@@ -31,6 +31,7 @@ import (
3131 "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
3232 "github.com/container-storage-interface/spec/lib/go/csi"
3333 "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/cloud/metadata"
34+ "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/cloud/wrap"
3435 "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/common"
3536 "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/disk/desc"
3637 "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/disk/waitstatus"
@@ -54,6 +55,7 @@ type controllerServer struct {
5455 ad DiskAttachDetach
5556 meta metadata.MetadataProvider
5657 snapshotWaiter waitstatus.StatusWaiter [ecs.Snapshot ]
58+ modify ModifyServer
5759 common.GenericControllerServer
5860}
5961
@@ -86,6 +88,16 @@ var veasp = struct {
8688
8789var delVolumeSnap sync.Map
8890
91+ func newTaskStatusWaiter () waitstatus.StatusWaiter [ecs.Task ] {
92+ client := desc.Task {Client : GlobalConfigVar .EcsClient }
93+ waiter := waitstatus .NewBatched (client , clock.RealClock {}, 3 * time .Second , 10 * time .Second )
94+ waiter .PollHook = func () desc.Client [ecs.Task ] {
95+ return desc.Task {Client : updateEcsClient (GlobalConfigVar .EcsClient )}
96+ }
97+ go waiter .Run (context .Background ())
98+ return waiter
99+ }
100+
89101func newSnapshotStatusWaiter () waitstatus.StatusWaiter [ecs.Snapshot ] {
90102 client := desc.Snapshots {
91103 Client : GlobalConfigVar .EcsClient ,
@@ -114,6 +126,10 @@ func NewControllerServer(csiCfg utils.Config, m metadata.MetadataProvider) csi.C
114126 detachThrottler : defaultThrottler (),
115127 },
116128 snapshotWaiter : newSnapshotStatusWaiter (),
129+ modify : ModifyServer {
130+ ecsClient : GlobalConfigVar .EcsClient ,
131+ taskWaiter : newTaskStatusWaiter (),
132+ },
117133 }
118134 detachConcurrency := 1
119135 attachConcurrency := 1
@@ -137,6 +153,7 @@ func (cs *controllerServer) ControllerGetCapabilities(ctx context.Context, req *
137153 csi .ControllerServiceCapability_RPC_CREATE_DELETE_SNAPSHOT ,
138154 csi .ControllerServiceCapability_RPC_LIST_SNAPSHOTS ,
139155 csi .ControllerServiceCapability_RPC_EXPAND_VOLUME ,
156+ csi .ControllerServiceCapability_RPC_MODIFY_VOLUME ,
140157 ),
141158 }, nil
142159}
@@ -168,6 +185,14 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
168185 return nil , status .Errorf (codes .InvalidArgument , "Invalid parameters from input: %v, with error: %v" , req .Name , err )
169186 }
170187
188+ if len (req .MutableParameters ) > 0 {
189+ mutable , err := parseMutableParameters (req .MutableParameters )
190+ if err != nil {
191+ return nil , status .Errorf (codes .InvalidArgument , "Invalid mutable parameters: %v" , err )
192+ }
193+ importMutableParameters (diskVol , & mutable )
194+ }
195+
171196 sharedDisk := len (diskVol .Type ) == 1 && (diskVol .Type [0 ] == DiskSharedEfficiency || diskVol .Type [0 ] == DiskSharedSSD )
172197
173198 var supportedTypes sets.Set [Category ]
@@ -787,3 +812,18 @@ func updateVolumeExpandAutoSnapshotID(pvc *v1.PersistentVolumeClaim, snapshotID,
787812 }
788813 return nil
789814}
815+
816+ func (cs * controllerServer ) ControllerModifyVolume (ctx context.Context , req * csi.ControllerModifyVolumeRequest ) (* csi.ControllerModifyVolumeResponse , error ) {
817+ params , err := parseMutableParameters (req .MutableParameters )
818+ if err != nil {
819+ return nil , status .Error (codes .InvalidArgument , err .Error ())
820+ }
821+ err = cs .modify .Modify (ctx , req .VolumeId , params )
822+ if err != nil {
823+ if errors .Is (err , wrap .ErrorCode ("InvalidDiskId.NotFound" )) {
824+ return nil , status .Error (codes .NotFound , err .Error ())
825+ }
826+ return nil , err
827+ }
828+ return & csi.ControllerModifyVolumeResponse {}, nil
829+ }
0 commit comments