From f70db71a26829e1a0376debe63d818c3f28217fa Mon Sep 17 00:00:00 2001 From: "James O. D. Hunt" Date: Wed, 29 Aug 2018 12:16:36 +0100 Subject: [PATCH] kata-env: Fix amd64 VM container capable check Fix nasty bug which resulted in `kata-env` showing `VMContainerCapable = true` even on amd64 systems without virtualisation support (thankfully `kata-check` still showed the correct results). Added arch-specific tests to avoid any possibility of regression. Fixes #660. Signed-off-by: James O. D. Hunt --- cli/kata-check_amd64_test.go | 29 +++++++++++++++++++ cli/kata-check_arm64_test.go | 4 +++ cli/kata-check_generic_test.go | 38 ++++++++++++++++++++++++ cli/kata-check_ppc64le_test.go | 4 +++ cli/kata-env.go | 2 ++ cli/kata-env_amd64_test.go | 50 ++++++++++++++++++++++++++++++++ cli/kata-env_arm64_test.go | 5 ++++ cli/kata-env_generic_test.go | 53 ++++++++++++++++++++++++++++++++++ cli/kata-env_ppc64le_test.go | 6 ++++ 9 files changed, 191 insertions(+) create mode 100644 cli/kata-check_generic_test.go create mode 100644 cli/kata-env_generic_test.go diff --git a/cli/kata-check_amd64_test.go b/cli/kata-check_amd64_test.go index f8c39784ca..9a77d79ec1 100644 --- a/cli/kata-check_amd64_test.go +++ b/cli/kata-check_amd64_test.go @@ -492,3 +492,32 @@ func TestKvmIsUsable(t *testing.T) { func TestGetCPUDetails(t *testing.T) { genericTestGetCPUDetails(t) } + +func TestSetCPUtype(t *testing.T) { + assert := assert.New(t) + + savedArchRequiredCPUFlags := archRequiredCPUFlags + savedArchRequiredCPUAttribs := archRequiredCPUAttribs + savedArchRequiredKernelModules := archRequiredKernelModules + + defer func() { + archRequiredCPUFlags = savedArchRequiredCPUFlags + archRequiredCPUAttribs = savedArchRequiredCPUAttribs + archRequiredKernelModules = savedArchRequiredKernelModules + }() + + archRequiredCPUFlags = map[string]string{} + archRequiredCPUAttribs = map[string]string{} + archRequiredKernelModules = map[string]kernelModule{} + + setCPUtype() + + assert.NotEmpty(archRequiredCPUFlags) + assert.NotEmpty(archRequiredCPUAttribs) + assert.NotEmpty(archRequiredKernelModules) + + assert.Equal(archRequiredCPUFlags["vmx"], "Virtualization support") + + _, ok := archRequiredKernelModules["kvm"] + assert.True(ok) +} diff --git a/cli/kata-check_arm64_test.go b/cli/kata-check_arm64_test.go index 4734790ed5..e62cb22696 100644 --- a/cli/kata-check_arm64_test.go +++ b/cli/kata-check_arm64_test.go @@ -199,3 +199,7 @@ foo : bar } } } + +func TestSetCPUtype(t *testing.T) { + testSetCPUTypeGeneric(t) +} diff --git a/cli/kata-check_generic_test.go b/cli/kata-check_generic_test.go new file mode 100644 index 0000000000..5332d4e892 --- /dev/null +++ b/cli/kata-check_generic_test.go @@ -0,0 +1,38 @@ +// Copyright (c) 2018 Intel Corporation +// +// SPDX-License-Identifier: Apache-2.0 +// + +// +build arm64 ppc64le + +package main + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func testSetCPUTypeGeneric(t *testing.T) { + assert := assert.New(t) + + savedArchRequiredCPUFlags := archRequiredCPUFlags + savedArchRequiredCPUAttribs := archRequiredCPUAttribs + savedArchRequiredKernelModules := archRequiredKernelModules + + defer func() { + archRequiredCPUFlags = savedArchRequiredCPUFlags + archRequiredCPUAttribs = savedArchRequiredCPUAttribs + archRequiredKernelModules = savedArchRequiredKernelModules + }() + + assert.Empty(archRequiredCPUFlags) + assert.Empty(archRequiredCPUAttribs) + assert.NotEmpty(archRequiredKernelModules) + + setCPUtype() + + assert.Equal(archRequiredCPUFlags, savedArchRequiredCPUFlags) + assert.Equal(archRequiredCPUAttribs, savedArchRequiredCPUAttribs) + assert.Equal(archRequiredKernelModules, savedArchRequiredKernelModules) +} diff --git a/cli/kata-check_ppc64le_test.go b/cli/kata-check_ppc64le_test.go index 4e2510e7e8..7d0291760a 100644 --- a/cli/kata-check_ppc64le_test.go +++ b/cli/kata-check_ppc64le_test.go @@ -211,3 +211,7 @@ func TestKvmIsUsable(t *testing.T) { func TestGetCPUDetails(t *testing.T) { genericTestGetCPUDetails(t) } + +func TestSetCPUtype(t *testing.T) { + testSetCPUTypeGeneric(t) +} diff --git a/cli/kata-env.go b/cli/kata-env.go index df89ef705c..a61c7e3090 100644 --- a/cli/kata-env.go +++ b/cli/kata-env.go @@ -294,6 +294,8 @@ func getHypervisorInfo(config oci.RuntimeConfig) HypervisorInfo { } func getEnvInfo(configFile string, config oci.RuntimeConfig) (env EnvInfo, err error) { + setCPUtype() + meta := getMetaInfo() runtime := getRuntimeInfo(configFile, config) diff --git a/cli/kata-env_amd64_test.go b/cli/kata-env_amd64_test.go index 870514f5ea..d515a1526b 100644 --- a/cli/kata-env_amd64_test.go +++ b/cli/kata-env_amd64_test.go @@ -5,6 +5,56 @@ package main +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + func getExpectedHostDetails(tmpdir string) (HostInfo, error) { return genericGetExpectedHostDetails(tmpdir) } + +func TestEnvGetEnvInfoSetsCPUType(t *testing.T) { + assert := assert.New(t) + + tmpdir, err := ioutil.TempDir("", "") + assert.NoError(err) + defer os.RemoveAll(tmpdir) + + savedArchRequiredCPUFlags := archRequiredCPUFlags + savedArchRequiredCPUAttribs := archRequiredCPUAttribs + savedArchRequiredKernelModules := archRequiredKernelModules + + defer func() { + archRequiredCPUFlags = savedArchRequiredCPUFlags + archRequiredCPUAttribs = savedArchRequiredCPUAttribs + archRequiredKernelModules = savedArchRequiredKernelModules + }() + + archRequiredCPUFlags = map[string]string{} + archRequiredCPUAttribs = map[string]string{} + archRequiredKernelModules = map[string]kernelModule{} + + configFile, config, err := makeRuntimeConfig(tmpdir) + assert.NoError(err) + + expectedEnv, err := getExpectedSettings(config, tmpdir, configFile) + assert.NoError(err) + + env, err := getEnvInfo(configFile, config) + assert.NoError(err) + + assert.Equal(expectedEnv, env) + + assert.NotEmpty(archRequiredCPUFlags) + assert.NotEmpty(archRequiredCPUAttribs) + assert.NotEmpty(archRequiredKernelModules) + + assert.Equal(archRequiredCPUFlags["vmx"], "Virtualization support") + + _, ok := archRequiredKernelModules["kvm"] + assert.True(ok) +} diff --git a/cli/kata-env_arm64_test.go b/cli/kata-env_arm64_test.go index e23fee82ad..0b0827f528 100644 --- a/cli/kata-env_arm64_test.go +++ b/cli/kata-env_arm64_test.go @@ -9,6 +9,7 @@ import ( "fmt" "path/filepath" goruntime "runtime" + "testing" ) func getExpectedHostDetails(tmpdir string) (HostInfo, error) { @@ -92,3 +93,7 @@ VERSION_ID="%s" return expectedHostDetails, nil } + +func TestEnvGetEnvInfoSetsCPUType(t *testing.T) { + testEnvGetEnvInfoSetsCPUTypeGeneric(t) +} diff --git a/cli/kata-env_generic_test.go b/cli/kata-env_generic_test.go new file mode 100644 index 0000000000..3077be61b3 --- /dev/null +++ b/cli/kata-env_generic_test.go @@ -0,0 +1,53 @@ +// Copyright (c) 2018 Intel Corporation +// +// SPDX-License-Identifier: Apache-2.0 +// + +// +build arm64 ppc64le + +package main + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func testEnvGetEnvInfoSetsCPUTypeGeneric(t *testing.T) { + assert := assert.New(t) + + tmpdir, err := ioutil.TempDir("", "") + assert.NoError(err) + defer os.RemoveAll(tmpdir) + + savedArchRequiredCPUFlags := archRequiredCPUFlags + savedArchRequiredCPUAttribs := archRequiredCPUAttribs + savedArchRequiredKernelModules := archRequiredKernelModules + + defer func() { + archRequiredCPUFlags = savedArchRequiredCPUFlags + archRequiredCPUAttribs = savedArchRequiredCPUAttribs + archRequiredKernelModules = savedArchRequiredKernelModules + }() + + assert.Empty(archRequiredCPUFlags) + assert.Empty(archRequiredCPUAttribs) + assert.NotEmpty(archRequiredKernelModules) + + configFile, config, err := makeRuntimeConfig(tmpdir) + assert.NoError(err) + + expectedEnv, err := getExpectedSettings(config, tmpdir, configFile) + assert.NoError(err) + + env, err := getEnvInfo(configFile, config) + assert.NoError(err) + + assert.Equal(expectedEnv, env) + + assert.Equal(archRequiredCPUFlags, savedArchRequiredCPUFlags) + assert.Equal(archRequiredCPUAttribs, savedArchRequiredCPUAttribs) + assert.Equal(archRequiredKernelModules, savedArchRequiredKernelModules) +} diff --git a/cli/kata-env_ppc64le_test.go b/cli/kata-env_ppc64le_test.go index a9cd394b9e..e63df6f751 100644 --- a/cli/kata-env_ppc64le_test.go +++ b/cli/kata-env_ppc64le_test.go @@ -5,6 +5,12 @@ package main +import "testing" + func getExpectedHostDetails(tmpdir string) (HostInfo, error) { return genericGetExpectedHostDetails(tmpdir) } + +func TestEnvGetEnvInfoSetsCPUType(t *testing.T) { + testEnvGetEnvInfoSetsCPUTypeGeneric(t) +}