func()

in pkg/nfs/controllerserver.go [541:580]


func (cs *ControllerServer) copyFromSnapshot(ctx context.Context, req *csi.CreateVolumeRequest, dstVol *nfsVolume) error {
	snap, err := getNfsSnapFromID(req.VolumeContentSource.GetSnapshot().GetSnapshotId())
	if err != nil {
		return status.Error(codes.NotFound, err.Error())
	}
	snapVol := volumeFromSnapshot(snap)

	var volCap *csi.VolumeCapability
	if len(req.GetVolumeCapabilities()) > 0 {
		volCap = req.GetVolumeCapabilities()[0]
	}

	if err = cs.internalMount(ctx, snapVol, nil, volCap); err != nil {
		return status.Errorf(codes.Internal, "failed to mount src nfs server for snapshot volume copy: %v", err)
	}
	defer func() {
		if err = cs.internalUnmount(ctx, snapVol); err != nil {
			klog.Warningf("failed to unmount src nfs server after snapshot volume copy: %v", err)
		}
	}()
	if err = cs.internalMount(ctx, dstVol, nil, volCap); err != nil {
		return status.Errorf(codes.Internal, "failed to mount dst nfs server for snapshot volume copy: %v", err)
	}
	defer func() {
		if err = cs.internalUnmount(ctx, dstVol); err != nil {
			klog.Warningf("failed to unmount dst nfs server after snapshot volume copy: %v", err)
		}
	}()

	// untar snapshot archive to dst path
	snapPath := filepath.Join(getInternalVolumePath(cs.Driver.workingMountDir, snapVol), snap.archiveName())
	dstPath := getInternalVolumePath(cs.Driver.workingMountDir, dstVol)
	klog.V(2).Infof("copy volume from snapshot %v -> %v", snapPath, dstPath)
	out, err := exec.Command("tar", "-xzvf", snapPath, "-C", dstPath).CombinedOutput()
	if err != nil {
		return status.Errorf(codes.Internal, "failed to copy volume for snapshot: %v: %v", err, string(out))
	}
	klog.V(2).Infof("volume copied from snapshot %v -> %v", snapPath, dstPath)
	return nil
}