in pkg/csi_driver/controller.go [76:116]
func (s *controllerServer) ValidateVolumeCapabilities(ctx context.Context, req *csi.ValidateVolumeCapabilitiesRequest) (*csi.ValidateVolumeCapabilitiesResponse, error) {
// Validate arguments
volumeID := req.GetVolumeId()
if req.GetVolumeContext()[VolumeContextKeyEphemeral] != util.TrueStr {
volumeID = parseVolumeID(volumeID)
}
if len(volumeID) == 0 {
return nil, status.Error(codes.InvalidArgument, "ValidateVolumeCapabilities volumeID must be provided")
}
caps := req.GetVolumeCapabilities()
if len(caps) == 0 {
return nil, status.Error(codes.InvalidArgument, "ValidateVolumeCapabilities volume capabilities must be provided")
}
storageService, err := s.prepareStorageService(ctx, req.GetSecrets())
if err != nil {
return nil, status.Errorf(codes.Unauthenticated, "failed to prepare storage service: %v", err)
}
defer storageService.Close()
// Check that the volume exists
if exist, err := storageService.CheckBucketExists(ctx, &storage.ServiceBucket{Name: volumeID}); !exist {
return nil, status.Errorf(storage.ParseErrCode(err), "volume %v doesn't exist: %v", volumeID, err)
}
// Validate that the volume matches the capabilities
// Note that there is nothing in the bucket that we actually need to validate
if err := s.driver.validateVolumeCapabilities(caps); err != nil {
return &csi.ValidateVolumeCapabilitiesResponse{
Message: err.Error(),
}, status.Error(codes.InvalidArgument, err.Error())
}
return &csi.ValidateVolumeCapabilitiesResponse{
Confirmed: &csi.ValidateVolumeCapabilitiesResponse_Confirmed{
VolumeContext: req.GetVolumeContext(),
VolumeCapabilities: req.GetVolumeCapabilities(),
Parameters: req.GetParameters(),
},
}, nil
}