From 0f5ce08de8f08f1e70ac1e72501929f36c872334 Mon Sep 17 00:00:00 2001 From: Tomer Haskalovitch Date: Wed, 25 Jun 2025 12:05:53 +0300 Subject: [PATCH] mgr/dashboard: migrate nvmeof pr #1277 to new cli Signed-off-by: Tomer Haskalovitch (cherry picked from commit a3165e081e783d24fa4e5987b01546108cc2f270) --- .../mgr/dashboard/controllers/nvmeof.py | 313 +++++++++++++++++- src/pybind/mgr/dashboard/model/nvmeof.py | 2 + 2 files changed, 312 insertions(+), 3 deletions(-) diff --git a/src/pybind/mgr/dashboard/controllers/nvmeof.py b/src/pybind/mgr/dashboard/controllers/nvmeof.py index c8be2add0ff..4f4791e04f9 100644 --- a/src/pybind/mgr/dashboard/controllers/nvmeof.py +++ b/src/pybind/mgr/dashboard/controllers/nvmeof.py @@ -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 ) ) diff --git a/src/pybind/mgr/dashboard/model/nvmeof.py b/src/pybind/mgr/dashboard/model/nvmeof.py index 330265879c4..2bb7aca2b5c 100644 --- a/src/pybind/mgr/dashboard/model/nvmeof.py +++ b/src/pybind/mgr/dashboard/model/nvmeof.py @@ -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): -- 2.39.5