func convert_v1beta3_ContainerState_To_api_ContainerState(in *ContainerState, out *api.ContainerState, s conversion.Scope) error { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { defaulting.(func(*ContainerState))(in) } if in.Waiting != nil { out.Waiting = new(api.ContainerStateWaiting) if err := convert_v1beta3_ContainerStateWaiting_To_api_ContainerStateWaiting(in.Waiting, out.Waiting, s); err != nil { return err } } else { out.Waiting = nil } if in.Running != nil { out.Running = new(api.ContainerStateRunning) if err := convert_v1beta3_ContainerStateRunning_To_api_ContainerStateRunning(in.Running, out.Running, s); err != nil { return err } } else { out.Running = nil } if in.Termination != nil { out.Terminated = new(api.ContainerStateTerminated) if err := convert_v1beta3_ContainerStateTerminated_To_api_ContainerStateTerminated(in.Termination, out.Terminated, s); err != nil { return err } } else { out.Terminated = nil } return 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{ // 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 }