// TODO(yifan): Delete this function when the logic is moved to kubelet. func (r *Runtime) ConvertPodStatusToAPIPodStatus(pod *api.Pod, status *kubecontainer.PodStatus) (*api.PodStatus, error) { apiPodStatus := &api.PodStatus{ // TODO(yifan): Add reason and message field. PodIP: status.IP, } // Sort in the reverse order of the restart count because the // lastest one will have the largest restart count. sort.Sort(sort.Reverse(sortByRestartCount(status.ContainerStatuses))) containerStatuses := make(map[string]*api.ContainerStatus) for _, c := range status.ContainerStatuses { var st api.ContainerState switch c.State { case kubecontainer.ContainerStateRunning: st.Running = &api.ContainerStateRunning{ StartedAt: unversioned.NewTime(c.StartedAt), } case kubecontainer.ContainerStateExited: if pod.Spec.RestartPolicy == api.RestartPolicyAlways || pod.Spec.RestartPolicy == api.RestartPolicyOnFailure && c.ExitCode != 0 { // TODO(yifan): Add reason and message. st.Waiting = &api.ContainerStateWaiting{} break } st.Terminated = &api.ContainerStateTerminated{ ExitCode: c.ExitCode, StartedAt: unversioned.NewTime(c.StartedAt), // TODO(yifan): Add reason, message, finishedAt, signal. ContainerID: c.ID.String(), } default: // Unknown state. // TODO(yifan): Add reason and message. st.Waiting = &api.ContainerStateWaiting{} } status, ok := containerStatuses[c.Name] if !ok { containerStatuses[c.Name] = &api.ContainerStatus{ Name: c.Name, Image: c.Image, ImageID: c.ImageID, ContainerID: c.ID.String(), RestartCount: c.RestartCount, State: st, } continue } // Found multiple container statuses, fill that as last termination state. if status.LastTerminationState.Waiting == nil && status.LastTerminationState.Running == nil && status.LastTerminationState.Terminated == nil { status.LastTerminationState = st } } for _, c := range pod.Spec.Containers { cs, ok := containerStatuses[c.Name] if !ok { cs = &api.ContainerStatus{ Name: c.Name, Image: c.Image, // TODO(yifan): Add reason and message. State: api.ContainerState{Waiting: &api.ContainerStateWaiting{}}, } } apiPodStatus.ContainerStatuses = append(apiPodStatus.ContainerStatuses, *cs) } return apiPodStatus, nil }
// TODO(yifan): Delete this function when the logic is moved to kubelet. func (r *runtime) ConvertPodStatusToAPIPodStatus(pod *api.Pod, status *kubecontainer.PodStatus) (*api.PodStatus, error) { apiPodStatus := &api.PodStatus{ PodIP: status.IP, ContainerStatuses: make([]api.ContainerStatus, 0, 1), } containerStatuses := make(map[string]*api.ContainerStatus) for _, c := range status.ContainerStatuses { var st api.ContainerState switch c.State { case kubecontainer.ContainerStateRunning: st.Running = &api.ContainerStateRunning{ StartedAt: unversioned.NewTime(c.StartedAt), } case kubecontainer.ContainerStateExited: st.Terminated = &api.ContainerStateTerminated{ ExitCode: c.ExitCode, StartedAt: unversioned.NewTime(c.StartedAt), Reason: c.Reason, Message: c.Message, FinishedAt: unversioned.NewTime(c.FinishedAt), ContainerID: c.ID.String(), } default: // Unknown state. st.Waiting = &api.ContainerStateWaiting{} } status, ok := containerStatuses[c.Name] if !ok { containerStatuses[c.Name] = &api.ContainerStatus{ Name: c.Name, Image: c.Image, ImageID: c.ImageID, ContainerID: c.ID.String(), RestartCount: c.RestartCount, State: st, } continue } // Found multiple container statuses, fill that as last termination state. if status.LastTerminationState.Waiting == nil && status.LastTerminationState.Running == nil && status.LastTerminationState.Terminated == nil { status.LastTerminationState = st } } for _, c := range pod.Spec.Containers { cs, ok := containerStatuses[c.Name] if !ok { cs = &api.ContainerStatus{ Name: c.Name, Image: c.Image, // TODO(yifan): Add reason and message. State: api.ContainerState{Waiting: &api.ContainerStateWaiting{}}, } } apiPodStatus.ContainerStatuses = append(apiPodStatus.ContainerStatuses, *cs) } sort.Sort(kubetypes.SortedContainerStatuses(apiPodStatus.ContainerStatuses)) return apiPodStatus, nil }