mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
Merge pull request #124901 from zhifei92/normalize-ephemeral-container-status
normalize ephemeral container statuses
This commit is contained in:
commit
99891ef08d
@ -993,7 +993,7 @@ func (m *manager) needsReconcile(uid types.UID, status v1.PodStatus) bool {
|
|||||||
// Related issue #15262/PR #15263 to move apiserver to RFC339NANO is closed.
|
// Related issue #15262/PR #15263 to move apiserver to RFC339NANO is closed.
|
||||||
func normalizeStatus(pod *v1.Pod, status *v1.PodStatus) *v1.PodStatus {
|
func normalizeStatus(pod *v1.Pod, status *v1.PodStatus) *v1.PodStatus {
|
||||||
bytesPerStatus := kubecontainer.MaxPodTerminationMessageLogLength
|
bytesPerStatus := kubecontainer.MaxPodTerminationMessageLogLength
|
||||||
if containers := len(pod.Spec.Containers) + len(pod.Spec.InitContainers); containers > 0 {
|
if containers := len(pod.Spec.Containers) + len(pod.Spec.InitContainers) + len(pod.Spec.EphemeralContainers); containers > 0 {
|
||||||
bytesPerStatus = bytesPerStatus / containers
|
bytesPerStatus = bytesPerStatus / containers
|
||||||
}
|
}
|
||||||
normalizeTimeStamp := func(t *metav1.Time) {
|
normalizeTimeStamp := func(t *metav1.Time) {
|
||||||
@ -1021,23 +1021,23 @@ func normalizeStatus(pod *v1.Pod, status *v1.PodStatus) *v1.PodStatus {
|
|||||||
normalizeTimeStamp(&condition.LastTransitionTime)
|
normalizeTimeStamp(&condition.LastTransitionTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
// update container statuses
|
normalizeContainerStatuses := func(containerStatuses []v1.ContainerStatus) {
|
||||||
for i := range status.ContainerStatuses {
|
for i := range containerStatuses {
|
||||||
cstatus := &status.ContainerStatuses[i]
|
cstatus := &containerStatuses[i]
|
||||||
normalizeContainerState(&cstatus.State)
|
normalizeContainerState(&cstatus.State)
|
||||||
normalizeContainerState(&cstatus.LastTerminationState)
|
normalizeContainerState(&cstatus.LastTerminationState)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Sort the container statuses, so that the order won't affect the result of comparison
|
|
||||||
|
normalizeContainerStatuses(status.ContainerStatuses)
|
||||||
sort.Sort(kubetypes.SortedContainerStatuses(status.ContainerStatuses))
|
sort.Sort(kubetypes.SortedContainerStatuses(status.ContainerStatuses))
|
||||||
|
|
||||||
// update init container statuses
|
normalizeContainerStatuses(status.InitContainerStatuses)
|
||||||
for i := range status.InitContainerStatuses {
|
|
||||||
cstatus := &status.InitContainerStatuses[i]
|
|
||||||
normalizeContainerState(&cstatus.State)
|
|
||||||
normalizeContainerState(&cstatus.LastTerminationState)
|
|
||||||
}
|
|
||||||
// Sort the container statuses, so that the order won't affect the result of comparison
|
|
||||||
kubetypes.SortInitContainerStatuses(pod, status.InitContainerStatuses)
|
kubetypes.SortInitContainerStatuses(pod, status.InitContainerStatuses)
|
||||||
|
|
||||||
|
normalizeContainerStatuses(status.EphemeralContainerStatuses)
|
||||||
|
sort.Sort(kubetypes.SortedContainerStatuses(status.EphemeralContainerStatuses))
|
||||||
|
|
||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -445,22 +445,32 @@ func shuffle(statuses []v1.ContainerStatus) []v1.ContainerStatus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestStatusEquality(t *testing.T) {
|
func TestStatusEquality(t *testing.T) {
|
||||||
pod := v1.Pod{
|
getContainersAndStatuses := func() ([]v1.Container, []v1.ContainerStatus) {
|
||||||
Spec: v1.PodSpec{},
|
var containers []v1.Container
|
||||||
}
|
var containerStatuses []v1.ContainerStatus
|
||||||
containerStatus := []v1.ContainerStatus{}
|
for i := 0; i < 10; i++ {
|
||||||
for i := 0; i < 10; i++ {
|
containerName := fmt.Sprintf("container%d", i)
|
||||||
s := v1.ContainerStatus{
|
containers = append(containers, v1.Container{Name: containerName})
|
||||||
Name: fmt.Sprintf("container%d", i),
|
containerStatuses = append(containerStatuses, v1.ContainerStatus{Name: containerName})
|
||||||
}
|
}
|
||||||
containerStatus = append(containerStatus, s)
|
return containers, containerStatuses
|
||||||
|
}
|
||||||
|
containers, containerStatuses := getContainersAndStatuses()
|
||||||
|
pod := v1.Pod{
|
||||||
|
Spec: v1.PodSpec{
|
||||||
|
InitContainers: containers,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
podStatus := v1.PodStatus{
|
podStatus := v1.PodStatus{
|
||||||
ContainerStatuses: containerStatus,
|
ContainerStatuses: containerStatuses,
|
||||||
|
InitContainerStatuses: containerStatuses,
|
||||||
|
EphemeralContainerStatuses: containerStatuses,
|
||||||
}
|
}
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
oldPodStatus := v1.PodStatus{
|
oldPodStatus := v1.PodStatus{
|
||||||
ContainerStatuses: shuffle(podStatus.ContainerStatuses),
|
ContainerStatuses: shuffle(podStatus.ContainerStatuses),
|
||||||
|
InitContainerStatuses: shuffle(podStatus.InitContainerStatuses),
|
||||||
|
EphemeralContainerStatuses: shuffle(podStatus.EphemeralContainerStatuses),
|
||||||
}
|
}
|
||||||
normalizeStatus(&pod, &oldPodStatus)
|
normalizeStatus(&pod, &oldPodStatus)
|
||||||
normalizeStatus(&pod, &podStatus)
|
normalizeStatus(&pod, &podStatus)
|
||||||
@ -504,8 +514,9 @@ func TestStatusNormalizationEnforcesMaxBytes(t *testing.T) {
|
|||||||
containerStatus = append(containerStatus, s)
|
containerStatus = append(containerStatus, s)
|
||||||
}
|
}
|
||||||
podStatus := v1.PodStatus{
|
podStatus := v1.PodStatus{
|
||||||
InitContainerStatuses: containerStatus[:24],
|
InitContainerStatuses: containerStatus[:16],
|
||||||
ContainerStatuses: containerStatus[24:],
|
ContainerStatuses: containerStatus[16:32],
|
||||||
|
EphemeralContainerStatuses: containerStatus[32:],
|
||||||
}
|
}
|
||||||
result := normalizeStatus(&pod, &podStatus)
|
result := normalizeStatus(&pod, &podStatus)
|
||||||
count := 0
|
count := 0
|
||||||
@ -521,6 +532,49 @@ func TestStatusNormalizationEnforcesMaxBytes(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStatusNormalizeTimeStamp(t *testing.T) {
|
||||||
|
pod := v1.Pod{
|
||||||
|
Spec: v1.PodSpec{},
|
||||||
|
}
|
||||||
|
|
||||||
|
now := metav1.Now()
|
||||||
|
podStatus := v1.PodStatus{
|
||||||
|
ContainerStatuses: []v1.ContainerStatus{
|
||||||
|
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
|
||||||
|
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
|
||||||
|
},
|
||||||
|
InitContainerStatuses: []v1.ContainerStatus{
|
||||||
|
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
|
||||||
|
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
|
||||||
|
},
|
||||||
|
EphemeralContainerStatuses: []v1.ContainerStatus{
|
||||||
|
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: now}}},
|
||||||
|
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: now, FinishedAt: now}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
expectedTime := now.DeepCopy().Rfc3339Copy()
|
||||||
|
expectedPodStatus := v1.PodStatus{
|
||||||
|
ContainerStatuses: []v1.ContainerStatus{
|
||||||
|
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
|
||||||
|
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
|
||||||
|
},
|
||||||
|
InitContainerStatuses: []v1.ContainerStatus{
|
||||||
|
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
|
||||||
|
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
|
||||||
|
},
|
||||||
|
EphemeralContainerStatuses: []v1.ContainerStatus{
|
||||||
|
{State: v1.ContainerState{Running: &v1.ContainerStateRunning{StartedAt: expectedTime}}},
|
||||||
|
{State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{StartedAt: expectedTime, FinishedAt: expectedTime}}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
normalizedStatus := normalizeStatus(&pod, &podStatus)
|
||||||
|
if !isPodStatusByKubeletEqual(&expectedPodStatus, normalizedStatus) {
|
||||||
|
t.Fatalf("The timestamp is not correctly converted to RFC3339 format.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestStaticPod(t *testing.T) {
|
func TestStaticPod(t *testing.T) {
|
||||||
staticPod := getTestPod()
|
staticPod := getTestPod()
|
||||||
staticPod.Annotations = map[string]string{kubetypes.ConfigSourceAnnotationKey: "file"}
|
staticPod.Annotations = map[string]string{kubetypes.ConfigSourceAnnotationKey: "file"}
|
||||||
|
Loading…
Reference in New Issue
Block a user