Skip to content

Commit 5c14a57

Browse files
authored
Merge pull request kubernetes#126600 from gnufied/update-e2e-expansion
Use allocatedResources as new size for finishing volume expansion on the node
2 parents 08bd75c + 26798d2 commit 5c14a57

File tree

10 files changed

+218
-66
lines changed

10 files changed

+218
-66
lines changed

pkg/kubelet/volumemanager/cache/actual_state_of_world.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,8 @@ func (asw *actualStateOfWorld) volumeNeedsExpansion(volumeObj attachedVolume, de
960960
return currentSize, false
961961
}
962962

963+
klog.V(5).InfoS("NodeExpandVolume checking size", "actualSize", volumeObj.persistentVolumeSize.String(), "desiredSize", desiredVolumeSize.String(), "volume", volumeObj.volumeName)
964+
963965
if desiredVolumeSize.Cmp(*volumeObj.persistentVolumeSize) > 0 {
964966
volumePlugin, err := asw.volumePluginMgr.FindNodeExpandablePluginBySpec(volumeObj.spec)
965967
if err != nil || volumePlugin == nil {

pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,10 +380,11 @@ func (dswp *desiredStateOfWorldPopulator) checkVolumeFSResize(
380380
klog.V(5).InfoS("Skip file system resize check for the volume, as the volume is mounted as readonly", "pod", klog.KObj(pod), "volumeName", podVolume.Name)
381381
return
382382
}
383+
383384
pvCap := volumeSpec.PersistentVolume.Spec.Capacity.Storage()
384385
pvcStatusCap := pvc.Status.Capacity.Storage()
385386
dswp.desiredStateOfWorld.UpdatePersistentVolumeSize(uniqueVolumeName, pvCap)
386-
387+
klog.V(5).InfoS("NodeExpandVolume updating size", "actualSize", pvcStatusCap.String(), "desiredSize", pvCap.String(), "volumeName", uniqueVolumeName)
387388
// in case the actualStateOfWorld was rebuild after kubelet restart ensure that claimSize is set to accurate value
388389
dswp.actualStateOfWorld.InitializeClaimSize(klog.TODO(), uniqueVolumeName, pvcStatusCap)
389390
}

pkg/volume/util/operationexecutor/node_expander.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ type NodeExpander struct {
3636

3737
// computed via precheck
3838
pvcStatusCap resource.Quantity
39-
pvCap resource.Quantity
4039
resizeStatus v1.ClaimResourceStatus
4140

4241
// indicates that if volume expansion failed on the node, then current expansion should be marked
@@ -47,6 +46,9 @@ type NodeExpander struct {
4746
// PVC has already been updated - possibly because expansion already succeeded on different node.
4847
// This can happen when a RWX PVC is expanded.
4948
pvcAlreadyUpdated bool
49+
50+
// testStatus is used for testing purposes only.
51+
testStatus testResponseData
5052
}
5153

5254
func newNodeExpander(resizeOp nodeResizeOperationOpts, client clientset.Interface, recorder record.EventRecorder) *NodeExpander {
@@ -76,7 +78,6 @@ type testResponseData struct {
7678
// it returns false.
7779
func (ne *NodeExpander) runPreCheck() bool {
7880
ne.pvcStatusCap = ne.pvc.Status.Capacity[v1.ResourceStorage]
79-
ne.pvCap = ne.pv.Spec.Capacity[v1.ResourceStorage]
8081

8182
allocatedResourceStatus := ne.pvc.Status.AllocatedResourceStatuses
8283
if currentStatus, ok := allocatedResourceStatus[v1.ResourceStorage]; ok {
@@ -117,10 +118,12 @@ func (ne *NodeExpander) runPreCheck() bool {
117118
return false
118119
}
119120

120-
func (ne *NodeExpander) expandOnPlugin() (bool, error, testResponseData) {
121+
func (ne *NodeExpander) expandOnPlugin() (bool, resource.Quantity, error) {
121122
allowExpansion := ne.runPreCheck()
122123
if !allowExpansion {
123-
return false, nil, testResponseData{false, true}
124+
klog.V(3).Infof("NodeExpandVolume is not allowed to proceed for volume %s with resizeStatus %s", ne.vmt.VolumeName, ne.resizeStatus)
125+
ne.testStatus = testResponseData{false /* resizeCalledOnPlugin */, true /* assumeResizeFinished */}
126+
return false, ne.pluginResizeOpts.OldSize, nil
124127
}
125128

126129
var err error
@@ -132,7 +135,8 @@ func (ne *NodeExpander) expandOnPlugin() (bool, error, testResponseData) {
132135
if err != nil {
133136
msg := ne.vmt.GenerateErrorDetailed("MountVolume.NodeExpandVolume failed to mark node expansion in progress: %v", err)
134137
klog.Errorf(msg.Error())
135-
return false, err, testResponseData{}
138+
ne.testStatus = testResponseData{}
139+
return false, ne.pluginResizeOpts.OldSize, err
136140
}
137141
}
138142
_, resizeErr := ne.volumePlugin.NodeExpand(ne.pluginResizeOpts)
@@ -159,24 +163,27 @@ func (ne *NodeExpander) expandOnPlugin() (bool, error, testResponseData) {
159163
if volumetypes.IsFailedPreconditionError(resizeErr) {
160164
ne.actualStateOfWorld.MarkForInUseExpansionError(ne.vmt.VolumeName)
161165
klog.Errorf(ne.vmt.GenerateErrorDetailed("MountVolume.NodeExapndVolume failed with %v", resizeErr).Error())
162-
return false, nil, testResponseData{assumeResizeFinished: true, resizeCalledOnPlugin: true}
166+
ne.testStatus = testResponseData{assumeResizeFinished: true, resizeCalledOnPlugin: true}
167+
return false, ne.pluginResizeOpts.OldSize, nil
163168
}
164-
return false, resizeErr, testResponseData{assumeResizeFinished: true, resizeCalledOnPlugin: true}
169+
ne.testStatus = testResponseData{assumeResizeFinished: true, resizeCalledOnPlugin: true}
170+
return false, ne.pluginResizeOpts.OldSize, resizeErr
165171
}
166172
simpleMsg, detailedMsg := ne.vmt.GenerateMsg("MountVolume.NodeExpandVolume succeeded", nodeName)
167173
ne.recorder.Eventf(ne.vmt.Pod, v1.EventTypeNormal, kevents.FileSystemResizeSuccess, simpleMsg)
168174
ne.recorder.Eventf(ne.pvc, v1.EventTypeNormal, kevents.FileSystemResizeSuccess, simpleMsg)
169175
klog.InfoS(detailedMsg, "pod", klog.KObj(ne.vmt.Pod))
170176

177+
ne.testStatus = testResponseData{true /*resizeCalledOnPlugin */, true /* assumeResizeFinished */}
171178
// no need to update PVC object if we already updated it
172179
if ne.pvcAlreadyUpdated {
173-
return true, nil, testResponseData{true, true}
180+
return true, ne.pluginResizeOpts.NewSize, nil
174181
}
175182

176183
// File system resize succeeded, now update the PVC's Capacity to match the PV's
177184
ne.pvc, err = util.MarkFSResizeFinished(ne.pvc, ne.pluginResizeOpts.NewSize, ne.kubeClient)
178185
if err != nil {
179-
return true, fmt.Errorf("mountVolume.NodeExpandVolume update pvc status failed: %v", err), testResponseData{true, true}
186+
return true, ne.pluginResizeOpts.NewSize, fmt.Errorf("mountVolume.NodeExpandVolume update pvc status failed: %w", err)
180187
}
181-
return true, nil, testResponseData{true, true}
188+
return true, ne.pluginResizeOpts.NewSize, nil
182189
}

pkg/volume/util/operationexecutor/node_expander_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ func TestNodeExpander(t *testing.T) {
162162
ogInstance, _ := og.(*operationGenerator)
163163
nodeExpander := newNodeExpander(resizeOp, ogInstance.kubeClient, ogInstance.recorder)
164164

165-
_, err, expansionResponse := nodeExpander.expandOnPlugin()
165+
_, _, err := nodeExpander.expandOnPlugin()
166+
expansionResponse := nodeExpander.testStatus
166167

167168
pvc = nodeExpander.pvc
168169
pvcStatusCap := pvc.Status.Capacity[v1.ResourceStorage]

pkg/volume/util/operationexecutor/operation_generator.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,14 +1957,14 @@ func (og *operationGenerator) doOnlineExpansion(volumeToMount VolumeToMount,
19571957
actualStateOfWorld ActualStateOfWorldMounterUpdater,
19581958
resizeOptions volume.NodeResizeOptions) (bool, error, error) {
19591959

1960-
resizeDone, err := og.nodeExpandVolume(volumeToMount, actualStateOfWorld, resizeOptions)
1960+
resizeDone, newSize, err := og.nodeExpandVolume(volumeToMount, actualStateOfWorld, resizeOptions)
19611961
if err != nil {
19621962
e1, e2 := volumeToMount.GenerateError("NodeExpandVolume.NodeExpandVolume failed", err)
19631963
klog.Errorf(e2.Error())
19641964
return false, e1, e2
19651965
}
19661966
if resizeDone {
1967-
markingDone := actualStateOfWorld.MarkVolumeAsResized(volumeToMount.VolumeName, &resizeOptions.NewSize)
1967+
markingDone := actualStateOfWorld.MarkVolumeAsResized(volumeToMount.VolumeName, &newSize)
19681968
if !markingDone {
19691969
// On failure, return error. Caller will log and retry.
19701970
genericFailureError := fmt.Errorf("unable to mark volume as resized")
@@ -2009,8 +2009,11 @@ func (og *operationGenerator) expandVolumeDuringMount(volumeToMount VolumeToMoun
20092009
actualStateOfWorld: actualStateOfWorld,
20102010
}
20112011
if og.checkForRecoveryFromExpansion(pvc, volumeToMount) {
2012+
// if recovery feature is enabled, we can use allocated size from PVC status as new size
2013+
rsOpts.NewSize = pvc.Status.AllocatedResources[v1.ResourceStorage]
2014+
resizeOp.pluginResizeOpts = rsOpts
20122015
nodeExpander := newNodeExpander(resizeOp, og.kubeClient, og.recorder)
2013-
resizeFinished, err, _ := nodeExpander.expandOnPlugin()
2016+
resizeFinished, _, err := nodeExpander.expandOnPlugin()
20142017
return resizeFinished, err
20152018
} else {
20162019
return og.legacyCallNodeExpandOnPlugin(resizeOp)
@@ -2041,7 +2044,7 @@ func (og *operationGenerator) checkIfSupportsNodeExpansion(volumeToMount VolumeT
20412044
func (og *operationGenerator) nodeExpandVolume(
20422045
volumeToMount VolumeToMount,
20432046
actualStateOfWorld ActualStateOfWorldMounterUpdater,
2044-
rsOpts volume.NodeResizeOptions) (bool, error) {
2047+
rsOpts volume.NodeResizeOptions) (bool, resource.Quantity, error) {
20452048

20462049
supportsExpansion, expandableVolumePlugin := og.checkIfSupportsNodeExpansion(volumeToMount)
20472050

@@ -2050,17 +2053,18 @@ func (og *operationGenerator) nodeExpandVolume(
20502053
if rsOpts.NewSize.Cmp(rsOpts.OldSize) > 0 {
20512054
pv := volumeToMount.VolumeSpec.PersistentVolume
20522055
pvc, err := og.kubeClient.CoreV1().PersistentVolumeClaims(pv.Spec.ClaimRef.Namespace).Get(context.TODO(), pv.Spec.ClaimRef.Name, metav1.GetOptions{})
2056+
currentSize := pvc.Status.Capacity.Storage()
20532057
if err != nil {
20542058
// Return error rather than leave the file system un-resized, caller will log and retry
2055-
return false, fmt.Errorf("mountVolume.NodeExpandVolume get PVC failed : %v", err)
2059+
return false, *currentSize, fmt.Errorf("mountVolume.NodeExpandVolume get PVC failed : %w", err)
20562060
}
20572061

20582062
if volumeToMount.VolumeSpec.ReadOnly {
20592063
simpleMsg, detailedMsg := volumeToMount.GenerateMsg("MountVolume.NodeExpandVolume failed", "requested read-only file system")
20602064
klog.Warningf(detailedMsg)
20612065
og.recorder.Eventf(volumeToMount.Pod, v1.EventTypeWarning, kevents.FileSystemResizeFailed, simpleMsg)
20622066
og.recorder.Eventf(pvc, v1.EventTypeWarning, kevents.FileSystemResizeFailed, simpleMsg)
2063-
return true, nil
2067+
return true, *currentSize, nil
20642068
}
20652069
resizeOp := nodeResizeOperationOpts{
20662070
vmt: volumeToMount,
@@ -2072,15 +2076,20 @@ func (og *operationGenerator) nodeExpandVolume(
20722076
}
20732077

20742078
if og.checkForRecoveryFromExpansion(pvc, volumeToMount) {
2079+
// if recovery feature is enabled, we can use allocated size from PVC status as new size
2080+
newSize := pvc.Status.AllocatedResources[v1.ResourceStorage]
2081+
rsOpts.NewSize = newSize
2082+
resizeOp.pluginResizeOpts.NewSize = newSize
20752083
nodeExpander := newNodeExpander(resizeOp, og.kubeClient, og.recorder)
2076-
resizeFinished, err, _ := nodeExpander.expandOnPlugin()
2077-
return resizeFinished, err
2084+
resizeFinished, newSize, err := nodeExpander.expandOnPlugin()
2085+
return resizeFinished, newSize, err
20782086
} else {
2079-
return og.legacyCallNodeExpandOnPlugin(resizeOp)
2087+
resizeFinished, err := og.legacyCallNodeExpandOnPlugin(resizeOp)
2088+
return resizeFinished, rsOpts.NewSize, err
20802089
}
20812090
}
20822091
}
2083-
return true, nil
2092+
return true, rsOpts.OldSize, nil
20842093
}
20852094

20862095
func (og *operationGenerator) checkForRecoveryFromExpansion(pvc *v1.PersistentVolumeClaim, volumeToMount VolumeToMount) bool {

pkg/volume/util/operationexecutor/operation_generator_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ func TestOperationGenerator_nodeExpandVolume(t *testing.T) {
305305
asow := newFakeActualStateOfWorld()
306306

307307
ogInstance, _ := og.(*operationGenerator)
308-
_, err := ogInstance.nodeExpandVolume(vmt, asow, pluginResizeOpts)
308+
_, _, err := ogInstance.nodeExpandVolume(vmt, asow, pluginResizeOpts)
309309

310310
if !test.expectError && err != nil {
311311
t.Errorf("For test %s, expected no error got: %v", test.name, err)

test/e2e/storage/csimock/base.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ type testParameters struct {
9696
enableNodeExpansion bool // enable node expansion for CSI mock driver
9797
// just disable resizing on driver it overrides enableResizing flag for CSI mock driver
9898
disableResizingOnDriver bool
99+
disableControllerExpansion bool
99100
enableSnapshot bool
100101
enableVolumeMountGroup bool // enable the VOLUME_MOUNT_GROUP node capability in the CSI mock driver.
101102
enableNodeVolumeCondition bool
@@ -172,6 +173,7 @@ func (m *mockDriverSetup) init(ctx context.Context, tp testParameters) {
172173
EnableResizing: tp.enableResizing,
173174
EnableNodeExpansion: tp.enableNodeExpansion,
174175
EnableNodeVolumeCondition: tp.enableNodeVolumeCondition,
176+
DisableControllerExpansion: tp.disableControllerExpansion,
175177
EnableSnapshot: tp.enableSnapshot,
176178
EnableVolumeMountGroup: tp.enableVolumeMountGroup,
177179
TokenRequests: tp.tokenRequests,

0 commit comments

Comments
 (0)