@@ -30,6 +30,11 @@ import (
3030 "k8s.io/klog/v2"
3131)
3232
33+ const (
34+ volumeIDRegex = "^(.*)#(.*)$"
35+ sourceAndSubDirSeperator = "#"
36+ )
37+
3338// smbVolume is an internal representation of a volume
3439// created by the provisioner.
3540type smbVolume struct {
@@ -68,13 +73,13 @@ func (d *Driver) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest)
6873 }
6974
7075 reqCapacity := req .GetCapacityRange ().GetRequiredBytes ()
71- smbVol , err := d .newSMBVolume (name , reqCapacity , req .GetParameters ())
76+ parameters := req .GetParameters ()
77+ smbVol , err := d .newSMBVolume (name , reqCapacity , parameters )
7278 if err != nil {
7379 return nil , status .Error (codes .InvalidArgument , err .Error ())
7480 }
7581
7682 // check if create SubDir is enable in storage class parameters
77- parameters := req .GetParameters ()
7883 createSubDir := true
7984 for k , v := range parameters {
8085 switch strings .ToLower (k ) {
@@ -117,7 +122,7 @@ func (d *Driver) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest)
117122 if volumeID == "" {
118123 return nil , status .Error (codes .InvalidArgument , "volume id is empty" )
119124 }
120- smbVol , err := d . getSmbVolFromID (volumeID )
125+ smbVol , err := getSmbVolFromID (volumeID )
121126 if err != nil {
122127 // An invalid ID should be treated as doesn't exist
123128 klog .Warningf ("failed to get smb volume for volume id %v deletion: %v" , volumeID , err )
@@ -213,7 +218,7 @@ func (d *Driver) getVolumeIDFromSmbVol(vol *smbVolume) string {
213218 idElements := make ([]string , totalIDElements )
214219 idElements [idsourceField ] = strings .Trim (vol .sourceField , "/" )
215220 idElements [idSubDir ] = strings .Trim (vol .subDir , "/" )
216- return strings .Join (idElements , "/" )
221+ return strings .Join (idElements , sourceAndSubDirSeperator )
217222}
218223
219224// Get working directory for CreateVolume and DeleteVolume
@@ -311,15 +316,17 @@ func (d *Driver) smbVolToCSI(vol *smbVolume, parameters map[string]string) *csi.
311316}
312317
313318// Given a CSI volume id, return a smbVolume
314- func (d * Driver ) getSmbVolFromID (id string ) (* smbVolume , error ) {
315- volRegex := regexp .MustCompile ("^([^/]+)/([^/]+)$" )
319+ // a sample volume Id: smb-server.default.svc.cluster.local/share/pvc-4729891a-f57e-4982-9c60-e9884af1be2f
320+ func getSmbVolFromID (id string ) (* smbVolume , error ) {
321+ volRegex := regexp .MustCompile (volumeIDRegex )
316322 tokens := volRegex .FindStringSubmatch (id )
317- if tokens == nil {
318- return nil , fmt .Errorf ("Could not split %q into server, baseDir and subDir" , id )
323+ if tokens == nil || len ( tokens ) != 3 {
324+ return nil , fmt .Errorf ("Could not split %q into server and subDir" , id )
319325 }
326+ source := "//" + tokens [1 ]
320327 return & smbVolume {
321328 id : id ,
322- sourceField : tokens [ 1 ] ,
329+ sourceField : source ,
323330 subDir : tokens [2 ],
324331 }, nil
325332}
0 commit comments