From 2d924f27f0980c52fb7d9d020e5bdc818a5526bf Mon Sep 17 00:00:00 2001 From: andyzhangx Date: Mon, 10 Mar 2025 12:11:40 +0000 Subject: [PATCH] fix: only remove root of SubDir when OnDelete is deleteRootSubDir --- pkg/nfs/controllerserver.go | 15 ++++++------ pkg/nfs/controllerserver_test.go | 40 +++++++++++++++++++++----------- pkg/nfs/utils.go | 3 ++- pkg/nfs/utils_test.go | 5 ++++ test/e2e/e2e_suite_test.go | 1 + 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/pkg/nfs/controllerserver.go b/pkg/nfs/controllerserver.go index e403b0d06..6ca40e882 100644 --- a/pkg/nfs/controllerserver.go +++ b/pkg/nfs/controllerserver.go @@ -292,15 +292,16 @@ func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol } klog.V(2).Infof("archived subdirectory %s --> %s", internalVolumePath, archivedInternalVolumePath) } else { - rootDir := getRootDir(nfsVol.subDir) - if rootDir != "" { - rootDir = filepath.Join(getInternalMountPath(cs.Driver.workingMountDir, nfsVol), rootDir) - } else { - rootDir = internalVolumePath + deleteDir := internalVolumePath + if strings.EqualFold(nfsVol.onDelete, deleteRootSubDir) { + rootDir := getRootDir(nfsVol.subDir) + if rootDir != "" { + deleteDir = filepath.Join(getInternalMountPath(cs.Driver.workingMountDir, nfsVol), rootDir) + } } // delete subdirectory under base-dir - klog.V(2).Infof("removing subdirectory at %v on internalVolumePath %s", rootDir, internalVolumePath) - if err = os.RemoveAll(rootDir); err != nil { + klog.V(2).Infof("removing subdirectory at %v on internalVolumePath %s", deleteDir, internalVolumePath) + if err = os.RemoveAll(deleteDir); err != nil { return nil, status.Errorf(codes.Internal, "delete subdirectory(%s) failed with %v", internalVolumePath, err) } } diff --git a/pkg/nfs/controllerserver_test.go b/pkg/nfs/controllerserver_test.go index 196a5aa5c..df21fdb1e 100644 --- a/pkg/nfs/controllerserver_test.go +++ b/pkg/nfs/controllerserver_test.go @@ -38,19 +38,20 @@ import ( ) const ( - testServer = "test-server" - testBaseDir = "test-base-dir" - testBaseDirNested = "test/base/dir" - testCSIVolume = "volume-name" - testVolumeID = "test-server/test-base-dir/volume-name" - newTestVolumeID = "test-server#test-base-dir#volume-name##" - newTestVolumeWithVolumeID = "test-server#test-base-dir#volume-name#volume-name#" - testVolumeIDNested = "test-server/test/base/dir/volume-name" - newTestVolumeIDNested = "test-server#test/base/dir#volume-name#" - newTestVolumeIDUUID = "test-server#test-base-dir#volume-name#uuid" - newTestVolumeOnDeleteRetain = "test-server#test-base-dir#volume-name#uuid#retain" - newTestVolumeOnDeleteDelete = "test-server#test-base-dir#volume-name#uuid#delete" - newTestVolumeOnDeleteArchive = "test-server#test-base-dir#volume-name##archive" + testServer = "test-server" + testBaseDir = "test-base-dir" + testBaseDirNested = "test/base/dir" + testCSIVolume = "volume-name" + testVolumeID = "test-server/test-base-dir/volume-name" + newTestVolumeID = "test-server#test-base-dir#volume-name##" + newTestVolumeWithVolumeID = "test-server#test-base-dir#volume-name#volume-name#" + testVolumeIDNested = "test-server/test/base/dir/volume-name" + newTestVolumeIDNested = "test-server#test/base/dir#volume-name#" + newTestVolumeIDUUID = "test-server#test-base-dir#volume-name#uuid" + newTestVolumeOnDeleteRetain = "test-server#test-base-dir#volume-name#uuid#retain" + newTestVolumeOnDeleteDelete = "test-server#test-base-dir#volume-name#uuid#delete" + newTestVolumeOnDeleteDeleteRootSubDir = "test-server#test-base-dir#volume-name#uuid#deleterootsubdir" + newTestVolumeOnDeleteArchive = "test-server#test-base-dir#volume-name##archive" ) func initTestController(_ *testing.T) *ControllerServer { @@ -510,6 +511,19 @@ func TestNfsVolFromId(t *testing.T) { }, expectErr: false, }, + { + name: "valid request nested ondelete deleterootsubdir", + volumeID: newTestVolumeOnDeleteDeleteRootSubDir, + resp: &nfsVolume{ + id: newTestVolumeOnDeleteDeleteRootSubDir, + server: testServer, + baseDir: testBaseDir, + subDir: testCSIVolume, + uuid: "uuid", + onDelete: "deleterootsubdir", + }, + expectErr: false, + }, { name: "valid request nested ondelete archive", volumeID: newTestVolumeOnDeleteArchive, diff --git a/pkg/nfs/utils.go b/pkg/nfs/utils.go index 4c5ad1c67..77a8213c5 100644 --- a/pkg/nfs/utils.go +++ b/pkg/nfs/utils.go @@ -39,10 +39,11 @@ const ( delete = "delete" retain = "retain" archive = "archive" + deleteRootSubDir = "deleteRootSubDir" volumeOperationAlreadyExistsFmt = "An operation with the given Volume ID %s already exists" ) -var supportedOnDeleteValues = []string{"", delete, retain, archive} +var supportedOnDeleteValues = []string{"", delete, retain, archive, deleteRootSubDir} func validateOnDeleteValue(onDelete string) error { for _, v := range supportedOnDeleteValues { diff --git a/pkg/nfs/utils_test.go b/pkg/nfs/utils_test.go index 66aa3fc48..93542c73b 100644 --- a/pkg/nfs/utils_test.go +++ b/pkg/nfs/utils_test.go @@ -334,6 +334,11 @@ func TestValidateOnDeleteValue(t *testing.T) { onDelete: "Delete", expected: nil, }, + { + desc: "Delete value", + onDelete: "DeleteRootSubDir", + expected: nil, + }, { desc: "Archive value", onDelete: "Archive", diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index fddf1f89f..c5481b137 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -66,6 +66,7 @@ var ( "csi.storage.k8s.io/provisioner-secret-name": "mount-options", "csi.storage.k8s.io/provisioner-secret-namespace": "default", "mountPermissions": "0755", + "onDelete": "deleteRootSubDir", } retainStorageClassParameters = map[string]string{ "server": nfsServerAddress,