1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| // pkg/driver/controller.go
// CreateVolume — 创建底层存储资源
func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) {
// 1. 校验参数
if req.GetName() == "" {
return nil, status.Error(codes.InvalidArgument, "name missing")
}
cap := req.GetCapacityRange()
size := cap.GetRequiredBytes()
// 2. 调用存储后端 API 创建存储
volumeID, err := d.backend.CreateVolume(req.GetName(), size)
if err != nil {
return nil, status.Errorf(codes.Internal, "create volume failed: %v", err)
}
// 3. 返回 Volume 信息
return &csi.CreateVolumeResponse{
Volume: &csi.Volume{
VolumeId: volumeID,
CapacityBytes: size,
VolumeContext: map[string]string{
"backend": "my-storage",
},
},
}, nil
}
// DeleteVolume — 删除底层存储资源
func (d *Driver) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) {
if req.GetVolumeId() == "" {
return nil, status.Error(codes.InvalidArgument, "volume ID missing")
}
err := d.backend.DeleteVolume(req.GetVolumeId())
if err != nil {
return nil, status.Errorf(codes.Internal, "delete volume failed: %v", err)
}
return &csi.DeleteVolumeResponse{}, nil
}
// ControllerPublishVolume — Attach:将存储挂接到节点
func (d *Driver) ControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
// 1. 校验参数
// 2. 调用存储后端 API 将 Volume 映射到目标节点
err := d.backend.Attach(req.GetVolumeId(), req.GetNodeId())
if err != nil {
return nil, status.Errorf(codes.Internal, "attach failed: %v", err)
}
return &csi.ControllerPublishVolumeResponse{}, nil
}
// ControllerUnpublishVolume — Detach:从节点卸接存储
func (d *Driver) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) {
err := d.backend.Detach(req.GetVolumeId(), req.GetNodeId())
if err != nil {
return nil, status.Errorf(codes.Internal, "detach failed: %v", err)
}
return &csi.ControllerUnpublishVolumeResponse{}, nil
}
|