Skip to content

Commit

Permalink
Clarify error message when unsupported volume capabilities are provided
Browse files Browse the repository at this point in the history
  • Loading branch information
huffmanca committed Sep 21, 2020
1 parent 4a34535 commit d0af5e5
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 2 deletions.
10 changes: 8 additions & 2 deletions pkg/driver/controller.go
Expand Up @@ -107,7 +107,10 @@ func (d *controllerService) CreateVolume(ctx context.Context, req *csi.CreateVol
}

if !isValidVolumeCapabilities(volCaps) {
return nil, status.Error(codes.InvalidArgument, "Volume capabilities not supported")
modes := util.GetAccessModes(volCaps)
stringModes := strings.Join(*modes, ", ")
errString := "Volume capabilities " + stringModes + " not supported. Only AccessModes[ReadWriteOnce] supported."
return nil, status.Error(codes.InvalidArgument, errString)
}

disk, err := d.cloud.GetDiskByName(ctx, volName, volSizeBytes)
Expand Down Expand Up @@ -256,7 +259,10 @@ func (d *controllerService) ControllerPublishVolume(ctx context.Context, req *cs

caps := []*csi.VolumeCapability{volCap}
if !isValidVolumeCapabilities(caps) {
return nil, status.Error(codes.InvalidArgument, "Volume capability not supported")
modes := util.GetAccessModes(caps)
stringModes := strings.Join(*modes, ", ")
errString := "Volume capabilities " + stringModes + " not supported. Only AccessModes[ReadWriteOnce] supported."
return nil, status.Error(codes.InvalidArgument, errString)
}

if !d.cloud.IsExistInstance(ctx, nodeID) {
Expand Down
12 changes: 12 additions & 0 deletions pkg/util/util.go
Expand Up @@ -23,6 +23,8 @@ import (
"path"
"path/filepath"
"strings"

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

const (
Expand Down Expand Up @@ -78,3 +80,13 @@ func ParseEndpoint(endpoint string) (string, string, error) {
func roundUpSize(volumeSizeBytes int64, allocationUnitBytes int64) int64 {
return (volumeSizeBytes + allocationUnitBytes - 1) / allocationUnitBytes
}

// GetAccessModes returns a slice containing all of the access modes defined
// in the passed in VolumeCapabilities.
func GetAccessModes(caps []*csi.VolumeCapability) *[]string {
modes := []string{}
for _, c := range caps {
modes = append(modes, c.AccessMode.GetMode().String())
}
return &modes
}
26 changes: 26 additions & 0 deletions pkg/util/util_test.go
Expand Up @@ -18,7 +18,10 @@ package util

import (
"fmt"
"reflect"
"testing"

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

func TestRoundUpBytes(t *testing.T) {
Expand Down Expand Up @@ -125,3 +128,26 @@ func TestParseEndpoint(t *testing.T) {
}

}

func TestGetAccessModes(t *testing.T) {
testVolCap := []*csi.VolumeCapability{
{
AccessMode: &csi.VolumeCapability_AccessMode{
Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER,
},
},
{
AccessMode: &csi.VolumeCapability_AccessMode{
Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_READER_ONLY,
},
},
}
expectedModes := []string{
"SINGLE_NODE_WRITER",
"SINGLE_NODE_READER_ONLY",
}
actualModes := GetAccessModes(testVolCap)
if !reflect.DeepEqual(expectedModes, *actualModes) {
t.Fatalf("Wrong values returned for volume capabilities. Expected %v, got %v", expectedModes, actualModes)
}
}

0 comments on commit d0af5e5

Please sign in to comment.