]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: migrate nvmeof pr #1277 to new cli
authorTomer Haskalovitch <il033030@Tomers-MBP.lan>
Wed, 25 Jun 2025 09:05:53 +0000 (12:05 +0300)
committerTomer Haskalovitch <tomer.haska@ibm.com>
Sun, 6 Jul 2025 07:43:08 +0000 (10:43 +0300)
Signed-off-by: Tomer Haskalovitch <tomer.haska@ibm.com>
(cherry picked from commit a3165e081e783d24fa4e5987b01546108cc2f270)

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

index c8be2add0ff24aafd49ab0b23ba74726434c2b62..4f4791e04f93fc5e3b34af5757c4f0652157765a 100644 (file)
@@ -394,10 +394,11 @@ else:
             trash_image: Optional[bool] = False,
             block_size: int = 512,
             load_balancing_group: Optional[int] = None,
+            force: Optional[bool] = False,
+            no_auto_visible: Optional[bool] = False,
+            disable_auto_resize: Optional[bool] = False,
             gw_group: Optional[str] = None,
             traddr: Optional[str] = None,
-            force: Optional[bool] = False,
-            no_auto_visible: Optional[bool] = False
         ):
             return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_add(
                 NVMeoFClient.pb2.namespace_add_req(
@@ -410,7 +411,313 @@ else:
                     trash_image=trash_image,
                     anagrpid=load_balancing_group,
                     force=force,
-                    no_auto_visible=no_auto_visible
+                    no_auto_visible=no_auto_visible,
+                    disable_auto_resize=disable_auto_resize
+                )
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/set_qos')
+        @EndpointDoc(
+            "set QOS for specified NVMeoF namespace",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "rw_ios_per_second": Param(int, "Read/Write IOPS"),
+                "rw_mbytes_per_second": Param(int, "Read/Write MB/s"),
+                "r_mbytes_per_second": Param(int, "Read MB/s"),
+                "w_mbytes_per_second": Param(int, "Write MB/s"),
+                "force": Param(
+                    bool,
+                    "Set QOS limits even if they were changed by RBD"
+                ),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns set_qos", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def set_qos(
+            self,
+            nqn: str,
+            nsid: str,
+            rw_ios_per_second: Optional[int] = None,
+            rw_mbytes_per_second: Optional[int] = None,
+            r_mbytes_per_second: Optional[int] = None,
+            w_mbytes_per_second: Optional[int] = None,
+            force: Optional[bool] = False,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            return NVMeoFClient(
+                gw_group=gw_group,
+                traddr=traddr
+            ).stub.namespace_set_qos_limits(
+                NVMeoFClient.pb2.namespace_set_qos_req(
+                    subsystem_nqn=nqn,
+                    nsid=int(nsid),
+                    rw_ios_per_second=rw_ios_per_second,
+                    rw_mbytes_per_second=rw_mbytes_per_second,
+                    r_mbytes_per_second=r_mbytes_per_second,
+                    w_mbytes_per_second=w_mbytes_per_second,
+                    force=force,
+                )
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/change_load_balancing_group')
+        @EndpointDoc(
+            "set the load balancing group for specified NVMeoF namespace",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "load_balancing_group": Param(int, "Load balancing group"),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns change_load_balancing_group", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def change_load_balancing_group(
+            self,
+            nqn: str,
+            nsid: str,
+            load_balancing_group: Optional[int] = None,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            return NVMeoFClient(
+                gw_group=gw_group,
+                traddr=traddr
+            ).stub.namespace_change_load_balancing_group(
+                NVMeoFClient.pb2.namespace_change_load_balancing_group_req(
+                    subsystem_nqn=nqn, nsid=int(nsid), anagrpid=load_balancing_group
+                )
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/resize')
+        @EndpointDoc(
+            "resize the specified NVMeoF namespace",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "rbd_image_size": Param(int, "RBD image size"),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns resize", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def resize(
+            self,
+            nqn: str,
+            nsid: str,
+            rbd_image_size: int,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            mib = 1024 * 1024
+            new_size_mib = int((rbd_image_size + mib - 1) / mib)
+
+            return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_resize(
+                NVMeoFClient.pb2.namespace_resize_req(
+                    subsystem_nqn=nqn, nsid=int(nsid), new_size=new_size_mib
+                )
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/add_host')
+        @EndpointDoc(
+            "Adds a host to the specified NVMeoF namespace",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "host_nqn": Param(str, 'NVMeoF host NQN. Use "*" to allow any host.'),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns add_host", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def add_host(
+            self,
+            nqn: str,
+            nsid: str,
+            host_nqn: str,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_add_host(
+                NVMeoFClient.pb2.namespace_add_host_req(subsystem_nqn=nqn,
+                                                        nsid=int(nsid),
+                                                        host_nqn=host_nqn)
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/del_host')
+        @EndpointDoc(
+            "Removes a host from the specified NVMeoF namespace",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "host_nqn": Param(str, 'NVMeoF host NQN. Use "*" to allow any host.'),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns del_host", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def del_host(
+            self,
+            nqn: str,
+            nsid: str,
+            host_nqn: str,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_delete_host(
+                NVMeoFClient.pb2.namespace_delete_host_req(
+                    subsystem_nqn=nqn,
+                    nsid=int(nsid),
+                    host_nqn=host_nqn,
+                )
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/change_visibility')
+        @EndpointDoc(
+            "changes the visibility of the specified NVMeoF namespace to all or selected hosts",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "auto_visible": Param(bool, 'True if visible to all hosts'),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns change_visibility", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def change_visibility(
+            self,
+            nqn: str,
+            nsid: str,
+            auto_visible: str,
+            force: Optional[bool] = False,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_change_visibility(
+                NVMeoFClient.pb2.namespace_change_visibility_req(
+                    subsystem_nqn=nqn,
+                    nsid=int(nsid),
+                    auto_visible=str_to_bool(auto_visible),
+                    force=str_to_bool(force),
+                )
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/set_auto_resize')
+        @EndpointDoc(
+            "Enable or disable namespace auto resize when RBD image is resized",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "auto_resize_enabled": Param(
+                    bool,
+                    'Enable or disable auto resize of '
+                    'namespace when RBD image is resized'
+                ),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns set_auto_resize", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def set_auto_resize(
+            self,
+            nqn: str,
+            nsid: str,
+            auto_resize_enabled: bool,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_set_auto_resize(
+                NVMeoFClient.pb2.namespace_set_auto_resize_req(
+                    subsystem_nqn=nqn,
+                    nsid=int(nsid),
+                    auto_resize=str_to_bool(auto_resize_enabled),
+                )
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/set_rbd_trash_image')
+        @EndpointDoc(
+            "changes the trash image on delete of the specified NVMeoF \
+                namespace to all or selected hosts",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "rbd_trash_image_on_delete": Param(bool, 'True if active'),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns set_rbd_trash_image", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def set_rbd_trash_image(
+            self,
+            nqn: str,
+            nsid: str,
+            rbd_trash_image_on_delete: str,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            return NVMeoFClient(
+                gw_group=gw_group,
+                traddr=traddr,
+            ).stub.namespace_set_rbd_trash_image(
+                NVMeoFClient.pb2.namespace_set_rbd_trash_image_req(
+                    subsystem_nqn=nqn,
+                    nsid=int(nsid),
+                    trash_image=str_to_bool(rbd_trash_image_on_delete),
+                )
+            )
+
+        @ReadPermission
+        @Endpoint('PUT', '{nsid}/refresh_size')
+        @EndpointDoc(
+            "refresh the specified NVMeoF namespace to current RBD image size",
+            parameters={
+                "nqn": Param(str, "NVMeoF subsystem NQN"),
+                "nsid": Param(str, "NVMeoF Namespace ID"),
+                "gw_group": Param(str, "NVMeoF gateway group", True, None),
+                "traddr": Param(str, "NVMeoF gateway address", True, None),
+            },
+        )
+        @NvmeofCLICommand("nvmeof ns refresh_size", model=model.RequestStatus)
+        @convert_to_model(model.RequestStatus)
+        @handle_nvmeof_error
+        def refresh_size(
+            self,
+            nqn: str,
+            nsid: str,
+            gw_group: Optional[str] = None,
+            traddr: Optional[str] = None
+        ):
+            return NVMeoFClient(gw_group=gw_group, traddr=traddr).stub.namespace_resize(
+                NVMeoFClient.pb2.namespace_resize_req(
+                    subsystem_nqn=nqn,
+                    nsid=int(nsid),
+                    new_size=0
                 )
             )
 
index 330265879c469475666250f03852c0cb14999297..2bb7aca2b5c54b6eeb9734ae7f613bca8c41300f 100644 (file)
@@ -121,6 +121,8 @@ class Namespace(NamedTuple):
     uuid: Optional[str]
     ns_subsystem_nqn: Optional[str]
     trash_image: Optional[bool]
+    disable_auto_resize: Optional[bool]
+
 
 
 class NamespaceList(NamedTuple):