From 523325aab9c91a27943ca824867bbb43e61907ab Mon Sep 17 00:00:00 2001 From: andyzhangx Date: Tue, 7 Oct 2025 07:38:19 +0000 Subject: [PATCH] feat: add volumePrefix parameter support in storage class fix fix --- docs/driver-parameters.md | 1 + pkg/nfs/controllerserver.go | 8 +++++- pkg/nfs/controllerserver_test.go | 44 +++++++++++++++++++++++++++----- pkg/nfs/nfs.go | 3 ++- test/e2e/e2e_suite_test.go | 1 + 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/docs/driver-parameters.md b/docs/driver-parameters.md index ca71078df..0bca12d18 100644 --- a/docs/driver-parameters.md +++ b/docs/driver-parameters.md @@ -11,6 +11,7 @@ share | NFS share path | `/` | Yes | subDir | sub directory under nfs share | | No | if sub directory does not exist, this driver would create a new one mountPermissions | mounted folder permissions. The default is `0`, if set as non-zero, driver will perform `chmod` after mount | | No | onDelete | when volume is deleted, keep the directory if it's `retain` | `delete`(default), `retain`, `archive` | No | `delete` +volumePrefix | prefix of volume name created by the driver | `prefix-` | No | - VolumeID(`volumeHandle`) is the identifier of the volume handled by the driver, format of VolumeID: ``` diff --git a/pkg/nfs/controllerserver.go b/pkg/nfs/controllerserver.go index b9eb4f27d..72185dd35 100644 --- a/pkg/nfs/controllerserver.go +++ b/pkg/nfs/controllerserver.go @@ -137,6 +137,7 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol case paramShare: case paramSubDir: case paramOnDelete: + case paramVolumePrefix: case pvcNamespaceKey: case pvcNameKey: case pvNameKey: @@ -660,7 +661,7 @@ func newNFSSnapshot(name string, params map[string]string, vol *nfsVolume) (*nfs // newNFSVolume Convert VolumeCreate parameters to an nfsVolume func newNFSVolume(name string, size int64, params map[string]string, defaultOnDeletePolicy string) (*nfsVolume, error) { - var server, baseDir, subDir, onDelete string + var server, baseDir, subDir, onDelete, volumePrefix string subDirReplaceMap := map[string]string{} // validate parameters (case-insensitive) @@ -674,6 +675,8 @@ func newNFSVolume(name string, size int64, params map[string]string, defaultOnDe subDir = v case paramOnDelete: onDelete = v + case paramVolumePrefix: + volumePrefix = v case pvcNamespaceKey: subDirReplaceMap[pvcNamespaceMetadata] = v case pvcNameKey: @@ -712,6 +715,9 @@ func newNFSVolume(name string, size int64, params map[string]string, defaultOnDe } vol.id = getVolumeIDFromNfsVol(vol) + if volumePrefix != "" { + vol.id = volumePrefix + vol.id + } return vol, nil } diff --git a/pkg/nfs/controllerserver_test.go b/pkg/nfs/controllerserver_test.go index 0fd4e046c..155893f74 100644 --- a/pkg/nfs/controllerserver_test.go +++ b/pkg/nfs/controllerserver_test.go @@ -137,18 +137,28 @@ func TestCreateVolume(t *testing.T) { }, }, Parameters: map[string]string{ - paramServer: testServer, - paramShare: testBaseDir, - paramSubDir: testCSIVolume, + paramServer: testServer, + paramShare: testBaseDir, + paramSubDir: testCSIVolume, + paramVolumePrefix: "prefix-", + paramOnDelete: "delete", + pvcNamespaceKey: "default", + pvcNameKey: testCSIVolume, + pvNameKey: testCSIVolume, }, }, resp: &csi.CreateVolumeResponse{ Volume: &csi.Volume{ - VolumeId: newTestVolumeWithVolumeID, + VolumeId: "prefix-" + newTestVolumeWithVolumeID, VolumeContext: map[string]string{ - paramServer: testServer, - paramShare: testBaseDir, - paramSubDir: testCSIVolume, + paramServer: testServer, + paramShare: testBaseDir, + paramSubDir: testCSIVolume, + paramOnDelete: "delete", + paramVolumePrefix: "prefix-", + pvcNamespaceKey: "default", + pvcNameKey: testCSIVolume, + pvNameKey: testCSIVolume, }, }, }, @@ -648,6 +658,26 @@ func TestNewNFSVolume(t *testing.T) { onDelete: "delete", }, }, + { + desc: "volumePrefix is specified", + name: "pv-name", + size: 100, + params: map[string]string{ + paramServer: "//nfs-server.default.svc.cluster.local", + paramShare: "share", + paramSubDir: "subdir", + paramVolumePrefix: "prefix-", + }, + expectVol: &nfsVolume{ + id: "prefix-nfs-server.default.svc.cluster.local#share#subdir#pv-name#", + server: "//nfs-server.default.svc.cluster.local", + baseDir: "share", + subDir: "subdir", + size: 100, + uuid: "pv-name", + onDelete: "delete", + }, + }, { desc: "subDir with pv/pvc metadata is specified", name: "pv-name", diff --git a/pkg/nfs/nfs.go b/pkg/nfs/nfs.go index 919d078d1..1305cdf0d 100644 --- a/pkg/nfs/nfs.go +++ b/pkg/nfs/nfs.go @@ -68,7 +68,8 @@ type Driver struct { const ( DefaultDriverName = "nfs.csi.k8s.io" // Address of the NFS server - paramServer = "server" + paramServer = "server" + paramVolumePrefix = "volumeprefix" // Base directory of the NFS server to create volumes under. // The base directory must be a direct child of the root directory. // The root directory is omitted from the string, for example: diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 906320270..b61b499de 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", + "volumePrefix": "prefix-", } retainStorageClassParameters = map[string]string{ "server": nfsServerAddress,