From 780c531e8678a50fa7469b7882124cc46e29928d Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 18 Sep 2017 12:06:05 -0400 Subject: [PATCH] Resize plugin should only check for increase in size We should only check if user is trying to increase the volume. --- .../persistentvolume/resize/admission.go | 14 +++- .../persistentvolume/resize/admission_test.go | 69 +++++++++++++++++++ 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/plugin/pkg/admission/persistentvolume/resize/admission.go b/plugin/pkg/admission/persistentvolume/resize/admission.go index 65909370560..eb7b11cdac0 100644 --- a/plugin/pkg/admission/persistentvolume/resize/admission.go +++ b/plugin/pkg/admission/persistentvolume/resize/admission.go @@ -98,6 +98,17 @@ func (pvcr *persistentVolumeClaimResize) Admit(a admission.Attributes) error { return nil } + oldSize := oldPvc.Spec.Resources.Requests[api.ResourceStorage] + newSize := pvc.Spec.Resources.Requests[api.ResourceStorage] + + if newSize.Cmp(oldSize) <= 0 { + return nil + } + + if oldPvc.Status.Phase != api.ClaimBound { + return admission.NewForbidden(a, fmt.Errorf("Only bound persistent volume claims can be expanded")) + } + // Growing Persistent volumes is only allowed for PVCs for which their StorageClass // explicitly allows it if !pvcr.allowResize(pvc, oldPvc) { @@ -108,13 +119,12 @@ func (pvcr *persistentVolumeClaimResize) Admit(a admission.Attributes) error { // volume plugin must support resize pv, err := pvcr.pvLister.Get(pvc.Spec.VolumeName) if err != nil { - return nil + return admission.NewForbidden(a, fmt.Errorf("Error updating persistent volume claim because fetching associated persistent volume failed")) } if !pvcr.checkVolumePlugin(pv) { return admission.NewForbidden(a, fmt.Errorf("volume plugin does not support resize")) } - return nil } diff --git a/plugin/pkg/admission/persistentvolume/resize/admission_test.go b/plugin/pkg/admission/persistentvolume/resize/admission_test.go index 66ca4142169..237b053822d 100644 --- a/plugin/pkg/admission/persistentvolume/resize/admission_test.go +++ b/plugin/pkg/admission/persistentvolume/resize/admission_test.go @@ -97,6 +97,7 @@ func TestPVCResizeAdmission(t *testing.T) { }, Status: api.PersistentVolumeClaimStatus{ Capacity: getResourceList("1Gi"), + Phase: api.ClaimBound, }, }, newObj: &api.PersistentVolumeClaim{ @@ -109,6 +110,7 @@ func TestPVCResizeAdmission(t *testing.T) { }, Status: api.PersistentVolumeClaimStatus{ Capacity: getResourceList("2Gi"), + Phase: api.ClaimBound, }, }, checkError: expectNoError, @@ -126,6 +128,7 @@ func TestPVCResizeAdmission(t *testing.T) { }, Status: api.PersistentVolumeClaimStatus{ Capacity: getResourceList("1Gi"), + Phase: api.ClaimBound, }, }, newObj: &api.PersistentVolumeClaim{ @@ -138,6 +141,7 @@ func TestPVCResizeAdmission(t *testing.T) { }, Status: api.PersistentVolumeClaimStatus{ Capacity: getResourceList("2Gi"), + Phase: api.ClaimBound, }, }, checkError: expectVolumePluginError, @@ -154,6 +158,7 @@ func TestPVCResizeAdmission(t *testing.T) { }, Status: api.PersistentVolumeClaimStatus{ Capacity: getResourceList("1Gi"), + Phase: api.ClaimBound, }, }, newObj: &api.PersistentVolumeClaim{ @@ -165,6 +170,7 @@ func TestPVCResizeAdmission(t *testing.T) { }, Status: api.PersistentVolumeClaimStatus{ Capacity: getResourceList("2Gi"), + Phase: api.ClaimBound, }, }, checkError: expectDynamicallyProvisionedError, @@ -182,6 +188,7 @@ func TestPVCResizeAdmission(t *testing.T) { }, Status: api.PersistentVolumeClaimStatus{ Capacity: getResourceList("1Gi"), + Phase: api.ClaimBound, }, }, newObj: &api.PersistentVolumeClaim{ @@ -194,10 +201,72 @@ func TestPVCResizeAdmission(t *testing.T) { }, Status: api.PersistentVolumeClaimStatus{ Capacity: getResourceList("2Gi"), + Phase: api.ClaimBound, }, }, checkError: expectDynamicallyProvisionedError, }, + { + name: "PVC update with no change in size", + resource: api.SchemeGroupVersion.WithResource("persistentvolumeclaims"), + oldObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + Resources: api.ResourceRequirements{ + Requests: getResourceList("1Gi"), + }, + StorageClassName: &silverClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("0Gi"), + Phase: api.ClaimPending, + }, + }, + newObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + VolumeName: "volume4", + Resources: api.ResourceRequirements{ + Requests: getResourceList("1Gi"), + }, + StorageClassName: &silverClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("1Gi"), + Phase: api.ClaimBound, + }, + }, + checkError: expectNoError, + }, + { + name: "expand pvc in pending state", + resource: api.SchemeGroupVersion.WithResource("persistentvolumeclaims"), + oldObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + Resources: api.ResourceRequirements{ + Requests: getResourceList("1Gi"), + }, + StorageClassName: &silverClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("0Gi"), + Phase: api.ClaimPending, + }, + }, + newObj: &api.PersistentVolumeClaim{ + Spec: api.PersistentVolumeClaimSpec{ + Resources: api.ResourceRequirements{ + Requests: getResourceList("2Gi"), + }, + StorageClassName: &silverClassName, + }, + Status: api.PersistentVolumeClaimStatus{ + Capacity: getResourceList("0Gi"), + Phase: api.ClaimPending, + }, + }, + checkError: func(err error) bool { + return strings.Contains(err.Error(), "Only bound persistent volume claims can be expanded") + }, + }, } ctrl := newPlugin()