diff --git a/virtcontainers/agent.go b/virtcontainers/agent.go index 8774d49ceb..cf0c71c504 100644 --- a/virtcontainers/agent.go +++ b/virtcontainers/agent.go @@ -137,7 +137,7 @@ type agent interface { // capabilities should return a structure that specifies the capabilities // supported by the agent. - capabilities() capabilities + capabilities() types.Capabilities // check will check the agent liveness check() error diff --git a/virtcontainers/capabilities.go b/virtcontainers/capabilities.go deleted file mode 100644 index 72716ddb24..0000000000 --- a/virtcontainers/capabilities.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2017 Intel Corporation -// -// SPDX-License-Identifier: Apache-2.0 -// - -package virtcontainers - -const ( - blockDeviceSupport = 1 << iota - blockDeviceHotplugSupport - multiQueueSupport - fsSharingUnsupported -) - -type capabilities struct { - flags uint -} - -func (caps *capabilities) isBlockDeviceSupported() bool { - if caps.flags&blockDeviceSupport != 0 { - return true - } - return false -} - -func (caps *capabilities) setBlockDeviceSupport() { - caps.flags = caps.flags | blockDeviceSupport -} - -func (caps *capabilities) isBlockDeviceHotplugSupported() bool { - if caps.flags&blockDeviceHotplugSupport != 0 { - return true - } - return false -} - -func (caps *capabilities) setBlockDeviceHotplugSupport() { - caps.flags |= blockDeviceHotplugSupport -} - -func (caps *capabilities) isMultiQueueSupported() bool { - if caps.flags&multiQueueSupport != 0 { - return true - } - return false -} - -func (caps *capabilities) setMultiQueueSupport() { - caps.flags |= multiQueueSupport -} - -func (caps *capabilities) isFsSharingSupported() bool { - return caps.flags&fsSharingUnsupported == 0 -} - -func (caps *capabilities) setFsSharingUnsupported() { - caps.flags |= fsSharingUnsupported -} diff --git a/virtcontainers/capabilities_test.go b/virtcontainers/capabilities_test.go deleted file mode 100644 index 3396989a85..0000000000 --- a/virtcontainers/capabilities_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2017 Intel Corporation -// -// SPDX-License-Identifier: Apache-2.0 -// - -package virtcontainers - -import "testing" - -func TestBlockDeviceCapability(t *testing.T) { - var caps capabilities - - if caps.isBlockDeviceSupported() { - t.Fatal() - } - - caps.setBlockDeviceSupport() - - if !caps.isBlockDeviceSupported() { - t.Fatal() - } -} - -func TestBlockDeviceHotplugCapability(t *testing.T) { - var caps capabilities - - if caps.isBlockDeviceHotplugSupported() { - t.Fatal() - } - - caps.setBlockDeviceHotplugSupport() - - if !caps.isBlockDeviceHotplugSupported() { - t.Fatal() - } -} - -func TestFsSharingCapability(t *testing.T) { - var caps capabilities - - if !caps.isFsSharingSupported() { - t.Fatal() - } - - caps.setFsSharingUnsupported() - - if caps.isFsSharingSupported() { - t.Fatal() - } -} diff --git a/virtcontainers/container.go b/virtcontainers/container.go index 545700b77f..db9715e97d 100644 --- a/virtcontainers/container.go +++ b/virtcontainers/container.go @@ -445,7 +445,7 @@ func (c *Container) shareFiles(m Mount, idx int, hostSharedDir, guestSharedDir s // copy file to contaier's rootfs if filesystem sharing is not supported, otherwise // bind mount it in the shared directory. caps := c.sandbox.hypervisor.capabilities() - if !caps.isFsSharingSupported() { + if !caps.IsFsSharingSupported() { c.Logger().Debug("filesystem sharing is not supported, files will be copied") fileInfo, err := os.Stat(m.Source) @@ -713,7 +713,7 @@ func (c *Container) checkBlockDeviceSupport() bool { agentCaps := c.sandbox.agent.capabilities() hypervisorCaps := c.sandbox.hypervisor.capabilities() - if agentCaps.isBlockDeviceSupported() && hypervisorCaps.isBlockDeviceHotplugSupported() { + if agentCaps.IsBlockDeviceSupported() && hypervisorCaps.IsBlockDeviceHotplugSupported() { return true } } diff --git a/virtcontainers/fc.go b/virtcontainers/fc.go index 7942da9582..203add79de 100644 --- a/virtcontainers/fc.go +++ b/virtcontainers/fc.go @@ -21,6 +21,7 @@ import ( "github.com/sirupsen/logrus" "github.com/kata-containers/runtime/virtcontainers/device/config" + "github.com/kata-containers/runtime/virtcontainers/types" "net" "net/http" @@ -656,12 +657,12 @@ func (fc *firecracker) disconnect() { } // Adds all capabilities supported by firecracker implementation of hypervisor interface -func (fc *firecracker) capabilities() capabilities { +func (fc *firecracker) capabilities() types.Capabilities { span, _ := fc.trace("capabilities") defer span.Finish() - var caps capabilities - caps.setFsSharingUnsupported() - caps.setBlockDeviceHotplugSupport() + var caps types.Capabilities + caps.SetFsSharingUnsupported() + caps.SetBlockDeviceHotplugSupport() return caps } diff --git a/virtcontainers/hyperstart_agent.go b/virtcontainers/hyperstart_agent.go index 31d774ac5e..feabc1f5a2 100644 --- a/virtcontainers/hyperstart_agent.go +++ b/virtcontainers/hyperstart_agent.go @@ -330,11 +330,11 @@ func (h *hyper) createSandbox(sandbox *Sandbox) (err error) { return h.configure(sandbox.hypervisor, "", h.getSharePath(sandbox.id), false, nil) } -func (h *hyper) capabilities() capabilities { - var caps capabilities +func (h *hyper) capabilities() types.Capabilities { + var caps types.Capabilities // add all capabilities supported by agent - caps.setBlockDeviceSupport() + caps.SetBlockDeviceSupport() return caps } diff --git a/virtcontainers/hypervisor.go b/virtcontainers/hypervisor.go index 4df16803a4..23cf82343d 100644 --- a/virtcontainers/hypervisor.go +++ b/virtcontainers/hypervisor.go @@ -604,7 +604,7 @@ type hypervisor interface { resizeVCPUs(vcpus uint32) (uint32, uint32, error) getSandboxConsole(sandboxID string) (string, error) disconnect() - capabilities() capabilities + capabilities() types.Capabilities hypervisorConfig() HypervisorConfig getThreadIDs() (*threadIDs, error) cleanup() error diff --git a/virtcontainers/kata_agent.go b/virtcontainers/kata_agent.go index 64b40a789c..3f0abc423f 100644 --- a/virtcontainers/kata_agent.go +++ b/virtcontainers/kata_agent.go @@ -211,11 +211,11 @@ func (k *kataAgent) agentURL() (string, error) { } } -func (k *kataAgent) capabilities() capabilities { - var caps capabilities +func (k *kataAgent) capabilities() types.Capabilities { + var caps types.Capabilities // add all capabilities supported by agent - caps.setBlockDeviceSupport() + caps.SetBlockDeviceSupport() return caps } @@ -261,7 +261,7 @@ func (k *kataAgent) configure(h hypervisor, id, sharePath string, builtin bool, // Neither create shared directory nor add 9p device if hypervisor // doesn't support filesystem sharing. caps := h.capabilities() - if !caps.isFsSharingSupported() { + if !caps.IsFsSharingSupported() { return nil } @@ -629,7 +629,7 @@ func (k *kataAgent) startSandbox(sandbox *Sandbox) error { caps := sandbox.hypervisor.capabilities() // append 9p shared volume to storages only if filesystem sharing is supported - if caps.isFsSharingSupported() { + if caps.IsFsSharingSupported() { sharedDir9pOptions = append(sharedDir9pOptions, fmt.Sprintf("msize=%d", sandbox.config.HypervisorConfig.Msize9p)) // We mount the shared directory in a predefined location diff --git a/virtcontainers/mock_hypervisor.go b/virtcontainers/mock_hypervisor.go index f23b3b8762..1146c6f746 100644 --- a/virtcontainers/mock_hypervisor.go +++ b/virtcontainers/mock_hypervisor.go @@ -8,13 +8,15 @@ package virtcontainers import ( "context" "os" + + "github.com/kata-containers/runtime/virtcontainers/types" ) type mockHypervisor struct { } -func (m *mockHypervisor) capabilities() capabilities { - return capabilities{} +func (m *mockHypervisor) capabilities() types.Capabilities { + return types.Capabilities{} } func (m *mockHypervisor) hypervisorConfig() HypervisorConfig { diff --git a/virtcontainers/network.go b/virtcontainers/network.go index bfa087f961..777d12fec2 100644 --- a/virtcontainers/network.go +++ b/virtcontainers/network.go @@ -511,7 +511,7 @@ func xConnectVMNetwork(endpoint Endpoint, h hypervisor) error { queues := 0 caps := h.capabilities() - if caps.isMultiQueueSupported() { + if caps.IsMultiQueueSupported() { queues = int(h.hypervisorConfig().NumVCPUs) } diff --git a/virtcontainers/noop_agent.go b/virtcontainers/noop_agent.go index f0e38bcc97..1783454b93 100644 --- a/virtcontainers/noop_agent.go +++ b/virtcontainers/noop_agent.go @@ -37,8 +37,8 @@ func (n *noopAgent) createSandbox(sandbox *Sandbox) error { } // capabilities returns empty capabilities, i.e no capabilties are supported. -func (n *noopAgent) capabilities() capabilities { - return capabilities{} +func (n *noopAgent) capabilities() types.Capabilities { + return types.Capabilities{} } // disconnect is the Noop agent connection closer. It does nothing. diff --git a/virtcontainers/qemu.go b/virtcontainers/qemu.go index 59d9dbbb17..ee6298203b 100644 --- a/virtcontainers/qemu.go +++ b/virtcontainers/qemu.go @@ -162,7 +162,7 @@ func (q *qemu) kernelParameters() string { } // Adds all capabilities supported by qemu implementation of hypervisor interface -func (q *qemu) capabilities() capabilities { +func (q *qemu) capabilities() types.Capabilities { span, _ := q.trace("capabilities") defer span.Finish() diff --git a/virtcontainers/qemu_amd64.go b/virtcontainers/qemu_amd64.go index 7e3fc9d3de..dec7ec9259 100644 --- a/virtcontainers/qemu_amd64.go +++ b/virtcontainers/qemu_amd64.go @@ -8,6 +8,8 @@ package virtcontainers import ( "os" + "github.com/kata-containers/runtime/virtcontainers/types" + govmmQemu "github.com/intel/govmm/qemu" ) @@ -101,16 +103,16 @@ func newQemuArch(config HypervisorConfig) qemuArch { return q } -func (q *qemuAmd64) capabilities() capabilities { - var caps capabilities +func (q *qemuAmd64) capabilities() types.Capabilities { + var caps types.Capabilities if q.machineType == QemuPC || q.machineType == QemuQ35 || q.machineType == QemuVirt { - caps.setBlockDeviceHotplugSupport() + caps.SetBlockDeviceHotplugSupport() } - caps.setMultiQueueSupport() + caps.SetMultiQueueSupport() return caps } diff --git a/virtcontainers/qemu_amd64_test.go b/virtcontainers/qemu_amd64_test.go index c10d126653..14bcb6e832 100644 --- a/virtcontainers/qemu_amd64_test.go +++ b/virtcontainers/qemu_amd64_test.go @@ -27,11 +27,11 @@ func TestQemuAmd64Capabilities(t *testing.T) { amd64 := newTestQemu(QemuPC) caps := amd64.capabilities() - assert.True(caps.isBlockDeviceHotplugSupported()) + assert.True(caps.IsBlockDeviceHotplugSupported()) amd64 = newTestQemu(QemuQ35) caps = amd64.capabilities() - assert.True(caps.isBlockDeviceHotplugSupported()) + assert.True(caps.IsBlockDeviceHotplugSupported()) } func TestQemuAmd64Bridges(t *testing.T) { diff --git a/virtcontainers/qemu_arch_base.go b/virtcontainers/qemu_arch_base.go index aa852353d8..fa8bd49be2 100644 --- a/virtcontainers/qemu_arch_base.go +++ b/virtcontainers/qemu_arch_base.go @@ -45,7 +45,7 @@ type qemuArch interface { kernelParameters(debug bool) []Param //capabilities returns the capabilities supported by QEMU - capabilities() capabilities + capabilities() types.Capabilities // bridges returns the number bridges for the machine type bridges(number uint32) []Bridge @@ -228,10 +228,10 @@ func (q *qemuArchBase) kernelParameters(debug bool) []Param { return params } -func (q *qemuArchBase) capabilities() capabilities { - var caps capabilities - caps.setBlockDeviceHotplugSupport() - caps.setMultiQueueSupport() +func (q *qemuArchBase) capabilities() types.Capabilities { + var caps types.Capabilities + caps.SetBlockDeviceHotplugSupport() + caps.SetMultiQueueSupport() return caps } diff --git a/virtcontainers/qemu_arch_base_test.go b/virtcontainers/qemu_arch_base_test.go index 711d585f4a..c6ae625282 100644 --- a/virtcontainers/qemu_arch_base_test.go +++ b/virtcontainers/qemu_arch_base_test.go @@ -138,7 +138,7 @@ func TestQemuArchBaseCapabilities(t *testing.T) { qemuArchBase := newQemuArchBase() c := qemuArchBase.capabilities() - assert.True(c.isBlockDeviceHotplugSupported()) + assert.True(c.IsBlockDeviceHotplugSupported()) } func TestQemuArchBaseBridges(t *testing.T) { diff --git a/virtcontainers/qemu_ppc64le.go b/virtcontainers/qemu_ppc64le.go index ca69e2d831..f6151f5f47 100644 --- a/virtcontainers/qemu_ppc64le.go +++ b/virtcontainers/qemu_ppc64le.go @@ -11,6 +11,7 @@ import ( govmmQemu "github.com/intel/govmm/qemu" deviceConfig "github.com/kata-containers/runtime/virtcontainers/device/config" + "github.com/kata-containers/runtime/virtcontainers/types" "github.com/kata-containers/runtime/virtcontainers/utils" "github.com/sirupsen/logrus" ) @@ -90,15 +91,15 @@ func newQemuArch(config HypervisorConfig) qemuArch { return q } -func (q *qemuPPC64le) capabilities() capabilities { - var caps capabilities +func (q *qemuPPC64le) capabilities() types.Capabilities { + var caps types.Capabilities // pseries machine type supports hotplugging drives if q.machineType == QemuPseries { - caps.setBlockDeviceHotplugSupport() + caps.SetBlockDeviceHotplugSupport() } - caps.setMultiQueueSupport() + caps.SetMultiQueueSupport() return caps } diff --git a/virtcontainers/qemu_test.go b/virtcontainers/qemu_test.go index 73ad6adfc9..1a01868167 100644 --- a/virtcontainers/qemu_test.go +++ b/virtcontainers/qemu_test.go @@ -306,7 +306,7 @@ func TestQemuCapabilities(t *testing.T) { } caps := q.capabilities() - if !caps.isBlockDeviceHotplugSupported() { + if !caps.IsBlockDeviceHotplugSupported() { t.Fatal("Block device hotplug should be supported") } } diff --git a/virtcontainers/types/capabilities.go b/virtcontainers/types/capabilities.go new file mode 100644 index 0000000000..c361601ef5 --- /dev/null +++ b/virtcontainers/types/capabilities.go @@ -0,0 +1,68 @@ +// Copyright (c) 2017 Intel Corporation +// +// SPDX-License-Identifier: Apache-2.0 +// + +package types + +const ( + blockDeviceSupport = 1 << iota + blockDeviceHotplugSupport + multiQueueSupport + fsSharingUnsupported +) + +// Capabilities describe a virtcontainers hypervisor capabilities +// through a bit mask. +type Capabilities struct { + flags uint +} + +// IsBlockDeviceSupported tells if an hypervisor supports block devices. +func (caps *Capabilities) IsBlockDeviceSupported() bool { + if caps.flags&blockDeviceSupport != 0 { + return true + } + return false +} + +// SetBlockDeviceSupport sets the block device support capability to true. +func (caps *Capabilities) SetBlockDeviceSupport() { + caps.flags = caps.flags | blockDeviceSupport +} + +// IsBlockDeviceHotplugSupported tells if an hypervisor supports hotplugging block devices. +func (caps *Capabilities) IsBlockDeviceHotplugSupported() bool { + if caps.flags&blockDeviceHotplugSupport != 0 { + return true + } + return false +} + +// SetBlockDeviceHotplugSupport sets the block device hotplugging capability to true. +func (caps *Capabilities) SetBlockDeviceHotplugSupport() { + caps.flags |= blockDeviceHotplugSupport +} + +// IsMultiQueueSupported tells if an hypervisor supports device multi queue support. +func (caps *Capabilities) IsMultiQueueSupported() bool { + if caps.flags&multiQueueSupport != 0 { + return true + } + return false +} + +// SetMultiQueueSupport sets the device multi queue capability to true. +func (caps *Capabilities) SetMultiQueueSupport() { + caps.flags |= multiQueueSupport +} + +// IsFsSharingSupported tells if an hypervisor supports host filesystem sharing. +func (caps *Capabilities) IsFsSharingSupported() bool { + return caps.flags&fsSharingUnsupported == 0 +} + +// SetFsSharingUnsupported sets the host filesystem sharing capability to true. +func (caps *Capabilities) SetFsSharingUnsupported() { + caps.flags |= fsSharingUnsupported +} diff --git a/virtcontainers/types/capabilities_test.go b/virtcontainers/types/capabilities_test.go new file mode 100644 index 0000000000..c5b0bcd068 --- /dev/null +++ b/virtcontainers/types/capabilities_test.go @@ -0,0 +1,50 @@ +// Copyright (c) 2017 Intel Corporation +// +// SPDX-License-Identifier: Apache-2.0 +// + +package types + +import "testing" + +func TestBlockDeviceCapability(t *testing.T) { + var caps Capabilities + + if caps.IsBlockDeviceSupported() { + t.Fatal() + } + + caps.SetBlockDeviceSupport() + + if !caps.IsBlockDeviceSupported() { + t.Fatal() + } +} + +func TestBlockDeviceHotplugCapability(t *testing.T) { + var caps Capabilities + + if caps.IsBlockDeviceHotplugSupported() { + t.Fatal() + } + + caps.SetBlockDeviceHotplugSupport() + + if !caps.IsBlockDeviceHotplugSupported() { + t.Fatal() + } +} + +func TestFsSharingCapability(t *testing.T) { + var caps Capabilities + + if !caps.IsFsSharingSupported() { + t.Fatal() + } + + caps.SetFsSharingUnsupported() + + if caps.IsFsSharingSupported() { + t.Fatal() + } +}