Skip to content

Commit 2fc2ae4

Browse files
committed
disk: implement ModifyVolume
1 parent 4a17e6f commit 2fc2ae4

File tree

8 files changed

+448
-11
lines changed

8 files changed

+448
-11
lines changed

docs/ram-policies/disk/controller.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
"ecs:DescribeSnapshots",
2121
"ecs:DescribeTags",
2222
"ecs:DescribeTaskAttribute",
23+
"ecs:DescribeTasks",
2324
"ecs:DetachDisk",
2425
"ecs:ListTagResources",
26+
"ecs:ModifyDiskAttribute",
2527
"ecs:ModifyDiskSpec",
2628
"ecs:RemoveTags",
2729
"ecs:ResizeDisk",

pkg/cloud/ecsinterface.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,10 @@ type ECSInterface interface {
1111
DescribeDisks(request *ecs.DescribeDisksRequest) (response *ecs.DescribeDisksResponse, err error)
1212
ResizeDisk(request *ecs.ResizeDiskRequest) (response *ecs.ResizeDiskResponse, err error)
1313
DescribeSnapshots(request *ecs.DescribeSnapshotsRequest) (response *ecs.DescribeSnapshotsResponse, err error)
14+
15+
TagResources(request *ecs.TagResourcesRequest) (response *ecs.TagResourcesResponse, err error)
16+
UntagResources(request *ecs.UntagResourcesRequest) (response *ecs.UntagResourcesResponse, err error)
17+
ModifyDiskSpec(request *ecs.ModifyDiskSpecRequest) (response *ecs.ModifyDiskSpecResponse, err error)
18+
ModifyDiskAttribute(request *ecs.ModifyDiskAttributeRequest) (response *ecs.ModifyDiskAttributeResponse, err error)
19+
DescribeTasks(request *ecs.DescribeTasksRequest) (response *ecs.DescribeTasksResponse, err error)
1420
}

pkg/cloud/ecsmock.go

Lines changed: 75 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/disk/constants.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package disk
22

