diff --git a/virtcontainers/api_test.go b/virtcontainers/api_test.go index ce4d01fff2..8db38a8e41 100644 --- a/virtcontainers/api_test.go +++ b/virtcontainers/api_test.go @@ -1726,7 +1726,7 @@ func TestEnterContainerFailingContNotStarted(t *testing.T) { cmd := newBasicTestCmd() _, c, _, err = EnterContainer(p.ID(), contID, cmd) - if c != nil || err == nil { + if c == nil || err != nil { t.Fatal() } } diff --git a/virtcontainers/container.go b/virtcontainers/container.go index 16a95d2e05..bc2eda71f7 100644 --- a/virtcontainers/container.go +++ b/virtcontainers/container.go @@ -432,6 +432,19 @@ func (c *Container) rollbackFailingContainerCreation() { } } +func (c *Container) checkBlockDeviceSupport() bool { + if !c.pod.config.HypervisorConfig.DisableBlockDeviceUse { + agentCaps := c.pod.agent.capabilities() + hypervisorCaps := c.pod.hypervisor.capabilities() + + if agentCaps.isBlockDeviceSupported() && hypervisorCaps.isBlockDeviceHotplugSupported() { + return true + } + } + + return false +} + // createContainer creates and start a container inside a Pod. It has to be // called only when a new container, not known by the pod, has to be created. func createContainer(pod *Pod, contConfig ContainerConfig) (c *Container, err error) { @@ -456,8 +469,10 @@ func createContainer(pod *Pod, contConfig ContainerConfig) (c *Container, err er } }() - if err = c.hotplugDrive(); err != nil { - return + if c.checkBlockDeviceSupport() { + if err = c.hotplugDrive(); err != nil { + return + } } // Attach devices @@ -683,15 +698,6 @@ func (c *Container) processList(options ProcessListOptions) (ProcessList, error) } func (c *Container) hotplugDrive() error { - agentCaps := c.pod.agent.capabilities() - hypervisorCaps := c.pod.hypervisor.capabilities() - - if c.pod.config.HypervisorConfig.DisableBlockDeviceUse || - !agentCaps.isBlockDeviceSupported() || - !hypervisorCaps.isBlockDeviceHotplugSupported() { - return nil - } - dev, err := getDeviceForPath(c.rootFs) if err == errMountPointNotFound { diff --git a/virtcontainers/container_test.go b/virtcontainers/container_test.go index 6ad6d9961a..4897e34a38 100644 --- a/virtcontainers/container_test.go +++ b/virtcontainers/container_test.go @@ -210,6 +210,12 @@ func TestContainerAddDriveDir(t *testing.T) { id: testPodID, storage: fs, hypervisor: &mockHypervisor{}, + agent: &noopAgent{}, + config: &PodConfig{ + HypervisorConfig: HypervisorConfig{ + DisableBlockDeviceUse: false, + }, + }, } contID := "100" @@ -258,7 +264,6 @@ func TestContainerAddDriveDir(t *testing.T) { if container.state.Fstype == "" || !container.state.HotpluggedDrive { t.Fatal() } - } func TestCheckPodRunningEmptyCmdFailure(t *testing.T) { @@ -307,7 +312,10 @@ func TestContainerAddResources(t *testing.T) { CPUQuota: 5000, CPUPeriod: 1000, } - c.pod = &Pod{hypervisor: &mockHypervisor{}} + c.pod = &Pod{ + hypervisor: &mockHypervisor{}, + agent: &noopAgent{}, + } err = c.addResources() assert.Nil(err) } diff --git a/virtcontainers/pkg/vcmock/container.go b/virtcontainers/pkg/vcmock/container.go index 7bee5567a8..07432c8c1b 100644 --- a/virtcontainers/pkg/vcmock/container.go +++ b/virtcontainers/pkg/vcmock/container.go @@ -30,6 +30,10 @@ func (c *Container) Pod() vc.VCPod { // Process implements the VCContainer function of the same name. func (c *Container) Process() vc.Process { + // always return a mockprocess with a non-zero Pid + if c.MockProcess.Pid == 0 { + c.MockProcess.Pid = 1000 + } return c.MockProcess }