Skip to content

Commit 9e52832

Browse files
authored
Merge pull request kubernetes#77317 from gnufied/fix-block-volume-resizing
Fix block volume expansion
2 parents 3b5e228 + 0eb68c5 commit 9e52832

File tree

4 files changed

+78
-43
lines changed

4 files changed

+78
-43
lines changed

pkg/volume/util/operationexecutor/operation_generator.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1537,10 +1537,11 @@ func (og *operationGenerator) GenerateExpandVolumeFunc(
15371537
klog.Infof("ExpandVolume.UpdatePV succeeded for volume %s", pvcWithResizeRequest.QualifiedName())
15381538
}
15391539

1540+
fsVolume, _ := util.CheckVolumeModeFilesystem(volumeSpec)
15401541
// No Cloudprovider resize needed, lets mark resizing as done
15411542
// Rest of the volume expand controller code will assume PVC as *not* resized until pvc.Status.Size
15421543
// reflects user requested size.
1543-
if !volumePlugin.RequiresFSResize() {
1544+
if !volumePlugin.RequiresFSResize() || !fsVolume {
15441545
klog.V(4).Infof("Controller resizing done for PVC %s", pvcWithResizeRequest.QualifiedName())
15451546
err := resizeMap.MarkAsResized(pvcWithResizeRequest, newSize)
15461547

test/e2e/storage/testsuites/provisioning.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ type StorageClassTest struct {
5353
ClaimSize string
5454
ExpectedSize string
5555
PvCheck func(claim *v1.PersistentVolumeClaim)
56-
VolumeMode *v1.PersistentVolumeMode
56+
VolumeMode v1.PersistentVolumeMode
5757
AllowVolumeExpansion bool
5858
}
5959

test/e2e/storage/volume_expand.go

Lines changed: 69 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ const (
4242

4343
var _ = utils.SIGDescribe("Volume expand", func() {
4444
var (
45-
c clientset.Interface
46-
ns string
47-
err error
48-
pvc *v1.PersistentVolumeClaim
49-
resizableSc *storage.StorageClass
45+
c clientset.Interface
46+
ns string
47+
err error
48+
pvc *v1.PersistentVolumeClaim
49+
storageClassVar *storage.StorageClass
5050
)
5151

5252
f := framework.NewDefaultFramework("volume-expand")
@@ -55,61 +55,58 @@ var _ = utils.SIGDescribe("Volume expand", func() {
5555
c = f.ClientSet
5656
ns = f.Namespace.Name
5757
framework.ExpectNoError(framework.WaitForAllNodesSchedulable(c, framework.TestContext.NodeSchedulableTimeout))
58+
})
59+
60+
setupFunc := func(allowExpansion bool, blockVolume bool) (*v1.PersistentVolumeClaim, *storage.StorageClass, error) {
5861
test := testsuites.StorageClassTest{
59-
Name: "default",
60-
ClaimSize: "2Gi",
61-
AllowVolumeExpansion: true,
62+
Name: "default",
63+
ClaimSize: "2Gi",
6264
}
63-
resizableSc, err = createStorageClass(test, ns, "resizing", c)
64-
framework.ExpectNoError(err, "Error creating resizable storage class")
65-
Expect(resizableSc.AllowVolumeExpansion).NotTo(BeNil())
66-
Expect(*resizableSc.AllowVolumeExpansion).To(BeTrue())
67-
68-
pvc = newClaim(test, ns, "default")
69-
pvc.Spec.StorageClassName = &resizableSc.Name
70-
pvc, err = c.CoreV1().PersistentVolumeClaims(pvc.Namespace).Create(pvc)
71-
framework.ExpectNoError(err, "Error creating pvc")
72-
})
65+
if allowExpansion {
66+
test.AllowVolumeExpansion = true
67+
}
68+
if blockVolume {
69+
test.VolumeMode = v1.PersistentVolumeBlock
70+
}
71+
72+
sc, err := createStorageClass(test, ns, "resizing", c)
73+
framework.ExpectNoError(err, "Error creating storage class for resizing")
74+
75+
tPVC := newClaim(test, ns, "default")
76+
tPVC.Spec.StorageClassName = &sc.Name
77+
tPVC, err = c.CoreV1().PersistentVolumeClaims(tPVC.Namespace).Create(tPVC)
78+
if err != nil {
79+
return nil, sc, err
80+
}
81+
return tPVC, sc, nil
82+
}
7383

7484
AfterEach(func() {
7585
framework.ExpectNoError(framework.DeletePersistentVolumeClaim(c, pvc.Name, pvc.Namespace))
76-
framework.ExpectNoError(c.StorageV1().StorageClasses().Delete(resizableSc.Name, nil))
86+
framework.ExpectNoError(c.StorageV1().StorageClasses().Delete(storageClassVar.Name, nil))
7787
})
7888

7989
It("should not allow expansion of pvcs without AllowVolumeExpansion property", func() {
80-
test := testsuites.StorageClassTest{
81-
Name: "no-expansion",
82-
ClaimSize: "2Gi",
83-
}
84-
regularSC, err := createStorageClass(test, ns, "noexpand", c)
85-
framework.ExpectNoError(err, "Error creating non-expandable storage class")
90+
pvc, storageClassVar, err = setupFunc(false /* allowExpansion */, false /*BlockVolume*/)
91+
framework.ExpectNoError(err, "Error creating non-expandable PVC")
8692

87-
defer func() {
88-
framework.ExpectNoError(c.StorageV1().StorageClasses().Delete(regularSC.Name, nil))
89-
}()
90-
Expect(regularSC.AllowVolumeExpansion).To(BeNil())
93+
Expect(storageClassVar.AllowVolumeExpansion).To(BeNil())
9194

92-
noExpandPVC := newClaim(test, ns, "noexpand")
93-
noExpandPVC.Spec.StorageClassName = &regularSC.Name
94-
noExpandPVC, err = c.CoreV1().PersistentVolumeClaims(noExpandPVC.Namespace).Create(noExpandPVC)
95-
framework.ExpectNoError(err, "Error creating pvc")
96-
97-
defer func() {
98-
framework.ExpectNoError(framework.DeletePersistentVolumeClaim(c, noExpandPVC.Name, noExpandPVC.Namespace))
99-
}()
100-
101-
pvcClaims := []*v1.PersistentVolumeClaim{noExpandPVC}
95+
pvcClaims := []*v1.PersistentVolumeClaim{pvc}
10296
pvs, err := framework.WaitForPVClaimBoundPhase(c, pvcClaims, framework.ClaimProvisionTimeout)
10397
framework.ExpectNoError(err, "Failed waiting for PVC to be bound %v", err)
10498
Expect(len(pvs)).To(Equal(1))
10599

106100
By("Expanding non-expandable pvc")
107101
newSize := resource.MustParse("6Gi")
108-
noExpandPVC, err = expandPVCSize(noExpandPVC, newSize, c)
102+
pvc, err = expandPVCSize(pvc, newSize, c)
109103
Expect(err).To(HaveOccurred(), "While updating non-expandable PVC")
110104
})
111105

112106
It("Verify if editing PVC allows resize", func() {
107+
pvc, storageClassVar, err = setupFunc(true /* allowExpansion */, false /*BlockVolume*/)
108+
framework.ExpectNoError(err, "Error creating non-expandable PVC")
109+
113110
By("Waiting for pvc to be in bound phase")
114111
pvcClaims := []*v1.PersistentVolumeClaim{pvc}
115112
pvs, err := framework.WaitForPVClaimBoundPhase(c, pvcClaims, framework.ClaimProvisionTimeout)
@@ -166,6 +163,38 @@ var _ = utils.SIGDescribe("Volume expand", func() {
166163
pvcConditions := pvc.Status.Conditions
167164
Expect(len(pvcConditions)).To(Equal(0), "pvc should not have conditions")
168165
})
166+
167+
It("should allow expansion of block volumes", func() {
168+
pvc, storageClassVar, err = setupFunc(true /*allowExpansion*/, true /*blockVolume*/)
169+
170+
By("Waiting for pvc to be in bound phase")
171+
pvcClaims := []*v1.PersistentVolumeClaim{pvc}
172+
pvs, err := framework.WaitForPVClaimBoundPhase(c, pvcClaims, framework.ClaimProvisionTimeout)
173+
framework.ExpectNoError(err, "Failed waiting for PVC to be bound %v", err)
174+
Expect(len(pvs)).To(Equal(1))
175+
176+
By("Expanding current pvc")
177+
newSize := resource.MustParse("6Gi")
178+
pvc, err = expandPVCSize(pvc, newSize, c)
179+
framework.ExpectNoError(err, "While updating pvc for more size")
180+
Expect(pvc).NotTo(BeNil())
181+
182+
pvcSize := pvc.Spec.Resources.Requests[v1.ResourceStorage]
183+
if pvcSize.Cmp(newSize) != 0 {
184+
framework.Failf("error updating pvc size %q", pvc.Name)
185+
}
186+
187+
By("Waiting for cloudprovider resize to finish")
188+
err = waitForControllerVolumeResize(pvc, c, totalResizeWaitPeriod)
189+
framework.ExpectNoError(err, "While waiting for pvc resize to finish")
190+
191+
By("Waiting for file system resize to finish")
192+
pvc, err = waitForFSResize(pvc, c)
193+
framework.ExpectNoError(err, "while waiting for fs resize to finish")
194+
195+
pvcConditions := pvc.Status.Conditions
196+
Expect(len(pvcConditions)).To(Equal(0), "pvc should not have conditions")
197+
})
169198
})
170199

171200
func createStorageClass(t testsuites.StorageClassTest, ns string, suffix string, c clientset.Interface) (*storage.StorageClass, error) {

test/e2e/storage/volume_provisioning.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,12 @@ func getClaim(claimSize string, ns string) *v1.PersistentVolumeClaim {
10341034
}
10351035

10361036
func newClaim(t testsuites.StorageClassTest, ns, suffix string) *v1.PersistentVolumeClaim {
1037-
return getClaim(t.ClaimSize, ns)
1037+
claim := getClaim(t.ClaimSize, ns)
1038+
if t.VolumeMode == v1.PersistentVolumeBlock {
1039+
blockVolumeMode := v1.PersistentVolumeBlock
1040+
claim.Spec.VolumeMode = &blockVolumeMode
1041+
}
1042+
return claim
10381043
}
10391044

10401045
func getDefaultPluginName() string {

0 commit comments

Comments
 (0)