diff --git a/containerd-shim-v2/service.go b/containerd-shim-v2/service.go index 41cbe7558..8737e5176 100644 --- a/containerd-shim-v2/service.go +++ b/containerd-shim-v2/service.go @@ -497,7 +497,28 @@ func (s *service) State(ctx context.Context, r *taskAPI.StateRequest) (*taskAPI. // Pause the container func (s *service) Pause(ctx context.Context, r *taskAPI.PauseRequest) (*ptypes.Empty, error) { - return nil, errdefs.ErrNotImplemented + s.Lock() + defer s.Unlock() + + c, err := s.getContainer(r.ID) + if err != nil { + return nil, err + } + + c.status = task.StatusPausing + + err = s.sandbox.PauseContainer(r.ID) + if err == nil { + c.status = task.StatusPaused + return empty, nil + } + + c.status, err = s.getContainerStatus(c.id) + if err != nil { + c.status = task.StatusUnknown + } + + return empty, err } // Resume the container @@ -678,3 +699,24 @@ func (s *service) getContainer(id string) (*container, error) { return c, nil } + +func (s *service) getContainerStatus(containerID string) (task.Status, error) { + cStatus, err := s.sandbox.StatusContainer(containerID) + if err != nil { + return task.StatusUnknown, err + } + + var status task.Status + switch cStatus.State.State { + case vc.StateReady: + status = task.StatusCreated + case vc.StateRunning: + status = task.StatusRunning + case vc.StatePaused: + status = task.StatusPaused + case vc.StateStopped: + status = task.StatusStopped + } + + return status, nil +}