Skip to content

Commit 34d1b19

Browse files
committed
Add cross validation of volume capabilities
1 parent 75e17ab commit 34d1b19

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

pkg/gce-pd-csi-driver/utils.go

+27-2
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,36 @@ func validateVolumeCapabilities(vcs []*csi.VolumeCapability) error {
7272
return err
7373
}
7474
}
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+
75100
return nil
76101
}
77102

78103
func validateVolumeCapability(vc *csi.VolumeCapability) error {
79-
if err := validateAccessModes(vc.GetAccessMode()); err != nil {
104+
if err := validateAccessMode(vc.GetAccessMode()); err != nil {
80105
return err
81106
}
82107
if blk := vc.GetBlock(); blk != nil {
@@ -90,7 +115,7 @@ func validateVolumeCapability(vc *csi.VolumeCapability) error {
90115
return nil
91116
}
92117

93-
func validateAccessModes(am *csi.VolumeCapability_AccessMode) error {
118+
func validateAccessMode(am *csi.VolumeCapability_AccessMode) error {
94119
if am == nil {
95120
return errors.New("access mode is nil")
96121
}

pkg/gce-pd-csi-driver/utils_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,22 @@ func TestValidateVolumeCapabilities(t *testing.T) {
139139
},
140140
expErr: true,
141141
},
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+
},
142158
}
143159

144160
for _, tc := range testCases {

0 commit comments

Comments
 (0)