Merge pull request #3066 from dgageot/3065-improve-vtx-check

FIX #3065 Improve VT-X check
This commit is contained in:
Jean-Laurent de Morlhon 2016-02-17 16:43:43 +01:00
commit dc5f1e9bdb
3 changed files with 100 additions and 22 deletions

View File

@ -248,28 +248,6 @@ func (d *Driver) PreCreateCheck() error {
return nil return nil
} }
// IsVTXDisabledInTheVM checks if VT-X is disabled in the started vm.
func (d *Driver) IsVTXDisabledInTheVM() (bool, error) {
lines, err := d.readVBoxLog()
if err != nil {
return true, err
}
for _, line := range lines {
if strings.Contains(line, "VT-x is disabled") {
return true, nil
}
if strings.Contains(line, "the host CPU does NOT support HW virtualization") {
return true, nil
}
if strings.Contains(line, "VERR_VMX_UNABLE_TO_START_VM") {
return true, nil
}
}
return false, nil
}
func (d *Driver) Create() error { func (d *Driver) Create() error {
if err := d.CreateVM(); err != nil { if err := d.CreateVM(); err != nil {
return err return err

28
drivers/virtualbox/vtx.go Normal file
View File

@ -0,0 +1,28 @@
package virtualbox
import "strings"
// IsVTXDisabledInTheVM checks if VT-X is disabled in the started vm.
func (d *Driver) IsVTXDisabledInTheVM() (bool, error) {
lines, err := d.readVBoxLog()
if err != nil {
return true, err
}
for _, line := range lines {
if strings.Contains(line, "VT-x is disabled") && !strings.Contains(line, "Falling back to raw-mode: VT-x is disabled in the BIOS for all CPU modes") {
return true, nil
}
if strings.Contains(line, "the host CPU does NOT support HW virtualization") {
return true, nil
}
if strings.Contains(line, "VERR_VMX_UNABLE_TO_START_VM") {
return true, nil
}
if strings.Contains(line, "Power up failed") && strings.Contains(line, "VERR_VMX_NO_VMX") {
return true, nil
}
}
return false, nil
}

View File

@ -0,0 +1,72 @@
package virtualbox
import (
"testing"
"errors"
"github.com/stretchr/testify/assert"
)
type MockLogsReader struct {
content []string
err error
}
func (r *MockLogsReader) Read(path string) ([]string, error) {
return r.content, r.err
}
func TestIsVTXEnabledInTheVM(t *testing.T) {
driver := NewDriver("default", "path")
var tests = []struct {
description string
content []string
err error
}{
{"Empty log", []string{}, nil},
{"Raw mode", []string{"Falling back to raw-mode: VT-x is disabled in the BIOS for all CPU modes"}, nil},
{"Raw mode", []string{"HM: HMR3Init: Falling back to raw-mode: VT-x is not available"}, nil},
}
for _, test := range tests {
driver.logsReader = &MockLogsReader{
content: test.content,
err: test.err,
}
disabled, err := driver.IsVTXDisabledInTheVM()
assert.False(t, disabled, test.description)
assert.Equal(t, test.err, err)
}
}
func TestIsVTXDisabledInTheVM(t *testing.T) {
driver := NewDriver("default", "path")
var tests = []struct {
description string
content []string
err error
}{
{"VT-x Disabled", []string{"VT-x is disabled"}, nil},
{"No HW virtualization", []string{"the host CPU does NOT support HW virtualization"}, nil},
{"Unable to start VM", []string{"VERR_VMX_UNABLE_TO_START_VM"}, nil},
{"Power up failed", []string{"00:00:00.318604 Power up failed (vrc=VERR_VMX_NO_VMX, rc=NS_ERROR_FAILURE (0X80004005))"}, nil},
{"Unable to read log", nil, errors.New("Unable to read log")},
}
for _, test := range tests {
driver.logsReader = &MockLogsReader{
content: test.content,
err: test.err,
}
disabled, err := driver.IsVTXDisabledInTheVM()
assert.True(t, disabled, test.description)
assert.Equal(t, test.err, err)
}
}