diff --git a/drivers/virtualbox/virtualbox.go b/drivers/virtualbox/virtualbox.go index 06e19a9194..31ee3c1b93 100644 --- a/drivers/virtualbox/virtualbox.go +++ b/drivers/virtualbox/virtualbox.go @@ -248,28 +248,6 @@ func (d *Driver) PreCreateCheck() error { 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 { if err := d.CreateVM(); err != nil { return err diff --git a/drivers/virtualbox/vtx.go b/drivers/virtualbox/vtx.go new file mode 100644 index 0000000000..7adb631fe9 --- /dev/null +++ b/drivers/virtualbox/vtx.go @@ -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 +} diff --git a/drivers/virtualbox/vtx_test.go b/drivers/virtualbox/vtx_test.go new file mode 100644 index 0000000000..da90b15ab5 --- /dev/null +++ b/drivers/virtualbox/vtx_test.go @@ -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) + } +}