diff --git a/server/sandbox.go b/server/sandbox.go index 796e2c30..5f359f4e 100644 --- a/server/sandbox.go +++ b/server/sandbox.go @@ -294,9 +294,21 @@ func (s *Server) RemovePodSandbox(ctx context.Context, req *pb.RemovePodSandboxR // Delete all the containers in the sandbox for _, c := range sb.containers.List() { + if err := s.runtime.UpdateStatus(c); err != nil { + return nil, fmt.Errorf("failed to update container state: %v", err) + } + + cState := s.runtime.ContainerStatus(c) + if cState.Status == ContainerStateCreated || cState.Status == ContainerStateRunning { + if err := s.runtime.StopContainer(c); err != nil { + return nil, fmt.Errorf("failed to stop container %s: %v", c.Name(), err) + } + } + if err := s.runtime.DeleteContainer(c); err != nil { return nil, fmt.Errorf("failed to delete container %s in sandbox %s: %v", c.Name(), sandboxID, err) } + if podInfraContainer == c.Name() { continue } diff --git a/test/pod.bats b/test/pod.bats index 7713afa6..1bc20142 100644 --- a/test/pod.bats +++ b/test/pod.bats @@ -33,3 +33,28 @@ function teardown() { stop_ocid cleanup_pods } + +@test "pod remove" { + # this test requires docker, thus it can't yet be run in a container + if [ "$TRAVIS" = "true" ]; then # instead of $TRAVIS, add a function is_containerized to skip here + skip "cannot yet run this test in a container, use sudo make localintegration" + fi + + start_ocid + run ocic pod create --config "$TESTDATA"/sandbox_config.json + [ "$status" -eq 0 ] + echo "$output" + pod_id="$output" + run ocic ctr create --config "$TESTDATA"/container_redis.json --pod "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + ctr_id="$output" + run ocic ctr start --id "$ctr_id" + echo "$output" + [ "$status" -eq 0 ] + run ocic pod remove --id "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + stop_ocid + cleanup_pods +}