@@ -1369,7 +1369,9 @@ def __init__(self,
13691369 enable_prometheus_exporter : Optional [bool ] = True ,
13701370 prometheus_port : Optional [int ] = 10008 ,
13711371 prometheus_stats_interval : Optional [int ] = 10 ,
1372- bdevs_per_cluster : Optional [int ] = 32 ,
1372+ bdevs_per_cluster : Optional [int ] = None ,
1373+ flat_bdevs_per_cluster : Optional [int ] = None ,
1374+ cluster_connections : Optional [int ] = None ,
13731375 verify_nqns : Optional [bool ] = True ,
13741376 verify_keys : Optional [bool ] = True ,
13751377 verify_listener_ip : Optional [bool ] = True ,
@@ -1505,8 +1507,22 @@ def __init__(self,
15051507 self .spdk_ping_interval_in_seconds = spdk_ping_interval_in_seconds
15061508 #: ``ping_spdk_under_lock`` whether or not we should perform SPDK ping under the RPC lock
15071509 self .ping_spdk_under_lock = ping_spdk_under_lock
1510+ # spdk to ceph connection mapping
1511+ #: see
1512+ #: https://github.com/ceph/ceph-nvmeof?tab=readme-ov-file#mapping-spdk-bdevs-into-a-ceph-rados-cluster-context # noqa: E501
15081513 #: ``bdevs_per_cluster`` number of bdevs per cluster
15091514 self .bdevs_per_cluster = bdevs_per_cluster
1515+ #: ``flat_bdevs_per_cluster`` number of bdevs per cluster, ignore ANA group
1516+ self .flat_bdevs_per_cluster = flat_bdevs_per_cluster
1517+ #: ``cluster_connections`` number of ceph cluster connections
1518+ self .cluster_connections = cluster_connections
1519+ # set default only if all spdk alloc stratgies are None (no parameters explicitly defined)
1520+ if all ([
1521+ self .bdevs_per_cluster is None ,
1522+ self .flat_bdevs_per_cluster is None ,
1523+ self .cluster_connections is None
1524+ ]):
1525+ self .cluster_connections = 32
15101526 #: ``server_key`` gateway server key
15111527 self .server_key = server_key
15121528 #: ``server_cert`` gateway server certificate
@@ -1579,6 +1595,37 @@ def __init__(self,
15791595 def get_port_start (self ) -> List [int ]:
15801596 return [self .port , 4420 , self .discovery_port , self .prometheus_port ]
15811597
1598+ def verify_spdk_ceph_connection_allocation (self ) -> None :
1599+ """
1600+ Validate that exactly one of bdevs_per_cluster, flat_bdevs_per_cluster, or
1601+ cluster_connections is defined (not None), and that the defined parameter
1602+ is a positive integer.
1603+
1604+ Raises:
1605+ SpecValidationError: If zero or more than one parameter is defined,
1606+ or if the defined parameter is not a positive integer.
1607+ """
1608+ defined_vars = [
1609+ ('bdevs_per_cluster' , self .bdevs_per_cluster ),
1610+ ('flat_bdevs_per_cluster' , self .flat_bdevs_per_cluster ),
1611+ ('cluster_connections' , self .cluster_connections )
1612+ ]
1613+
1614+ defined_count = sum (1 for _ , value in defined_vars if value is not None )
1615+
1616+ if defined_count != 1 :
1617+ raise SpecValidationError (
1618+ "Exactly one of 'bdevs_per_cluster', 'flat_bdevs_per_cluster', or "
1619+ "'cluster_connections' must be defined (not None); others must be None. "
1620+ f"Found { defined_count } defined parameters."
1621+ )
1622+
1623+ # validate the defined parameter
1624+ for name , value in defined_vars :
1625+ if value is not None :
1626+ verify_positive_int (value , name )
1627+ break # only one should be defined, so we can stop after validating it
1628+
15821629 def validate (self ) -> None :
15831630 # TODO: what other parameters should be validated as part of this function?
15841631 super (NvmeofServiceSpec , self ).validate ()
@@ -1606,9 +1653,7 @@ def validate(self) -> None:
16061653 ['DEBUG' , 'INFO' , 'WARNING' , 'ERROR' , 'NOTICE' ])
16071654 verify_enum (self .spdk_protocol_log_level , "SPDK protocol log level" ,
16081655 ['DEBUG' , 'INFO' , 'WARNING' , 'ERROR' , 'NOTICE' ])
1609- verify_positive_int (self .bdevs_per_cluster , "Bdevs per cluster" )
1610- if self .bdevs_per_cluster is not None and self .bdevs_per_cluster < 1 :
1611- raise SpecValidationError ("Bdevs per cluster should be at least 1" )
1656+ self .verify_spdk_ceph_connection_allocation ()
16121657 verify_non_negative_int (self .qos_timeslice_in_usecs , "QOS timeslice" )
16131658
16141659 verify_non_negative_number (self .spdk_ping_interval_in_seconds , "SPDK ping interval" )
0 commit comments