From 3f630d8ad7c162d7cac8fedfb32b35f0cc7240ff Mon Sep 17 00:00:00 2001 From: eulerzgy Date: Mon, 26 Oct 2015 17:16:08 +0800 Subject: [PATCH] when pod has successed, update condition to PodCompleted --- pkg/kubelet/kubelet.go | 10 ++++++++-- pkg/kubelet/kubelet_test.go | 21 ++++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 87ab78ba59f..29ce3032d3f 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -2657,7 +2657,7 @@ func readyPodCondition(isPodReady bool, reason, message string) []api.PodConditi } // getPodReadyCondition returns ready condition if all containers in a pod are ready, else it returns an unready condition. -func getPodReadyCondition(spec *api.PodSpec, containerStatuses []api.ContainerStatus) []api.PodCondition { +func getPodReadyCondition(spec *api.PodSpec, containerStatuses []api.ContainerStatus, podPhase api.PodPhase) []api.PodCondition { // Find if all containers are ready or not. if containerStatuses == nil { return readyPodCondition(false, "UnknownContainerStatuses", "") @@ -2673,6 +2673,12 @@ func getPodReadyCondition(spec *api.PodSpec, containerStatuses []api.ContainerSt unknownContainers = append(unknownContainers, container.Name) } } + + // In case of unexist unknowContainers, If pod has derminated successed and it has unreadyContainers, just return PodCompleted + if podPhase == api.PodSucceeded && len(unknownContainers) == 0 { + return readyPodCondition(false, fmt.Sprint("PodCompleted"), "") + } + unreadyMessages := []string{} if len(unknownContainers) > 0 { unreadyMessages = append(unreadyMessages, fmt.Sprintf("containers with unknown status: %s", unknownContainers)) @@ -2734,7 +2740,7 @@ func (kl *Kubelet) generatePodStatus(pod *api.Pod) (api.PodStatus, error) { podStatus.Phase = GetPhase(spec, podStatus.ContainerStatuses) kl.probeManager.UpdatePodStatus(pod.UID, podStatus) - podStatus.Conditions = append(podStatus.Conditions, getPodReadyCondition(spec, podStatus.ContainerStatuses)...) + podStatus.Conditions = append(podStatus.Conditions, getPodReadyCondition(spec, podStatus.ContainerStatuses, podStatus.Phase)...) if !kl.standaloneMode { hostIP, err := kl.GetHostIP() diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index c4670fd1b64..3567bcdfc2f 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -1875,16 +1875,19 @@ func TestGetPodReadyCondition(t *testing.T) { tests := []struct { spec *api.PodSpec containerStatuses []api.ContainerStatus + podPhase api.PodPhase expected []api.PodCondition }{ { spec: nil, containerStatuses: nil, + podPhase: api.PodRunning, expected: getReadyCondition(api.ConditionFalse, "UnknownContainerStatuses", ""), }, { spec: &api.PodSpec{}, containerStatuses: []api.ContainerStatus{}, + podPhase: api.PodRunning, expected: getReadyCondition(api.ConditionTrue, "", ""), }, { @@ -1894,6 +1897,7 @@ func TestGetPodReadyCondition(t *testing.T) { }, }, containerStatuses: []api.ContainerStatus{}, + podPhase: api.PodRunning, expected: getReadyCondition(api.ConditionFalse, "ContainersNotReady", "containers with unknown status: [1234]"), }, { @@ -1907,6 +1911,7 @@ func TestGetPodReadyCondition(t *testing.T) { getReadyStatus("1234"), getReadyStatus("5678"), }, + podPhase: api.PodRunning, expected: getReadyCondition(api.ConditionTrue, "", ""), }, { @@ -1919,6 +1924,7 @@ func TestGetPodReadyCondition(t *testing.T) { containerStatuses: []api.ContainerStatus{ getReadyStatus("1234"), }, + podPhase: api.PodRunning, expected: getReadyCondition(api.ConditionFalse, "ContainersNotReady", "containers with unknown status: [5678]"), }, { @@ -1932,12 +1938,25 @@ func TestGetPodReadyCondition(t *testing.T) { getReadyStatus("1234"), getNotReadyStatus("5678"), }, + podPhase: api.PodRunning, expected: getReadyCondition(api.ConditionFalse, "ContainersNotReady", "containers with unready status: [5678]"), }, + { + spec: &api.PodSpec{ + Containers: []api.Container{ + {Name: "1234"}, + }, + }, + containerStatuses: []api.ContainerStatus{ + getNotReadyStatus("1234"), + }, + podPhase: api.PodSucceeded, + expected: getReadyCondition(api.ConditionFalse, "PodCompleted", ""), + }, } for i, test := range tests { - condition := getPodReadyCondition(test.spec, test.containerStatuses) + condition := getPodReadyCondition(test.spec, test.containerStatuses, test.podPhase) if !reflect.DeepEqual(condition, test.expected) { t.Errorf("On test case %v, expected:\n%+v\ngot\n%+v\n", i, test.expected, condition) }