Merge pull request #78873 from davidz627/fix/backAccessMode

Add more backward compatible access mode logic to remove ReadOnlyMany access mode when ReadWriteOnce,ReadOnlyMany specified
This commit is contained in:
Kubernetes Prow Robot 2019-06-14 23:06:34 -07:00 committed by GitHub
commit 7c0989445e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 9 deletions

View File

@ -141,19 +141,44 @@ func (g *gcePersistentDiskCSITranslator) TranslateInTreeStorageClassToCSI(sc *st
// plugin never supported ReadWriteMany but also did not validate or enforce
// this access mode for pre-provisioned volumes. The GCE PD CSI Driver validates
// 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 {
if ams == nil {
return nil
}
newAM := []v1.PersistentVolumeAccessMode{}
s := map[v1.PersistentVolumeAccessMode]bool{}
var newAM []v1.PersistentVolumeAccessMode
for _, am := range ams {
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 {
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
}

View File

@ -211,18 +211,16 @@ func TestBackwardCompatibleAccessModes(t *testing.T) {
expAccessModes []v1.PersistentVolumeAccessMode
}{
{
name: "multiple normals",
name: "ROX",
accessModes: []v1.PersistentVolumeAccessMode{
v1.ReadOnlyMany,
v1.ReadWriteOnce,
},
expAccessModes: []v1.PersistentVolumeAccessMode{
v1.ReadOnlyMany,
v1.ReadWriteOnce,
},
},
{
name: "one normal",
name: "RWO",
accessModes: []v1.PersistentVolumeAccessMode{
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{
v1.ReadWriteOnce,
v1.ReadWriteMany,
},
expAccessModes: []v1.PersistentVolumeAccessMode{
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,
},
},