mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-14 14:23:37 +00:00
Merge pull request #118102 from RomanBednar/retro-sc-assignment-ga
graduate RetroactiveDefaultStorageClass feature to GA in 1.28
This commit is contained in:
commit
960830bc66
@ -2019,8 +2019,6 @@ type PersistentVolumeClaimSpecValidationOptions struct {
|
||||
AllowReadWriteOncePod bool
|
||||
// Allow users to recover from previously failing expansion operation
|
||||
EnableRecoverFromExpansionFailure bool
|
||||
// Allow assigning StorageClass to unbound PVCs retroactively
|
||||
EnableRetroactiveDefaultStorageClass bool
|
||||
// Allow to validate the label value of the label selector
|
||||
AllowInvalidLabelValueInSelector bool
|
||||
}
|
||||
@ -2029,7 +2027,6 @@ func ValidationOptionsForPersistentVolumeClaim(pvc, oldPvc *core.PersistentVolum
|
||||
opts := PersistentVolumeClaimSpecValidationOptions{
|
||||
AllowReadWriteOncePod: utilfeature.DefaultFeatureGate.Enabled(features.ReadWriteOncePod),
|
||||
EnableRecoverFromExpansionFailure: utilfeature.DefaultFeatureGate.Enabled(features.RecoverVolumeExpansionFailure),
|
||||
EnableRetroactiveDefaultStorageClass: utilfeature.DefaultFeatureGate.Enabled(features.RetroactiveDefaultStorageClass),
|
||||
AllowInvalidLabelValueInSelector: false,
|
||||
}
|
||||
if oldPvc == nil {
|
||||
@ -2286,16 +2283,14 @@ func validateStorageClassUpgradeFromAnnotation(oldAnnotations, newAnnotations ma
|
||||
|
||||
// Provide an upgrade path from PVC with nil storage class. We allow update of
|
||||
// StorageClassName only if following four conditions are met at the same time:
|
||||
// 1. RetroactiveDefaultStorageClass FeatureGate is enabled
|
||||
// 2. The new pvc's StorageClassName is not nil
|
||||
// 3. The old pvc's StorageClassName is nil
|
||||
// 4. The old pvc either does not have beta annotation set, or the beta annotation matches new pvc's StorageClassName
|
||||
// 1. The new pvc's StorageClassName is not nil
|
||||
// 2. The old pvc's StorageClassName is nil
|
||||
// 3. The old pvc either does not have beta annotation set, or the beta annotation matches new pvc's StorageClassName
|
||||
func validateStorageClassUpgradeFromNil(oldAnnotations map[string]string, oldScName, newScName *string, opts PersistentVolumeClaimSpecValidationOptions) bool {
|
||||
oldAnnotation, oldAnnotationExist := oldAnnotations[core.BetaStorageClassAnnotation]
|
||||
return opts.EnableRetroactiveDefaultStorageClass /* condition 1 */ &&
|
||||
newScName != nil /* condition 2 */ &&
|
||||
oldScName == nil /* condition 3 */ &&
|
||||
(!oldAnnotationExist || *newScName == oldAnnotation) /* condition 4 */
|
||||
return newScName != nil /* condition 1 */ &&
|
||||
oldScName == nil /* condition 2 */ &&
|
||||
(!oldAnnotationExist || *newScName == oldAnnotation) /* condition 3 */
|
||||
}
|
||||
|
||||
var resizeStatusSet = sets.NewString(string(core.PersistentVolumeClaimNoExpansionInProgress),
|
||||
|
@ -2424,7 +2424,6 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
|
||||
oldClaim *core.PersistentVolumeClaim
|
||||
newClaim *core.PersistentVolumeClaim
|
||||
enableRecoverFromExpansion bool
|
||||
enableRetroactiveDefaultStorageClass bool
|
||||
}{
|
||||
"valid-update-volumeName-only": {
|
||||
isExpectedFailure: false,
|
||||
@ -2539,64 +2538,31 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
|
||||
isExpectedFailure: false,
|
||||
oldClaim: validClaimStorageClassNil,
|
||||
newClaim: validClaimStorageClassInSpec,
|
||||
enableRetroactiveDefaultStorageClass: true,
|
||||
// Feature enabled - change from nil sc name is valid if there is no beta annotation.
|
||||
},
|
||||
"invalid-upgrade-nil-storage-class-spec-to-spec": {
|
||||
isExpectedFailure: true,
|
||||
oldClaim: validClaimStorageClassNil,
|
||||
newClaim: validClaimStorageClassInSpec,
|
||||
enableRetroactiveDefaultStorageClass: false,
|
||||
// Feature disabled - change from nil sc name is invalid if there is no beta annotation.
|
||||
},
|
||||
"invalid-upgrade-not-nil-storage-class-spec-to-spec": {
|
||||
isExpectedFailure: true,
|
||||
oldClaim: validClaimStorageClassInSpec,
|
||||
newClaim: validClaimStorageClassInSpecChanged,
|
||||
enableRetroactiveDefaultStorageClass: true,
|
||||
// Feature enablement must not allow non nil value change.
|
||||
},
|
||||
"invalid-upgrade-to-nil-storage-class-spec-to-spec": {
|
||||
isExpectedFailure: true,
|
||||
oldClaim: validClaimStorageClassInSpec,
|
||||
newClaim: validClaimStorageClassNil,
|
||||
enableRetroactiveDefaultStorageClass: true,
|
||||
// Feature enablement must not allow change to nil value change.
|
||||
},
|
||||
"valid-upgrade-storage-class-annotation-and-nil-spec-to-spec": {
|
||||
isExpectedFailure: false,
|
||||
oldClaim: validClaimStorageClassInAnnotationAndNilInSpec,
|
||||
newClaim: validClaimStorageClassInAnnotationAndSpec,
|
||||
enableRetroactiveDefaultStorageClass: false,
|
||||
// Change from nil sc name is valid if annotations match.
|
||||
},
|
||||
"valid-upgrade-storage-class-annotation-and-nil-spec-to-spec-retro": {
|
||||
isExpectedFailure: false,
|
||||
oldClaim: validClaimStorageClassInAnnotationAndNilInSpec,
|
||||
newClaim: validClaimStorageClassInAnnotationAndSpec,
|
||||
enableRetroactiveDefaultStorageClass: true,
|
||||
// Change from nil sc name is valid if annotations match, feature enablement must not break this old behavior.
|
||||
},
|
||||
"invalid-upgrade-storage-class-annotation-and-spec-to-spec": {
|
||||
isExpectedFailure: true,
|
||||
oldClaim: validClaimStorageClassInAnnotationAndSpec,
|
||||
newClaim: validClaimStorageClassInSpecChanged,
|
||||
enableRetroactiveDefaultStorageClass: false,
|
||||
// Change from non nil sc name is invalid if annotations don't match.
|
||||
},
|
||||
"invalid-upgrade-storage-class-annotation-and-spec-to-spec-retro": {
|
||||
isExpectedFailure: true,
|
||||
oldClaim: validClaimStorageClassInAnnotationAndSpec,
|
||||
newClaim: validClaimStorageClassInSpecChanged,
|
||||
enableRetroactiveDefaultStorageClass: true,
|
||||
// Change from non nil sc name is invalid if annotations don't match, feature enablement must not break this old behavior.
|
||||
},
|
||||
"invalid-upgrade-storage-class-annotation-and-no-spec": {
|
||||
isExpectedFailure: true,
|
||||
oldClaim: validClaimStorageClassInAnnotationAndNilInSpec,
|
||||
newClaim: validClaimStorageClassInSpecChanged,
|
||||
enableRetroactiveDefaultStorageClass: true,
|
||||
// Change from nil sc name is invalid if annotations don't match, feature enablement must not break this old behavior.
|
||||
},
|
||||
"invalid-upgrade-storage-class-annotation-to-spec": {
|
||||
isExpectedFailure: true,
|
||||
@ -2662,7 +2628,6 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) {
|
||||
for name, scenario := range scenarios {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RecoverVolumeExpansionFailure, scenario.enableRecoverFromExpansion)()
|
||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RetroactiveDefaultStorageClass, scenario.enableRetroactiveDefaultStorageClass)()
|
||||
scenario.oldClaim.ResourceVersion = "1"
|
||||
scenario.newClaim.ResourceVersion = "1"
|
||||
opts := ValidationOptionsForPersistentVolumeClaim(scenario.newClaim, scenario.oldClaim)
|
||||
@ -2689,7 +2654,6 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
|
||||
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
|
||||
AllowReadWriteOncePod: true,
|
||||
EnableRecoverFromExpansionFailure: false,
|
||||
EnableRetroactiveDefaultStorageClass: true,
|
||||
},
|
||||
},
|
||||
"rwop allowed because feature enabled": {
|
||||
@ -2698,7 +2662,6 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
|
||||
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
|
||||
AllowReadWriteOncePod: true,
|
||||
EnableRecoverFromExpansionFailure: false,
|
||||
EnableRetroactiveDefaultStorageClass: true,
|
||||
},
|
||||
},
|
||||
"rwop not allowed because not used and feature disabled": {
|
||||
@ -2707,7 +2670,6 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
|
||||
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
|
||||
AllowReadWriteOncePod: false,
|
||||
EnableRecoverFromExpansionFailure: false,
|
||||
EnableRetroactiveDefaultStorageClass: true,
|
||||
},
|
||||
},
|
||||
"rwop allowed because used and feature enabled": {
|
||||
@ -2716,7 +2678,6 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
|
||||
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
|
||||
AllowReadWriteOncePod: true,
|
||||
EnableRecoverFromExpansionFailure: false,
|
||||
EnableRetroactiveDefaultStorageClass: true,
|
||||
},
|
||||
},
|
||||
"rwop allowed because used and feature disabled": {
|
||||
@ -2725,7 +2686,6 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
|
||||
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
|
||||
AllowReadWriteOncePod: true,
|
||||
EnableRecoverFromExpansionFailure: false,
|
||||
EnableRetroactiveDefaultStorageClass: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
@ -2736,7 +2696,7 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
|
||||
|
||||
opts := ValidationOptionsForPersistentVolumeClaim(nil, tc.oldPvc)
|
||||
if opts != tc.expectValidationOpts {
|
||||
t.Errorf("Expected opts: %+v, received: %+v", opts, tc.expectValidationOpts)
|
||||
t.Errorf("Expected opts: %+v, received: %+v", tc.expectValidationOpts, opts)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -349,8 +349,7 @@ func (ctrl *PersistentVolumeController) syncUnboundClaim(ctx context.Context, cl
|
||||
// No PV could be found
|
||||
// OBSERVATION: pvc is "Pending", will retry
|
||||
|
||||
if utilfeature.DefaultFeatureGate.Enabled(features.RetroactiveDefaultStorageClass) {
|
||||
logger.V(4).Info("FeatureGate is enabled, attempting to assign storage class to unbound PersistentVolumeClaim", "featureGate", features.RetroactiveDefaultStorageClass, "PVC", klog.KObj(claim))
|
||||
logger.V(4).Info("Attempting to assign storage class to unbound PersistentVolumeClaim", "PVC", klog.KObj(claim))
|
||||
updated, err := ctrl.assignDefaultStorageClass(ctx, claim)
|
||||
if err != nil {
|
||||
metrics.RecordRetroactiveStorageClassMetric(false)
|
||||
@ -361,7 +360,6 @@ func (ctrl *PersistentVolumeController) syncUnboundClaim(ctx context.Context, cl
|
||||
metrics.RecordRetroactiveStorageClassMetric(true)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
switch {
|
||||
case delayBinding && !storagehelpers.IsDelayBindingProvisioning(claim):
|
||||
|
@ -754,8 +754,6 @@ func TestModifyDeletionFinalizers(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRetroactiveStorageClassAssignment(t *testing.T) {
|
||||
// Enable RetroactiveDefaultStorageClass feature gate.
|
||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RetroactiveDefaultStorageClass, true)()
|
||||
tests := []struct {
|
||||
storageClasses []*storagev1.StorageClass
|
||||
tests []controllerTest
|
||||
|
@ -668,6 +668,8 @@ const (
|
||||
// owner: @RomanBednar
|
||||
// kep: https://kep.k8s.io/3333
|
||||
// alpha: v1.25
|
||||
// beta: 1.26
|
||||
// stable: v1.28
|
||||
//
|
||||
// Allow assigning StorageClass to unbound PVCs retroactively
|
||||
RetroactiveDefaultStorageClass featuregate.Feature = "RetroactiveDefaultStorageClass"
|
||||
@ -1026,7 +1028,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS
|
||||
|
||||
RecoverVolumeExpansionFailure: {Default: false, PreRelease: featuregate.Alpha},
|
||||
|
||||
RetroactiveDefaultStorageClass: {Default: true, PreRelease: featuregate.Beta},
|
||||
RetroactiveDefaultStorageClass: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.29
|
||||
|
||||
RotateKubeletServerCertificate: {Default: true, PreRelease: featuregate.Beta},
|
||||
|
||||
|
@ -19,9 +19,6 @@ package volume
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
utilfeature "k8s.io/apiserver/pkg/util/feature"
|
||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
"math/rand"
|
||||
"os"
|
||||
"strconv"
|
||||
@ -1045,7 +1042,6 @@ func TestPersistentVolumeMultiPVsDiffAccessModes(t *testing.T) {
|
||||
// assignment and binding of PVCs with storage class name set to nil or "" with
|
||||
// and without presence of a default SC.
|
||||
func TestRetroactiveStorageClassAssignment(t *testing.T) {
|
||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RetroactiveDefaultStorageClass, true)()
|
||||
s := kubeapiservertesting.StartTestServerOrDie(t, nil, []string{"--disable-admission-plugins=DefaultStorageClass"}, framework.SharedEtcd())
|
||||
defer s.TearDownFn()
|
||||
namespaceName := "retro-pvc-sc"
|
||||
|
Loading…
Reference in New Issue
Block a user