diff --git a/cli/delete.go b/cli/delete.go index b775b6a11a..11db6fc5b0 100644 --- a/cli/delete.go +++ b/cli/delete.go @@ -105,10 +105,17 @@ func delete(containerID string, force bool) error { } func deleteSandbox(sandboxID string) error { - if _, err := vci.StopSandbox(sandboxID); err != nil { + status, err := vci.StatusSandbox(sandboxID) + if err != nil { return err } + if oci.StateToOCIState(status.State) != oci.StateStopped { + if _, err := vci.StopSandbox(sandboxID); err != nil { + return err + } + } + if _, err := vci.DeleteSandbox(sandboxID); err != nil { return err } diff --git a/cli/delete_test.go b/cli/delete_test.go index 89c5715466..66debda43e 100644 --- a/cli/delete_test.go +++ b/cli/delete_test.go @@ -192,6 +192,23 @@ func TestDeleteSandbox(t *testing.T) { assert.Error(err) assert.True(vcmock.IsMockError(err)) + testingImpl.StatusSandboxFunc = func(sandboxID string) (vc.SandboxStatus, error) { + return vc.SandboxStatus{ + ID: sandbox.ID(), + State: vc.State{ + State: vc.StateReady, + }, + }, nil + } + + defer func() { + testingImpl.StatusSandboxFunc = nil + }() + + err = delete(sandbox.ID(), false) + assert.Error(err) + assert.True(vcmock.IsMockError(err)) + testingImpl.StopSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) { return sandbox, nil } @@ -297,11 +314,21 @@ func TestDeleteSandboxRunning(t *testing.T) { assert.Error(err) assert.False(vcmock.IsMockError(err)) + testingImpl.StatusSandboxFunc = func(sandboxID string) (vc.SandboxStatus, error) { + return vc.SandboxStatus{ + ID: sandbox.ID(), + State: vc.State{ + State: vc.StateRunning, + }, + }, nil + } + testingImpl.StopSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) { return sandbox, nil } defer func() { + testingImpl.StatusSandboxFunc = nil testingImpl.StopSandboxFunc = nil }() @@ -525,6 +552,15 @@ func TestDeleteCLIFunctionSuccess(t *testing.T) { }, nil } + testingImpl.StatusSandboxFunc = func(sandboxID string) (vc.SandboxStatus, error) { + return vc.SandboxStatus{ + ID: sandbox.ID(), + State: vc.State{ + State: vc.StateReady, + }, + }, nil + } + testingImpl.StopSandboxFunc = func(sandboxID string) (vc.VCSandbox, error) { return sandbox, nil }