func TestStaleUpdates(t *testing.T) { pod := getTestPod() client := fake.NewSimpleClientset(pod) m := newTestManager(client) status := api.PodStatus{Message: "initial status"} m.SetPodStatus(pod, status) status.Message = "first version bump" m.SetPodStatus(pod, status) status.Message = "second version bump" m.SetPodStatus(pod, status) verifyUpdates(t, m, 3) t.Logf("First sync pushes latest status.") m.testSyncBatch() verifyActions(t, m.kubeClient, []core.Action{ core.GetActionImpl{ActionImpl: core.ActionImpl{Verb: "get", Resource: "pods"}}, core.UpdateActionImpl{ActionImpl: core.ActionImpl{Verb: "update", Resource: "pods", Subresource: "status"}}, }) client.ClearActions() for i := 0; i < 2; i++ { t.Logf("Next 2 syncs should be ignored (%d).", i) m.testSyncBatch() verifyActions(t, m.kubeClient, []core.Action{}) } t.Log("Unchanged status should not send an update.") m.SetPodStatus(pod, status) verifyUpdates(t, m, 0) t.Log("... unless it's stale.") m.apiStatusVersions[pod.UID] = m.apiStatusVersions[pod.UID] - 1 m.SetPodStatus(pod, status) m.testSyncBatch() verifyActions(t, m.kubeClient, []core.Action{ core.GetActionImpl{ActionImpl: core.ActionImpl{Verb: "get", Resource: "pods"}}, core.UpdateActionImpl{ActionImpl: core.ActionImpl{Verb: "update", Resource: "pods", Subresource: "status"}}, }) // Nothing stuck in the pipe. verifyUpdates(t, m, 0) }
// GetPodStatus retrieves the status of the pod, including the information of // all containers in the pod. Clients of this interface assume the containers // statuses in a pod always have a deterministic ordering (eg: sorted by name). func (r *runtime) GetPodStatus(pod *api.Pod) (*api.PodStatus, error) { podInfos, err := r.hyperClient.ListPods() if err != nil { glog.Errorf("Hyper: ListPods failed, error: %s", err) return nil, err } var status api.PodStatus podFullName := r.buildHyperPodFullName(string(pod.UID), string(pod.Name), string(pod.Namespace)) for _, podInfo := range podInfos { if podInfo.PodName != podFullName { continue } if len(podInfo.PodInfo.Status.PodIP) > 0 { status.PodIP = podInfo.PodInfo.Status.PodIP[0] } status.HostIP = podInfo.PodInfo.Status.HostIP status.Phase = api.PodPhase(podInfo.PodInfo.Status.Phase) status.Message = podInfo.PodInfo.Status.Message status.Reason = podInfo.PodInfo.Status.Reason for _, containerInfo := range podInfo.PodInfo.Status.Status { for _, container := range podInfo.PodInfo.Spec.Containers { if container.ContainerID == containerInfo.ContainerID { status.ContainerStatuses = append( status.ContainerStatuses, r.getContainerStatus(containerInfo, container.Image, container.ImageID)) } } } } glog.V(5).Infof("Hyper: get pod %s status %s", podFullName, status) return &status, nil }