Skip to content

Commit 4a214f6

Browse files
authored
Merge pull request kubernetes#125461 from mimowo/pod-disruption-conditions-ga
Graduate PodDisruptionConditions to stable
2 parents 048b291 + 780191b commit 4a214f6

File tree

19 files changed

+409
-725
lines changed

19 files changed

+409
-725
lines changed

pkg/controller/job/job_controller_test.go

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2709,7 +2709,6 @@ func TestSyncJobWithJobPodFailurePolicy(t *testing.T) {
27092709

27102710
testCases := map[string]struct {
27112711
enableJobPodFailurePolicy bool
2712-
enablePodDisruptionConditions bool
27132712
enableJobPodReplacementPolicy bool
27142713
job batch.Job
27152714
pods []v1.Pod
@@ -3702,7 +3701,7 @@ func TestSyncJobWithJobPodFailurePolicy(t *testing.T) {
37023701
wantStatusFailed: 1,
37033702
wantStatusSucceeded: 0,
37043703
},
3705-
"terminating Pod considered failed when PodDisruptionConditions is disabled": {
3704+
"terminating Pod not considered failed when JobPodFailurePolicy is enabled and used": {
37063705
enableJobPodFailurePolicy: true,
37073706
job: batch.Job{
37083707
TypeMeta: metav1.TypeMeta{Kind: "Job"},
@@ -3727,40 +3726,6 @@ func TestSyncJobWithJobPodFailurePolicy(t *testing.T) {
37273726
},
37283727
},
37293728
},
3730-
pods: []v1.Pod{
3731-
{
3732-
ObjectMeta: metav1.ObjectMeta{
3733-
DeletionTimestamp: &now,
3734-
},
3735-
},
3736-
},
3737-
},
3738-
"terminating Pod not considered failed when PodDisruptionConditions is enabled": {
3739-
enableJobPodFailurePolicy: true,
3740-
enablePodDisruptionConditions: true,
3741-
job: batch.Job{
3742-
TypeMeta: metav1.TypeMeta{Kind: "Job"},
3743-
ObjectMeta: validObjectMeta,
3744-
Spec: batch.JobSpec{
3745-
Parallelism: ptr.To[int32](1),
3746-
Selector: validSelector,
3747-
Template: validTemplate,
3748-
BackoffLimit: ptr.To[int32](0),
3749-
PodFailurePolicy: &batch.PodFailurePolicy{
3750-
Rules: []batch.PodFailurePolicyRule{
3751-
{
3752-
Action: batch.PodFailurePolicyActionCount,
3753-
OnPodConditions: []batch.PodFailurePolicyOnPodConditionsPattern{
3754-
{
3755-
Type: v1.DisruptionTarget,
3756-
Status: v1.ConditionTrue,
3757-
},
3758-
},
3759-
},
3760-
},
3761-
},
3762-
},
3763-
},
37643729
pods: []v1.Pod{
37653730
{
37663731
ObjectMeta: metav1.ObjectMeta{
@@ -3776,7 +3741,6 @@ func TestSyncJobWithJobPodFailurePolicy(t *testing.T) {
37763741
for name, tc := range testCases {
37773742
t.Run(name, func(t *testing.T) {
37783743
featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, features.JobPodFailurePolicy, tc.enableJobPodFailurePolicy)
3779-
featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, features.PodDisruptionConditions, tc.enablePodDisruptionConditions)
37803744
featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, features.JobPodReplacementPolicy, tc.enableJobPodReplacementPolicy)
37813745

37823746
if tc.job.Spec.PodReplacementPolicy == nil {

pkg/controller/podgc/gc_controller_test.go

Lines changed: 36 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,17 @@ import (
3131
"k8s.io/apimachinery/pkg/util/sets"
3232
"k8s.io/apimachinery/pkg/util/strategicpatch"
3333
"k8s.io/apimachinery/pkg/util/wait"
34-
utilfeature "k8s.io/apiserver/pkg/util/feature"
3534
"k8s.io/client-go/informers"
3635
coreinformers "k8s.io/client-go/informers/core/v1"
3736
clientset "k8s.io/client-go/kubernetes"
3837
"k8s.io/client-go/kubernetes/fake"
3938
clienttesting "k8s.io/client-go/testing"
4039
"k8s.io/client-go/util/workqueue"
41-
featuregatetesting "k8s.io/component-base/featuregate/testing"
4240
metricstestutil "k8s.io/component-base/metrics/testutil"
4341
"k8s.io/klog/v2/ktesting"
4442
"k8s.io/kubernetes/pkg/controller"
4543
"k8s.io/kubernetes/pkg/controller/podgc/metrics"
4644
"k8s.io/kubernetes/pkg/controller/testutil"
47-
"k8s.io/kubernetes/pkg/features"
4845
"k8s.io/kubernetes/pkg/kubelet/eviction"
4946
testingclock "k8s.io/utils/clock/testing"
5047
"k8s.io/utils/pointer"
@@ -69,23 +66,21 @@ func TestGCTerminated(t *testing.T) {
6966
}
7067

7168
testCases := []struct {
72-
name string
73-
pods []nameToPhase
74-
threshold int
75-
deletedPodNames sets.Set[string]
76-
patchedPodNames sets.Set[string]
77-
enablePodDisruptionConditions bool
69+
name string
70+
pods []nameToPhase
71+
threshold int
72+
deletedPodNames sets.Set[string]
73+
patchedPodNames sets.Set[string]
7874
}{
7975
{
80-
name: "delete pod a which is PodFailed and pod b which is PodSucceeded; PodDisruptionConditions enabled",
76+
name: "delete pod a which is PodFailed and pod b which is PodSucceeded",
8177
pods: []nameToPhase{
8278
{name: "a", phase: v1.PodFailed},
8379
{name: "b", phase: v1.PodSucceeded},
8480
{name: "c", phase: v1.PodFailed},
8581
},
86-
threshold: 1,
87-
deletedPodNames: sets.New("a", "b"),
88-
enablePodDisruptionConditions: true,
82+
threshold: 1,
83+
deletedPodNames: sets.New("a", "b"),
8984
},
9085
{
9186
name: "threshold = 0, disables terminated pod deletion",
@@ -156,7 +151,6 @@ func TestGCTerminated(t *testing.T) {
156151
t.Run(test.name, func(t *testing.T) {
157152
resetMetrics()
158153
_, ctx := ktesting.NewTestContext(t)
159-
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodDisruptionConditions, test.enablePodDisruptionConditions)
160154
creationTime := time.Unix(0, 0)
161155
nodes := []*v1.Node{testutil.NewNode("node")}
162156

@@ -206,19 +200,18 @@ func waitForAdded(q workqueue.TypedDelayingInterface[string], depth int) error {
206200

207201
func TestGCOrphaned(t *testing.T) {
208202
testCases := []struct {
209-
name string
210-
initialClientNodes []*v1.Node
211-
initialInformerNodes []*v1.Node
212-
delay time.Duration
213-
addedClientNodes []*v1.Node
214-
deletedClientNodes []*v1.Node
215-
addedInformerNodes []*v1.Node
216-
deletedInformerNodes []*v1.Node
217-
pods []*v1.Pod
218-
itemsInQueue int
219-
deletedPodNames sets.Set[string]
220-
patchedPodNames sets.Set[string]
221-
enablePodDisruptionConditions bool
203+
name string
204+
initialClientNodes []*v1.Node
205+
initialInformerNodes []*v1.Node
206+
delay time.Duration
207+
addedClientNodes []*v1.Node
208+
deletedClientNodes []*v1.Node
209+
addedInformerNodes []*v1.Node
210+
deletedInformerNodes []*v1.Node
211+
pods []*v1.Pod
212+
itemsInQueue int
213+
deletedPodNames sets.Set[string]
214+
patchedPodNames sets.Set[string]
222215
}{
223216
{
224217
name: "nodes present in lister",
@@ -259,17 +252,16 @@ func TestGCOrphaned(t *testing.T) {
259252
deletedPodNames: sets.New("a", "b"),
260253
},
261254
{
262-
name: "no nodes with PodDisruptionConditions enabled",
255+
name: "no nodes, one running pod",
263256
delay: 2 * quarantineTime,
264257
pods: []*v1.Pod{
265258
makePod("a", "deleted", v1.PodFailed),
266259
makePod("b", "deleted", v1.PodSucceeded),
267260
makePod("c", "deleted", v1.PodRunning),
268261
},
269-
itemsInQueue: 1,
270-
deletedPodNames: sets.New("a", "b", "c"),
271-
patchedPodNames: sets.New("c"),
272-
enablePodDisruptionConditions: true,
262+
itemsInQueue: 1,
263+
deletedPodNames: sets.New("a", "b", "c"),
264+
patchedPodNames: sets.New("c"),
273265
},
274266
{
275267
name: "quarantine not finished",
@@ -351,7 +343,6 @@ func TestGCOrphaned(t *testing.T) {
351343
t.Run(test.name, func(t *testing.T) {
352344
resetMetrics()
353345
_, ctx := ktesting.NewTestContext(t)
354-
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodDisruptionConditions, test.enablePodDisruptionConditions)
355346

356347
client := setupNewSimpleClient(test.initialClientNodes, test.pods)
357348
gcc, podInformer, nodeInformer := NewFromClient(ctx, client, -1)
@@ -416,23 +407,11 @@ func TestGCUnscheduledTerminating(t *testing.T) {
416407
}
417408

418409
testCases := []struct {
419-
name string
420-
pods []nameToPhase
421-
deletedPodNames sets.Set[string]
422-
patchedPodNames sets.Set[string]
423-
enablePodDisruptionConditions bool
410+
name string
411+
pods []nameToPhase
412+
deletedPodNames sets.Set[string]
413+
patchedPodNames sets.Set[string]
424414
}{
425-
{
426-
name: "Unscheduled pod in any phase must be deleted, the phase of the running pod is changed to Failed; PodDisruptionConditions enabled",
427-
pods: []nameToPhase{
428-
{name: "a", phase: v1.PodFailed, deletionTimeStamp: &metav1.Time{}, nodeName: ""},
429-
{name: "b", phase: v1.PodSucceeded, deletionTimeStamp: &metav1.Time{}, nodeName: ""},
430-
{name: "c", phase: v1.PodRunning, deletionTimeStamp: &metav1.Time{}, nodeName: ""},
431-
},
432-
deletedPodNames: sets.New("a", "b", "c"),
433-
patchedPodNames: sets.New("c"),
434-
enablePodDisruptionConditions: true,
435-
},
436415
{
437416
name: "Unscheduled pod in any phase must be deleted",
438417
pods: []nameToPhase{
@@ -457,7 +436,6 @@ func TestGCUnscheduledTerminating(t *testing.T) {
457436
t.Run(test.name, func(t *testing.T) {
458437
resetMetrics()
459438
_, ctx := ktesting.NewTestContext(t)
460-
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodDisruptionConditions, test.enablePodDisruptionConditions)
461439
creationTime := time.Unix(0, 0)
462440

463441
pods := make([]*v1.Pod, 0, len(test.pods))
@@ -505,12 +483,11 @@ func TestGCTerminating(t *testing.T) {
505483
}
506484

507485
testCases := []struct {
508-
name string
509-
pods []nameToPodConfig
510-
nodes []node
511-
deletedPodNames sets.Set[string]
512-
patchedPodNames sets.Set[string]
513-
enablePodDisruptionConditions bool
486+
name string
487+
pods []nameToPodConfig
488+
nodes []node
489+
deletedPodNames sets.Set[string]
490+
patchedPodNames sets.Set[string]
514491
}{
515492
{
516493
name: "pods have deletion timestamp set and the corresponding nodes are not ready",
@@ -592,7 +569,7 @@ func TestGCTerminating(t *testing.T) {
592569
patchedPodNames: sets.New("b1", "b4", "b5", "b6"),
593570
},
594571
{
595-
name: "pods deleted from node tained out-of-service; PodDisruptionConditions enabled",
572+
name: "pods deleted from node tainted out-of-service",
596573
nodes: []node{
597574
{name: "worker", readyCondition: v1.ConditionFalse, taints: []v1.Taint{{Key: v1.TaintNodeOutOfService,
598575
Effect: v1.TaintEffectNoExecute}}},
@@ -602,16 +579,14 @@ func TestGCTerminating(t *testing.T) {
602579
{name: "b", phase: v1.PodFailed, deletionTimeStamp: &metav1.Time{}, nodeName: "worker"},
603580
{name: "c", phase: v1.PodSucceeded, deletionTimeStamp: &metav1.Time{}, nodeName: "worker"},
604581
},
605-
deletedPodNames: sets.New("a", "b", "c"),
606-
patchedPodNames: sets.New("a"),
607-
enablePodDisruptionConditions: true,
582+
deletedPodNames: sets.New("a", "b", "c"),
583+
patchedPodNames: sets.New("a"),
608584
},
609585
}
610586
for _, test := range testCases {
611587
t.Run(test.name, func(t *testing.T) {
612588
resetMetrics()
613589
_, ctx := ktesting.NewTestContext(t)
614-
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodDisruptionConditions, test.enablePodDisruptionConditions)
615590

616591
creationTime := time.Unix(0, 0)
617592
nodes := make([]*v1.Node, 0, len(test.nodes))
@@ -720,7 +695,6 @@ func TestGCInspectingPatchedPodBeforeDeletion(t *testing.T) {
720695
for _, test := range testCases {
721696
t.Run(test.name, func(t *testing.T) {
722697
_, ctx := ktesting.NewTestContext(t)
723-
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodDisruptionConditions, true)
724698

725699
pods := []*v1.Pod{test.pod}
726700

0 commit comments

Comments
 (0)