mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 20:53:33 +00:00
Add more backward compatible access mode logic to remove ReadOnlyMany access mode when ReadWriteOnce,ReadOnlyMany specified
This commit is contained in:
parent
d873167e8f
commit
f3e7eeca8c
@ -141,19 +141,44 @@ func (g *gcePersistentDiskCSITranslator) TranslateInTreeStorageClassToCSI(sc *st
|
|||||||
// plugin never supported ReadWriteMany but also did not validate or enforce
|
// plugin never supported ReadWriteMany but also did not validate or enforce
|
||||||
// this access mode for pre-provisioned volumes. The GCE PD CSI Driver validates
|
// this access mode for pre-provisioned volumes. The GCE PD CSI Driver validates
|
||||||
// and enforces (fails) ReadWriteMany. Therefore we treat all in-tree
|
// and enforces (fails) ReadWriteMany. Therefore we treat all in-tree
|
||||||
// ReadWriteMany as ReadWriteOnce volumes to not break legacy volumes.
|
// ReadWriteMany as ReadWriteOnce volumes to not break legacy volumes. It also
|
||||||
|
// takes [ReadWriteOnce, ReadOnlyMany] and makes it ReadWriteOnce. This is
|
||||||
|
// because the in-tree plugin does not enforce access modes and just attaches
|
||||||
|
// the disk in ReadWriteOnce mode; however, the CSI external-attacher will fail
|
||||||
|
// this combination because technically [ReadWriteOnce, ReadOnlyMany] is not
|
||||||
|
// supportable on an attached volume
|
||||||
|
// See: https://github.com/kubernetes-csi/external-attacher/issues/153
|
||||||
func backwardCompatibleAccessModes(ams []v1.PersistentVolumeAccessMode) []v1.PersistentVolumeAccessMode {
|
func backwardCompatibleAccessModes(ams []v1.PersistentVolumeAccessMode) []v1.PersistentVolumeAccessMode {
|
||||||
if ams == nil {
|
if ams == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
newAM := []v1.PersistentVolumeAccessMode{}
|
|
||||||
|
s := map[v1.PersistentVolumeAccessMode]bool{}
|
||||||
|
var newAM []v1.PersistentVolumeAccessMode
|
||||||
|
|
||||||
for _, am := range ams {
|
for _, am := range ams {
|
||||||
if am == v1.ReadWriteMany {
|
if am == v1.ReadWriteMany {
|
||||||
newAM = append(newAM, v1.ReadWriteOnce)
|
// ReadWriteMany is unsupported in CSI, but in-tree did no
|
||||||
|
// validation and treated it as ReadWriteOnce
|
||||||
|
s[v1.ReadWriteOnce] = true
|
||||||
} else {
|
} else {
|
||||||
newAM = append(newAM, am)
|
s[am] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case s[v1.ReadOnlyMany] && s[v1.ReadWriteOnce]:
|
||||||
|
// ROX,RWO is unsupported in CSI, but in-tree did not validation and
|
||||||
|
// treated it as ReadWriteOnce
|
||||||
|
newAM = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}
|
||||||
|
case s[v1.ReadWriteOnce]:
|
||||||
|
newAM = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}
|
||||||
|
case s[v1.ReadOnlyMany]:
|
||||||
|
newAM = []v1.PersistentVolumeAccessMode{v1.ReadOnlyMany}
|
||||||
|
default:
|
||||||
|
newAM = []v1.PersistentVolumeAccessMode{v1.ReadWriteOnce}
|
||||||
|
}
|
||||||
|
|
||||||
return newAM
|
return newAM
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,18 +211,16 @@ func TestBackwardCompatibleAccessModes(t *testing.T) {
|
|||||||
expAccessModes []v1.PersistentVolumeAccessMode
|
expAccessModes []v1.PersistentVolumeAccessMode
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "multiple normals",
|
name: "ROX",
|
||||||
accessModes: []v1.PersistentVolumeAccessMode{
|
accessModes: []v1.PersistentVolumeAccessMode{
|
||||||
v1.ReadOnlyMany,
|
v1.ReadOnlyMany,
|
||||||
v1.ReadWriteOnce,
|
|
||||||
},
|
},
|
||||||
expAccessModes: []v1.PersistentVolumeAccessMode{
|
expAccessModes: []v1.PersistentVolumeAccessMode{
|
||||||
v1.ReadOnlyMany,
|
v1.ReadOnlyMany,
|
||||||
v1.ReadWriteOnce,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "one normal",
|
name: "RWO",
|
||||||
accessModes: []v1.PersistentVolumeAccessMode{
|
accessModes: []v1.PersistentVolumeAccessMode{
|
||||||
v1.ReadWriteOnce,
|
v1.ReadWriteOnce,
|
||||||
},
|
},
|
||||||
@ -231,13 +229,52 @@ func TestBackwardCompatibleAccessModes(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "some readwritemany",
|
name: "RWX",
|
||||||
|
accessModes: []v1.PersistentVolumeAccessMode{
|
||||||
|
v1.ReadWriteMany,
|
||||||
|
},
|
||||||
|
expAccessModes: []v1.PersistentVolumeAccessMode{
|
||||||
|
v1.ReadWriteOnce,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "RWO, ROX",
|
||||||
|
accessModes: []v1.PersistentVolumeAccessMode{
|
||||||
|
v1.ReadOnlyMany,
|
||||||
|
v1.ReadWriteOnce,
|
||||||
|
},
|
||||||
|
expAccessModes: []v1.PersistentVolumeAccessMode{
|
||||||
|
v1.ReadWriteOnce,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "RWO, RWX",
|
||||||
accessModes: []v1.PersistentVolumeAccessMode{
|
accessModes: []v1.PersistentVolumeAccessMode{
|
||||||
v1.ReadWriteOnce,
|
v1.ReadWriteOnce,
|
||||||
v1.ReadWriteMany,
|
v1.ReadWriteMany,
|
||||||
},
|
},
|
||||||
expAccessModes: []v1.PersistentVolumeAccessMode{
|
expAccessModes: []v1.PersistentVolumeAccessMode{
|
||||||
v1.ReadWriteOnce,
|
v1.ReadWriteOnce,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "RWX, ROX",
|
||||||
|
accessModes: []v1.PersistentVolumeAccessMode{
|
||||||
|
v1.ReadWriteMany,
|
||||||
|
v1.ReadOnlyMany,
|
||||||
|
},
|
||||||
|
expAccessModes: []v1.PersistentVolumeAccessMode{
|
||||||
|
v1.ReadWriteOnce,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "RWX, ROX, RWO",
|
||||||
|
accessModes: []v1.PersistentVolumeAccessMode{
|
||||||
|
v1.ReadWriteMany,
|
||||||
|
v1.ReadWriteOnce,
|
||||||
|
v1.ReadOnlyMany,
|
||||||
|
},
|
||||||
|
expAccessModes: []v1.PersistentVolumeAccessMode{
|
||||||
v1.ReadWriteOnce,
|
v1.ReadWriteOnce,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user