Skip to content

Commit 8f8e9b8

Browse files
committed
Enforce ReadWriteOncePod can only be used by itself
1 parent 48c8713 commit 8f8e9b8

File tree

2 files changed

+15
-38
lines changed

2 files changed

+15
-38
lines changed

accessmodes/access_modes.go

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ func toCSIAccessMode(pvAccessModes []v1.PersistentVolumeAccessMode) (csi.VolumeC
3939
m := uniqueAccessModes(pvAccessModes)
4040

4141
switch {
42+
// This mapping exists to enable CSI drivers that lack the
43+
// SINGLE_NODE_MULTI_WRITER capability to work with the
44+
// ReadWriteOncePod access mode.
45+
case m[v1.ReadWriteOncePod]:
46+
if len(m) > 1 {
47+
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("Kubernetes does not support use of ReadWriteOncePod with other access modes on the same PersistentVolume")
48+
}
49+
return csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, nil
50+
4251
case m[v1.ReadWriteMany]:
4352
// ReadWriteMany takes precedence, regardless of what other
4453
// modes are set.
@@ -48,26 +57,12 @@ func toCSIAccessMode(pvAccessModes []v1.PersistentVolumeAccessMode) (csi.VolumeC
4857
// This is not possible in the CSI spec.
4958
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("CSI does not support ReadOnlyMany and ReadWriteOnce on the same PersistentVolume")
5059

51-
case m[v1.ReadOnlyMany] && m[v1.ReadWriteOncePod]:
52-
// This is not possible in the CSI spec.
53-
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("CSI does not support ReadOnlyMany and ReadWriteOncePod on the same PersistentVolume")
54-
55-
case m[v1.ReadWriteOnce] && m[v1.ReadWriteOncePod]:
56-
// This is not possible in the CSI spec.
57-
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("CSI does not support ReadWriteOnce and ReadWriteOncePod on the same PersistentVolume")
58-
5960
case m[v1.ReadOnlyMany]:
6061
return csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY, nil
6162

6263
case m[v1.ReadWriteOnce]:
6364
return csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, nil
6465

65-
// This mapping exists to enable CSI drivers that lack the
66-
// SINGLE_NODE_MULTI_WRITER capability to work with the
67-
// ReadWriteOncePod access mode.
68-
case m[v1.ReadWriteOncePod]:
69-
return csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, nil
70-
7166
default:
7267
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("unsupported AccessMode combination: %+v", pvAccessModes)
7368
}
@@ -80,6 +75,12 @@ func toSingleNodeMultiWriterCapableCSIAccessMode(pvAccessModes []v1.PersistentVo
8075
m := uniqueAccessModes(pvAccessModes)
8176

8277
switch {
78+
case m[v1.ReadWriteOncePod]:
79+
if len(m) > 1 {
80+
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("Kubernetes does not support use of ReadWriteOncePod with other access modes on the same PersistentVolume")
81+
}
82+
return csi.VolumeCapability_AccessMode_SINGLE_NODE_SINGLE_WRITER, nil
83+
8384
case m[v1.ReadWriteMany]:
8485
// ReadWriteMany trumps everything, regardless of what other
8586
// modes are set.
@@ -89,23 +90,12 @@ func toSingleNodeMultiWriterCapableCSIAccessMode(pvAccessModes []v1.PersistentVo
8990
// This is not possible in the CSI spec.
9091
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("CSI does not support ReadOnlyMany and ReadWriteOnce on the same PersistentVolume")
9192

92-
case m[v1.ReadOnlyMany] && m[v1.ReadWriteOncePod]:
93-
// This is not possible in the CSI spec.
94-
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("CSI does not support ReadOnlyMany and ReadWriteOncePod on the same PersistentVolume")
95-
96-
case m[v1.ReadWriteOnce] && m[v1.ReadWriteOncePod]:
97-
// This is not possible in the CSI spec.
98-
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("CSI does not support ReadWriteOnce and ReadWriteOncePod on the same PersistentVolume")
99-
10093
case m[v1.ReadOnlyMany]:
10194
return csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY, nil
10295

10396
case m[v1.ReadWriteOnce]:
10497
return csi.VolumeCapability_AccessMode_SINGLE_NODE_MULTI_WRITER, nil
10598

106-
case m[v1.ReadWriteOncePod]:
107-
return csi.VolumeCapability_AccessMode_SINGLE_NODE_SINGLE_WRITER, nil
108-
10999
default:
110100
return csi.VolumeCapability_AccessMode_UNKNOWN, fmt.Errorf("unsupported AccessMode combination: %+v", pvAccessModes)
111101
}

accessmodes/access_modes_test.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,6 @@ func TestToCSIAccessMode(t *testing.T) {
4848
expectedCSIAccessMode: csi.VolumeCapability_AccessMode_UNKNOWN,
4949
expectError: true,
5050
},
51-
{
52-
name: "RWO + RWOP",
53-
pvAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce, v1.ReadWriteOncePod},
54-
expectedCSIAccessMode: csi.VolumeCapability_AccessMode_UNKNOWN,
55-
expectError: true,
56-
},
5751
{
5852
name: "ROX",
5953
pvAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany},
@@ -95,13 +89,6 @@ func TestToCSIAccessMode(t *testing.T) {
9589
expectError: true,
9690
supportsSingleNodeMultiWriter: true,
9791
},
98-
{
99-
name: "RWO + RWOP with SINGLE_NODE_MULTI_WRITER capable driver",
100-
pvAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce, v1.ReadWriteOncePod},
101-
expectedCSIAccessMode: csi.VolumeCapability_AccessMode_UNKNOWN,
102-
expectError: true,
103-
supportsSingleNodeMultiWriter: true,
104-
},
10592
{
10693
name: "ROX with SINGLE_NODE_MULTI_WRITER capable driver",
10794
pvAccessModes: []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany},

0 commit comments

Comments
 (0)