]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Add 'network_mask' to nvmeof cli
authorVallari Agrawal <vallari.agrawal@ibm.com>
Thu, 12 Mar 2026 13:50:00 +0000 (19:20 +0530)
committerVallari Agrawal <vallari.agrawal@ibm.com>
Tue, 12 May 2026 06:51:50 +0000 (12:21 +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>
(cherry picked from commit 366702057e65857ca86702b278cd2fd836484a51)

Conflicts:
src/pybind/mgr/dashboard/controllers/nvmeof.py
        NVMeoFSubsystem controller uses param name "traddr"
        in tentacle branch and its renamed to "server_address"
        in main branch. Since its a breaking change, it would be
        changed to "server_address" in next major version.
        So in this backport commit, we use "traddr" in create(),
        add_network(), and del_network().

src/pybind/mgr/dashboard/controllers/nvmeof.py
src/pybind/mgr/dashboard/model/nvmeof.py
src/pybind/mgr/dashboard/openapi.yaml

index ff199ac4ec8410b428c20ecb3c55ce77b719eb6e..501eaf06d3157edf5410d966d018ff0a0eb8e13a 100644 (file)
@@ -235,6 +235,9 @@ else:
                 "dhchap_key": Param(str, "Subsystem DH-HMAC-CHAP key", True, None),
                 "gw_group": Param(str, "NVMeoF gateway group", True, None),
                 "traddr": Param(str, "NVMeoF gateway address", True, None),
+                "network_mask": Param([str],
+                                      "Network mask to automatically create listeners",
+                                      True, None),
             },
         )
         @convert_to_model(model.SubsystemStatus)
@@ -242,13 +245,14 @@ else:
         def create(self, nqn: str, enable_ha: Optional[bool] = True,
                    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, traddr: Optional[str] = None):
+                   gw_group: Optional[str] = None, traddr: Optional[str] = None,
+                   network_mask: Optional[List[str]] = None):
             return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.create_subsystem(
                 NVMeoFClient.pb2.create_subsystem_req(
                     subsystem_nqn=nqn, serial_number=serial_number,
                     max_namespaces=max_namespaces, enable_ha=enable_ha,
                     no_group_append=no_group_append,
-                    dhchap_key=dhchap_key
+                    dhchap_key=dhchap_key, network_mask=network_mask,
                 )
             )
 
@@ -313,6 +317,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),
+                "traddr": 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,
+                        traddr: Optional[str] = None):
+            return NVMeoFClient(
+                gw_group=gw_group,
+                traddr=traddr
+            ).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),
+                "traddr": 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,
+                        traddr: Optional[str] = None):
+            return NVMeoFClient(
+                gw_group=gw_group,
+                traddr=traddr
+            ).stub.del_subsystem_network(
+                NVMeoFClient.pb2.del_subsystem_network_req(
+                    subsystem_nqn=nqn, network_mask=network_mask
+                )
+            )
+
         @empty_response
         @NvmeofCLICommand(
             "nvmeof subsystem add_kmip_server_endpoint", model.RequestStatus
index 1dcd6babf2c60b07833d68a69f099e42810b4922..390bedca3dea1c266acb9463080d0ec097c05391 100644 (file)
@@ -85,6 +85,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 4ddc6ead464d13719bd67639bb7c93e9a635424f..e783fcfacffa3e0f2ac316aaf0ad7b47cdee87d6 100644 (file)
@@ -9748,6 +9748,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