Skip to content

Commit

Permalink
Fix kubernetes-csi#128 - Cannot attach raw block volumes
Browse files Browse the repository at this point in the history
CSI has supported raw block volumes since version 0.1, and Kubernetes
since v1.9, but the external-attacher cannot attach a block volume.

When attaching a raw block volume we don't even see an error on the
external-attacher logs saying it cannot handle it, it just goes ahead
assuming it's a mount type of volume.

This patch checks the volume mode on the spec to see if it's a raw
volume or not.

The the volume mode is define and it's PVBlock we'll use the Block
access type, in any other case (undefined and Filesystem mode) we'll use
the Mount access type.
  • Loading branch information
Akrog committed Mar 5, 2019
1 parent 0e6f5f2 commit a525eb9
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 11 deletions.
33 changes: 22 additions & 11 deletions pkg/controller/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,19 +146,30 @@ func GetVolumeCapabilities(pv *v1.PersistentVolume, csiSource *v1.CSIPersistentV
return nil, fmt.Errorf("CSI volume source was nil")
}

fsType := csiSource.FSType
if len(fsType) == 0 {
fsType = defaultFSType
}
var cap *csi.VolumeCapability
if pv.Spec.VolumeMode != nil && *pv.Spec.VolumeMode == v1.PersistentVolumeBlock {
cap = &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Block{
Block: &csi.VolumeCapability_BlockVolume{},
},
AccessMode: &csi.VolumeCapability_AccessMode{},
}

cap := &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Mount{
Mount: &csi.VolumeCapability_MountVolume{
FsType: fsType,
MountFlags: pv.Spec.MountOptions,
} else {
fsType := csiSource.FSType
if len(fsType) == 0 {
fsType = defaultFSType
}

cap = &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Mount{
Mount: &csi.VolumeCapability_MountVolume{
FsType: fsType,
MountFlags: pv.Spec.MountOptions,
},
},
},
AccessMode: &csi.VolumeCapability_AccessMode{},
AccessMode: &csi.VolumeCapability_AccessMode{},
}
}

// Translate array of modes into single VolumeCapability
Expand Down
31 changes: 31 additions & 0 deletions pkg/controller/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,17 @@ func TestGetNodeIDFromNode(t *testing.T) {
}
}

func createBlockCapability(mode csi.VolumeCapability_AccessMode_Mode) *csi.VolumeCapability {
return &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Block{
Block: &csi.VolumeCapability_BlockVolume{},
},
AccessMode: &csi.VolumeCapability_AccessMode{
Mode: mode,
},
}
}

func createMountCapability(fsType string, mode csi.VolumeCapability_AccessMode_Mode, mountOptions []string) *csi.VolumeCapability {
return &csi.VolumeCapability{
AccessType: &csi.VolumeCapability_Mount{
Expand All @@ -92,8 +103,12 @@ func createMountCapability(fsType string, mode csi.VolumeCapability_AccessMode_M
}

func TestGetVolumeCapabilities(t *testing.T) {
blockVolumeMode := v1.PersistentVolumeMode(v1.PersistentVolumeBlock)
filesystemVolumeMode := v1.PersistentVolumeMode(v1.PersistentVolumeFilesystem)

tests := []struct {
name string
volumeMode *v1.PersistentVolumeMode
fsType string
modes []v1.PersistentVolumeAccessMode
mountOptions []string
Expand All @@ -102,10 +117,18 @@ func TestGetVolumeCapabilities(t *testing.T) {
}{
{
name: "RWX",
volumeMode: &filesystemVolumeMode,
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
expectedCapability: createMountCapability(defaultFSType, csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER, nil),
expectError: false,
},
{
name: "Block RWX",
volumeMode: &blockVolumeMode,
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteMany},
expectedCapability: createBlockCapability(csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER),
expectError: false,
},
{
name: "RWX + specified fsType",
fsType: "ext3",
Expand All @@ -119,6 +142,13 @@ func TestGetVolumeCapabilities(t *testing.T) {
expectedCapability: createMountCapability(defaultFSType, csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, nil),
expectError: false,
},
{
name: "Block RWO",
volumeMode: &blockVolumeMode,
modes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce},
expectedCapability: createBlockCapability(csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER),
expectError: false,
},
{
name: "ROX",
modes: []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany},
Expand Down Expand Up @@ -155,6 +185,7 @@ func TestGetVolumeCapabilities(t *testing.T) {
for _, test := range tests {
pv := &v1.PersistentVolume{
Spec: v1.PersistentVolumeSpec{
VolumeMode: test.volumeMode,
AccessModes: test.modes,
MountOptions: test.mountOptions,
PersistentVolumeSource: v1.PersistentVolumeSource{
Expand Down

0 comments on commit a525eb9

Please sign in to comment.