Skip to content

Commit 039f979

Browse files
committed
Bugfix: DeleteVolume does not work
1 parent 1da1b63 commit 039f979

File tree

2 files changed

+65
-11
lines changed

2 files changed

+65
-11
lines changed

pkg/smb/controllerserver.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
3540
type 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
}

pkg/smb/controllerserver_test.go

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ import (
3333
)
3434

3535
const (
36-
testServer = "test-server"
36+
testServer = "test-server/baseDir"
3737
testCSIVolume = "test-csi"
38-
testVolumeID = "test-server/test-csi"
38+
testVolumeID = "test-server/baseDir#test-csi"
3939
)
4040

4141
func TestControllerGetCapabilities(t *testing.T) {
@@ -403,3 +403,50 @@ func TestListSnapshots(t *testing.T) {
403403
t.Errorf("Unexpected error: %v", err)
404404
}
405405
}
406+
407+
func TestGetSmbVolFromID(t *testing.T) {
408+
409+
cases := []struct {
410+
desc string
411+
volumeID string
412+
source string
413+
subDir string
414+
expectErr bool
415+
}{
416+
{
417+
desc: "correct volume id",
418+
volumeID: "smb-server.default.svc.cluster.local/share#pvc-4729891a-f57e-4982-9c60-e9884af1be2f",
419+
source: "//smb-server.default.svc.cluster.local/share",
420+
subDir: "pvc-4729891a-f57e-4982-9c60-e9884af1be2f",
421+
expectErr: false,
422+
},
423+
{
424+
desc: "correct volume id with multiple base directories",
425+
volumeID: "smb-server.default.svc.cluster.local/share/dir1/dir2#pvc-4729891a-f57e-4982-9c60-e9884af1be2f",
426+
source: "//smb-server.default.svc.cluster.local/share/dir1/dir2",
427+
subDir: "pvc-4729891a-f57e-4982-9c60-e9884af1be2f",
428+
expectErr: false,
429+
},
430+
{
431+
desc: "incorrect volume id",
432+
volumeID: "smb-server.default.svc.cluster.local/share",
433+
source: "//smb-server.default.svc.cluster.local/share",
434+
subDir: "pvc-4729891a-f57e-4982-9c60-e9884af1be2f",
435+
expectErr: true,
436+
},
437+
}
438+
for _, test := range cases {
439+
test := test //pin
440+
t.Run(test.desc, func(t *testing.T) {
441+
smbVolume, err := getSmbVolFromID(test.volumeID)
442+
443+
if !test.expectErr {
444+
assert.Equal(t, smbVolume.sourceField, test.source)
445+
assert.Equal(t, smbVolume.subDir, test.subDir)
446+
assert.Nil(t, err)
447+
} else {
448+
assert.NotNil(t, err)
449+
}
450+
})
451+
}
452+
}

0 commit comments

Comments
 (0)