Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 6 additions & 28 deletions pkg/nfs/controllerserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
return nil, status.Error(codes.InvalidArgument, err.Error())
}

var volCap *csi.VolumeCapability
volCap := getVolumeCapabilityFromSecret(name, req.GetSecrets())
if len(req.GetVolumeCapabilities()) > 0 {
volCap = req.GetVolumeCapabilities()[0]
}
Expand Down Expand Up @@ -220,19 +220,6 @@ func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol
return &csi.DeleteVolumeResponse{}, nil
}

var volCap *csi.VolumeCapability
mountOptions := getMountOptions(req.GetSecrets())
if mountOptions != "" {
klog.V(2).Infof("DeleteVolume: found mountOptions(%s) for volume(%s)", mountOptions, volumeID)
volCap = &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Mount{
Mount: &csi.VolumeCapability_MountVolume{
MountFlags: []string{mountOptions},
},
},
}
}

if nfsVol.onDelete == "" {
nfsVol.onDelete = cs.Driver.defaultOnDeletePolicy
}
Expand All @@ -253,6 +240,7 @@ func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol
return &csi.DeleteVolumeResponse{}, nil
}
// mount nfs base share so we can delete the subdirectory
volCap := getVolumeCapabilityFromSecret(volumeID, req.GetSecrets())
if err = cs.internalMount(ctx, nfsVol, nil, volCap); err != nil {
return nil, status.Errorf(codes.Internal, "failed to mount nfs server: %v", err)
}
Expand Down Expand Up @@ -376,7 +364,8 @@ func (cs *ControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateS
return nil, status.Errorf(codes.NotFound, "failed to create nfsSnapshot: %v", err)
}
snapVol := volumeFromSnapshot(snapshot)
if err = cs.internalMount(ctx, snapVol, req.GetParameters(), nil); err != nil {
volCap := getVolumeCapabilityFromSecret(req.GetSourceVolumeId(), req.GetSecrets())
if err = cs.internalMount(ctx, snapVol, req.GetParameters(), volCap); err != nil {
return nil, status.Errorf(codes.Internal, "failed to mount snapshot nfs server: %v", err)
}
defer func() {
Expand All @@ -392,7 +381,7 @@ func (cs *ControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateS
return nil, err
}

if err = cs.internalMount(ctx, srcVol, req.GetParameters(), nil); err != nil {
if err = cs.internalMount(ctx, srcVol, req.GetParameters(), volCap); err != nil {
return nil, status.Errorf(codes.Internal, "failed to mount src nfs server: %v", err)
}
defer func() {
Expand Down Expand Up @@ -445,18 +434,7 @@ func (cs *ControllerServer) DeleteSnapshot(ctx context.Context, req *csi.DeleteS
return &csi.DeleteSnapshotResponse{}, nil
}

var volCap *csi.VolumeCapability
mountOptions := getMountOptions(req.GetSecrets())
if mountOptions != "" {
klog.V(2).Infof("DeleteSnapshot: found mountOptions(%s) for snapshot(%s)", mountOptions, req.GetSnapshotId())
volCap = &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Mount{
Mount: &csi.VolumeCapability_MountVolume{
MountFlags: []string{mountOptions},
},
},
}
}
volCap := getVolumeCapabilityFromSecret(req.SnapshotId, req.GetSecrets())
vol := volumeFromSnapshot(snap)
if err = cs.internalMount(ctx, vol, nil, volCap); err != nil {
return nil, status.Errorf(codes.Internal, "failed to mount nfs server for snapshot deletion: %v", err)
Expand Down
18 changes: 18 additions & 0 deletions pkg/nfs/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,3 +289,21 @@ func WaitUntilTimeout(timeout time.Duration, execFunc ExecFunc, timeoutFunc Time
return timeoutFunc()
}
}

// getVolumeCapabilityFromSecret retrieves the volume capability from the secret
// if secret contains mountOptions, it will return the volume capability
// if secret does not contain mountOptions, it will return nil
func getVolumeCapabilityFromSecret(volumeID string, secret map[string]string) *csi.VolumeCapability {
mountOptions := getMountOptions(secret)
if mountOptions != "" {
klog.V(2).Infof("found mountOptions(%s) for volume(%s)", mountOptions, volumeID)
return &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Mount{
Mount: &csi.VolumeCapability_MountVolume{
MountFlags: []string{mountOptions},
},
},
}
}
return nil
}
49 changes: 49 additions & 0 deletions pkg/nfs/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"testing"
"time"

"github.com/container-storage-interface/spec/lib/go/csi"
"go.uber.org/goleak"
)

Expand Down Expand Up @@ -505,3 +506,51 @@ func TestWaitUntilTimeout(t *testing.T) {
}
}
}
func TestGetVolumeCapabilityFromSecret(t *testing.T) {
tests := []struct {
desc string
volumeID string
secret map[string]string
expected *csi.VolumeCapability
}{
{
desc: "secret contains mountOptions",
volumeID: "vol-123",
secret: map[string]string{"mountOptions": "nfsvers=3"},
expected: &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Mount{
Mount: &csi.VolumeCapability_MountVolume{
MountFlags: []string{"nfsvers=3"},
},
},
},
},
{
desc: "secret does not contain mountOptions",
volumeID: "vol-456",
secret: map[string]string{"otherKey": "otherValue"},
expected: nil,
},
{
desc: "empty secret",
volumeID: "vol-789",
secret: map[string]string{},
expected: nil,
},
{
desc: "nil secret",
volumeID: "vol-000",
secret: nil,
expected: nil,
},
}

for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
result := getVolumeCapabilityFromSecret(test.volumeID, test.secret)
if !reflect.DeepEqual(result, test.expected) {
t.Errorf("test[%s]: unexpected result: %v, expected: %v", test.desc, result, test.expected)
}
})
}
}
Loading