Skip to content

Commit 94e7c8c

Browse files
committed
controller: refact the duplcated codes for the clone operation
- also correct the description of command Signed-off-by: Vicente Cheng <vicente.cheng@suse.com>
1 parent 4e3dacd commit 94e7c8c

File tree

3 files changed

+34
-57
lines changed

3 files changed

+34
-57
lines changed

cmd/provisioner/createsnap.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func createSnapCmd() *cli.Command {
1616
Flags: []cli.Flag{
1717
&cli.StringFlag{
1818
Name: flagSnapName,
19-
Usage: "Required. Specify lv name.",
19+
Usage: "Required. Specify snapshot name.",
2020
},
2121
&cli.Int64Flag{
2222
Name: flagLVSize,
@@ -28,7 +28,7 @@ func createSnapCmd() *cli.Command {
2828
},
2929
&cli.StringFlag{
3030
Name: flagLVName,
31-
Usage: "Required. the name of the volumegroup",
31+
Usage: "Required. Specify the logical volume name.",
3232
},
3333
&cli.StringFlag{
3434
Name: flagLVMType,
@@ -60,7 +60,7 @@ func createSnap(c *cli.Context) error {
6060
}
6161
snapName := c.String(flagSnapName)
6262
if snapName == "" {
63-
return fmt.Errorf("invalid empty flag %v", flagLVMType)
63+
return fmt.Errorf("invalid empty flag %v", flagSnapName)
6464
}
6565
lvType := c.String(flagLVMType)
6666
if lvType == "" {

cmd/provisioner/deletesnap.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ func deleteSnapCmd() *cli.Command {
1616
Flags: []cli.Flag{
1717
&cli.StringFlag{
1818
Name: flagSnapName,
19-
Usage: "Required. Specify lv name.",
19+
Usage: "Required. Specify snapshot name.",
2020
},
2121
&cli.StringFlag{
2222
Name: flagVGName,
@@ -40,7 +40,7 @@ func deleteSnap(c *cli.Context) error {
4040
}
4141
snapName := c.String(flagSnapName)
4242
if snapName == "" {
43-
return fmt.Errorf("invalid empty flag %v", flagLVMType)
43+
return fmt.Errorf("invalid empty flag %v", flagSnapName)
4444
}
4545

4646
klog.Infof("delete snapshot: %s/%s", vgName, snapName)

pkg/lvm/controllerserver.go

Lines changed: 29 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -195,36 +195,27 @@ func (cs *controllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
195195
}, nil
196196
}
197197

198-
func (cs *controllerServer) cloneFromSnapshot(ctx context.Context, snapContent *snapv1.VolumeSnapshotContent, dstName, dstNode, dstLVType, dstVGName string, dstSize int64) error {
199-
srcVolID := *snapContent.Spec.Source.VolumeHandle
200-
srcVol, err := cs.kubeClient.CoreV1().PersistentVolumes().Get(ctx, srcVolID, metav1.GetOptions{})
201-
if err != nil {
202-
klog.Errorf("error getting volume: %v", err)
203-
return err
204-
}
198+
func (cs *controllerServer) generateVolumeActionForClone(srcVol *v1.PersistentVolume, srcLVName, dstName, dstNode, dstLVType, dstVGName string, srcSize, dstSize int64) (volumeAction, error) {
205199
ns := srcVol.Spec.NodeAffinity.Required.NodeSelectorTerms
206200
srcNode := ns[0].MatchExpressions[0].Values[0]
207201
srcVgName := srcVol.Spec.CSI.VolumeAttributes["vgName"]
208-
srcVgType := srcVol.Spec.CSI.VolumeAttributes["type"]
209-
restoreSize := *snapContent.Status.RestoreSize
202+
srcType := srcVol.Spec.CSI.VolumeAttributes["type"]
210203

211-
snapshotLVName := fmt.Sprintf("lvm-%s", *snapContent.Status.SnapshotHandle)
212-
//srcSnapDev := fmt.Sprintf("/dev/%s/%s", srcVgName, snapshotLVName)
213204
srcInfo := &srcInfo{
214-
srcLVName: snapshotLVName,
205+
srcLVName: srcLVName,
215206
srcVGName: srcVgName,
216-
srcType: srcVgType,
207+
srcType: srcType,
217208
}
218-
klog.V(4).Infof("cloning volume from %s/%s ", srcVgName, snapshotLVName)
209+
klog.V(4).Infof("cloning volume from %s/%s ", srcVgName, srcLVName)
219210

220-
if restoreSize > dstSize {
221-
return status.Error(codes.InvalidArgument, "source volume size is larger than destination volume size")
211+
if srcSize > dstSize {
212+
return volumeAction{}, status.Errorf(codes.InvalidArgument, "source/snapshot volume size(%v) is larger than destination volume size(%v)", srcSize, dstSize)
222213
}
223214
if srcNode != dstNode {
224-
return status.Errorf(codes.InvalidArgument, "source (%s) and destination (%s) nodes are different (not supported)", srcNode, dstNode)
215+
return volumeAction{}, status.Errorf(codes.InvalidArgument, "source (%s) and destination (%s) nodes are different (not supported)", srcNode, dstNode)
225216
}
226217

227-
va := volumeAction{
218+
return volumeAction{
228219
action: actionTypeClone,
229220
name: dstName,
230221
nodeName: dstNode,
@@ -237,7 +228,23 @@ func (cs *controllerServer) cloneFromSnapshot(ctx context.Context, snapContent *
237228
vgName: dstVGName,
238229
hostWritePath: cs.hostWritePath,
239230
srcInfo: srcInfo,
231+
}, nil
232+
}
233+
234+
func (cs *controllerServer) cloneFromSnapshot(ctx context.Context, snapContent *snapv1.VolumeSnapshotContent, dstName, dstNode, dstLVType, dstVGName string, dstSize int64) error {
235+
srcVolID := *snapContent.Spec.Source.VolumeHandle
236+
srcVol, err := cs.kubeClient.CoreV1().PersistentVolumes().Get(ctx, srcVolID, metav1.GetOptions{})
237+
if err != nil {
238+
klog.Errorf("error getting volume: %v", err)
239+
return err
240240
}
241+
restoreSize := *snapContent.Status.RestoreSize
242+
snapshotLVName := fmt.Sprintf("lvm-%s", *snapContent.Status.SnapshotHandle)
243+
va, err := cs.generateVolumeActionForClone(srcVol, snapshotLVName, dstName, dstNode, dstLVType, dstVGName, restoreSize, dstSize)
244+
if err != nil {
245+
return err
246+
}
247+
241248
if err := createProvisionerPod(ctx, va); err != nil {
242249
klog.Errorf("error creating provisioner pod :%v", err)
243250
return err
@@ -247,47 +254,17 @@ func (cs *controllerServer) cloneFromSnapshot(ctx context.Context, snapContent *
247254
}
248255

249256
func (cs *controllerServer) cloneFromVolume(ctx context.Context, srcVol *v1.PersistentVolume, dstName, dstNode, dstLVType, dstVGName string, dstSize int64) error {
250-
ns := srcVol.Spec.NodeAffinity.Required.NodeSelectorTerms
251-
srcNode := ns[0].MatchExpressions[0].Values[0]
252-
srcVgName := srcVol.Spec.CSI.VolumeAttributes["vgName"]
253-
srcType := srcVol.Spec.CSI.VolumeAttributes["type"]
254257
srcSizeStr := srcVol.Spec.CSI.VolumeAttributes["RequiredBytes"]
255258
srcSize, err := strconv.ParseInt(srcSizeStr, 10, 64)
256259
if err != nil {
257-
klog.Errorf("error parsing srcSize: %v", err)
258-
return err
260+
return status.Errorf(codes.InvalidArgument, "error parsing srcSize: %v", err)
259261
}
260-
261-
//srcDev := fmt.Sprintf("/dev/%s/%s", srcVgName, srcVol.GetName())
262262
srcLVName := srcVol.GetName()
263-
srcInfo := &srcInfo{
264-
srcLVName: srcLVName,
265-
srcVGName: srcVgName,
266-
srcType: srcType,
267-
}
268-
klog.V(4).Infof("cloning volume from %s/%s ", srcVgName, srcLVName)
269-
270-
if srcSize > dstSize {
271-
return status.Error(codes.InvalidArgument, "source volume size is larger than destination volume size")
272-
}
273-
if srcNode != dstNode {
274-
return status.Errorf(codes.InvalidArgument, "source (%s) and destination (%s) nodes are different (not supported)", srcNode, dstNode)
263+
va, err := cs.generateVolumeActionForClone(srcVol, srcLVName, dstName, dstNode, dstLVType, dstVGName, srcSize, dstSize)
264+
if err != nil {
265+
return err
275266
}
276267

277-
va := volumeAction{
278-
action: actionTypeClone,
279-
name: dstName,
280-
nodeName: dstNode,
281-
size: dstSize,
282-
lvmType: dstLVType,
283-
pullPolicy: cs.pullPolicy,
284-
provisionerImage: cs.provisionerImage,
285-
kubeClient: cs.kubeClient,
286-
namespace: cs.namespace,
287-
vgName: dstVGName,
288-
hostWritePath: cs.hostWritePath,
289-
srcInfo: srcInfo,
290-
}
291268
if err := createProvisionerPod(ctx, va); err != nil {
292269
klog.Errorf("error creating provisioner pod :%v", err)
293270
return err

0 commit comments

Comments
 (0)