Skip to content

Commit 3e3276e

Browse files
authored
Promote PodIndexLabel for Statefulset and IndexedJob stable (kubernetes#128387)
* lock feature gate for PodIndexLabel and mark it GA Signed-off-by: Alay Patel <[email protected]> * add emulated version if testing disabling of PodIndexLabel FG Signed-off-by: Alay Patel <[email protected]> --------- Signed-off-by: Alay Patel <[email protected]>
1 parent b4d91d1 commit 3e3276e

File tree

4 files changed

+47
-15
lines changed

4 files changed

+47
-15
lines changed

pkg/controller/job/job_controller_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"k8s.io/apimachinery/pkg/util/rand"
3939
"k8s.io/apimachinery/pkg/util/sets"
4040
"k8s.io/apimachinery/pkg/util/uuid"
41+
utilversion "k8s.io/apimachinery/pkg/util/version"
4142
"k8s.io/apimachinery/pkg/util/wait"
4243
"k8s.io/apimachinery/pkg/watch"
4344
"k8s.io/apiserver/pkg/util/feature"
@@ -1249,6 +1250,10 @@ func TestControllerSyncJob(t *testing.T) {
12491250
for name, tc := range testCases {
12501251
t.Run(name, func(t *testing.T) {
12511252
logger, _ := ktesting.NewTestContext(t)
1253+
if tc.podIndexLabelDisabled {
1254+
// TODO: this will be removed in 1.35 when 1.31 will fall out of support matrix
1255+
featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, feature.DefaultFeatureGate, utilversion.MustParse("1.31"))
1256+
}
12521257
featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, features.PodIndexLabel, !tc.podIndexLabelDisabled)
12531258
featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, features.JobPodReplacementPolicy, tc.jobPodReplacementPolicy)
12541259
featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, features.JobSuccessPolicy, tc.jobSuccessPolicy)

pkg/controller/statefulset/stateful_set_control_test.go

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
"k8s.io/apimachinery/pkg/types"
4040
utilerrors "k8s.io/apimachinery/pkg/util/errors"
4141
"k8s.io/apimachinery/pkg/util/intstr"
42+
utilversion "k8s.io/apimachinery/pkg/util/version"
4243
utilfeature "k8s.io/apiserver/pkg/util/feature"
4344
"k8s.io/client-go/informers"
4445
appsinformers "k8s.io/client-go/informers/apps/v1"
@@ -165,7 +166,8 @@ func TestStatefulSetControl(t *testing.T) {
165166
fn func(*testing.T, *apps.StatefulSet, invariantFunc)
166167
obj func() *apps.StatefulSet
167168
}{
168-
{CreatesPods, simpleSetFn},
169+
{CreatesPodsWithPodIndexLabelFeature, simpleSetFn},
170+
{CreatesPodsWithoutPodIndexLabelFeature, simpleSetFn},
169171
{ScalesUp, simpleSetFn},
170172
{ScalesDown, simpleSetFn},
171173
{ReplacesPods, largeSetFn},
@@ -208,7 +210,20 @@ func TestStatefulSetControl(t *testing.T) {
208210
}
209211
}
210212

211-
func CreatesPods(t *testing.T, set *apps.StatefulSet, invariants invariantFunc) {
213+
func CreatesPodsWithPodIndexLabelFeature(t *testing.T, set *apps.StatefulSet, invariants invariantFunc) {
214+
createPods(t, set, invariants, true)
215+
}
216+
217+
func CreatesPodsWithoutPodIndexLabelFeature(t *testing.T, set *apps.StatefulSet, invariants invariantFunc) {
218+
createPods(t, set, invariants, false)
219+
}
220+
221+
func createPods(t *testing.T, set *apps.StatefulSet, invariants invariantFunc, isPodIndexLabelEnabled bool) {
222+
if !isPodIndexLabelEnabled {
223+
// TODO: this will be removed in 1.35
224+
featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, utilversion.MustParse("1.31"))
225+
}
226+
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodIndexLabel, isPodIndexLabelEnabled)
212227
client := fake.NewSimpleClientset(set)
213228
om, _, ssc := setupController(client)
214229

@@ -229,20 +244,21 @@ func CreatesPods(t *testing.T, set *apps.StatefulSet, invariants invariantFunc)
229244
if set.Status.UpdatedReplicas != 3 {
230245
t.Error("Failed to set UpdatedReplicas correctly")
231246
}
247+
232248
// Check all pods have correct pod index label.
233-
if utilfeature.DefaultFeatureGate.Enabled(features.PodIndexLabel) {
234-
selector, err := metav1.LabelSelectorAsSelector(set.Spec.Selector)
235-
if err != nil {
236-
t.Error(err)
237-
}
238-
pods, err := om.podsLister.Pods(set.Namespace).List(selector)
239-
if err != nil {
240-
t.Error(err)
241-
}
242-
if len(pods) != 3 {
243-
t.Errorf("Expected 3 pods, got %d", len(pods))
244-
}
245-
for _, pod := range pods {
249+
selector, err := metav1.LabelSelectorAsSelector(set.Spec.Selector)
250+
if err != nil {
251+
t.Error(err)
252+
}
253+
pods, err := om.podsLister.Pods(set.Namespace).List(selector)
254+
if err != nil {
255+
t.Error(err)
256+
}
257+
if len(pods) != 3 {
258+
t.Errorf("Expected 3 pods, got %d", len(pods))
259+
}
260+
for _, pod := range pods {
261+
if isPodIndexLabelEnabled {
246262
podIndexFromLabel, exists := pod.Labels[apps.PodIndexLabel]
247263
if !exists {
248264
t.Errorf("Missing pod index label: %s", apps.PodIndexLabel)
@@ -252,6 +268,12 @@ func CreatesPods(t *testing.T, set *apps.StatefulSet, invariants invariantFunc)
252268
if podIndexFromLabel != podIndexFromName {
253269
t.Errorf("Pod index label value (%s) does not match pod index in pod name (%s)", podIndexFromLabel, podIndexFromName)
254270
}
271+
} else {
272+
_, exists := pod.Labels[apps.PodIndexLabel]
273+
if exists {
274+
t.Errorf("Pod index label should not exist when feature gate is disabled: %s", apps.PodIndexLabel)
275+
continue
276+
}
255277
}
256278
}
257279
}

pkg/features/versioned_kube_features.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,7 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
559559

560560
PodIndexLabel: {
561561
{Version: version.MustParse("1.28"), Default: true, PreRelease: featuregate.Beta},
562+
{Version: version.MustParse("1.32"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.35
562563
},
563564

564565
PodLifecycleSleepAction: {

test/featuregates_linter/test_data/versioned_feature_list.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -884,6 +884,10 @@
884884
lockToDefault: false
885885
preRelease: Beta
886886
version: "1.28"
887+
- default: true
888+
lockToDefault: true
889+
preRelease: GA
890+
version: "1.32"
887891
- name: PodLifecycleSleepAction
888892
versionedSpecs:
889893
- default: false

0 commit comments

Comments
 (0)