// TODO(random-liu): Convert PodStatus to running Pod, should be deprecated soon func ConvertPodStatusToRunningPod(runtimeName string, podStatus *kubecontainer.PodStatus) kubecontainer.Pod { runningPod := kubecontainer.Pod{ ID: podStatus.ID, Name: podStatus.Name, Namespace: podStatus.Namespace, } for _, containerStatus := range podStatus.ContainerStatuses { if containerStatus.State != kubecontainer.ContainerStateRunning { continue } container := &kubecontainer.Container{ ID: containerStatus.ID, Name: containerStatus.Name, Image: containerStatus.Image, ImageID: containerStatus.ImageID, Hash: containerStatus.Hash, State: containerStatus.State, } runningPod.Containers = append(runningPod.Containers, container) } // Need to place a sandbox in the Pod as well. for _, sandbox := range podStatus.SandboxStatuses { runningPod.Sandboxes = append(runningPod.Sandboxes, &kubecontainer.Container{ ID: kubecontainer.ContainerID{Type: runtimeName, ID: *sandbox.Id}, State: sandboxToKubeContainerState(*sandbox.State), }) } return runningPod }
// GetPods returns a list containers group by pods. The boolean parameter // specifies whether the runtime returns all containers including those already // exited and dead containers (used for garbage collection). func (r *runtime) GetPods(all bool) ([]*kubecontainer.Pod, error) { podInfos, err := r.hyperClient.ListPods() if err != nil { return nil, err } var kubepods []*kubecontainer.Pod for _, podInfo := range podInfos { var pod kubecontainer.Pod var containers []*kubecontainer.Container podID, podName, podNamespace, err := r.parseHyperPodFullName(podInfo.PodName) if err != nil { glog.V(5).Infof("Hyper: pod %s is not managed by kubelet", podInfo.PodName) continue } pod.ID = types.UID(podID) pod.Name = podName pod.Namespace = podNamespace for _, cinfo := range podInfo.PodInfo.Spec.Containers { var container kubecontainer.Container container.ID = kubecontainer.ContainerID{Type: typeHyper, ID: cinfo.ContainerID} container.Image = cinfo.Image for _, cstatus := range podInfo.PodInfo.Status.Status { if cstatus.ContainerID == r.buildContainerID(cinfo.ContainerID) { createAt, err := parseTimeString(cstatus.Running.StartedAt) if err == nil { container.Created = createAt.Unix() } } } _, _, _, containerName, containerHash, err := r.parseHyperContainerFullName(cinfo.Name) if err != nil { glog.V(5).Infof("Hyper: container %s is not managed by kubelet", cinfo.Name) continue } container.Name = containerName hash, err := strconv.ParseUint(containerHash, 16, 64) if err == nil { container.Hash = hash } containers = append(containers, &container) } pod.Containers = containers kubepods = append(kubepods, &pod) } return kubepods, nil }
func dockerContainersToPod(containers []*docker.APIContainers) kubecontainer.Pod { var pod kubecontainer.Pod for _, c := range containers { dockerName, hash, err := ParseDockerName(c.Names[0]) if err != nil { continue } pod.Containers = append(pod.Containers, &kubecontainer.Container{ ID: kubecontainer.ContainerID{"docker", c.ID}, Name: dockerName.ContainerName, Hash: hash, Image: c.Image, }) // TODO(yifan): Only one evaluation is enough. pod.ID = dockerName.PodUID name, namespace, _ := kubecontainer.ParsePodFullName(dockerName.PodFullName) pod.Name = name pod.Namespace = namespace } return pod }
// GetPods returns a list containers group by pods. The boolean parameter // specifies whether the runtime returns all containers including those already // exited and dead containers (used for garbage collection). func (r *runtime) GetPods(all bool) ([]*kubecontainer.Pod, error) { podInfos, err := r.hyperClient.ListPods() if err != nil { return nil, err } var kubepods []*kubecontainer.Pod for _, podInfo := range podInfos { var pod kubecontainer.Pod var containers []*kubecontainer.Container if !all && podInfo.Status != StatusRunning { continue } podID := podInfo.PodInfo.Spec.Labels[KEY_API_POD_UID] podName, podNamespace, err := kubecontainer.ParsePodFullName(podInfo.PodName) if err != nil { glog.V(5).Infof("Hyper: pod %s is not managed by kubelet", podInfo.PodName) continue } pod.ID = types.UID(podID) pod.Name = podName pod.Namespace = podNamespace for _, cinfo := range podInfo.PodInfo.Spec.Containers { var container kubecontainer.Container container.ID = kubecontainer.ContainerID{Type: typeHyper, ID: cinfo.ContainerID} container.Image = cinfo.Image for _, cstatus := range podInfo.PodInfo.Status.ContainerStatus { if cstatus.ContainerID == cinfo.ContainerID { switch cstatus.Phase { case StatusRunning: container.State = kubecontainer.ContainerStateRunning default: container.State = kubecontainer.ContainerStateExited } // harryz: container.Created is moved to ContainerStatus // createAt, err := parseTimeString(cstatus.Running.StartedAt) // if err == nil { // container.Created = createAt.Unix() // } } } _, _, _, containerName, _, containerHash, err := r.parseHyperContainerFullName(cinfo.Name) if err != nil { glog.V(5).Infof("Hyper: container %s is not managed by kubelet", cinfo.Name) continue } container.Name = containerName hash, err := strconv.ParseUint(containerHash, 16, 64) if err == nil { container.Hash = hash } containers = append(containers, &container) } pod.Containers = containers kubepods = append(kubepods, &pod) } return kubepods, nil }