@@ -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"
@@ -53,6 +54,7 @@ type controllerServer struct {
5354 ad DiskAttachDetach
5455 meta metadata.MetadataProvider
5556 snapshotWaiter waitstatus.StatusWaiter [ecs.Snapshot ]
57+ modify ModifyServer
5658 common.GenericControllerServer
5759}
5860
@@ -79,6 +81,16 @@ type diskVolumeArgs struct {
7981
8082var delVolumeSnap sync.Map
8183
84+ func newTaskStatusWaiter () waitstatus.StatusWaiter [ecs.Task ] {
85+ client := desc.Task {Client : GlobalConfigVar .EcsClient }
86+ waiter := waitstatus .NewBatched (client , clock.RealClock {}, 3 * time .Second , 10 * time .Second )
87+ waiter .PollHook = func () desc.Client [ecs.Task ] {
88+ return desc.Task {Client : updateEcsClient (GlobalConfigVar .EcsClient )}
89+ }
90+ go waiter .Run (context .Background ())
91+ return waiter
92+ }
93+
8294func newSnapshotStatusWaiter () waitstatus.StatusWaiter [ecs.Snapshot ] {
8395 client := desc.Snapshots {
8496 Client : GlobalConfigVar .EcsClient ,
@@ -107,6 +119,10 @@ func NewControllerServer(csiCfg utils.Config, m metadata.MetadataProvider) csi.C
107119 detachThrottler : defaultThrottler (),
108120 },
109121 snapshotWaiter : newSnapshotStatusWaiter (),
122+ modify : ModifyServer {
123+ ecsClient : GlobalConfigVar .EcsClient ,
124+ taskWaiter : newTaskStatusWaiter (),
125+ },
110126 }
111127 detachConcurrency := 1
112128 attachConcurrency := 1
@@ -130,6 +146,7 @@ func (cs *controllerServer) ControllerGetCapabilities(ctx context.Context, req *
130146 csi .ControllerServiceCapability_RPC_CREATE_DELETE_SNAPSHOT ,
131147 csi .ControllerServiceCapability_RPC_LIST_SNAPSHOTS ,
132148 csi .ControllerServiceCapability_RPC_EXPAND_VOLUME ,
149+ csi .ControllerServiceCapability_RPC_MODIFY_VOLUME ,
133150 ),
134151 }, nil
135152}
@@ -161,6 +178,14 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
161178 return nil , status .Errorf (codes .InvalidArgument , "Invalid parameters from input: %v, with error: %v" , req .Name , err )
162179 }
163180
181+ if len (req .MutableParameters ) > 0 {
182+ mutable , err := parseMutableParameters (req .MutableParameters )
183+ if err != nil {
184+ return nil , status .Errorf (codes .InvalidArgument , "Invalid mutable parameters: %v" , err )
185+ }
186+ importMutableParameters (diskVol , & mutable )
187+ }
188+
164189 var supportedTypes sets.Set [Category ]
165190 var selectedInstance string
166191 var isVirtualNode bool
@@ -751,3 +776,18 @@ func formatCSISnapshot(ecsSnapshot *ecs.Snapshot) (*csi.Snapshot, error) {
751776 GroupSnapshotId : groupSnapshotId ,
752777 }, nil
753778}
779+
780+ func (cs * controllerServer ) ControllerModifyVolume (ctx context.Context , req * csi.ControllerModifyVolumeRequest ) (* csi.ControllerModifyVolumeResponse , error ) {
781+ params , err := parseMutableParameters (req .MutableParameters )
782+ if err != nil {
783+ return nil , status .Error (codes .InvalidArgument , err .Error ())
784+ }
785+ err = cs .modify .Modify (ctx , req .VolumeId , params )
786+ if err != nil {
787+ if errors .Is (err , wrap .ErrorCode ("InvalidDiskId.NotFound" )) {
788+ return nil , status .Error (codes .NotFound , err .Error ())
789+ }
790+ return nil , err
791+ }
792+ return & csi.ControllerModifyVolumeResponse {}, nil
793+ }
0 commit comments