From: Vallari Agrawal Date: Thu, 12 Mar 2026 13:50:00 +0000 (+0530) Subject: mgr/dashboard: Add 'network_mask' to nvmeof cli X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=366702057e65857ca86702b278cd2fd836484a51;p=ceph.git mgr/dashboard: Add 'network_mask' to nvmeof cli This commit add the following to nvmeof cli: 0. Add new param `--network-mask` to 'subsystem add' cmd It's a list parameter so we can pass multiple netmask by `subsystem add --network-mask --network-mask ` 1. Add new cli `subsystem add_network --network-mask ` 2. Add new cli `subsystem del_network --network-mask ` 3. Add column 'network_mask' to `subsystem list` output 4. Add column 'manual' to `listener list` output Fixes: https://tracker.ceph.com/issues/75348 Signed-off-by: Vallari Agrawal --- diff --git a/src/pybind/mgr/dashboard/controllers/nvmeof.py b/src/pybind/mgr/dashboard/controllers/nvmeof.py index 7c841335f8bc..ea3c1f6467a1 100644 --- a/src/pybind/mgr/dashboard/controllers/nvmeof.py +++ b/src/pybind/mgr/dashboard/controllers/nvmeof.py @@ -337,6 +337,9 @@ else: "dhchap_key": Param(str, "Subsystem DH-HMAC-CHAP key", True, None), "gw_group": Param(str, "NVMeoF gateway group", True, None), "server_address": Param(str, "NVMeoF gateway address", True, None), + "network_mask": Param([str], + "Network mask to automatically create listeners", + True, None), }, ) @convert_to_model(model.SubsystemStatus) @@ -344,7 +347,8 @@ else: def create(self, nqn: str, max_namespaces: Optional[int] = None, no_group_append: Optional[bool] = False, serial_number: Optional[str] = None, dhchap_key: Optional[str] = None, - gw_group: Optional[str] = None, server_address: Optional[str] = None): + gw_group: Optional[str] = None, server_address: Optional[str] = None, + network_mask: Optional[List[str]] = None): return NVMeoFClient( gw_group=gw_group, server_address=server_address @@ -353,7 +357,7 @@ else: subsystem_nqn=nqn, serial_number=serial_number, max_namespaces=max_namespaces, enable_ha=True, no_group_append=no_group_append, - dhchap_key=dhchap_key + dhchap_key=dhchap_key, network_mask=network_mask, ) ) @@ -432,6 +436,62 @@ else: ) ) + @empty_response + @NvmeofCLICommand( + "nvmeof subsystem add_network", model.RequestStatus, + success_message_template=("Adding network mask {network_mask} for subsystem " + "{nqn}: Successful") + ) + @EndpointDoc( + "Add subsystem network mask", + parameters={ + "nqn": Param(str, "NVMeoF subsystem NQN"), + "network_mask": Param(str, "Network mask to add"), + "gw_group": Param(str, "NVMeoF gateway group", True, None), + "server_address": Param(str, "NVMeoF gateway address", True, None), + }, + ) + @convert_to_model(model.RequestStatus) + @handle_nvmeof_error + def add_network(self, nqn: str, network_mask: str, gw_group: Optional[str] = None, + server_address: Optional[str] = None): + return NVMeoFClient( + gw_group=gw_group, + server_address=server_address + ).stub.add_subsystem_network( + NVMeoFClient.pb2.add_subsystem_network_req( + subsystem_nqn=nqn, network_mask=network_mask + ) + ) + + @empty_response + @NvmeofCLICommand( + "nvmeof subsystem del_network", model.RequestStatus, + success_message_template=("Deleting network mask {network_mask} for subsystem " + "{nqn}: Successful") + ) + @EndpointDoc( + "Delete subsystem network mask", + parameters={ + "nqn": Param(str, "NVMeoF subsystem NQN"), + "network_mask": Param(str, "Network mask to remove"), + "gw_group": Param(str, "NVMeoF gateway group", True, None), + "server_address": Param(str, "NVMeoF gateway address", True, None), + }, + ) + @convert_to_model(model.RequestStatus) + @handle_nvmeof_error + def del_network(self, nqn: str, network_mask: str, gw_group: Optional[str] = None, + server_address: Optional[str] = None): + return NVMeoFClient( + gw_group=gw_group, + server_address=server_address + ).stub.del_subsystem_network( + NVMeoFClient.pb2.del_subsystem_network_req( + subsystem_nqn=nqn, network_mask=network_mask + ) + ) + @NvmeofCLICommand("nvmeof get_subsystems", model.GetSubsystems) @convert_to_model(model.GetSubsystems) @handle_nvmeof_error diff --git a/src/pybind/mgr/dashboard/model/nvmeof.py b/src/pybind/mgr/dashboard/model/nvmeof.py index ae029a8c4662..90b9559c2e85 100644 --- a/src/pybind/mgr/dashboard/model/nvmeof.py +++ b/src/pybind/mgr/dashboard/model/nvmeof.py @@ -84,6 +84,7 @@ class Subsystem(NamedTuple): has_dhchap_key: bool allow_any_host: bool created_without_key: bool = False + network_mask: Annotated[List[str], CliFieldTransformer(lambda v: "\n".join(v))] = [] class SubsystemList(NamedTuple): diff --git a/src/pybind/mgr/dashboard/openapi.yaml b/src/pybind/mgr/dashboard/openapi.yaml index d42f53af7404..5f6024ca9de3 100644 --- a/src/pybind/mgr/dashboard/openapi.yaml +++ b/src/pybind/mgr/dashboard/openapi.yaml @@ -13066,6 +13066,11 @@ paths: max_namespaces: description: Maximum number of namespaces type: integer + network_mask: + description: Network mask to automatically create listeners + items: + type: string + type: array no_group_append: default: false description: Do not append gateway group name to the NQN