Merge pull request #128342 from gnufied/recovery-expansion-beta

Move RecoverVolumeExpansionFailure feature to beta
This commit is contained in:
Kubernetes Prow Robot 2024-11-04 23:15:36 +00:00 committed by GitHub
commit 5572688cef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 33 additions and 6 deletions

View File

@ -3066,19 +3066,21 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
"nil pv": { "nil pv": {
oldPvc: nil, oldPvc: nil,
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
EnableRecoverFromExpansionFailure: false, EnableRecoverFromExpansionFailure: true,
EnableVolumeAttributesClass: false, EnableVolumeAttributesClass: false,
}, },
}, },
"invaild apiGroup in dataSource allowed because the old pvc is used": { "invaild apiGroup in dataSource allowed because the old pvc is used": {
oldPvc: pvcWithDataSource(&core.TypedLocalObjectReference{APIGroup: &invaildAPIGroup}), oldPvc: pvcWithDataSource(&core.TypedLocalObjectReference{APIGroup: &invaildAPIGroup}),
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
EnableRecoverFromExpansionFailure: true,
AllowInvalidAPIGroupInDataSourceOrRef: true, AllowInvalidAPIGroupInDataSourceOrRef: true,
}, },
}, },
"invaild apiGroup in dataSourceRef allowed because the old pvc is used": { "invaild apiGroup in dataSourceRef allowed because the old pvc is used": {
oldPvc: pvcWithDataSourceRef(&core.TypedObjectReference{APIGroup: &invaildAPIGroup}), oldPvc: pvcWithDataSourceRef(&core.TypedObjectReference{APIGroup: &invaildAPIGroup}),
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
EnableRecoverFromExpansionFailure: true,
AllowInvalidAPIGroupInDataSourceOrRef: true, AllowInvalidAPIGroupInDataSourceOrRef: true,
}, },
}, },
@ -3086,7 +3088,7 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
oldPvc: pvcWithVolumeAttributesClassName(utilpointer.String("foo")), oldPvc: pvcWithVolumeAttributesClassName(utilpointer.String("foo")),
enableVolumeAttributesClass: true, enableVolumeAttributesClass: true,
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
EnableRecoverFromExpansionFailure: false, EnableRecoverFromExpansionFailure: true,
EnableVolumeAttributesClass: true, EnableVolumeAttributesClass: true,
}, },
}, },
@ -3094,7 +3096,7 @@ func TestValidationOptionsForPersistentVolumeClaim(t *testing.T) {
oldPvc: pvcWithVolumeAttributesClassName(utilpointer.String("foo")), oldPvc: pvcWithVolumeAttributesClassName(utilpointer.String("foo")),
enableVolumeAttributesClass: false, enableVolumeAttributesClass: false,
expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{ expectValidationOpts: PersistentVolumeClaimSpecValidationOptions{
EnableRecoverFromExpansionFailure: false, EnableRecoverFromExpansionFailure: true,
EnableVolumeAttributesClass: true, EnableVolumeAttributesClass: true,
}, },
}, },

View File

@ -509,6 +509,7 @@ const (
// owner: @gnufied // owner: @gnufied
// kep: https://kep.k8s.io/1790 // kep: https://kep.k8s.io/1790
// beta - v1.32
// //
// Allow users to recover from volume expansion failure // Allow users to recover from volume expansion failure
RecoverVolumeExpansionFailure featuregate.Feature = "RecoverVolumeExpansionFailure" RecoverVolumeExpansionFailure featuregate.Feature = "RecoverVolumeExpansionFailure"

View File

@ -596,6 +596,7 @@ var defaultVersionedKubernetesFeatureGates = map[featuregate.Feature]featuregate
RecoverVolumeExpansionFailure: { RecoverVolumeExpansionFailure: {
{Version: version.MustParse("1.23"), Default: false, PreRelease: featuregate.Alpha}, {Version: version.MustParse("1.23"), Default: false, PreRelease: featuregate.Alpha},
{Version: version.MustParse("1.32"), Default: true, PreRelease: featuregate.Beta},
}, },
RecursiveReadOnlyMounts: { RecursiveReadOnlyMounts: {
{Version: version.MustParse("1.30"), Default: false, PreRelease: featuregate.Alpha}, {Version: version.MustParse("1.30"), Default: false, PreRelease: featuregate.Alpha},

View File

@ -24,6 +24,7 @@ import (
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/kubectl/pkg/util/storage"
kevents "k8s.io/kubernetes/pkg/kubelet/events" kevents "k8s.io/kubernetes/pkg/kubelet/events"
"k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util"
volumetypes "k8s.io/kubernetes/pkg/volume/util/types" volumetypes "k8s.io/kubernetes/pkg/volume/util/types"
@ -97,7 +98,9 @@ func (ne *NodeExpander) runPreCheck() bool {
// PVC is already expanded but we are still trying to expand the volume because // PVC is already expanded but we are still trying to expand the volume because
// last recorded size in ASOW is older. This can happen for RWX volume types. // last recorded size in ASOW is older. This can happen for RWX volume types.
if ne.pvcStatusCap.Cmp(ne.pluginResizeOpts.NewSize) >= 0 && ne.resizeStatus == "" { if ne.pvcStatusCap.Cmp(ne.pluginResizeOpts.NewSize) >= 0 &&
ne.resizeStatus == "" &&
storage.ContainsAccessMode(ne.pvc.Spec.AccessModes, v1.ReadWriteMany) {
ne.pvcAlreadyUpdated = true ne.pvcAlreadyUpdated = true
return true return true
} }

View File

@ -110,10 +110,21 @@ func TestNodeExpander(t *testing.T) {
expectedStatusSize: resource.MustParse("1G"), expectedStatusSize: resource.MustParse("1G"),
}, },
{ {
name: "pv.spec.cap = pvc.status.cap, resizeStatus='', desiredSize > actualSize", name: "RWO volumes, pv.spec.cap = pvc.status.cap, resizeStatus='', desiredSize > actualSize",
pvc: getTestPVC("test-vol0", "2G", "2G", "2G", nil), pvc: getTestPVC("test-vol0", "2G", "2G", "2G", nil),
pv: getTestPV("test-vol0", "2G"), pv: getTestPV("test-vol0", "2G"),
expectedResizeStatus: "",
expectResizeCall: false,
assumeResizeOpAsFinished: true,
expectFinalErrors: false,
expectedStatusSize: resource.MustParse("2G"),
},
{
name: "RWX volumes, pv.spec.cap = pvc.status.cap, resizeStatus='', desiredSize > actualSize",
pvc: addAccessMode(getTestPVC("test-vol0", "2G", "2G", "2G", nil), v1.ReadWriteMany),
pv: getTestPV("test-vol0", "2G"),
expectedResizeStatus: "", expectedResizeStatus: "",
expectResizeCall: true, expectResizeCall: true,
assumeResizeOpAsFinished: true, assumeResizeOpAsFinished: true,

View File

@ -255,7 +255,7 @@ func TestOperationGenerator_nodeExpandVolume(t *testing.T) {
actualSize: getSizeFunc("1G"), actualSize: getSizeFunc("1G"),
expectedResizeStatus: "", expectedResizeStatus: "",
resizeCallCount: 1, resizeCallCount: 0,
expectedStatusSize: resource.MustParse("2G"), expectedStatusSize: resource.MustParse("2G"),
}, },
{ {
@ -455,6 +455,11 @@ func getTestPVC(volumeName string, specSize, statusSize, allocatedSize string, r
return pvc return pvc
} }
func addAccessMode(pvc *v1.PersistentVolumeClaim, mode v1.PersistentVolumeAccessMode) *v1.PersistentVolumeClaim {
pvc.Spec.AccessModes = append(pvc.Spec.AccessModes, mode)
return pvc
}
func getTestPV(volumeName string, specSize string) *v1.PersistentVolume { func getTestPV(volumeName string, specSize string) *v1.PersistentVolume {
return &v1.PersistentVolume{ return &v1.PersistentVolume{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{

View File

@ -964,6 +964,10 @@
lockToDefault: false lockToDefault: false
preRelease: Alpha preRelease: Alpha
version: "1.23" version: "1.23"
- default: true
lockToDefault: false
preRelease: Beta
version: "1.32"
- name: RecursiveReadOnlyMounts - name: RecursiveReadOnlyMounts
versionedSpecs: versionedSpecs:
- default: false - default: false