mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-13 02:33:34 +00:00
rbd: introduce a helper function to detect multi writer,block & rwofile
SINGLE_NODE_WRITER capability ambiguity has been fixed in csi spec v1.5 which allows the SP drivers to declare more granular WRITE capability in form of SINGLE_NODE_SINGLE_WRITER or SINGLE_NODE_MULTI_WRITER. These are not really new capabilities rather capabilities introduced to get the desired functionality from CO side based on the capabilities SP driver support for various CSI operations, this new capabilities also help to address new access mode RWOP (readwriteoncepod). This commit adds a helper function which identity the request is of multiwriter mode and also validates whether it is filesystem mode or block mode. Based on the inspection it fails to allow multi write requests for filesystem mode and only allow multi write request against block mode. This commit also adds unit tests for isMultiWriterBlock function which validates various accesstypes and accessmodes. Signed-off-by: Humble Chirammal <hchiramm@redhat.com>
This commit is contained in:
committed by
mergify[bot]
parent
68350e8815
commit
4a69378698
@ -101,11 +101,17 @@ func (cs *ControllerServer) parseVolCreateRequest(
|
||||
req *csi.CreateVolumeRequest) (*rbdVolume, error) {
|
||||
// TODO (sbezverk) Last check for not exceeding total storage capacity
|
||||
|
||||
// RO modes need to be handled independently (ie right now even if access mode is RO, they'll be RW upon attach)
|
||||
isBlock, isMultiNode := csicommon.IsBlockMultiNode(req.VolumeCapabilities)
|
||||
// below capability check indicates that we support both {SINGLE_NODE or MULTI_NODE} WRITERs and the `isMultiWriter`
|
||||
// flag has been set accordingly.
|
||||
isMultiWriter, isBlock := csicommon.IsBlockMultiWriter(req.VolumeCapabilities)
|
||||
|
||||
// below return value has set, if it is RWO mode File PVC.
|
||||
isRWOFile := csicommon.IsFileRWO(req.VolumeCapabilities)
|
||||
|
||||
// below return value has set, if it is ReadOnly capability.
|
||||
isROOnly := csicommon.IsReaderOnly(req.VolumeCapabilities)
|
||||
// We want to fail early if the user is trying to create a RWX on a non-block type device
|
||||
if isMultiNode && !isBlock {
|
||||
if !isRWOFile && !isBlock && !isROOnly {
|
||||
return nil, status.Error(
|
||||
codes.InvalidArgument,
|
||||
"multi node access modes are only supported on rbd `block` type volumes")
|
||||
@ -115,11 +121,13 @@ func (cs *ControllerServer) parseVolCreateRequest(
|
||||
return nil, status.Error(codes.InvalidArgument, "missing required parameter imageFeatures")
|
||||
}
|
||||
|
||||
// if it's NOT SINGLE_NODE_WRITER and it's BLOCK we'll set the parameter to ignore the in-use checks
|
||||
// if it's NOT SINGLE_NODE_WRITER, and it's BLOCK we'll set the parameter to ignore the in-use checks
|
||||
rbdVol, err := genVolFromVolumeOptions(
|
||||
ctx,
|
||||
req.GetParameters(), req.GetSecrets(),
|
||||
(isMultiNode && isBlock), false)
|
||||
req.GetParameters(),
|
||||
req.GetSecrets(),
|
||||
isMultiWriter && isBlock,
|
||||
false)
|
||||
if err != nil {
|
||||
return nil, status.Error(codes.InvalidArgument, err.Error())
|
||||
}
|
||||
|
Reference in New Issue
Block a user