Merge pull request #132662 from gnufied/bump-recovery-feature-ga

Bump recovery feature ga
This commit is contained in:
Kubernetes Prow Robot
2025-07-17 17:10:25 -07:00
committed by GitHub
10 changed files with 64 additions and 1 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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: {

View File

@@ -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{

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()