diff options
Diffstat (limited to 'server/container_status.go')
-rw-r--r-- | server/container_status.go | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/server/container_status.go b/server/container_status.go new file mode 100644 index 000000000..b1512e0cd --- /dev/null +++ b/server/container_status.go @@ -0,0 +1,102 @@ +package server + +import ( + "github.com/kubernetes-incubator/cri-o/oci" + "github.com/sirupsen/logrus" + "golang.org/x/net/context" + pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime" +) + +const ( + oomKilledReason = "OOMKilled" + completedReason = "Completed" + errorReason = "Error" +) + +// ContainerStatus returns status of the container. +func (s *Server) ContainerStatus(ctx context.Context, req *pb.ContainerStatusRequest) (*pb.ContainerStatusResponse, error) { + logrus.Debugf("ContainerStatusRequest %+v", req) + c, err := s.GetContainerFromRequest(req.ContainerId) + if err != nil { + return nil, err + } + + containerID := c.ID() + resp := &pb.ContainerStatusResponse{ + Status: &pb.ContainerStatus{ + Id: containerID, + Metadata: c.Metadata(), + Labels: c.Labels(), + Annotations: c.Annotations(), + ImageRef: c.ImageRef(), + }, + } + resp.Status.Image = &pb.ImageSpec{Image: c.ImageName()} + + mounts := []*pb.Mount{} + for _, cv := range c.Volumes() { + mounts = append(mounts, &pb.Mount{ + ContainerPath: cv.ContainerPath, + HostPath: cv.HostPath, + Readonly: cv.Readonly, + }) + } + resp.Status.Mounts = mounts + + cState := s.Runtime().ContainerStatus(c) + rStatus := pb.ContainerState_CONTAINER_UNKNOWN + + imageName := c.Image() + status, err := s.StorageImageServer().ImageStatus(s.ImageContext(), imageName) + if err != nil { + return nil, err + } + + resp.Status.ImageRef = status.ImageRef + + // If we defaulted to exit code -1 earlier then we attempt to + // get the exit code from the exit file again. + if cState.ExitCode == -1 { + err := s.Runtime().UpdateStatus(c) + if err != nil { + logrus.Warnf("Failed to UpdateStatus of container %s: %v", c.ID(), err) + } + cState = s.Runtime().ContainerStatus(c) + } + + switch cState.Status { + case oci.ContainerStateCreated: + rStatus = pb.ContainerState_CONTAINER_CREATED + created := cState.Created.UnixNano() + resp.Status.CreatedAt = created + case oci.ContainerStateRunning: + rStatus = pb.ContainerState_CONTAINER_RUNNING + created := cState.Created.UnixNano() + resp.Status.CreatedAt = created + started := cState.Started.UnixNano() + resp.Status.StartedAt = started + case oci.ContainerStateStopped: + rStatus = pb.ContainerState_CONTAINER_EXITED + created := cState.Created.UnixNano() + resp.Status.CreatedAt = created + started := cState.Started.UnixNano() + resp.Status.StartedAt = started + finished := cState.Finished.UnixNano() + resp.Status.FinishedAt = finished + resp.Status.ExitCode = cState.ExitCode + switch { + case cState.OOMKilled: + resp.Status.Reason = oomKilledReason + case cState.ExitCode == 0: + resp.Status.Reason = completedReason + default: + resp.Status.Reason = errorReason + resp.Status.Message = cState.Error + } + } + + resp.Status.State = rStatus + + logrus.Debugf("ContainerStatusResponse: %+v", resp) + return resp, nil +} |