@@ -163,7 +163,35 @@ func (cs *controllerServer) ControllerGetCapabilities(ctx context.Context, req *
163
163
}
164
164
165
165
func (cs * controllerServer ) ValidateVolumeCapabilities (ctx context.Context , req * csi.ValidateVolumeCapabilitiesRequest ) (* csi.ValidateVolumeCapabilitiesResponse , error ) {
166
- return nil , status .Error (codes .Unimplemented , "" )
166
+
167
+ // Check arguments
168
+ if len (req .GetVolumeId ()) == 0 {
169
+ return nil , status .Error (codes .InvalidArgument , "Volume ID cannot be empty" )
170
+ }
171
+ if len (req .VolumeCapabilities ) == 0 {
172
+ return nil , status .Error (codes .InvalidArgument , req .VolumeId )
173
+ }
174
+
175
+ if _ , err := getVolumeByID (req .GetVolumeId ()); err != nil {
176
+ return nil , status .Error (codes .NotFound , req .GetVolumeId ())
177
+ }
178
+
179
+ for _ , cap := range req .GetVolumeCapabilities () {
180
+ if cap .GetMount () == nil && cap .GetBlock () == nil {
181
+ return nil , status .Error (codes .InvalidArgument , "cannot have both mount and block access type be undefined" )
182
+ }
183
+
184
+ // A real driver would check the capabilities of the given volume with
185
+ // the set of requested capabilities.
186
+ }
187
+
188
+ return & csi.ValidateVolumeCapabilitiesResponse {
189
+ Confirmed : & csi.ValidateVolumeCapabilitiesResponse_Confirmed {
190
+ VolumeContext : req .GetVolumeContext (),
191
+ VolumeCapabilities : req .GetVolumeCapabilities (),
192
+ Parameters : req .GetParameters (),
193
+ },
194
+ }, nil
167
195
}
168
196
169
197
func (cs * controllerServer ) ControllerPublishVolume (ctx context.Context , req * csi.ControllerPublishVolumeRequest ) (* csi.ControllerPublishVolumeResponse , error ) {
0 commit comments