@@ -30,6 +30,7 @@ import (
3030 "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
3131 "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
3232 "github.com/container-storage-interface/spec/lib/go/csi"
33+ "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/cloud/wrap"
3334 "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/common"
3435 "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/disk/desc"
3536 "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/disk/waitstatus"
@@ -52,6 +53,7 @@ type controllerServer struct {
5253 recorder record.EventRecorder
5354 ad DiskAttachDetach
5455 snapshotWaiter waitstatus.StatusWaiter [ecs.Snapshot ]
56+ modify ModifyServer
5557 common.GenericControllerServer
5658}
5759
@@ -85,6 +87,16 @@ var veasp = struct {
8587
8688var delVolumeSnap sync.Map
8789
90+ func newTaskStatusWaiter () waitstatus.StatusWaiter [ecs.Task ] {
91+ client := desc.Task {Client : GlobalConfigVar .EcsClient }
92+ waiter := waitstatus .NewBatched (client , clock.RealClock {}, 3 * time .Second , 10 * time .Second )
93+ waiter .PollHook = func () desc.Client [ecs.Task ] {
94+ return desc.Task {Client : updateEcsClient (GlobalConfigVar .EcsClient )}
95+ }
96+ go waiter .Run (context .Background ())
97+ return waiter
98+ }
99+
88100func newSnapshotStatusWaiter () waitstatus.StatusWaiter [ecs.Snapshot ] {
89101 client := desc.Snapshots {
90102 Client : GlobalConfigVar .EcsClient ,
@@ -112,6 +124,10 @@ func NewControllerServer(csiCfg utils.Config) csi.ControllerServer {
112124 detachThrottler : defaultThrottler (),
113125 },
114126 snapshotWaiter : newSnapshotStatusWaiter (),
127+ modify : ModifyServer {
128+ ecsClient : GlobalConfigVar .EcsClient ,
129+ taskWaiter : newTaskStatusWaiter (),
130+ },
115131 }
116132 detachConcurrency := 1
117133 attachConcurrency := 1
@@ -135,6 +151,7 @@ func (cs *controllerServer) ControllerGetCapabilities(ctx context.Context, req *
135151 csi .ControllerServiceCapability_RPC_CREATE_DELETE_SNAPSHOT ,
136152 csi .ControllerServiceCapability_RPC_LIST_SNAPSHOTS ,
137153 csi .ControllerServiceCapability_RPC_EXPAND_VOLUME ,
154+ csi .ControllerServiceCapability_RPC_MODIFY_VOLUME ,
138155 ),
139156 }, nil
140157}
@@ -169,6 +186,14 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
169186 return nil , status .Errorf (codes .InvalidArgument , "Invalid parameters from input: %v, with error: %v" , req .Name , err )
170187 }
171188
189+ if len (req .MutableParameters ) > 0 {
190+ mutable , err := parseMutableParameters (req .MutableParameters )
191+ if err != nil {
192+ return nil , status .Errorf (codes .InvalidArgument , "Invalid mutable parameters: %v" , err )
193+ }
194+ importMutableParameters (diskVol , & mutable )
195+ }
196+
172197 sharedDisk := len (diskVol .Type ) == 1 && (diskVol .Type [0 ] == DiskSharedEfficiency || diskVol .Type [0 ] == DiskSharedSSD )
173198
174199 var supportedTypes sets.Set [Category ]
@@ -805,3 +830,18 @@ func (cs *controllerServer) deleteVolumeExpandAutoSnapshot(ctx context.Context,
805830 cs .recorder .Event (pvc , v1 .EventTypeNormal , snapshotDeletedSuccessfully , str )
806831 return nil
807832}
833+
834+ func (cs * controllerServer ) ControllerModifyVolume (ctx context.Context , req * csi.ControllerModifyVolumeRequest ) (* csi.ControllerModifyVolumeResponse , error ) {
835+ params , err := parseMutableParameters (req .MutableParameters )
836+ if err != nil {
837+ return nil , status .Error (codes .InvalidArgument , err .Error ())
838+ }
839+ err = cs .modify .Modify (ctx , req .VolumeId , params )
840+ if err != nil {
841+ if errors .Is (err , wrap .ErrorCode ("InvalidDiskId.NotFound" )) {
842+ return nil , status .Error (codes .NotFound , err .Error ())
843+ }
844+ return nil , err
845+ }
846+ return & csi.ControllerModifyVolumeResponse {}, nil
847+ }
0 commit comments