File tree 2 files changed +43
-2
lines changed
2 files changed +43
-2
lines changed Original file line number Diff line number Diff line change @@ -72,11 +72,36 @@ func validateVolumeCapabilities(vcs []*csi.VolumeCapability) error {
72
72
return err
73
73
}
74
74
}
75
+ if err := crossValidateAccessModes (vcs ); err != nil {
76
+ return err
77
+ }
78
+ return nil
79
+ }
80
+
81
+ func crossValidateAccessModes (vcs []* csi.VolumeCapability ) error {
82
+ m := map [csi.VolumeCapability_AccessMode_Mode ]bool {}
83
+
84
+ for _ , vc := range vcs {
85
+ m [vc .GetAccessMode ().GetMode ()] = true
86
+ }
87
+
88
+ hasWriter := m [csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ]
89
+ hasSingleReader := m [csi .VolumeCapability_AccessMode_SINGLE_NODE_READER_ONLY ]
90
+ hasMultiReader := m [csi .VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY ]
91
+
92
+ if hasWriter && (hasSingleReader || hasMultiReader ) {
93
+ return fmt .Errorf ("both SINGLE_NODE_WRITER and READER_ONLY access mode specified" )
94
+ }
95
+
96
+ if hasSingleReader && hasMultiReader {
97
+ return fmt .Errorf ("both SINGLE_NODE_READER_ONLY and MULTI_NODE_READY_ONLY specified" )
98
+ }
99
+
75
100
return nil
76
101
}
77
102
78
103
func validateVolumeCapability (vc * csi.VolumeCapability ) error {
79
- if err := validateAccessModes (vc .GetAccessMode ()); err != nil {
104
+ if err := validateAccessMode (vc .GetAccessMode ()); err != nil {
80
105
return err
81
106
}
82
107
if blk := vc .GetBlock (); blk != nil {
@@ -90,7 +115,7 @@ func validateVolumeCapability(vc *csi.VolumeCapability) error {
90
115
return nil
91
116
}
92
117
93
- func validateAccessModes (am * csi.VolumeCapability_AccessMode ) error {
118
+ func validateAccessMode (am * csi.VolumeCapability_AccessMode ) error {
94
119
if am == nil {
95
120
return errors .New ("access mode is nil" )
96
121
}
Original file line number Diff line number Diff line change @@ -139,6 +139,22 @@ func TestValidateVolumeCapabilities(t *testing.T) {
139
139
},
140
140
expErr : true ,
141
141
},
142
+ {
143
+ name : "fail with reader + writer capabilities" ,
144
+ vc : []* csi.VolumeCapability {
145
+ createVolumeCapability (csi .VolumeCapability_AccessMode_SINGLE_NODE_READER_ONLY ),
146
+ createVolumeCapability (csi .VolumeCapability_AccessMode_SINGLE_NODE_WRITER ),
147
+ },
148
+ expErr : true ,
149
+ },
150
+ {
151
+ name : "fail with different reader capabilities" ,
152
+ vc : []* csi.VolumeCapability {
153
+ createVolumeCapability (csi .VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY ),
154
+ createVolumeCapability (csi .VolumeCapability_AccessMode_SINGLE_NODE_READER_ONLY ),
155
+ },
156
+ expErr : true ,
157
+ },
142
158
}
143
159
144
160
for _ , tc := range testCases {
You can’t perform that action at this time.
0 commit comments