diff --git a/pkg/kubelet/status/generate.go b/pkg/kubelet/status/generate.go index 9826d9ac91a..f7d94c72b76 100644 --- a/pkg/kubelet/status/generate.go +++ b/pkg/kubelet/status/generate.go @@ -23,6 +23,13 @@ import ( "k8s.io/kubernetes/pkg/api/v1" ) +const ( + UnknownContainerStatuses = "UnknownContainerStatuses" + PodCompleted = "PodCompleted" + ContainersNotReady = "ContainersNotReady" + ContainersNotInitialized = "ContainersNotInitialized" +) + // GeneratePodReadyCondition returns ready condition if all containers in a pod are ready, else it // returns an unready condition. func GeneratePodReadyCondition(spec *v1.PodSpec, containerStatuses []v1.ContainerStatus, podPhase v1.PodPhase) v1.PodCondition { @@ -31,7 +38,7 @@ func GeneratePodReadyCondition(spec *v1.PodSpec, containerStatuses []v1.Containe return v1.PodCondition{ Type: v1.PodReady, Status: v1.ConditionFalse, - Reason: "UnknownContainerStatuses", + Reason: UnknownContainerStatuses, } } unknownContainers := []string{} @@ -51,7 +58,7 @@ func GeneratePodReadyCondition(spec *v1.PodSpec, containerStatuses []v1.Containe return v1.PodCondition{ Type: v1.PodReady, Status: v1.ConditionFalse, - Reason: "PodCompleted", + Reason: PodCompleted, } } @@ -67,7 +74,7 @@ func GeneratePodReadyCondition(spec *v1.PodSpec, containerStatuses []v1.Containe return v1.PodCondition{ Type: v1.PodReady, Status: v1.ConditionFalse, - Reason: "ContainersNotReady", + Reason: ContainersNotReady, Message: unreadyMessage, } } @@ -86,7 +93,7 @@ func GeneratePodInitializedCondition(spec *v1.PodSpec, containerStatuses []v1.Co return v1.PodCondition{ Type: v1.PodInitialized, Status: v1.ConditionFalse, - Reason: "UnknownContainerStatuses", + Reason: UnknownContainerStatuses, } } unknownContainers := []string{} @@ -106,7 +113,7 @@ func GeneratePodInitializedCondition(spec *v1.PodSpec, containerStatuses []v1.Co return v1.PodCondition{ Type: v1.PodInitialized, Status: v1.ConditionTrue, - Reason: "PodCompleted", + Reason: PodCompleted, } } @@ -122,7 +129,7 @@ func GeneratePodInitializedCondition(spec *v1.PodSpec, containerStatuses []v1.Co return v1.PodCondition{ Type: v1.PodInitialized, Status: v1.ConditionFalse, - Reason: "ContainersNotInitialized", + Reason: ContainersNotInitialized, Message: unreadyMessage, } } diff --git a/pkg/kubelet/status/generate_test.go b/pkg/kubelet/status/generate_test.go index 783c9b05344..bcb06b36108 100644 --- a/pkg/kubelet/status/generate_test.go +++ b/pkg/kubelet/status/generate_test.go @@ -20,6 +20,7 @@ import ( "reflect" "testing" + "github.com/stretchr/testify/assert" "k8s.io/kubernetes/pkg/api/v1" ) @@ -34,7 +35,7 @@ func TestGeneratePodReadyCondition(t *testing.T) { spec: nil, containerStatuses: nil, podPhase: v1.PodRunning, - expected: getReadyCondition(false, "UnknownContainerStatuses", ""), + expected: getReadyCondition(false, UnknownContainerStatuses, ""), }, { spec: &v1.PodSpec{}, @@ -50,7 +51,7 @@ func TestGeneratePodReadyCondition(t *testing.T) { }, containerStatuses: []v1.ContainerStatus{}, podPhase: v1.PodRunning, - expected: getReadyCondition(false, "ContainersNotReady", "containers with unknown status: [1234]"), + expected: getReadyCondition(false, ContainersNotReady, "containers with unknown status: [1234]"), }, { spec: &v1.PodSpec{ @@ -77,7 +78,7 @@ func TestGeneratePodReadyCondition(t *testing.T) { getReadyStatus("1234"), }, podPhase: v1.PodRunning, - expected: getReadyCondition(false, "ContainersNotReady", "containers with unknown status: [5678]"), + expected: getReadyCondition(false, ContainersNotReady, "containers with unknown status: [5678]"), }, { spec: &v1.PodSpec{ @@ -91,7 +92,7 @@ func TestGeneratePodReadyCondition(t *testing.T) { getNotReadyStatus("5678"), }, podPhase: v1.PodRunning, - expected: getReadyCondition(false, "ContainersNotReady", "containers with unready status: [5678]"), + expected: getReadyCondition(false, ContainersNotReady, "containers with unready status: [5678]"), }, { spec: &v1.PodSpec{ @@ -103,7 +104,7 @@ func TestGeneratePodReadyCondition(t *testing.T) { getNotReadyStatus("1234"), }, podPhase: v1.PodSucceeded, - expected: getReadyCondition(false, "PodCompleted", ""), + expected: getReadyCondition(false, PodCompleted, ""), }, } @@ -115,6 +116,110 @@ func TestGeneratePodReadyCondition(t *testing.T) { } } +func TestGeneratePodInitializedCondition(t *testing.T) { + noInitContainer := &v1.PodSpec{} + oneInitContainer := &v1.PodSpec{ + InitContainers: []v1.Container{ + {Name: "1234"}, + }, + } + twoInitContainer := &v1.PodSpec{ + InitContainers: []v1.Container{ + {Name: "1234"}, + {Name: "5678"}, + }, + } + tests := []struct { + spec *v1.PodSpec + containerStatuses []v1.ContainerStatus + podPhase v1.PodPhase + expected v1.PodCondition + }{ + { + spec: twoInitContainer, + containerStatuses: nil, + podPhase: v1.PodRunning, + expected: v1.PodCondition{ + Status: v1.ConditionFalse, + Reason: UnknownContainerStatuses, + }, + }, + { + spec: noInitContainer, + containerStatuses: []v1.ContainerStatus{}, + podPhase: v1.PodRunning, + expected: v1.PodCondition{ + Status: v1.ConditionTrue, + Reason: "", + }, + }, + { + spec: oneInitContainer, + containerStatuses: []v1.ContainerStatus{}, + podPhase: v1.PodRunning, + expected: v1.PodCondition{ + Status: v1.ConditionFalse, + Reason: ContainersNotInitialized, + }, + }, + { + spec: twoInitContainer, + containerStatuses: []v1.ContainerStatus{ + getReadyStatus("1234"), + getReadyStatus("5678"), + }, + podPhase: v1.PodRunning, + expected: v1.PodCondition{ + Status: v1.ConditionTrue, + Reason: "", + }, + }, + { + spec: twoInitContainer, + containerStatuses: []v1.ContainerStatus{ + getReadyStatus("1234"), + }, + podPhase: v1.PodRunning, + expected: v1.PodCondition{ + Status: v1.ConditionFalse, + Reason: ContainersNotInitialized, + }, + }, + { + spec: twoInitContainer, + containerStatuses: []v1.ContainerStatus{ + getReadyStatus("1234"), + getNotReadyStatus("5678"), + }, + podPhase: v1.PodRunning, + expected: v1.PodCondition{ + Status: v1.ConditionFalse, + Reason: ContainersNotInitialized, + }, + }, + { + spec: oneInitContainer, + containerStatuses: []v1.ContainerStatus{ + getReadyStatus("1234"), + }, + podPhase: v1.PodSucceeded, + expected: v1.PodCondition{ + Status: v1.ConditionTrue, + Reason: PodCompleted, + }, + }, + } + + for _, test := range tests { + test.expected.Type = v1.PodInitialized + condition := GeneratePodInitializedCondition(test.spec, test.containerStatuses, test.podPhase) + assert.Equal(t, test.expected.Type, condition.Type) + assert.Equal(t, test.expected.Status, condition.Status) + assert.Equal(t, test.expected.Reason, condition.Reason) + + } +} + func getReadyCondition(ready bool, reason, message string) v1.PodCondition { status := v1.ConditionFalse if ready {