diff --git a/pkg/api/persistentvolumeclaim/util_test.go b/pkg/api/persistentvolumeclaim/util_test.go index 300759393df..61b6cb34844 100644 --- a/pkg/api/persistentvolumeclaim/util_test.go +++ b/pkg/api/persistentvolumeclaim/util_test.go @@ -449,6 +449,7 @@ func TestDropDisabledVolumeAttributesClass(t *testing.T) { } func TestDropDisabledFieldsFromStatus(t *testing.T) { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) tests := []struct { name string enableRecoverVolumeExpansionFailure bool diff --git a/pkg/apis/core/validation/validation_test.go b/pkg/apis/core/validation/validation_test.go index ede69c4c6c8..57d7a9948ff 100644 --- a/pkg/apis/core/validation/validation_test.go +++ b/pkg/apis/core/validation/validation_test.go @@ -2333,6 +2333,7 @@ func TestAlphaPVVolumeModeUpdate(t *testing.T) { } func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) block := core.PersistentVolumeBlock file := core.PersistentVolumeFilesystem invalidAPIGroup := "^invalid" @@ -20140,6 +20141,7 @@ func TestValidateLimitRange(t *testing.T) { } func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) validClaim := testVolumeClaim("foo", "ns", core.PersistentVolumeClaimSpec{ AccessModes: []core.PersistentVolumeAccessMode{ core.ReadWriteOnce, diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 23f862784e4..09fa573cf8f 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -1523,6 +1523,7 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate RecoverVolumeExpansionFailure: { {Version: version.MustParse("1.23"), Default: false, PreRelease: featuregate.Alpha}, {Version: version.MustParse("1.32"), Default: true, PreRelease: featuregate.Beta}, + {Version: version.MustParse("1.34"), Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // GA in 1.34; remove in 1.37 }, RecursiveReadOnlyMounts: { diff --git a/pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go b/pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go index 5cd9ad48aea..9462ecb2986 100644 --- a/pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go +++ b/pkg/quota/v1/evaluator/core/persistent_volume_claims_test.go @@ -25,6 +25,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/version" "k8s.io/apiserver/pkg/admission" quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/apiserver/pkg/quota/v1/generic" @@ -159,6 +160,7 @@ func TestPersistentVolumeClaimEvaluatorMatchingScopes(t *testing.T) { } func TestPersistentVolumeClaimEvaluatorUsage(t *testing.T) { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) classGold := "gold" validClaim := testVolumeClaim("foo", "ns", core.PersistentVolumeClaimSpec{ Selector: &metav1.LabelSelector{ diff --git a/pkg/volume/util/operationexecutor/node_expander_test.go b/pkg/volume/util/operationexecutor/node_expander_test.go index d12804c62e1..91e583da4ad 100644 --- a/pkg/volume/util/operationexecutor/node_expander_test.go +++ b/pkg/volume/util/operationexecutor/node_expander_test.go @@ -23,6 +23,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/version" utilfeature "k8s.io/apiserver/pkg/util/feature" featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kubernetes/pkg/features" @@ -45,6 +46,8 @@ func newFakeActualStateOfWorld() *fakeActualStateOfWorld { } func TestNodeExpander(t *testing.T) { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) + nodeResizeFailed := v1.PersistentVolumeClaimNodeResizeInfeasible nodeResizePending := v1.PersistentVolumeClaimNodeResizePending diff --git a/pkg/volume/util/operationexecutor/operation_generator_test.go b/pkg/volume/util/operationexecutor/operation_generator_test.go index 15a724a3961..32ed5eeb8c3 100644 --- a/pkg/volume/util/operationexecutor/operation_generator_test.go +++ b/pkg/volume/util/operationexecutor/operation_generator_test.go @@ -34,6 +34,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/uuid" + "k8s.io/apimachinery/pkg/util/version" fakeclient "k8s.io/client-go/kubernetes/fake" "k8s.io/component-base/metrics/testutil" "k8s.io/kubernetes/pkg/volume" @@ -93,6 +94,7 @@ func TestOperationGenerator_GenerateUnmapVolumeFunc_PluginName(t *testing.T) { } func TestOperationGenerator_GenerateExpandAndRecoverVolumeFunc(t *testing.T) { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) nodeResizePending := v1.PersistentVolumeClaimNodeResizePending nodeResizeFailed := v1.PersistentVolumeClaimNodeResizeInfeasible var tests = []struct { @@ -193,6 +195,7 @@ func TestOperationGenerator_nodeExpandVolume(t *testing.T) { x := resource.MustParse(size) return &x } + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) nodeResizeFailed := v1.PersistentVolumeClaimNodeResizeInfeasible nodeResizePending := v1.PersistentVolumeClaimNodeResizePending @@ -321,6 +324,7 @@ func TestOperationGenerator_nodeExpandVolume(t *testing.T) { } func TestExpandDuringMount(t *testing.T) { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) nodeResizePending := v1.PersistentVolumeClaimNodeResizePending var tests = []struct { name string @@ -403,6 +407,7 @@ func TestExpandDuringMount(t *testing.T) { } } func TestCheckForRecoveryFromExpansion(t *testing.T) { + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) tests := []struct { name string pvc *v1.PersistentVolumeClaim diff --git a/pkg/volume/util/resize_util_test.go b/pkg/volume/util/resize_util_test.go index b10b04ceb02..d115b2a3b41 100644 --- a/pkg/volume/util/resize_util_test.go +++ b/pkg/volume/util/resize_util_test.go @@ -25,6 +25,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" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" @@ -174,7 +175,7 @@ func TestMergeResizeCondition(t *testing.T) { func TestResizeFunctions(t *testing.T) { basePVC := makePVC([]v1.PersistentVolumeClaimCondition{}) - + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, utilfeature.DefaultFeatureGate, version.MustParse("1.33")) tests := []struct { name string pvc *v1.PersistentVolumeClaim diff --git a/plugin/pkg/admission/noderestriction/admission_test.go b/plugin/pkg/admission/noderestriction/admission_test.go index f283b98a0d6..fc1aace6c4c 100644 --- a/plugin/pkg/admission/noderestriction/admission_test.go +++ b/plugin/pkg/admission/noderestriction/admission_test.go @@ -36,6 +36,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/version" "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/authentication/user" "k8s.io/apiserver/pkg/authorization/authorizer" @@ -1972,6 +1973,7 @@ func TestAdmitPVCStatus(t *testing.T) { mynode := &user.DefaultInfo{Name: "system:node:mynode", Groups: []string{"system:nodes"}} nodeExpansionFailed := api.PersistentVolumeClaimNodeResizeInfeasible + featuregatetesting.SetFeatureGateEmulationVersionDuringTest(t, feature.DefaultFeatureGate, version.MustParse("1.33")) tests := []struct { name string diff --git a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml index 51341c8256a..adac3ab1395 100644 --- a/test/compatibility_lifecycle/reference/versioned_feature_list.yaml +++ b/test/compatibility_lifecycle/reference/versioned_feature_list.yaml @@ -1199,6 +1199,10 @@ lockToDefault: false preRelease: Beta version: "1.32" + - default: true + lockToDefault: true + preRelease: GA + version: "1.34" - name: RecursiveReadOnlyMounts versionedSpecs: - default: false diff --git a/test/e2e/storage/local_volume_resize.go b/test/e2e/storage/local_volume_resize.go index 84955203efd..0afccfcd2b1 100644 --- a/test/e2e/storage/local_volume_resize.go +++ b/test/e2e/storage/local_volume_resize.go @@ -122,6 +122,13 @@ var _ = utils.SIGDescribe("PersistentVolumes-expansion", func() { gomega.Expect(pv).NotTo(gomega.BeNil()) testVol.pv = pv + // since there is no external-resizer involved for this local volume, + // we need to update the PVC status to reflect the new size. + pvc, err := modifyPVCStatus(ctx, testVol.pvc, newSize, f.ClientSet) + framework.ExpectNoError(err, "while updating pvc status to more size") + gomega.Expect(pvc).NotTo(gomega.BeNil()) + testVol.pvc = pvc + ginkgo.By("Waiting for file system resize to finish") testVol.pvc, err = testsuites.WaitForFSResize(ctx, testVol.pvc, f.ClientSet) framework.ExpectNoError(err, "while waiting for fs resize to finish") @@ -134,6 +141,41 @@ var _ = utils.SIGDescribe("PersistentVolumes-expansion", func() { }) +func modifyPVCStatus(ctx context.Context, pvc *v1.PersistentVolumeClaim, size resource.Quantity, c clientset.Interface) (*v1.PersistentVolumeClaim, error) { + pvcName := pvc.Name + pvcToUpdate := pvc.DeepCopy() + + var lastError error + waitErr := wait.PollUntilContextTimeout(ctx, 5*time.Second, csiResizeWaitPeriod, true, func(ctx context.Context) (bool, error) { + var err error + pvcToUpdate, err = c.CoreV1().PersistentVolumeClaims(pvc.Namespace).Get(ctx, pvcName, metav1.GetOptions{}) + if err != nil { + return false, fmt.Errorf("error fetching pvc %s: %w", pvcName, err) + } + pvcToUpdate.Status.AllocatedResources = v1.ResourceList{ + v1.ResourceStorage: size, + } + pvcToUpdate.Status.AllocatedResourceStatuses = map[v1.ResourceName]v1.ClaimResourceStatus{ + v1.ResourceStorage: v1.PersistentVolumeClaimNodeResizePending, + } + + pvcToUpdate, err = c.CoreV1().PersistentVolumeClaims(pvc.Namespace).UpdateStatus(ctx, pvcToUpdate, metav1.UpdateOptions{}) + if err != nil { + framework.Logf("error updating PVC %s: %v", pvcName, err) + lastError = err + return false, nil + } + return true, nil + }) + if wait.Interrupted(waitErr) { + return nil, fmt.Errorf("timed out attempting to update PVC size. last update error: %w", lastError) + } + if waitErr != nil { + return nil, fmt.Errorf("failed to expand PVC size: %w", waitErr) + } + return pvcToUpdate, nil +} + func UpdatePVSize(ctx context.Context, pv *v1.PersistentVolume, size resource.Quantity, c clientset.Interface) (*v1.PersistentVolume, error) { pvName := pv.Name pvToUpdate := pv.DeepCopy()