]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: add get_subsystem nvme command 66715/head
authorTomer Haskalovitch <tomer.haska@ibm.com>
Mon, 8 Dec 2025 11:25:18 +0000 (13:25 +0200)
committerTomer Haskalovitch <tomer.haska@ibm.com>
Mon, 12 Jan 2026 09:45:54 +0000 (11:45 +0200)
Signed-off-by: Tomer Haskalovitch <tomer.haska@ibm.com>
src/pybind/mgr/dashboard/controllers/nvmeof.py
src/pybind/mgr/dashboard/model/nvmeof.py
src/pybind/mgr/dashboard/services/nvmeof_client.py

index 1d04b75b5292dc87b9dc2c162c14c06d497eb820..27479c40aa1320672606aa6eb3ca51057120075a 100644 (file)
@@ -310,6 +310,14 @@ else:
                 )
             )
 
+        @NvmeofCLICommand("nvmeof get_subsystems", model.GetSubsystems)
+        @convert_to_model(model.GetSubsystems)
+        @handle_nvmeof_error
+        def get_subsystems(self, gw_group: Optional[str] = None, traddr: Optional[str] = None):
+            return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.get_subsystems(
+                NVMeoFClient.pb2.get_subsystems_req()
+            )
+
     @APIRouter("/nvmeof/subsystem/{nqn}/listener", Scope.NVME_OF)
     @APIDoc("NVMe-oF Subsystem Listener Management API", "NVMe-oF Subsystem Listener")
     class NVMeoFListener(RESTController):
index 9b1349d2f2b6b28e5f324d20dc5b3e004c2eec65..3539dd51f15b37071e63a18bf80cf002f1410ee4 100644 (file)
@@ -267,3 +267,43 @@ class GatewayListenersInfo(NamedTuple):
 class RequestStatus(NamedTuple):
     status: Annotated[int, CliFlags.EXCLUSIVE_RESULT]
     error_message: str
+
+
+class ListenAdress(NamedTuple):
+    trtype: str
+    adrfam: str
+    traddr: str
+    trsvcid: str
+    transport: Optional[str]
+    secure: Optional[bool]
+
+
+class NamespaceInfo(NamedTuple):
+    nsid: int
+    name: str
+    bdev_name: Optional[str]
+    nguid: Optional[str]
+    uuid: Optional[str]
+    anagrpid: Optional[int]
+    nonce: Optional[str]
+    auto_visible: Optional[bool]
+    hosts: List[Host]
+
+
+class SubsystemInfo(NamedTuple):
+    nqn: str
+    subtype: str
+    listen_addresses: List[ListenAdress]
+    hosts: List[Host]
+    allow_any_host: bool
+    serial_number: Optional[str]
+    model_number: Optional[str]
+    max_namespaces: Optional[int]
+    min_cntlid: Optional[int]
+    max_cntlid: Optional[int]
+    namespaces: List[Namespace]
+    has_dhchap_key: Optional[bool]
+
+
+class GetSubsystems(NamedTuple):
+    subsystems: List[Subsystem]
index 8ac76f2a8e34effd4d07beb25b20dba5c6c33b0d..31ded6cb187200367abe756d0f4ae0b79ca9cb53 100644 (file)
@@ -111,11 +111,14 @@ else:
                     component="nvmeof",
                 )
 
-            if response.status != 0:
+            status = getattr(response, "status", None)
+            error_message = getattr(response, "error_message", None)
+
+            if status not in (None, 0):
                 raise DashboardException(
-                    msg=response.error_message,
-                    code=response.status,
-                    http_status_code=NVMeoFError2HTTP.get(response.status, 400),
+                    msg=error_message or "NVMeoF operation failed",
+                    code=status,
+                    http_status_code=NVMeoFError2HTTP.get(status, 400),  # type: ignore[arg-type]
                     component="nvmeof",
                 )
             return response