From 35d7672d73931f4e2c2e2458abcae288a91c710c 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 37310d5658..2212e89cd2 100644 --- a/cli/kata-check_amd64_test.go +++ b/cli/kata-check_amd64_test.go @@ -491,3 +491,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 61983af767..05c04043ae 100644 --- a/cli/kata-check_arm64_test.go +++ b/cli/kata-check_arm64_test.go @@ -198,3 +198,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 e2c397458d..6df57e3f4e 100644 --- a/cli/kata-check_ppc64le_test.go +++ b/cli/kata-check_ppc64le_test.go @@ -210,3 +210,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 133be1616e..58cd04b583 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) +}