Skip to content

Commit 99891ef

Browse files
authored
Merge pull request kubernetes#124901 from zhifei92/normalize-ephemeral-container-status
normalize ephemeral container statuses
2 parents 36de77c + 86e0ed1 commit 99891ef

File tree

2 files changed

+80
-26
lines changed

2 files changed

+80
-26
lines changed

pkg/kubelet/status/status_manager.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,7 @@ func (m *manager) needsReconcile(uid types.UID, status v1.PodStatus) bool {
993993
// Related issue #15262/PR #15263 to move apiserver to RFC339NANO is closed.
994994
func normalizeStatus(pod *v1.Pod, status *v1.PodStatus) *v1.PodStatus {
995995
bytesPerStatus := kubecontainer.MaxPodTerminationMessageLogLength
996-
if containers := len(pod.Spec.Containers) + len(pod.Spec.InitContainers); containers > 0 {
996+
if containers := len(pod.Spec.Containers) + len(pod.Spec.InitContainers) + len(pod.Spec.EphemeralContainers); containers > 0 {
997997
bytesPerStatus = bytesPerStatus / containers
998998
}
999999
normalizeTimeStamp := func(t *metav1.Time) {
@@ -1021,23 +1021,23 @@ func normalizeStatus(pod *v1.Pod, status *v1.PodStatus) *v1.PodStatus {
10211021
normalizeTimeStamp(&condition.LastTransitionTime)
10221022
}
10231023

1024-
// update container statuses
1025-
for i := range status.ContainerStatuses {
1026-
cstatus := &status.ContainerStatuses[i]
1027-
normalizeContainerState(&cstatus.State)
1028-
normalizeContainerState(&cstatus.LastTerminationState)
1024+
normalizeContainerStatuses := func(containerStatuses []v1.ContainerStatus) {
1025+
for i := range containerStatuses {
1026+
cstatus := &containerStatuses[i]
1027+
normalizeContainerState(&cstatus.State)
1028+
normalizeContainerState(&cstatus.LastTerminationState)
1029+
}
10291030
}
1030-
// Sort the container statuses, so that the order won't affect the result of comparison
1031+
1032+
normalizeContainerStatuses(status.ContainerStatuses)
10311033
sort.Sort(kubetypes.SortedContainerStatuses(status.ContainerStatuses))
10321034

1033-
// update init container statuses
1034-
for i := range status.InitContainerStatuses {
1035-
cstatus := &status.InitContainerStatuses[i]
1036-
normalizeContainerState(&cstatus.State)
1037-
normalizeContainerState(&cstatus.LastTerminationState)
1038-
}
1039-
// Sort the container statuses, so that the order won't affect the result of comparison
1035+
normalizeContainerStatuses(status.InitContainerStatuses)
10401036
kubetypes.SortInitContainerStatuses(pod, status.InitContainerStatuses)
1037+
1038+
normalizeContainerStatuses(status.EphemeralContainerStatuses)
1039+
sort.Sort(kubetypes.SortedContainerStatuses(status.EphemeralContainerStatuses))
1040+
10411041
return status
10421042
}
10431043

pkg/kubelet/status/status_manager_test.go

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -445,22 +445,32 @@ func shuffle(statuses []v1.ContainerStatus) []v1.ContainerStatus {
445445
}
446446

447447
func TestStatusEquality(t *testing.T) {
448-
pod := v1.Pod{
449-
Spec: v1.PodSpec{},
450-
}
451-
containerStatus := []v1.ContainerStatus{}
452-
for i := 0; i < 10; i++ {
453-
s := v1.ContainerStatus{
454-
Name: fmt.Sprintf("container%d", i),
448+
getContainersAndStatuses := func() ([]v1.Container, []v1.ContainerStatus) {
449+
var containers []v1.Container
450+
var containerStatuses []v1.ContainerStatus
451+
for i := 0; i < 10; i++ {
452+
containerName := fmt.Sprintf("container%d", i)
453+
containers = append(containers, v1.Container{Name: containerName})
454+
containerStatuses = append(containerStatuses, v1.ContainerStatus{Name: containerName})
455455
}
456-
containerStatus = append(containerStatus, s)
456+
return containers, containerStatuses
457+
}
458+
containers, containerStatuses := getContainersAndStatuses()
459+
pod := v1.Pod{
460+
Spec: v1.PodSpec{
461+
InitContainers: containers,
462+
},
457463
}
458464
podStatus := v1.PodStatus{
459-
ContainerStatuses: containerStatus,
465+
ContainerStatuses: containerStatuses,
466+
InitContainerStatuses: containerStatuses,
467+
EphemeralContainerStatuses: containerStatuses,
460468
}
461469
for i := 0; i < 10; i++ {
462470
oldPodStatus := v1.PodStatus{
463-
ContainerStatuses: shuffle(podStatus.ContainerStatuses),
471+
ContainerStatuses: shuffle(podStatus.ContainerStatuses),
472+
InitContainerStatuses: shuffle(podStatus.InitContainerStatuses),
473+
EphemeralContainerStatuses: shuffle(podStatus.EphemeralContainerStatuses),
464474
}
465475
normalizeStatus(&pod, &oldPodStatus)
466476
normalizeStatus(&pod, &podStatus)
@@ -504,8 +514,9 @@ func TestStatusNormalizationEnforcesMaxBytes(t *testing.T) {
504514
containerStatus = append(containerStatus, s)
505515
}
506516
podStatus := v1.PodStatus{
507-
InitContainerStatuses: containerStatus[:24],
508-
ContainerStatuses: containerStatus[24:],
517+
InitContainerStatuses: containerStatus[:16],
518+
ContainerStatuses: containerStatus[16:32],
519+
EphemeralContainerStatuses: containerStatus[32:],
509520
}
510521
result := normalizeStatus(&pod, &podStatus)
511522
count := 0
@@ -521,6 +532,49 @@ func TestStatusNormalizationEnforcesMaxBytes(t *testing.T) {
521532
}
522533
}
523534

535+
func TestStatusNormalizeTimeStamp(t *testing.T) {
536+
pod := v1.Pod{
537+
Spec: v1.PodSpec{},
538+
}
539+
540+
now := metav1.Now()
541+
podStatus := v1.PodStatus{
542+
ContainerStatuses: []v1.ContainerStatus{
543+
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
544+
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
545+
},
546+
InitContainerStatuses: []v1.ContainerStatus{
547+
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
548+
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
549+
},
550+
EphemeralContainerStatuses: []v1.ContainerStatus{
551+
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
552+
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
553+
},
554+
}
555+
556+
expectedTime := now.DeepCopy().Rfc3339Copy()
557+
expectedPodStatus := v1.PodStatus{
558+
ContainerStatuses: []v1.ContainerStatus{
559+
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
560+
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
561+
},
562+
InitContainerStatuses: []v1.ContainerStatus{
563+
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
564+
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
565+
},
566+
EphemeralContainerStatuses: []v1.ContainerStatus{
567+
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
568+
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
569+
},
570+
}
571+
572+
normalizedStatus := normalizeStatus(&pod, &podStatus)
573+
if !isPodStatusByKubeletEqual(&expectedPodStatus, normalizedStatus) {
574+
t.Fatalf("The timestamp is not correctly converted to RFC3339 format.")
575+
}
576+
}
577+
524578
func TestStaticPod(t *testing.T) {
525579
staticPod := getTestPod()
526580
staticPod.Annotations = map[string]string{kubetypes.ConfigSourceAnnotationKey: "file"}

0 commit comments

Comments
 (0)