33
const (
4-
5-
// ESSD_PERFORMANCE_LEVEL is storage class
6-
ESSD_PERFORMANCE_LEVEL = "performanceLevel"
74
// DISKTAGKEY1 tag
85
DISKTAGKEY1 = "k8s.aliyun.com"
96
// DISKTAGVALUE1 value
@@ -18,6 +15,16 @@ const (
1815
SNAPSHOTTAGKEY1 = "force.delete.snapshot.k8s.aliyun.com"
1916
)
2017

18+
// keys used in CreateVolumeRequest.Parameters and MutableParameters
19+
const (
20+
DISK_TYPE = "type"
21+
ESSD_PERFORMANCE_LEVEL = "performanceLevel"
22+
PROVISIONED_IOPS_KEY = "provisionedIops"
23+
BURSTING_ENABLED_KEY = "burstingEnabled"
24+
DISK_TAG_PREFIX = "diskTags/"
25+
REMOVE_DISK_TAG_PREFIX = "-diskTags/"
26+
)
27+
2128
// keys used in CreateSnapshotRequest.Parameters
2229
const (
2330
SNAPSHOTTYPE = "snapshotType"
@@ -128,9 +135,6 @@ const (
128135
VOLUME_EXPAND_AUTO_SNAPSHOT_OP_KEY = "volumeExpandAutoSnapshot"
129136
VOLUME_DELETE_AUTO_SNAPSHOT_OP_RETENT_DAYS_KEY = "volumeDeleteSnapshotRetentionDays"
130137

131-
PROVISIONED_IOPS_KEY = "provisionedIops"
132-
BURSTING_ENABLED_KEY = "burstingEnabled"
133-
134138
CSI_DEFAULT_FS_TYPE = "csi.storage.k8s.io/fstype"
135139
FS_TYPE = "fsType"
136140
EXT4_FSTYPE = "ext4"

pkg/disk/controllerserver.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ 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"
35+
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/disk/desc"
36+
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/disk/waitstatus"
3437
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/features"
3538
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/utils"
3639
"google.golang.org/grpc/codes"
@@ -42,11 +45,13 @@ import (
4245
"k8s.io/apimachinery/pkg/util/sets"
4346
"k8s.io/client-go/tools/record"
4447
"k8s.io/klog/v2"
48+
"k8s.io/utils/clock"
4549
)
4650

4751
// controller server try to create/delete volumes/snapshots
4852
type controllerServer struct {
4953
recorder record.EventRecorder
54+
modify ModifyServer
5055
common.GenericControllerServer
5156
}
5257

@@ -80,10 +85,24 @@ var veasp = struct {
8085

8186
var delVolumeSnap sync.Map
8287

88+
func newTaskStatusWaiter() waitstatus.StatusWaiter[ecs.Task] {
89+
client := desc.Task{Client: GlobalConfigVar.EcsClient}
90+
waiter := waitstatus.NewBatched(client, clock.RealClock{}, 3*time.Second, 10*time.Second)
91+
waiter.PollHook = func() desc.Client[ecs.Task] {
92+
return desc.Task{Client: updateEcsClient(GlobalConfigVar.EcsClient)}
93+
}
94+
go waiter.Run(context.Background())
95+
return waiter
96+
}
97+
8398
// NewControllerServer is to create controller server
8499
func NewControllerServer() csi.ControllerServer {
85100
c := &controllerServer{
86101
recorder: utils.NewEventRecorder(),
102+
modify: ModifyServer{
103+
ecsClient: GlobalConfigVar.EcsClient,
104+
taskWaiter: newTaskStatusWaiter(),
105+
},
87106
}
88107
return c
89108
}
@@ -96,6 +115,7 @@ func (cs *controllerServer) ControllerGetCapabilities(ctx context.Context, req *
96115
csi.ControllerServiceCapability_RPC_CREATE_DELETE_SNAPSHOT,
97116
csi.ControllerServiceCapability_RPC_LIST_SNAPSHOTS,
98117
csi.ControllerServiceCapability_RPC_EXPAND_VOLUME,
118+
csi.ControllerServiceCapability_RPC_MODIFY_VOLUME,
99119
),
100120
}, nil
101121
}
@@ -136,6 +156,14 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
136156
return nil, status.Errorf(codes.InvalidArgument, "Invalid parameters from input: %v, with error: %v", req.Name, err)
137157
}
138158

159+
if len(req.MutableParameters) > 0 {
160+
mutable, err := parseMutableParameters(req.MutableParameters)
161+
if err != nil {
162+
return nil, status.Errorf(codes.InvalidArgument, "Invalid mutable parameters: %v", err)
163+
}
164+
importMutableParameters(diskVol, &mutable)
165+
}
166+
139167
// 兼容 serverless 拓扑感知场景;
140168
// req参数里面包含了云盘ID,则直接使用云盘ID进行返回;
141169
csiVolume, err := staticVolumeCreate(req, snapshotID)
@@ -970,3 +998,18 @@ func (cs *controllerServer) deleteUntagAutoSnapshot(snapshotID, diskID string) {
970998
klog.Errorf("ControllerExpandVolume:: failed to untag volumeExpandAutoSnapshot: %s", err.Error())
971999
}
9721000
}
1001+
1002+
func (cs *controllerServer) ControllerModifyVolume(ctx context.Context, req *csi.ControllerModifyVolumeRequest) (*csi.ControllerModifyVolumeResponse, error) {
1003+
params, err := parseMutableParameters(req.MutableParameters)
1004+
if err != nil {
1005+
return nil, status.Error(codes.InvalidArgument, err.Error())
1006+
}
1007+
err = cs.modify.Modify(ctx, req.VolumeId, params)
1008+
if err != nil {
1009+
if errors.Is(err, wrap.ErrorCode("InvalidDiskId.NotFound")) {
1010+
return nil, status.Error(codes.NotFound, err.Error())
1011+
}
1012+
return nil, err
1013+
}
1014+
return &csi.ControllerModifyVolumeResponse{}, nil
1015+
}

pkg/disk/desc/task.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package desc
2+
3+
import (
4+
"strings"
5+
6+
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
7+
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
8+
)
9+
10+
type Task struct {
11+
*ecs.Client
12+
}
13+
14+
func (c Task) Describe(ids []string) (Response[ecs.Task], error) {
15+
req := ecs.CreateDescribeTasksRequest()
16+
req.TaskIds = strings.Join(ids, ",")
17+
req.PageSize = requests.NewInteger(batchSize)
18+
19+
ret := Response[ecs.Task]{}
20+
resp, err := c.Client.DescribeTasks(req)
21+
if err != nil {
22+
return ret, err
23+
}
24+
ret.RequestID = resp.RequestId
25+
ret.Resources = resp.TaskSet.Task
26+
return ret, nil
27+
}
28+
29+
func (c Task) GetID(resource *ecs.Task) string {
30+
return resource.TaskId
31+
}
32+
33+
func (c Task) Type() string {
34+
return "task"
35+
}
36+
37+
func (c Task) BatchSize() int {
38+
return batchSize
39+
}
40+
41+
func TaskSattled(t *ecs.Task) bool {
42+
return t.TaskStatus == "Finished" || t.TaskStatus == "Failed"
43+
}

0 commit comments

Comments
 (0)