mirror of https://github.com/docker/docs.git
Merge pull request #3066 from dgageot/3065-improve-vtx-check
FIX #3065 Improve VT-X check
This commit is contained in:
commit
dc5f1e9bdb
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue