diff --git a/pkg/api/persistentvolumeclaim/util.go b/pkg/api/persistentvolumeclaim/util.go index 5f818c2e1e3..b847a87161c 100644 --- a/pkg/api/persistentvolumeclaim/util.go +++ b/pkg/api/persistentvolumeclaim/util.go @@ -22,6 +22,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/apis/core/helper" "k8s.io/kubernetes/pkg/features" ) @@ -95,10 +96,10 @@ func EnforceDataSourceBackwardsCompatibility(pvcSpec, oldPVCSpec *core.Persisten func DropDisabledFieldsFromStatus(pvc, oldPVC *core.PersistentVolumeClaim) { if !utilfeature.DefaultFeatureGate.Enabled(features.RecoverVolumeExpansionFailure) { - if !allocatedResourcesInUse(oldPVC) { + if !helper.ClaimContainsAllocatedResources(oldPVC) { pvc.Status.AllocatedResources = nil } - if !resizeStatusInUse(oldPVC) { + if !helper.ClaimContainsAllocatedResourceStatus(oldPVC) { pvc.Status.AllocatedResourceStatuses = nil } } @@ -175,28 +176,6 @@ func NormalizeDataSources(pvcSpec *core.PersistentVolumeClaimSpec) { } } -func resizeStatusInUse(oldPVC *core.PersistentVolumeClaim) bool { - if oldPVC == nil { - return false - } - if oldPVC.Status.AllocatedResourceStatuses != nil { - return true - } - return false -} - -func allocatedResourcesInUse(oldPVC *core.PersistentVolumeClaim) bool { - if oldPVC == nil { - return false - } - - if oldPVC.Status.AllocatedResources != nil { - return true - } - - return false -} - func GetWarningsForPersistentVolumeClaim(pv *core.PersistentVolumeClaim) []string { var warnings []string diff --git a/pkg/apis/core/helper/helpers.go b/pkg/apis/core/helper/helpers.go index 85fbc061610..a404263e78c 100644 --- a/pkg/apis/core/helper/helpers.go +++ b/pkg/apis/core/helper/helpers.go @@ -361,7 +361,22 @@ func ContainsAccessMode(modes []core.PersistentVolumeAccessMode, mode core.Persi } func ClaimContainsAllocatedResources(pvc *core.PersistentVolumeClaim) bool { - if pvc.Status.AllocatedResourceStatuses != nil || pvc.Status.AllocatedResources != nil { + if pvc == nil { + return false + } + + if pvc.Status.AllocatedResources != nil { + return true + } + return false +} + +func ClaimContainsAllocatedResourceStatus(pvc *core.PersistentVolumeClaim) bool { + if pvc == nil { + return false + } + + if pvc.Status.AllocatedResourceStatuses != nil { return true } return false diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index ded0900c11f..d925231aae7 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -2047,7 +2047,8 @@ func ValidationOptionsForPersistentVolumeClaim(pvc, oldPvc *core.PersistentVolum opts.AllowReadWriteOncePod = true } - if helper.ClaimContainsAllocatedResources(oldPvc) { + if helper.ClaimContainsAllocatedResources(oldPvc) || + helper.ClaimContainsAllocatedResourceStatus(oldPvc) { opts.EnableRecoverFromExpansionFailure = true } return opts diff --git a/pkg/volume/util/resize_util_test.go b/pkg/volume/util/resize_util_test.go index 0eabae9d001..f49b93fdc7b 100644 --- a/pkg/volume/util/resize_util_test.go +++ b/pkg/volume/util/resize_util_test.go @@ -159,16 +159,16 @@ func TestResizeFunctions(t *testing.T) { { name: "mark fs resize, with no other conditions", pvc: basePVC.get(), - expectedPVC: basePVC.modifyStorageResourceStatus(v1.PersistentVolumeClaimNodeResizePending).get(), + expectedPVC: basePVC.withStorageResourceStatus(v1.PersistentVolumeClaimNodeResizePending).get(), testFunc: func(pvc *v1.PersistentVolumeClaim, c clientset.Interface, _ resource.Quantity) (*v1.PersistentVolumeClaim, error) { return MarkForFSResize(pvc, c) }, }, { name: "mark fs resize, when other resource statuses are present", - pvc: basePVC.modifyResourceStatus(v1.ResourceCPU, v1.PersistentVolumeClaimControllerResizeFailed).get(), - expectedPVC: basePVC.modifyResourceStatus(v1.ResourceCPU, v1.PersistentVolumeClaimControllerResizeFailed). - modifyStorageResourceStatus(v1.PersistentVolumeClaimNodeResizePending).get(), + pvc: basePVC.withResourceStatus(v1.ResourceCPU, v1.PersistentVolumeClaimControllerResizeFailed).get(), + expectedPVC: basePVC.withResourceStatus(v1.ResourceCPU, v1.PersistentVolumeClaimControllerResizeFailed). + withStorageResourceStatus(v1.PersistentVolumeClaimNodeResizePending).get(), testFunc: func(pvc *v1.PersistentVolumeClaim, c clientset.Interface, _ resource.Quantity) (*v1.PersistentVolumeClaim, error) { return MarkForFSResize(pvc, c) }, @@ -176,17 +176,17 @@ func TestResizeFunctions(t *testing.T) { { name: "mark controller resize in-progress", pvc: basePVC.get(), - expectedPVC: basePVC.modifyStorageResourceStatus(v1.PersistentVolumeClaimControllerResizeInProgress).get(), + expectedPVC: basePVC.withStorageResourceStatus(v1.PersistentVolumeClaimControllerResizeInProgress).get(), testFunc: func(pvc *v1.PersistentVolumeClaim, i clientset.Interface, q resource.Quantity) (*v1.PersistentVolumeClaim, error) { return MarkControllerReisizeInProgress(pvc, "foobar", q, i) }, }, { name: "mark resize finished", - pvc: basePVC.modifyResourceStatus(v1.ResourceCPU, v1.PersistentVolumeClaimControllerResizeFailed). - modifyStorageResourceStatus(v1.PersistentVolumeClaimNodeResizePending).get(), - expectedPVC: basePVC.modifyResourceStatus(v1.ResourceCPU, v1.PersistentVolumeClaimControllerResizeFailed). - modifyStorageResourceStatus("").get(), + pvc: basePVC.withResourceStatus(v1.ResourceCPU, v1.PersistentVolumeClaimControllerResizeFailed). + withStorageResourceStatus(v1.PersistentVolumeClaimNodeResizePending).get(), + expectedPVC: basePVC.withResourceStatus(v1.ResourceCPU, v1.PersistentVolumeClaimControllerResizeFailed). + withStorageResourceStatus("").get(), testFunc: func(pvc *v1.PersistentVolumeClaim, i clientset.Interface, q resource.Quantity) (*v1.PersistentVolumeClaim, error) { return MarkFSResizeFinished(pvc, q, i) }, @@ -281,11 +281,11 @@ func makePVC(conditions []v1.PersistentVolumeClaimCondition) pvcModifier { return pvcModifier{pvc} } -func (m pvcModifier) modifyStorageResourceStatus(status v1.ClaimResourceStatus) pvcModifier { - return m.modifyResourceStatus(v1.ResourceStorage, status) +func (m pvcModifier) withStorageResourceStatus(status v1.ClaimResourceStatus) pvcModifier { + return m.withResourceStatus(v1.ResourceStorage, status) } -func (m pvcModifier) modifyResourceStatus(resource v1.ResourceName, status v1.ClaimResourceStatus) pvcModifier { +func (m pvcModifier) withResourceStatus(resource v1.ResourceName, status v1.ClaimResourceStatus) pvcModifier { if m.pvc.Status.AllocatedResourceStatuses != nil && status == "" { delete(m.pvc.Status.AllocatedResourceStatuses, resource) return m