feat: provide option to retain subdir on delete

This commit is contained in:
Lukas Wöhrl 2023-03-20 21:13:57 +01:00
parent 2999e7e3fb
commit c6392e630c
2 changed files with 47 additions and 20 deletions

View File

@ -55,6 +55,8 @@ type nfsVolume struct {
size int64 size int64
// pv name when subDir is not empty // pv name when subDir is not empty
uuid string uuid string
// on delete action
onDelete string
} }
// Ordering of elements in the CSI volume id. // Ordering of elements in the CSI volume id.
@ -68,6 +70,7 @@ const (
idBaseDir idBaseDir
idSubDir idSubDir
idUUID idUUID
idOnDelete
totalIDElements // Always last totalIDElements // Always last
) )
@ -187,6 +190,9 @@ func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol
} }
} }
deleteSubdirOnVolumeDelete := nfsVol.onDelete != "retain"
if deleteSubdirOnVolumeDelete {
// mount nfs base share so we can delete the subdirectory // mount nfs base share so we can delete the subdirectory
if err = cs.internalMount(ctx, nfsVol, nil, volCap); err != nil { if err = cs.internalMount(ctx, nfsVol, nil, volCap); err != nil {
return nil, status.Errorf(codes.Internal, "failed to mount nfs server: %v", err.Error()) return nil, status.Errorf(codes.Internal, "failed to mount nfs server: %v", err.Error())
@ -204,6 +210,9 @@ func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol
if err = os.RemoveAll(internalVolumePath); err != nil { if err = os.RemoveAll(internalVolumePath); err != nil {
return nil, status.Errorf(codes.Internal, "failed to delete subdirectory: %v", err.Error()) return nil, status.Errorf(codes.Internal, "failed to delete subdirectory: %v", err.Error())
} }
} else {
klog.V(2).Infof("DeleteVolume: volume(%s) is set to retain, not deleting subdirectory", volumeID)
}
return &csi.DeleteVolumeResponse{}, nil return &csi.DeleteVolumeResponse{}, nil
} }
@ -369,7 +378,7 @@ func (cs *ControllerServer) copyVolume(ctx context.Context, req *csi.CreateVolum
// newNFSVolume Convert VolumeCreate parameters to an nfsVolume // newNFSVolume Convert VolumeCreate parameters to an nfsVolume
func newNFSVolume(name string, size int64, params map[string]string) (*nfsVolume, error) { func newNFSVolume(name string, size int64, params map[string]string) (*nfsVolume, error) {
var server, baseDir, subDir string var server, baseDir, subDir, onDelete string
subDirReplaceMap := map[string]string{} subDirReplaceMap := map[string]string{}
// validate parameters (case-insensitive) // validate parameters (case-insensitive)
@ -381,6 +390,8 @@ func newNFSVolume(name string, size int64, params map[string]string) (*nfsVolume
baseDir = v baseDir = v
case paramSubDir: case paramSubDir:
subDir = v subDir = v
case paramOnDelete:
onDelete = v
case pvcNamespaceKey: case pvcNamespaceKey:
subDirReplaceMap[pvcNamespaceMetadata] = v subDirReplaceMap[pvcNamespaceMetadata] = v
case pvcNameKey: case pvcNameKey:
@ -408,6 +419,16 @@ func newNFSVolume(name string, size int64, params map[string]string) (*nfsVolume
// make volume id unique if subDir is provided // make volume id unique if subDir is provided
vol.uuid = name vol.uuid = name
} }
if onDelete == "" {
vol.onDelete = "delete"
} else {
if (onDelete != "retain") && (onDelete != "delete") {
return nil, fmt.Errorf("%v is not a valid value for %v", onDelete, paramOnDelete)
}
vol.onDelete = onDelete
}
vol.id = getVolumeIDFromNfsVol(vol) vol.id = getVolumeIDFromNfsVol(vol)
return vol, nil return vol, nil
} }
@ -442,6 +463,7 @@ func getVolumeIDFromNfsVol(vol *nfsVolume) string {
idElements[idBaseDir] = strings.Trim(vol.baseDir, "/") idElements[idBaseDir] = strings.Trim(vol.baseDir, "/")
idElements[idSubDir] = strings.Trim(vol.subDir, "/") idElements[idSubDir] = strings.Trim(vol.subDir, "/")
idElements[idUUID] = vol.uuid idElements[idUUID] = vol.uuid
idElements[idOnDelete] = vol.onDelete
return strings.Join(idElements, separator) return strings.Join(idElements, separator)
} }
@ -453,7 +475,7 @@ func getVolumeIDFromNfsVol(vol *nfsVolume) string {
// nfs-server.default.svc.cluster.local#share#subdir#pvc-4bcbf944-b6f7-4bd0-b50f-3c3dd00efc64 // nfs-server.default.svc.cluster.local#share#subdir#pvc-4bcbf944-b6f7-4bd0-b50f-3c3dd00efc64
// old volumeID: nfs-server.default.svc.cluster.local/share/pvc-4bcbf944-b6f7-4bd0-b50f-3c3dd00efc64 // old volumeID: nfs-server.default.svc.cluster.local/share/pvc-4bcbf944-b6f7-4bd0-b50f-3c3dd00efc64
func getNfsVolFromID(id string) (*nfsVolume, error) { func getNfsVolFromID(id string) (*nfsVolume, error) {
var server, baseDir, subDir, uuid string var server, baseDir, subDir, uuid, onDelete string
segments := strings.Split(id, separator) segments := strings.Split(id, separator)
if len(segments) < 3 { if len(segments) < 3 {
klog.V(2).Infof("could not split %s into server, baseDir and subDir with separator(%s)", id, separator) klog.V(2).Infof("could not split %s into server, baseDir and subDir with separator(%s)", id, separator)
@ -473,6 +495,9 @@ func getNfsVolFromID(id string) (*nfsVolume, error) {
if len(segments) >= 4 { if len(segments) >= 4 {
uuid = segments[3] uuid = segments[3]
} }
if len(segments) >= 5 {
onDelete = segments[4]
}
} }
return &nfsVolume{ return &nfsVolume{
@ -481,6 +506,7 @@ func getNfsVolFromID(id string) (*nfsVolume, error) {
baseDir: baseDir, baseDir: baseDir,
subDir: subDir, subDir: subDir,
uuid: uuid, uuid: uuid,
onDelete: onDelete,
}, nil }, nil
} }

View File

@ -59,6 +59,7 @@ const (
// "base" instead of "/base" // "base" instead of "/base"
paramShare = "share" paramShare = "share"
paramSubDir = "subdir" paramSubDir = "subdir"
paramOnDelete = "onDelete"
mountOptionsField = "mountoptions" mountOptionsField = "mountoptions"
mountPermissionsField = "mountpermissions" mountPermissionsField = "mountpermissions"
pvcNameKey = "csi.storage.k8s.io/pvc/name" pvcNameKey = "csi.storage.k8s.io/pvc/name"