From 5f489a33277bbe3d28173e5e298272ce5b77d366 Mon Sep 17 00:00:00 2001 From: kannon92 Date: Mon, 1 May 2023 13:57:09 +0000 Subject: [PATCH] feat: rename PodHasNetwork to PodReadyToStartContainers --- pkg/features/kube_features.go | 6 +-- pkg/kubelet/kubelet_pods.go | 4 +- pkg/kubelet/kubelet_pods_test.go | 64 ++++++++++++++-------------- pkg/kubelet/status/generate.go | 6 +-- pkg/kubelet/status/generate_test.go | 6 +-- pkg/kubelet/status/status_manager.go | 4 +- pkg/kubelet/types/constants.go | 7 ++- pkg/kubelet/types/pod_status.go | 4 +- pkg/kubelet/types/pod_status_test.go | 4 +- test/e2e_node/pod_conditions_test.go | 36 ++++++++-------- 10 files changed, 70 insertions(+), 71 deletions(-) diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 4bba72caea9..b8e44588a4b 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -630,9 +630,9 @@ const ( // owner: @ddebroy // alpha: v1.25 // - // Enables reporting of PodHasNetwork condition in pod status after pod + // Enables reporting of PodReadyToStartContainersCondition condition in pod status after pod // sandbox creation and network configuration completes successfully - PodHasNetworkCondition featuregate.Feature = "PodHasNetworkCondition" + PodReadyToStartContainersCondition featuregate.Feature = "PodReadyToStartContainersCondition" // owner: @Huang-Wei // kep: https://kep.k8s.io/3521 @@ -1043,7 +1043,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS PodDisruptionConditions: {Default: true, PreRelease: featuregate.Beta}, - PodHasNetworkCondition: {Default: false, PreRelease: featuregate.Alpha}, + PodReadyToStartContainersCondition: {Default: false, PreRelease: featuregate.Alpha}, PodSchedulingReadiness: {Default: true, PreRelease: featuregate.Beta}, diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index 7d53bdcf01b..2fab80ea485 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -1605,8 +1605,8 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po } // set all Kubelet-owned conditions - if utilfeature.DefaultFeatureGate.Enabled(features.PodHasNetworkCondition) { - s.Conditions = append(s.Conditions, status.GeneratePodHasNetworkCondition(pod, podStatus)) + if utilfeature.DefaultFeatureGate.Enabled(features.PodReadyToStartContainersCondition) { + s.Conditions = append(s.Conditions, status.GeneratePodReadyToStartContainersCondition(pod, podStatus)) } s.Conditions = append(s.Conditions, status.GeneratePodInitializedCondition(&pod.Spec, s.InitContainerStatuses, s.Phase)) s.Conditions = append(s.Conditions, status.GeneratePodReadyCondition(&pod.Spec, s.Conditions, s.ContainerStatuses, s.Phase)) diff --git a/pkg/kubelet/kubelet_pods_test.go b/pkg/kubelet/kubelet_pods_test.go index 753e6959c51..d4cc9707e6b 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -2819,16 +2819,16 @@ func Test_generateAPIPodStatus(t *testing.T) { normalized_now := now.Rfc3339Copy() tests := []struct { - name string - pod *v1.Pod - currentStatus *kubecontainer.PodStatus - unreadyContainer []string - previousStatus v1.PodStatus - isPodTerminal bool - enablePodDisruptionConditions bool - expected v1.PodStatus - expectedPodDisruptionCondition v1.PodCondition - expectedPodHasNetworkCondition v1.PodCondition + name string + pod *v1.Pod + currentStatus *kubecontainer.PodStatus + unreadyContainer []string + previousStatus v1.PodStatus + isPodTerminal bool + enablePodDisruptionConditions bool + expected v1.PodStatus + expectedPodDisruptionCondition v1.PodCondition + expectedPodReadyToStartContainersCondition v1.PodCondition }{ { name: "pod disruption condition is copied over and the phase is set to failed when deleted; PodDisruptionConditions enabled", @@ -2881,8 +2881,8 @@ func Test_generateAPIPodStatus(t *testing.T) { Status: v1.ConditionTrue, LastTransitionTime: normalized_now, }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionTrue, }, }, @@ -2920,8 +2920,8 @@ func Test_generateAPIPodStatus(t *testing.T) { ready(waitingWithLastTerminationUnknown("containerB", 0)), }, }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionTrue, }, }, @@ -2958,8 +2958,8 @@ func Test_generateAPIPodStatus(t *testing.T) { ready(waitingWithLastTerminationUnknown("containerB", 1)), }, }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionTrue, }, }, @@ -2997,8 +2997,8 @@ func Test_generateAPIPodStatus(t *testing.T) { ready(waitingWithLastTerminationUnknown("containerB", 1)), }, }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionFalse, }, }, @@ -3042,8 +3042,8 @@ func Test_generateAPIPodStatus(t *testing.T) { Reason: "Test", Message: "test", }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionFalse, }, }, @@ -3094,8 +3094,8 @@ func Test_generateAPIPodStatus(t *testing.T) { Reason: "Test", Message: "test", }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionFalse, }, }, @@ -3133,8 +3133,8 @@ func Test_generateAPIPodStatus(t *testing.T) { ready(waitingStateWithReason("containerB", "ContainerCreating")), }, }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionTrue, }, }, @@ -3187,8 +3187,8 @@ func Test_generateAPIPodStatus(t *testing.T) { ready(withID(runningStateWithStartedAt("containerB", time.Unix(1, 0).UTC()), "://foo")), }, }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionTrue, }, }, @@ -3245,17 +3245,17 @@ func Test_generateAPIPodStatus(t *testing.T) { ready(withID(runningStateWithStartedAt("containerB", time.Unix(2, 0).UTC()), "://c2")), }, }, - expectedPodHasNetworkCondition: v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + expectedPodReadyToStartContainersCondition: v1.PodCondition{ + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionTrue, }, }, } for _, test := range tests { - for _, enablePodHasNetworkCondition := range []bool{false, true} { + for _, enablePodReadyToStartContainersCondition := range []bool{false, true} { t.Run(test.name, func(t *testing.T) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodDisruptionConditions, test.enablePodDisruptionConditions)() - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodHasNetworkCondition, enablePodHasNetworkCondition)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodReadyToStartContainersCondition, enablePodReadyToStartContainersCondition)() testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */) defer testKubelet.Cleanup() kl := testKubelet.kubelet @@ -3265,8 +3265,8 @@ func Test_generateAPIPodStatus(t *testing.T) { } expected := test.expected.DeepCopy() actual := kl.generateAPIPodStatus(test.pod, test.currentStatus, test.isPodTerminal) - if enablePodHasNetworkCondition { - expected.Conditions = append([]v1.PodCondition{test.expectedPodHasNetworkCondition}, expected.Conditions...) + if enablePodReadyToStartContainersCondition { + expected.Conditions = append([]v1.PodCondition{test.expectedPodReadyToStartContainersCondition}, expected.Conditions...) } if test.enablePodDisruptionConditions { expected.Conditions = append([]v1.PodCondition{test.expectedPodDisruptionCondition}, expected.Conditions...) diff --git a/pkg/kubelet/status/generate.go b/pkg/kubelet/status/generate.go index 9f0a40f03cd..0b3fd517158 100644 --- a/pkg/kubelet/status/generate.go +++ b/pkg/kubelet/status/generate.go @@ -198,7 +198,7 @@ func GeneratePodInitializedCondition(spec *v1.PodSpec, containerStatuses []v1.Co } } -func GeneratePodHasNetworkCondition(pod *v1.Pod, podStatus *kubecontainer.PodStatus) v1.PodCondition { +func GeneratePodReadyToStartContainersCondition(pod *v1.Pod, podStatus *kubecontainer.PodStatus) v1.PodCondition { newSandboxNeeded, _, _ := runtimeutil.PodSandboxChanged(pod, podStatus) // if a new sandbox does not need to be created for a pod, it indicates that // a sandbox for the pod with networking configured already exists. @@ -206,12 +206,12 @@ func GeneratePodHasNetworkCondition(pod *v1.Pod, podStatus *kubecontainer.PodSta // fresh sandbox and configure networking for the sandbox. if !newSandboxNeeded { return v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionTrue, } } return v1.PodCondition{ - Type: kubetypes.PodHasNetwork, + Type: kubetypes.PodReadyToStartContainers, Status: v1.ConditionFalse, } } diff --git a/pkg/kubelet/status/generate_test.go b/pkg/kubelet/status/generate_test.go index b3ddaff6710..777df128869 100644 --- a/pkg/kubelet/status/generate_test.go +++ b/pkg/kubelet/status/generate_test.go @@ -422,7 +422,7 @@ func TestGeneratePodInitializedCondition(t *testing.T) { } } -func TestGeneratePodHasNetworkCondition(t *testing.T) { +func TestGeneratePodReadyToStartContainersCondition(t *testing.T) { for desc, test := range map[string]struct { pod *v1.Pod status *kubecontainer.PodStatus @@ -485,8 +485,8 @@ func TestGeneratePodHasNetworkCondition(t *testing.T) { }, } { t.Run(desc, func(t *testing.T) { - test.expected.Type = kubetypes.PodHasNetwork - condition := GeneratePodHasNetworkCondition(test.pod, test.status) + test.expected.Type = kubetypes.PodReadyToStartContainers + condition := GeneratePodReadyToStartContainersCondition(test.pod, test.status) require.Equal(t, test.expected.Type, condition.Type) require.Equal(t, test.expected.Status, condition.Status) }) diff --git a/pkg/kubelet/status/status_manager.go b/pkg/kubelet/status/status_manager.go index 52c93d3db66..df289341b92 100644 --- a/pkg/kubelet/status/status_manager.go +++ b/pkg/kubelet/status/status_manager.go @@ -589,8 +589,8 @@ func (m *manager) updateStatusInternal(pod *v1.Pod, status v1.PodStatus, forceUp // Set InitializedCondition.LastTransitionTime. updateLastTransitionTime(&status, &oldStatus, v1.PodInitialized) - // Set PodHasNetwork.LastTransitionTime. - updateLastTransitionTime(&status, &oldStatus, kubetypes.PodHasNetwork) + // Set PodReadyToStartContainersCondition.LastTransitionTime. + updateLastTransitionTime(&status, &oldStatus, kubetypes.PodReadyToStartContainers) // Set PodScheduledCondition.LastTransitionTime. updateLastTransitionTime(&status, &oldStatus, v1.PodScheduled) diff --git a/pkg/kubelet/types/constants.go b/pkg/kubelet/types/constants.go index 32af6d6baa4..3f085d22a11 100644 --- a/pkg/kubelet/types/constants.go +++ b/pkg/kubelet/types/constants.go @@ -43,8 +43,7 @@ const ( // entries here should be moved to staging/src/k8s.io.api/core/v1/types.go // once the feature managing the condition graduates to Beta. const ( - // PodHasNetwork indicates networking has been configured successfully for the - // pod and IP address(es) assigned. Images for containers specified in the pod - // spec can be pulled and containers launched after this condition is true. - PodHasNetwork = "PodHasNetwork" + // PodReadyToStartContainers pod sandbox is successfully configured and + // the pod is ready to launch containers. + PodReadyToStartContainers = "PodReadyToStartContainers" ) diff --git a/pkg/kubelet/types/pod_status.go b/pkg/kubelet/types/pod_status.go index a1894aedf7a..f69ca822a0b 100644 --- a/pkg/kubelet/types/pod_status.go +++ b/pkg/kubelet/types/pod_status.go @@ -37,8 +37,8 @@ func PodConditionByKubelet(conditionType v1.PodConditionType) bool { return true } } - if utilfeature.DefaultFeatureGate.Enabled(features.PodHasNetworkCondition) { - if conditionType == PodHasNetwork { + if utilfeature.DefaultFeatureGate.Enabled(features.PodReadyToStartContainersCondition) { + if conditionType == PodReadyToStartContainers { return true } } diff --git a/pkg/kubelet/types/pod_status_test.go b/pkg/kubelet/types/pod_status_test.go index 91b8a264227..84cea89e1b9 100644 --- a/pkg/kubelet/types/pod_status_test.go +++ b/pkg/kubelet/types/pod_status_test.go @@ -26,7 +26,7 @@ import ( ) func TestPodConditionByKubelet(t *testing.T) { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodHasNetworkCondition, true)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodReadyToStartContainersCondition, true)() defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodDisruptionConditions, true)() trueCases := []v1.PodConditionType{ @@ -34,7 +34,7 @@ func TestPodConditionByKubelet(t *testing.T) { v1.PodReady, v1.PodInitialized, v1.ContainersReady, - PodHasNetwork, + PodReadyToStartContainers, } for _, tc := range trueCases { diff --git a/test/e2e_node/pod_conditions_test.go b/test/e2e_node/pod_conditions_test.go index 343c695ab9f..d4039fc4073 100644 --- a/test/e2e_node/pod_conditions_test.go +++ b/test/e2e_node/pod_conditions_test.go @@ -47,10 +47,10 @@ var _ = SIGDescribe("Pod conditions managed by Kubelet", func() { f := framework.NewDefaultFramework("pod-conditions") f.NamespacePodSecurityEnforceLevel = admissionapi.LevelBaseline - ginkgo.Context("including PodHasNetwork condition [Serial] [Feature:PodHasNetwork]", func() { + ginkgo.Context("including PodReadyToStartContainers condition [Serial] [Feature:PodReadyToStartContainersCondition]", func() { tempSetCurrentKubeletConfig(f, func(ctx context.Context, initialConfig *kubeletconfig.KubeletConfiguration) { initialConfig.FeatureGates = map[string]bool{ - string(features.PodHasNetworkCondition): true, + string(features.PodReadyToStartContainersCondition): true, } }) ginkgo.It("a pod without init containers should report all conditions set in expected order after the pod is up", runPodReadyConditionsTest(f, false, true)) @@ -59,7 +59,7 @@ var _ = SIGDescribe("Pod conditions managed by Kubelet", func() { ginkgo.It("a pod failing to mount volumes and with init containers should report just the scheduled condition set", runPodFailingConditionsTest(f, true, true)) }) - ginkgo.Context("without PodHasNetwork condition", func() { + ginkgo.Context("without PodReadyToStartContainersCondition condition", func() { ginkgo.It("a pod without init containers should report all conditions set in expected order after the pod is up", runPodReadyConditionsTest(f, false, false)) ginkgo.It("a pod with init containers should report all conditions set in expected order after the pod is up", runPodReadyConditionsTest(f, true, false)) ginkgo.It("a pod failing to mount volumes and without init containers should report scheduled and initialized conditions set", runPodFailingConditionsTest(f, false, false)) @@ -67,7 +67,7 @@ var _ = SIGDescribe("Pod conditions managed by Kubelet", func() { }) }) -func runPodFailingConditionsTest(f *framework.Framework, hasInitContainers, checkPodHasNetwork bool) func(ctx context.Context) { +func runPodFailingConditionsTest(f *framework.Framework, hasInitContainers, checkPodReadyToStart bool) func(ctx context.Context) { return func(ctx context.Context) { ginkgo.By("creating a pod whose sandbox creation is blocked due to a missing volume") @@ -109,9 +109,9 @@ func runPodFailingConditionsTest(f *framework.Framework, hasInitContainers, chec scheduledTime, err := getTransitionTimeForPodConditionWithStatus(p, v1.PodScheduled, true) framework.ExpectNoError(err) - // Verify PodHasNetwork is not set (since sandboxcreation is blocked) - if checkPodHasNetwork { - _, err := getTransitionTimeForPodConditionWithStatus(p, kubetypes.PodHasNetwork, false) + // Verify PodReadyToStartContainers is not set (since sandboxcreation is blocked) + if checkPodReadyToStart { + _, err := getTransitionTimeForPodConditionWithStatus(p, kubetypes.PodReadyToStartContainers, false) framework.ExpectNoError(err) } @@ -135,7 +135,7 @@ func runPodFailingConditionsTest(f *framework.Framework, hasInitContainers, chec } } -func runPodReadyConditionsTest(f *framework.Framework, hasInitContainers, checkPodHasNetwork bool) func(ctx context.Context) { +func runPodReadyConditionsTest(f *framework.Framework, hasInitContainers, checkPodReadyToStart bool) func(ctx context.Context) { return func(ctx context.Context) { ginkgo.By("creating a pod that successfully comes up in a ready/running state") @@ -157,23 +157,23 @@ func runPodReadyConditionsTest(f *framework.Framework, hasInitContainers, checkP condBeforeContainersReadyTransitionTime := initializedTime errSubstrIfContainersReadyTooEarly := "is initialized" - if checkPodHasNetwork { - hasNetworkTime, err := getTransitionTimeForPodConditionWithStatus(p, kubetypes.PodHasNetwork, true) + if checkPodReadyToStart { + readyToStartContainersTime, err := getTransitionTimeForPodConditionWithStatus(p, kubetypes.PodReadyToStartContainers, true) framework.ExpectNoError(err) if hasInitContainers { - // With init containers, verify the sequence of conditions is: Scheduled => HasNetwork => Initialized - framework.ExpectNotEqual(hasNetworkTime.Before(scheduledTime), true, fmt.Sprintf("pod with init containers is initialized at: %v which is before pod has network at: %v", initializedTime, hasNetworkTime)) - framework.ExpectNotEqual(initializedTime.Before(hasNetworkTime), true, fmt.Sprintf("pod with init containers is initialized at: %v which is before pod has network at: %v", initializedTime, hasNetworkTime)) + // With init containers, verify the sequence of conditions is: Scheduled => PodReadyToStartContainers => Initialized + framework.ExpectNotEqual(readyToStartContainersTime.Before(scheduledTime), true, fmt.Sprintf("pod with init containers is initialized at: %v which is before pod has ready to start at: %v", initializedTime, readyToStartContainersTime)) + framework.ExpectNotEqual(initializedTime.Before(readyToStartContainersTime), true, fmt.Sprintf("pod with init containers is initialized at: %v which is before pod has ready to start at: %v", initializedTime, readyToStartContainersTime)) } else { - // Without init containers, verify the sequence of conditions is: Scheduled => Initialized => HasNetwork - condBeforeContainersReadyTransitionTime = hasNetworkTime - errSubstrIfContainersReadyTooEarly = "has network" + // Without init containers, verify the sequence of conditions is: Scheduled => Initialized => PodReadyToStartContainers + condBeforeContainersReadyTransitionTime = readyToStartContainersTime + errSubstrIfContainersReadyTooEarly = "ready to start" framework.ExpectNotEqual(initializedTime.Before(scheduledTime), true, fmt.Sprintf("pod without init containers initialized at: %v which is before pod scheduled at: %v", initializedTime, scheduledTime)) - framework.ExpectNotEqual(hasNetworkTime.Before(initializedTime), true, fmt.Sprintf("pod without init containers has network at: %v which is before pod is initialized at: %v", hasNetworkTime, initializedTime)) + framework.ExpectNotEqual(readyToStartContainersTime.Before(initializedTime), true, fmt.Sprintf("pod without init containers has ready to start at: %v which is before pod is initialized at: %v", readyToStartContainersTime, initializedTime)) } } else { - // In the absence of HasNetwork feature disabled, verify the sequence is: Scheduled => Initialized + // In the absence of PodHasReadyToStartContainers feature disabled, verify the sequence is: Scheduled => Initialized framework.ExpectNotEqual(initializedTime.Before(scheduledTime), true, fmt.Sprintf("pod initialized at: %v which is before pod scheduled at: %v", initializedTime, scheduledTime)) } // Verify the next condition to get set is ContainersReady