]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Add 'network_mask' to nvmeof cli 67766/head
authorVallari Agrawal <vallari.agrawal@ibm.com>
Thu, 12 Mar 2026 13:50:00 +0000 (19:20 +0530)
committerVallari Agrawal <vallari.agrawal@ibm.com>
Mon, 30 Mar 2026 13:59:50 +0000 (19:29 +0530)
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 <subnet1> --network-mask <subnet2>`
1. Add new cli `subsystem add_network --network-mask <subnet>`
2. Add new cli `subsystem del_network --network-mask <subnet>`
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 <vallari.agrawal@ibm.com>
src/pybind/mgr/dashboard/controllers/nvmeof.py
src/pybind/mgr/dashboard/model/nvmeof.py
src/pybind/mgr/dashboard/openapi.yaml

index 7c841335f8bccaf03b3799e1a073a5c3c9d52b1a..ea3c1f6467a1c46c10eda2e82e76526864b04261 100644 (file)
@@ -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
index ae029a8c46624d09c5ddaf44c14084bb723c1485..90b9559c2e85d95f33aa97028a58fc26416f98c8 100644 (file)
@@ -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):
index d42f53af740440cef010cf27f72879cb3cfe8aa6..5f6024ca9de3d9767bc80f87dabc17a8634a7875 100644 (file)
@@ -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