diff --git a/pkg/controller/volume/persistentvolume/delete_test.go b/pkg/controller/volume/persistentvolume/delete_test.go index 062c077931b..63b678dea70 100644 --- a/pkg/controller/volume/persistentvolume/delete_test.go +++ b/pkg/controller/volume/persistentvolume/delete_test.go @@ -22,13 +22,9 @@ import ( v1 "k8s.io/api/core/v1" storage "k8s.io/api/storage/v1" - "k8s.io/apimachinery/pkg/util/version" - utilfeature "k8s.io/apiserver/pkg/util/feature" - featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/component-helpers/storage/volume" "k8s.io/klog/v2/ktesting" pvtesting "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/testing" - "k8s.io/kubernetes/pkg/features" ) // Test single call to syncVolume, expecting recycling to happen. @@ -37,10 +33,6 @@ import ( // 3. Compare resulting volumes with expected volumes. func TestDeleteSync(t *testing.T) { const gceDriver = "pd.csi.storage.gke.io" - // Default enable the HonorPVReclaimPolicy feature gate. - // TODO: this will be removed in 1.36 - featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.32")) - featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.HonorPVReclaimPolicy, true) _, ctx := ktesting.NewTestContext(t) tests := []controllerTest{ { diff --git a/pkg/controller/volume/persistentvolume/provision_test.go b/pkg/controller/volume/persistentvolume/provision_test.go index 47281b75045..d8299101283 100644 --- a/pkg/controller/volume/persistentvolume/provision_test.go +++ b/pkg/controller/volume/persistentvolume/provision_test.go @@ -20,16 +20,12 @@ import ( "errors" "testing" - utilfeature "k8s.io/apiserver/pkg/util/feature" - featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/klog/v2/ktesting" - "k8s.io/kubernetes/pkg/features" v1 "k8s.io/api/core/v1" storage "k8s.io/api/storage/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/version" corelisters "k8s.io/client-go/listers/core/v1" "k8s.io/client-go/tools/cache" "k8s.io/component-helpers/storage/volume" @@ -172,10 +168,6 @@ var provision2Success = provisionCall{ // 2. Call the syncVolume *once*. // 3. Compare resulting volumes with expected volumes. func TestProvisionSync(t *testing.T) { - // Default enable the HonorPVReclaimPolicy feature gate. - // TODO: this will be removed in 1.36 - featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.32")) - featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.HonorPVReclaimPolicy, true) _, ctx := ktesting.NewTestContext(t) tests := []controllerTest{ { @@ -601,11 +593,6 @@ func TestProvisionSync(t *testing.T) { // // Some limit of calls in enforced to prevent endless loops. func TestProvisionMultiSync(t *testing.T) { - // Default enable the HonorPVReclaimPolicy feature gate. - // TODO: this will be removed in 1.36 - featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.32")) - featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.HonorPVReclaimPolicy, true) - _, ctx := ktesting.NewTestContext(t) tests := []controllerTest{ { diff --git a/pkg/controller/volume/persistentvolume/pv_controller.go b/pkg/controller/volume/persistentvolume/pv_controller.go index 66c8c62e978..b7a5371edfd 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller.go +++ b/pkg/controller/volume/persistentvolume/pv_controller.go @@ -1333,12 +1333,6 @@ func (ctrl *PersistentVolumeController) deleteVolumeOperation(ctx context.Contex return "", nil } - if !utilfeature.DefaultFeatureGate.Enabled(features.HonorPVReclaimPolicy) { - if newVolume.GetDeletionTimestamp() != nil { - logger.V(3).Info("Volume is already being deleted", "volumeName", volume.Name) - return "", nil - } - } needsReclaim, err := ctrl.isVolumeReleased(logger, newVolume) if err != nil { logger.V(3).Info("Error reading claim for volume", "volumeName", volume.Name, "err", err) @@ -1529,12 +1523,8 @@ func (ctrl *PersistentVolumeController) doDeleteVolume(ctx context.Context, volu return pluginName, false, err } logger.V(2).Info("Volume deleted", "volumeName", volume.Name) - // Remove in-tree delete finalizer on the PV as the volume has been deleted from the underlying storage - if utilfeature.DefaultFeatureGate.Enabled(features.HonorPVReclaimPolicy) { - err = ctrl.removeDeletionProtectionFinalizer(ctx, volume) - if err != nil { - return pluginName, true, err - } + if err := ctrl.removeDeletionProtectionFinalizer(ctx, volume); err != nil { + return pluginName, true, err } return pluginName, true, nil } @@ -1740,11 +1730,9 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation( metav1.SetMetaDataAnnotation(&volume.ObjectMeta, storagehelpers.AnnBoundByController, "yes") metav1.SetMetaDataAnnotation(&volume.ObjectMeta, storagehelpers.AnnDynamicallyProvisioned, plugin.GetPluginName()) - if utilfeature.DefaultFeatureGate.Enabled(features.HonorPVReclaimPolicy) { - if volume.Spec.PersistentVolumeReclaimPolicy == v1.PersistentVolumeReclaimDelete { - // Add In-Tree protection finalizer here only when the reclaim policy is `Delete` - volume.SetFinalizers([]string{storagehelpers.PVDeletionInTreeProtectionFinalizer}) - } + if volume.Spec.PersistentVolumeReclaimPolicy == v1.PersistentVolumeReclaimDelete { + // Add In-Tree protection finalizer here only when the reclaim policy is `Delete` + volume.SetFinalizers([]string{storagehelpers.PVDeletionInTreeProtectionFinalizer}) } // Try to create the PV object several times diff --git a/pkg/controller/volume/persistentvolume/pv_controller_base.go b/pkg/controller/volume/persistentvolume/pv_controller_base.go index 32427aa2892..86e029c191a 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller_base.go +++ b/pkg/controller/volume/persistentvolume/pv_controller_base.go @@ -31,7 +31,6 @@ import ( "k8s.io/apimachinery/pkg/labels" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" - utilfeature "k8s.io/apiserver/pkg/util/feature" coreinformers "k8s.io/client-go/informers/core/v1" storageinformers "k8s.io/client-go/informers/storage/v1" clientset "k8s.io/client-go/kubernetes" @@ -46,7 +45,6 @@ import ( "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/volume/common" "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/util/goroutinemap" "k8s.io/kubernetes/pkg/util/slice" vol "k8s.io/kubernetes/pkg/volume" @@ -402,9 +400,6 @@ func (ctrl *PersistentVolumeController) updateVolumeMigrationAnnotationsAndFinal func modifyDeletionFinalizers(logger klog.Logger, cmpm CSIMigratedPluginManager, volume *v1.PersistentVolume) ([]string, bool) { modified := false var outFinalizers []string - if !utilfeature.DefaultFeatureGate.Enabled(features.HonorPVReclaimPolicy) { - return volume.Finalizers, false - } if !metav1.HasAnnotation(volume.ObjectMeta, storagehelpers.AnnDynamicallyProvisioned) { // PV deletion protection finalizer is currently supported only for dynamically // provisioned volumes. diff --git a/pkg/controller/volume/persistentvolume/pv_controller_test.go b/pkg/controller/volume/persistentvolume/pv_controller_test.go index 1e3fcb3dde5..e636da4be81 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller_test.go +++ b/pkg/controller/volume/persistentvolume/pv_controller_test.go @@ -27,22 +27,18 @@ import ( v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/version" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" - utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes/fake" storagelisters "k8s.io/client-go/listers/storage/v1" core "k8s.io/client-go/testing" "k8s.io/client-go/tools/cache" - featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/component-helpers/storage/volume" csitrans "k8s.io/csi-translation-lib" "k8s.io/klog/v2/ktesting" "k8s.io/kubernetes/pkg/controller" pvtesting "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/testing" - "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/volume/csimigration" "k8s.io/kubernetes/pkg/volume/util" ) @@ -53,10 +49,6 @@ import ( // can't reliably simulate periodic sync of volumes/claims - it would be // either very timing-sensitive or slow to wait for real periodic sync. func TestControllerSync(t *testing.T) { - // Default enable the HonorPVReclaimPolicy feature gate. - // TODO: this will be removed in 1.36 - featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.32")) - featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.HonorPVReclaimPolicy, true) tests := []controllerTest{ // [Unit test set 5] - controller tests. // We test the controller as if @@ -612,9 +604,6 @@ func TestModifyDeletionFinalizers(t *testing.T) { // in-tree plugin is used as migration is disabled. When that plugin is migrated, a different // non-migrated one should be used. If all plugins are migrated this test can be removed. The // gce in-tree plugin is used for a migrated driver as it is feature-locked as of 1.25. - // TODO: this will be removed in 1.36 - featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.32")) - featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.HonorPVReclaimPolicy, true) const nonmigratedDriver = "rbd.csi.ceph.com" const migratedPlugin = "kubernetes.io/gce-pd" const migratedDriver = "pd.csi.storage.gke.io" diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 43dc82dd6b1..77cf644b296 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -357,13 +357,6 @@ const ( // Enables support of HPA scaling to zero pods when an object or custom metric is configured. HPAScaleToZero featuregate.Feature = "HPAScaleToZero" - // owner: @deepakkinni @xing-yang - // kep: https://kep.k8s.io/2644 - // - // Honor Persistent Volume Reclaim Policy when it is "Delete" irrespective of PV-PVC - // deletion ordering. - HonorPVReclaimPolicy featuregate.Feature = "HonorPVReclaimPolicy" - // owner: @HirazawaUi // kep: https://kep.k8s.io/4762 // @@ -1320,12 +1313,6 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate {Version: version.MustParse("1.16"), Default: false, PreRelease: featuregate.Alpha}, }, - HonorPVReclaimPolicy: { - {Version: version.MustParse("1.23"), Default: false, PreRelease: featuregate.Alpha}, - {Version: version.MustParse("1.31"), Default: true, PreRelease: featuregate.Beta}, - {Version: version.MustParse("1.33"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.36 - }, - HostnameOverride: { {Version: version.MustParse("1.34"), Default: false, PreRelease: featuregate.Alpha}, {Version: version.MustParse("1.35"), Default: true, PreRelease: featuregate.Beta}, @@ -2207,8 +2194,6 @@ var defaultKubernetesFeatureGateDependencies = map[featuregate.Feature][]feature HPAScaleToZero: {}, - HonorPVReclaimPolicy: {}, - HostnameOverride: {}, ImageMaximumGCAge: {}, diff --git a/test/compatibility_lifecycle/reference/feature_list.md b/test/compatibility_lifecycle/reference/feature_list.md index 684ec26b6cd..28c34478885 100644 --- a/test/compatibility_lifecycle/reference/feature_list.md +++ b/test/compatibility_lifecycle/reference/feature_list.md @@ -79,7 +79,6 @@ | GracefulNodeShutdownBasedOnPodPriority | :ballot_box_with_check: 1.24+ | | 1.23 | 1.24– | | | GracefulNodeShutdown | [code](https://cs.k8s.io/?q=%5CbGracefulNodeShutdownBasedOnPodPriority%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbGracefulNodeShutdownBasedOnPodPriority%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | HPAConfigurableTolerance | :ballot_box_with_check: 1.35+ | | 1.33–1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbHPAConfigurableTolerance%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbHPAConfigurableTolerance%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | HPAScaleToZero | | | 1.16– | | | | | [code](https://cs.k8s.io/?q=%5CbHPAScaleToZero%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbHPAScaleToZero%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | -| HonorPVReclaimPolicy | :ballot_box_with_check: 1.31+ | :closed_lock_with_key: 1.33+ | 1.23–1.30 | 1.31–1.32 | 1.33– | | | [code](https://cs.k8s.io/?q=%5CbHonorPVReclaimPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbHonorPVReclaimPolicy%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | HostnameOverride | :ballot_box_with_check: 1.35+ | | 1.34 | 1.35– | | | | [code](https://cs.k8s.io/?q=%5CbHostnameOverride%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbHostnameOverride%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | ImageMaximumGCAge | :ballot_box_with_check: 1.30+ | :closed_lock_with_key: 1.35+ | 1.29 | 1.30–1.34 | 1.35– | | | [code](https://cs.k8s.io/?q=%5CbImageMaximumGCAge%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbImageMaximumGCAge%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | | ImageVolume | :ballot_box_with_check: 1.35+ | | 1.31–1.32 | 1.33– | | | | [code](https://cs.k8s.io/?q=%5CbImageVolume%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/kubernetes) [KEPs](https://cs.k8s.io/?q=%5CbImageVolume%5Cb&i=nope&files=&excludeFiles=CHANGELOG&repos=kubernetes/enhancements) | diff --git a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml index 93756d8f1af..15756cc83ba 100644 --- a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml +++ b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml @@ -649,20 +649,6 @@ lockToDefault: false preRelease: Beta version: "1.24" -- name: HonorPVReclaimPolicy - versionedSpecs: - - default: false - lockToDefault: false - preRelease: Alpha - version: "1.23" - - default: true - lockToDefault: false - preRelease: Beta - version: "1.31" - - default: true - lockToDefault: true - preRelease: GA - version: "1.33" - name: HostnameOverride versionedSpecs: - default: false