diff --git a/virtcontainers/interfaces.go b/virtcontainers/interfaces.go index 54b6cfd4e0..dc62135682 100644 --- a/virtcontainers/interfaces.go +++ b/virtcontainers/interfaces.go @@ -50,6 +50,7 @@ type VCSandbox interface { Resume() error Release() error Delete() error + Status() SandboxStatus CreateContainer(contConfig ContainerConfig) (VCContainer, error) DeleteContainer(contID string) (VCContainer, error) StartContainer(containerID string) (VCContainer, error) diff --git a/virtcontainers/pkg/vcmock/sandbox.go b/virtcontainers/pkg/vcmock/sandbox.go index 4cffc4875e..943ffe2b71 100644 --- a/virtcontainers/pkg/vcmock/sandbox.go +++ b/virtcontainers/pkg/vcmock/sandbox.go @@ -89,3 +89,8 @@ func (p *Sandbox) StartContainer(contID string) (vc.VCContainer, error) { func (p *Sandbox) StatusContainer(contID string) (vc.ContainerStatus, error) { return vc.ContainerStatus{}, nil } + +// Status implements the VCSandbox function of the same name. +func (p *Sandbox) Status() vc.SandboxStatus { + return vc.SandboxStatus{} +} diff --git a/virtcontainers/sandbox.go b/virtcontainers/sandbox.go index 70c3298dae..03758f41da 100644 --- a/virtcontainers/sandbox.go +++ b/virtcontainers/sandbox.go @@ -535,6 +535,32 @@ func (s *Sandbox) Release() error { return s.agent.disconnect() } +// Status gets the status of the sandbox +// TODO: update container status properly, see kata-containers/runtime#253 +func (s *Sandbox) Status() SandboxStatus { + var contStatusList []ContainerStatus + for _, c := range s.containers { + contStatusList = append(contStatusList, ContainerStatus{ + ID: c.id, + State: c.state, + PID: c.process.Pid, + StartTime: c.process.StartTime, + RootFs: c.config.RootFs, + Annotations: c.config.Annotations, + }) + } + + return SandboxStatus{ + ID: s.id, + State: s.state, + Hypervisor: s.config.HypervisorType, + HypervisorConfig: s.config.HypervisorConfig, + Agent: s.config.AgentType, + ContainersStatus: contStatusList, + Annotations: s.config.Annotations, + } +} + func createAssets(sandboxConfig *SandboxConfig) error { kernel, err := newAsset(sandboxConfig, kernelAsset) if err != nil { diff --git a/virtcontainers/sandbox_test.go b/virtcontainers/sandbox_test.go index a6eab04680..c6dc8dfc0e 100644 --- a/virtcontainers/sandbox_test.go +++ b/virtcontainers/sandbox_test.go @@ -1356,3 +1356,11 @@ func TestStatusContainer(t *testing.T) { _, err = s.DeleteContainer(contID) assert.Nil(t, err, "Failed to delete container %s in sandbox %s: %v", contID, s.ID(), err) } + +func TestStatusSandbox(t *testing.T) { + s, err := testCreateSandbox(t, testSandboxID, MockHypervisor, newHypervisorConfig(nil, nil), NoopAgentType, NoopNetworkModel, NetworkConfig{}, nil, nil) + assert.Nil(t, err, "VirtContainers should not allow empty sandboxes") + defer cleanUp() + + s.Status() +}