func()

in pkg/nfs/controllerserver.go [205:277]


func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) {
	volumeID := req.GetVolumeId()
	if volumeID == "" {
		return nil, status.Error(codes.InvalidArgument, "volume id is empty")
	}
	nfsVol, err := getNfsVolFromID(volumeID)
	if err != nil {
		// An invalid ID should be treated as doesn't exist
		klog.Warningf("failed to get nfs volume for volume id %v deletion: %v", volumeID, err)
		return &csi.DeleteVolumeResponse{}, nil
	}

	var volCap *csi.VolumeCapability
	mountOptions := getMountOptions(req.GetSecrets())
	if mountOptions != "" {
		klog.V(2).Infof("DeleteVolume: found mountOptions(%s) for volume(%s)", mountOptions, volumeID)
		volCap = &csi.VolumeCapability{
			AccessType: &csi.VolumeCapability_Mount{
				Mount: &csi.VolumeCapability_MountVolume{
					MountFlags: []string{mountOptions},
				},
			},
		}
	}

	if nfsVol.onDelete == "" {
		nfsVol.onDelete = cs.Driver.defaultOnDeletePolicy
	}

	if !strings.EqualFold(nfsVol.onDelete, retain) {
		// mount nfs base share so we can delete the subdirectory
		if err = cs.internalMount(ctx, nfsVol, nil, volCap); err != nil {
			return nil, status.Errorf(codes.Internal, "failed to mount nfs server: %v", err.Error())
		}
		defer func() {
			if err = cs.internalUnmount(ctx, nfsVol); err != nil {
				klog.Warningf("failed to unmount nfs server: %v", err.Error())
			}
		}()

		internalVolumePath := getInternalVolumePath(cs.Driver.workingMountDir, nfsVol)

		if strings.EqualFold(nfsVol.onDelete, archive) {
			archivedInternalVolumePath := filepath.Join(getInternalMountPath(cs.Driver.workingMountDir, nfsVol), "archived-"+nfsVol.subDir)
			if strings.Contains(nfsVol.subDir, "/") {
				parentDir := filepath.Dir(archivedInternalVolumePath)
				klog.V(2).Infof("DeleteVolume: subdirectory(%s) contains '/', make sure the parent directory(%s) exists", nfsVol.subDir, parentDir)
				if err = os.MkdirAll(parentDir, 0777); err != nil {
					return nil, status.Errorf(codes.Internal, "create parent directory(%s) of %s failed with %v", parentDir, archivedInternalVolumePath, err.Error())
				}
			}

			// archive subdirectory under base-dir, remove stale archived copy if exists.
			klog.V(2).Infof("archiving subdirectory %s --> %s", internalVolumePath, archivedInternalVolumePath)
			if err = os.RemoveAll(archivedInternalVolumePath); err != nil {
				return nil, status.Errorf(codes.Internal, "failed to delete archived subdirectory %s: %v", archivedInternalVolumePath, err.Error())
			}
			if err = os.Rename(internalVolumePath, archivedInternalVolumePath); err != nil {
				return nil, status.Errorf(codes.Internal, "archive subdirectory(%s, %s) failed with %v", internalVolumePath, archivedInternalVolumePath, err.Error())
			}
		} else {
			// delete subdirectory under base-dir
			klog.V(2).Infof("removing subdirectory at %v", internalVolumePath)
			if err = os.RemoveAll(internalVolumePath); err != nil {
				return nil, status.Errorf(codes.Internal, "delete subdirectory(%s) failed with %v", internalVolumePath, err.Error())
			}
		}
	} else {
		klog.V(2).Infof("DeleteVolume: volume(%s) is set to retain, not deleting/archiving subdirectory", volumeID)
	}

	return &csi.DeleteVolumeResponse{}, nil
}