From 8b6f98b06eae38ebf9e8db4bb2f2d8a4f9576470 Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Tue, 7 Oct 2025 11:03:49 +0200 Subject: [PATCH] DRA: lock to default-on The core functionality was enabled by default in 1.34 without any issues that would have suggested turning it off, so now we can lock it to on-by-default. Tests which cover disabling the feature must use version emulation. --- pkg/api/pod/util_test.go | 3 +++ pkg/features/kube_features.go | 4 +++- pkg/registry/core/pod/strategy_test.go | 3 +++ pkg/scheduler/apis/config/v1/default_plugins_test.go | 4 ++++ pkg/scheduler/eventhandlers_test.go | 3 +++ pkg/scheduler/framework/events_test.go | 4 ++++ pkg/scheduler/scheduler_test.go | 2 +- plugin/pkg/admission/noderestriction/admission_test.go | 3 +++ .../reference/versioned_feature_list.yaml | 4 ++++ test/integration/dra/dra_test.go | 5 +++++ 10 files changed, 33 insertions(+), 2 deletions(-) diff --git a/pkg/api/pod/util_test.go b/pkg/api/pod/util_test.go index fe985eeaeb9..1aa4d65377b 100644 --- a/pkg/api/pod/util_test.go +++ b/pkg/api/pod/util_test.go @@ -1058,6 +1058,9 @@ func TestDropDynamicResourceAllocation(t *testing.T) { for _, tc := range testcases { t.Run(tc.description, func(t *testing.T) { + if !tc.enabled { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.34")) + } featuregatetesting.SetFeatureGatesDuringTest(t, utilfeature.DefaultFeatureGate, featuregatetesting.FeatureOverrides{ features.DynamicResourceAllocation: tc.enabled, features.DRAExtendedResource: tc.extendedEnabled, diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index a1d6f0cb055..0dfbe82b599 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -1196,7 +1196,9 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate DynamicResourceAllocation: { {Version: version.MustParse("1.26"), Default: false, PreRelease: featuregate.Alpha}, {Version: version.MustParse("1.32"), Default: false, PreRelease: featuregate.Beta}, - {Version: version.MustParse("1.34"), Default: true, PreRelease: featuregate.GA}, // lock to default in 1.35 + {Version: version.MustParse("1.34"), Default: true, PreRelease: featuregate.GA}, + {Version: version.MustParse("1.35"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, + // TODO (https://github.com/kubernetes/kubernetes/issues/134459): remove completely in 1.38 }, EnvFiles: { {Version: version.MustParse("1.34"), Default: false, PreRelease: featuregate.Alpha}, diff --git a/pkg/registry/core/pod/strategy_test.go b/pkg/registry/core/pod/strategy_test.go index 131743767e7..6af91ed615b 100644 --- a/pkg/registry/core/pod/strategy_test.go +++ b/pkg/registry/core/pod/strategy_test.go @@ -4141,6 +4141,9 @@ func TestStatusPrepareForUpdate(t *testing.T) { for _, tc := range testCases { t.Run(tc.description, func(t *testing.T) { + if draEnabled, draExists := tc.features[features.DynamicResourceAllocation]; draExists && !draEnabled { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.34")) + } featuregatetesting.SetFeatureGatesDuringTest(t, utilfeature.DefaultFeatureGate, tc.features) StatusStrategy.PrepareForUpdate(genericapirequest.NewContext(), tc.newPod, tc.oldPod) if !cmp.Equal(tc.expected, tc.newPod) { diff --git a/pkg/scheduler/apis/config/v1/default_plugins_test.go b/pkg/scheduler/apis/config/v1/default_plugins_test.go index a6f945c96d5..86cbc6f7e5f 100644 --- a/pkg/scheduler/apis/config/v1/default_plugins_test.go +++ b/pkg/scheduler/apis/config/v1/default_plugins_test.go @@ -20,6 +20,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" + "k8s.io/apimachinery/pkg/util/version" "k8s.io/apiserver/pkg/util/feature" "k8s.io/component-base/featuregate" featuregatetesting "k8s.io/component-base/featuregate/testing" @@ -101,6 +102,9 @@ func TestApplyFeatureGates(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { + if draEnabled, draExists := test.features[features.DynamicResourceAllocation]; draExists && !draEnabled { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, feature.DefaultFeatureGate, version.MustParse("1.34")) + } featuregatetesting.SetFeatureGatesDuringTest(t, feature.DefaultFeatureGate, test.features) gotConfig := getDefaultPlugins() diff --git a/pkg/scheduler/eventhandlers_test.go b/pkg/scheduler/eventhandlers_test.go index 7a395b6159e..250006dc333 100644 --- a/pkg/scheduler/eventhandlers_test.go +++ b/pkg/scheduler/eventhandlers_test.go @@ -558,6 +558,9 @@ func TestAddAllEventHandlers(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + if !tt.enableDRA { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.34")) + } featuregatetesting.SetFeatureGatesDuringTest(t, utilfeature.DefaultFeatureGate, featuregatetesting.FeatureOverrides{ features.DynamicResourceAllocation: tt.enableDRA, features.DRADeviceTaints: tt.enableDRADeviceTaints, diff --git a/pkg/scheduler/framework/events_test.go b/pkg/scheduler/framework/events_test.go index 603a9bd748c..41a8eebbd77 100644 --- a/pkg/scheduler/framework/events_test.go +++ b/pkg/scheduler/framework/events_test.go @@ -26,6 +26,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/version" utilfeature "k8s.io/apiserver/pkg/util/feature" featuregatetesting "k8s.io/component-base/featuregate/testing" fwk "k8s.io/kube-scheduler/framework" @@ -466,6 +467,9 @@ func Test_podSchedulingPropertiesChange(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + if tt.draDisabled { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.34")) + } featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.DynamicResourceAllocation, !tt.draDisabled) got := PodSchedulingPropertiesChange(tt.newPod, tt.oldPod) if diff := cmp.Diff(tt.want, got, cmpopts.EquateComparable(fwk.ClusterEvent{})); diff != "" { diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go index 84cc2039e65..4aa5d3d069d 100644 --- a/pkg/scheduler/scheduler_test.go +++ b/pkg/scheduler/scheduler_test.go @@ -1006,7 +1006,7 @@ func Test_UnionedGVKs(t *testing.T) { t.Run(tt.name, func(t *testing.T) { pluginConfig := defaults.PluginConfigsV1 - if !tt.enableSchedulerQueueingHints { + if !tt.enableSchedulerQueueingHints || !tt.enableDynamicResourceAllocation { // Set emulated version before setting other feature gates, since it can impact feature dependencies. featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) } diff --git a/plugin/pkg/admission/noderestriction/admission_test.go b/plugin/pkg/admission/noderestriction/admission_test.go index 8ef0e5af68d..493bc6e063f 100644 --- a/plugin/pkg/admission/noderestriction/admission_test.go +++ b/plugin/pkg/admission/noderestriction/admission_test.go @@ -2555,6 +2555,9 @@ func TestAdmitResourceSlice(t *testing.T) { attributes := admission.NewAttributesRecord( test.obj, test.oldObj, schema.GroupVersionKind{}, "", "foo", apiResource, "", test.operation, test.options, false, mynode) + if !test.featureEnabled { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, feature.DefaultFeatureGate, version.MustParse("1.34")) + } featuregatetesting.SetFeatureGateDuringTest(t, feature.DefaultFeatureGate, features.DynamicResourceAllocation, test.featureEnabled) a := &admitTestCase{ name: name, diff --git a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml index cdd1cf1618a..43d3599ff07 100644 --- a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml +++ b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml @@ -517,6 +517,10 @@ lockToDefault: false preRelease: GA version: "1.34" + - default: true + lockToDefault: true + preRelease: GA + version: "1.35" - name: EnvFiles versionedSpecs: - default: false diff --git a/test/integration/dra/dra_test.go b/test/integration/dra/dra_test.go index 0a4c3485820..3000b1b0eb4 100644 --- a/test/integration/dra/dra_test.go +++ b/test/integration/dra/dra_test.go @@ -47,6 +47,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/version" utilfeature "k8s.io/apiserver/pkg/util/feature" resourceapiac "k8s.io/client-go/applyconfigurations/resource/v1" "k8s.io/client-go/informers" @@ -337,6 +338,10 @@ func TestDRA(t *testing.T) { sort.Strings(entries) t.Logf("Config: %s", strings.Join(entries, ",")) + // We need to set emulation version for DynamicResourceAllocation feature gate, which is locked at 1.35. + if draEnabled, draExists := tc.features[features.DynamicResourceAllocation]; draExists && !draEnabled { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.34")) + } featuregatetesting.SetFeatureGatesDuringTest(t, utilfeature.DefaultFeatureGate, tc.features) etcdOptions := framework.SharedEtcd()