1588dfe31SMichal Berger# SPDX-License-Identifier: BSD-3-Clause 2588dfe31SMichal Berger# Copyright (C) 2018 Intel Corporation. 3588dfe31SMichal Berger# All rights reserved. 4588dfe31SMichal Berger 57610bc38SKonrad Sztyberfrom .ui_node import UINode, UIBdevs, UILvolStores, UIVhosts 67610bc38SKonrad Sztyberfrom .ui_node_nvmf import UINVMf 77610bc38SKonrad Sztyberfrom .ui_node_iscsi import UIISCSI 87610bc38SKonrad Sztyberfrom .. import rpc 97610bc38SKonrad Sztyberfrom functools import wraps 107610bc38SKonrad Sztyber 117610bc38SKonrad Sztyber 127610bc38SKonrad Sztyberclass UIRoot(UINode): 137610bc38SKonrad Sztyber """ 147610bc38SKonrad Sztyber Root node for CLI menu tree structure. Refreshes running config on startup. 157610bc38SKonrad Sztyber """ 167610bc38SKonrad Sztyber def __init__(self, client, shell): 177610bc38SKonrad Sztyber UINode.__init__(self, "/", shell=shell) 187610bc38SKonrad Sztyber self.current_bdevs = [] 197610bc38SKonrad Sztyber self.current_lvol_stores = [] 207610bc38SKonrad Sztyber self.current_vhost_ctrls = [] 217610bc38SKonrad Sztyber self.current_nvmf_transports = [] 227610bc38SKonrad Sztyber self.current_nvmf_subsystems = [] 23470e8518SSlawomir Ptak self.current_nvmf_referrals = [] 247610bc38SKonrad Sztyber self.set_rpc_target(client) 257610bc38SKonrad Sztyber self.verbose = False 267610bc38SKonrad Sztyber self.is_init = self.check_init() 277610bc38SKonrad Sztyber self.methods = [] 287610bc38SKonrad Sztyber 297610bc38SKonrad Sztyber def refresh(self): 307610bc38SKonrad Sztyber self.methods = self.rpc_get_methods(current=True) 317610bc38SKonrad Sztyber if self.is_init is False: 327610bc38SKonrad Sztyber methods = "\n".join(self.methods) 337610bc38SKonrad Sztyber self.shell.log.warning("SPDK Application is not yet initialized.\n" 347610bc38SKonrad Sztyber "Please initialize subsystems with framework_start_init command.\n" 357610bc38SKonrad Sztyber "List of available commands in current state:\n" 367610bc38SKonrad Sztyber "%s" % methods) 377610bc38SKonrad Sztyber else: 387610bc38SKonrad Sztyber # Pass because we'd like to build main tree structure for "ls" 397610bc38SKonrad Sztyber # even if state is uninitialized 407610bc38SKonrad Sztyber pass 417610bc38SKonrad Sztyber 427610bc38SKonrad Sztyber self._children = set([]) 437610bc38SKonrad Sztyber UIBdevs(self) 447610bc38SKonrad Sztyber UILvolStores(self) 45e0516095STomasz Zawadzki if self.has_subsystem("vhost_scsi") or self.has_subsystem("vhost_blk"): 467610bc38SKonrad Sztyber UIVhosts(self) 477610bc38SKonrad Sztyber if self.has_subsystem("nvmf"): 487610bc38SKonrad Sztyber UINVMf(self) 497610bc38SKonrad Sztyber if self.has_subsystem("iscsi"): 507610bc38SKonrad Sztyber UIISCSI(self) 517610bc38SKonrad Sztyber 527610bc38SKonrad Sztyber def set_rpc_target(self, client): 537610bc38SKonrad Sztyber self.client = client 547610bc38SKonrad Sztyber 557610bc38SKonrad Sztyber def print_array(self, a): 567610bc38SKonrad Sztyber return " ".join(a) 577610bc38SKonrad Sztyber 587610bc38SKonrad Sztyber def verbose(f): 597610bc38SKonrad Sztyber # For any configuration calls (create, delete, construct, etc.) 607610bc38SKonrad Sztyber # Check if verbose option is to be used and set appropriately. 617610bc38SKonrad Sztyber # Do not use for "get_*" methods so that output is not 627610bc38SKonrad Sztyber # flooded. 637610bc38SKonrad Sztyber def w(self, **kwargs): 647610bc38SKonrad Sztyber self.client.log_set_level("INFO" if self.verbose else "ERROR") 657610bc38SKonrad Sztyber r = f(self, **kwargs) 667610bc38SKonrad Sztyber self.client.log_set_level("ERROR") 677610bc38SKonrad Sztyber return r 687610bc38SKonrad Sztyber return w 697610bc38SKonrad Sztyber 707610bc38SKonrad Sztyber def is_method_available(f): 717610bc38SKonrad Sztyber # Check if method f is available for given spdk target 727610bc38SKonrad Sztyber def w(self, **kwargs): 737610bc38SKonrad Sztyber if f.__name__ in self.methods: 747610bc38SKonrad Sztyber r = f(self, **kwargs) 757610bc38SKonrad Sztyber return r 767610bc38SKonrad Sztyber # If given method is not available return empty list 777610bc38SKonrad Sztyber # similar to real get_* like rpc 787610bc38SKonrad Sztyber return [] 797610bc38SKonrad Sztyber return w 807610bc38SKonrad Sztyber 817610bc38SKonrad Sztyber def ui_command_framework_start_init(self): 827610bc38SKonrad Sztyber if rpc.framework_start_init(self.client): 837610bc38SKonrad Sztyber self.is_init = True 847610bc38SKonrad Sztyber self.refresh() 857610bc38SKonrad Sztyber 867610bc38SKonrad Sztyber def ui_command_load_config(self, filename): 877610bc38SKonrad Sztyber with open(filename, "r") as fd: 887610bc38SKonrad Sztyber rpc.load_config(self.client, fd) 897610bc38SKonrad Sztyber 907610bc38SKonrad Sztyber def ui_command_load_subsystem_config(self, filename): 917610bc38SKonrad Sztyber with open(filename, "r") as fd: 927610bc38SKonrad Sztyber rpc.load_subsystem_config(self.client, fd) 937610bc38SKonrad Sztyber 947610bc38SKonrad Sztyber def ui_command_save_config(self, filename, indent=2): 957610bc38SKonrad Sztyber with open(filename, "w") as fd: 967610bc38SKonrad Sztyber rpc.save_config(self.client, fd, indent) 977610bc38SKonrad Sztyber 987610bc38SKonrad Sztyber def ui_command_save_subsystem_config(self, filename, subsystem, indent=2): 997610bc38SKonrad Sztyber with open(filename, "w") as fd: 1007610bc38SKonrad Sztyber rpc.save_subsystem_config(self.client, fd, indent, subsystem) 1017610bc38SKonrad Sztyber 1027610bc38SKonrad Sztyber def rpc_get_methods(self, current=False): 1037610bc38SKonrad Sztyber return rpc.rpc_get_methods(self.client, current=current) 1047610bc38SKonrad Sztyber 1057610bc38SKonrad Sztyber def check_init(self): 1067610bc38SKonrad Sztyber return "framework_start_init" not in self.rpc_get_methods(current=True) 1077610bc38SKonrad Sztyber 1087610bc38SKonrad Sztyber def bdev_get_bdevs(self, bdev_type): 1097610bc38SKonrad Sztyber if self.is_init: 1107610bc38SKonrad Sztyber self.current_bdevs = rpc.bdev.bdev_get_bdevs(self.client) 1117610bc38SKonrad Sztyber # Following replace needs to be done in order for some of the bdev 1127610bc38SKonrad Sztyber # listings to work: logical volumes, split disk. 1137610bc38SKonrad Sztyber # For example logical volumes: listing in menu is "Logical_Volume" 1147610bc38SKonrad Sztyber # (cannot have space), but the product name in SPDK is "Logical Volume" 1157610bc38SKonrad Sztyber bdev_type = bdev_type.replace("_", " ") 1167610bc38SKonrad Sztyber for bdev in [x for x in self.current_bdevs if bdev_type in x["product_name"].lower()]: 1177610bc38SKonrad Sztyber test = Bdev(bdev) 1187610bc38SKonrad Sztyber yield test 1197610bc38SKonrad Sztyber 1207610bc38SKonrad Sztyber def bdev_get_iostat(self, **kwargs): 1217610bc38SKonrad Sztyber return rpc.bdev.bdev_get_iostat(self.client, **kwargs) 1227610bc38SKonrad Sztyber 1237610bc38SKonrad Sztyber @verbose 1247610bc38SKonrad Sztyber def bdev_split_create(self, **kwargs): 1257610bc38SKonrad Sztyber response = rpc.bdev.bdev_split_create(self.client, **kwargs) 1267610bc38SKonrad Sztyber return self.print_array(response) 1277610bc38SKonrad Sztyber 1287610bc38SKonrad Sztyber @verbose 1297610bc38SKonrad Sztyber def bdev_split_delete(self, **kwargs): 1307610bc38SKonrad Sztyber rpc.bdev.bdev_split_delete(self.client, **kwargs) 1317610bc38SKonrad Sztyber 1327610bc38SKonrad Sztyber @verbose 1337610bc38SKonrad Sztyber def create_malloc_bdev(self, **kwargs): 1347610bc38SKonrad Sztyber response = rpc.bdev.bdev_malloc_create(self.client, **kwargs) 1357610bc38SKonrad Sztyber return response 1367610bc38SKonrad Sztyber 1377610bc38SKonrad Sztyber @verbose 1387610bc38SKonrad Sztyber def bdev_malloc_delete(self, **kwargs): 1397610bc38SKonrad Sztyber rpc.bdev.bdev_malloc_delete(self.client, **kwargs) 1407610bc38SKonrad Sztyber 1417610bc38SKonrad Sztyber @verbose 1427610bc38SKonrad Sztyber def create_iscsi_bdev(self, **kwargs): 1437610bc38SKonrad Sztyber response = rpc.bdev.bdev_iscsi_create(self.client, **kwargs) 1447610bc38SKonrad Sztyber return response 1457610bc38SKonrad Sztyber 1467610bc38SKonrad Sztyber @verbose 1477610bc38SKonrad Sztyber def bdev_iscsi_delete(self, **kwargs): 1487610bc38SKonrad Sztyber rpc.bdev.bdev_iscsi_delete(self.client, **kwargs) 1497610bc38SKonrad Sztyber 1507610bc38SKonrad Sztyber @verbose 1517610bc38SKonrad Sztyber def bdev_aio_create(self, **kwargs): 1527610bc38SKonrad Sztyber response = rpc.bdev.bdev_aio_create(self.client, **kwargs) 1537610bc38SKonrad Sztyber return response 1547610bc38SKonrad Sztyber 1557610bc38SKonrad Sztyber @verbose 1567610bc38SKonrad Sztyber def bdev_aio_delete(self, **kwargs): 1577610bc38SKonrad Sztyber rpc.bdev.bdev_aio_delete(self.client, **kwargs) 1587610bc38SKonrad Sztyber 1597610bc38SKonrad Sztyber @verbose 1607610bc38SKonrad Sztyber def create_lvol_bdev(self, **kwargs): 1617610bc38SKonrad Sztyber response = rpc.lvol.bdev_lvol_create(self.client, **kwargs) 1627610bc38SKonrad Sztyber return response 1637610bc38SKonrad Sztyber 1647610bc38SKonrad Sztyber @verbose 1657610bc38SKonrad Sztyber def bdev_lvol_delete(self, **kwargs): 1667610bc38SKonrad Sztyber response = rpc.lvol.bdev_lvol_delete(self.client, **kwargs) 1677610bc38SKonrad Sztyber return response 1687610bc38SKonrad Sztyber 1697610bc38SKonrad Sztyber @verbose 1707610bc38SKonrad Sztyber def create_nvme_bdev(self, **kwargs): 1717610bc38SKonrad Sztyber response = rpc.bdev.bdev_nvme_attach_controller(self.client, **kwargs) 1727610bc38SKonrad Sztyber return response 1737610bc38SKonrad Sztyber 1747610bc38SKonrad Sztyber @verbose 1757610bc38SKonrad Sztyber def bdev_nvme_detach_controller(self, **kwargs): 1767610bc38SKonrad Sztyber rpc.bdev.bdev_nvme_detach_controller(self.client, **kwargs) 1777610bc38SKonrad Sztyber 1787610bc38SKonrad Sztyber @verbose 1797610bc38SKonrad Sztyber def bdev_null_create(self, **kwargs): 1807610bc38SKonrad Sztyber response = rpc.bdev.bdev_null_create(self.client, **kwargs) 1817610bc38SKonrad Sztyber return response 1827610bc38SKonrad Sztyber 1837610bc38SKonrad Sztyber @verbose 1847610bc38SKonrad Sztyber def bdev_null_delete(self, **kwargs): 1857610bc38SKonrad Sztyber rpc.bdev.bdev_null_delete(self.client, **kwargs) 1867610bc38SKonrad Sztyber 1877610bc38SKonrad Sztyber @verbose 1887610bc38SKonrad Sztyber def create_error_bdev(self, **kwargs): 1897610bc38SKonrad Sztyber response = rpc.bdev.bdev_error_create(self.client, **kwargs) 1907610bc38SKonrad Sztyber 1917610bc38SKonrad Sztyber @verbose 1927610bc38SKonrad Sztyber def bdev_error_delete(self, **kwargs): 1937610bc38SKonrad Sztyber rpc.bdev.bdev_error_delete(self.client, **kwargs) 1947610bc38SKonrad Sztyber 1957610bc38SKonrad Sztyber @verbose 1967610bc38SKonrad Sztyber @is_method_available 1977610bc38SKonrad Sztyber def bdev_lvol_get_lvstores(self): 1987610bc38SKonrad Sztyber if self.is_init: 1997610bc38SKonrad Sztyber self.current_lvol_stores = rpc.lvol.bdev_lvol_get_lvstores(self.client) 2007610bc38SKonrad Sztyber for lvs in self.current_lvol_stores: 2017610bc38SKonrad Sztyber yield LvolStore(lvs) 2027610bc38SKonrad Sztyber 2037610bc38SKonrad Sztyber @verbose 2047610bc38SKonrad Sztyber def bdev_lvol_create_lvstore(self, **kwargs): 2057610bc38SKonrad Sztyber response = rpc.lvol.bdev_lvol_create_lvstore(self.client, **kwargs) 2067610bc38SKonrad Sztyber return response 2077610bc38SKonrad Sztyber 2087610bc38SKonrad Sztyber @verbose 2097610bc38SKonrad Sztyber def bdev_lvol_delete_lvstore(self, **kwargs): 2107610bc38SKonrad Sztyber rpc.lvol.bdev_lvol_delete_lvstore(self.client, **kwargs) 2117610bc38SKonrad Sztyber 2127610bc38SKonrad Sztyber @verbose 2137610bc38SKonrad Sztyber def create_rbd_bdev(self, **kwargs): 2147610bc38SKonrad Sztyber response = rpc.bdev.bdev_rbd_create(self.client, **kwargs) 2157610bc38SKonrad Sztyber return response 2167610bc38SKonrad Sztyber 2177610bc38SKonrad Sztyber @verbose 2187610bc38SKonrad Sztyber def bdev_rbd_delete(self, **kwargs): 2197610bc38SKonrad Sztyber response = rpc.bdev.bdev_rbd_delete(self.client, **kwargs) 2207610bc38SKonrad Sztyber return response 2217610bc38SKonrad Sztyber 2227610bc38SKonrad Sztyber @verbose 2237610bc38SKonrad Sztyber def create_virtio_dev(self, **kwargs): 2247610bc38SKonrad Sztyber response = rpc.vhost.bdev_virtio_attach_controller(self.client, **kwargs) 2257610bc38SKonrad Sztyber return self.print_array(response) 2267610bc38SKonrad Sztyber 2277610bc38SKonrad Sztyber @verbose 2287610bc38SKonrad Sztyber def bdev_virtio_detach_controller(self, **kwargs): 2297610bc38SKonrad Sztyber response = rpc.vhost.bdev_virtio_detach_controller(self.client, **kwargs) 2307610bc38SKonrad Sztyber return response 2317610bc38SKonrad Sztyber 2327610bc38SKonrad Sztyber @verbose 2337610bc38SKonrad Sztyber def bdev_raid_create(self, **kwargs): 2347610bc38SKonrad Sztyber rpc.bdev.bdev_raid_create(self.client, **kwargs) 2357610bc38SKonrad Sztyber 2367610bc38SKonrad Sztyber @verbose 2377610bc38SKonrad Sztyber def bdev_raid_delete(self, **kwargs): 2387610bc38SKonrad Sztyber rpc.bdev.bdev_raid_delete(self.client, **kwargs) 2397610bc38SKonrad Sztyber 2407610bc38SKonrad Sztyber @verbose 241da846dd4SKarol Latecki def bdev_uring_create(self, **kwargs): 242da846dd4SKarol Latecki response = rpc.bdev.bdev_uring_create(self.client, **kwargs) 243da846dd4SKarol Latecki return response 244da846dd4SKarol Latecki 245da846dd4SKarol Latecki @verbose 246da846dd4SKarol Latecki def bdev_uring_delete(self, **kwargs): 247da846dd4SKarol Latecki rpc.bdev.bdev_uring_delete(self.client, **kwargs) 248da846dd4SKarol Latecki 249da846dd4SKarol Latecki @verbose 2507610bc38SKonrad Sztyber @is_method_available 2517610bc38SKonrad Sztyber def bdev_virtio_scsi_get_devices(self): 2527610bc38SKonrad Sztyber if self.is_init: 2537610bc38SKonrad Sztyber for bdev in rpc.vhost.bdev_virtio_scsi_get_devices(self.client): 2547610bc38SKonrad Sztyber test = Bdev(bdev) 2557610bc38SKonrad Sztyber yield test 2567610bc38SKonrad Sztyber 2577610bc38SKonrad Sztyber def list_vhost_ctrls(self): 2587610bc38SKonrad Sztyber if self.is_init: 2597610bc38SKonrad Sztyber self.current_vhost_ctrls = rpc.vhost.vhost_get_controllers(self.client) 2607610bc38SKonrad Sztyber 2617610bc38SKonrad Sztyber @verbose 2627610bc38SKonrad Sztyber @is_method_available 2637610bc38SKonrad Sztyber def vhost_get_controllers(self, ctrlr_type): 2647610bc38SKonrad Sztyber if self.is_init: 2657610bc38SKonrad Sztyber self.list_vhost_ctrls() 2667610bc38SKonrad Sztyber for ctrlr in [x for x in self.current_vhost_ctrls if ctrlr_type in list(x["backend_specific"].keys())]: 2677610bc38SKonrad Sztyber yield VhostCtrlr(ctrlr) 2687610bc38SKonrad Sztyber 2697610bc38SKonrad Sztyber @verbose 2707610bc38SKonrad Sztyber def vhost_delete_controller(self, **kwargs): 2717610bc38SKonrad Sztyber rpc.vhost.vhost_delete_controller(self.client, **kwargs) 2727610bc38SKonrad Sztyber 2737610bc38SKonrad Sztyber @verbose 2747610bc38SKonrad Sztyber def vhost_create_scsi_controller(self, **kwargs): 2757610bc38SKonrad Sztyber rpc.vhost.vhost_create_scsi_controller(self.client, **kwargs) 2767610bc38SKonrad Sztyber 2777610bc38SKonrad Sztyber @verbose 278dc93bd85SHaoqian He def vhost_start_scsi_controller(self, **kwargs): 279dc93bd85SHaoqian He rpc.vhost.vhost_start_scsi_controller(self.client, **kwargs) 280dc93bd85SHaoqian He 281dc93bd85SHaoqian He @verbose 2827610bc38SKonrad Sztyber def vhost_create_blk_controller(self, **kwargs): 2837610bc38SKonrad Sztyber rpc.vhost.vhost_create_blk_controller(self.client, **kwargs) 2847610bc38SKonrad Sztyber 2857610bc38SKonrad Sztyber @verbose 2867610bc38SKonrad Sztyber def vhost_scsi_controller_remove_target(self, **kwargs): 2877610bc38SKonrad Sztyber rpc.vhost.vhost_scsi_controller_remove_target(self.client, **kwargs) 2887610bc38SKonrad Sztyber 2897610bc38SKonrad Sztyber @verbose 2907610bc38SKonrad Sztyber def vhost_scsi_controller_add_target(self, **kwargs): 2917610bc38SKonrad Sztyber rpc.vhost.vhost_scsi_controller_add_target(self.client, **kwargs) 2927610bc38SKonrad Sztyber 2937610bc38SKonrad Sztyber def vhost_controller_set_coalescing(self, **kwargs): 2947610bc38SKonrad Sztyber rpc.vhost.vhost_controller_set_coalescing(self.client, **kwargs) 2957610bc38SKonrad Sztyber 2967610bc38SKonrad Sztyber @verbose 2977610bc38SKonrad Sztyber def create_nvmf_transport(self, **kwargs): 2987610bc38SKonrad Sztyber rpc.nvmf.nvmf_create_transport(self.client, **kwargs) 2997610bc38SKonrad Sztyber 3007610bc38SKonrad Sztyber def list_nvmf_transports(self): 3017610bc38SKonrad Sztyber if self.is_init: 3027610bc38SKonrad Sztyber self.current_nvmf_transports = rpc.nvmf.nvmf_get_transports(self.client) 3037610bc38SKonrad Sztyber 3047610bc38SKonrad Sztyber @verbose 3057610bc38SKonrad Sztyber @is_method_available 3067610bc38SKonrad Sztyber def nvmf_get_transports(self): 3077610bc38SKonrad Sztyber if self.is_init: 3087610bc38SKonrad Sztyber self.list_nvmf_transports() 3097610bc38SKonrad Sztyber for transport in self.current_nvmf_transports: 3107610bc38SKonrad Sztyber yield NvmfTransport(transport) 3117610bc38SKonrad Sztyber 3127610bc38SKonrad Sztyber def list_nvmf_subsystems(self): 3137610bc38SKonrad Sztyber if self.is_init: 3147610bc38SKonrad Sztyber self.current_nvmf_subsystems = rpc.nvmf.nvmf_get_subsystems(self.client) 3157610bc38SKonrad Sztyber 3167610bc38SKonrad Sztyber @verbose 3177610bc38SKonrad Sztyber @is_method_available 3187610bc38SKonrad Sztyber def nvmf_get_subsystems(self): 3197610bc38SKonrad Sztyber if self.is_init: 3207610bc38SKonrad Sztyber self.list_nvmf_subsystems() 3217610bc38SKonrad Sztyber for subsystem in self.current_nvmf_subsystems: 3227610bc38SKonrad Sztyber yield NvmfSubsystem(subsystem) 3237610bc38SKonrad Sztyber 324470e8518SSlawomir Ptak def list_nvmf_referrals(self): 325470e8518SSlawomir Ptak if self.is_init: 326470e8518SSlawomir Ptak self.current_nvmf_referrals = rpc.nvmf.nvmf_discovery_get_referrals(self.client) 327470e8518SSlawomir Ptak 328470e8518SSlawomir Ptak @verbose 329470e8518SSlawomir Ptak @is_method_available 330470e8518SSlawomir Ptak def nvmf_discovery_get_referrals(self): 331470e8518SSlawomir Ptak if self.is_init: 332470e8518SSlawomir Ptak self.list_nvmf_referrals() 333470e8518SSlawomir Ptak for referral in self.current_nvmf_referrals: 334470e8518SSlawomir Ptak yield NvmfReferral(referral) 335470e8518SSlawomir Ptak 336470e8518SSlawomir Ptak @verbose 337470e8518SSlawomir Ptak def nvmf_discovery_add_referral(self, **kwargs): 338470e8518SSlawomir Ptak rpc.nvmf.nvmf_discovery_add_referral(self.client, **kwargs) 339470e8518SSlawomir Ptak 340470e8518SSlawomir Ptak @verbose 341470e8518SSlawomir Ptak def nvmf_discovery_remove_referral(self, **kwargs): 342470e8518SSlawomir Ptak rpc.nvmf.nvmf_discovery_remove_referral(self.client, **kwargs) 343470e8518SSlawomir Ptak 3447610bc38SKonrad Sztyber @verbose 3457610bc38SKonrad Sztyber def create_nvmf_subsystem(self, **kwargs): 3467610bc38SKonrad Sztyber rpc.nvmf.nvmf_create_subsystem(self.client, **kwargs) 3477610bc38SKonrad Sztyber 3487610bc38SKonrad Sztyber @verbose 3497610bc38SKonrad Sztyber def nvmf_delete_subsystem(self, **kwargs): 3507610bc38SKonrad Sztyber rpc.nvmf.nvmf_delete_subsystem(self.client, **kwargs) 3517610bc38SKonrad Sztyber 3527610bc38SKonrad Sztyber @verbose 3537610bc38SKonrad Sztyber def nvmf_subsystem_add_listener(self, **kwargs): 3547610bc38SKonrad Sztyber rpc.nvmf.nvmf_subsystem_add_listener(self.client, **kwargs) 3557610bc38SKonrad Sztyber 3567610bc38SKonrad Sztyber @verbose 3577610bc38SKonrad Sztyber def nvmf_subsystem_remove_listener(self, **kwargs): 3587610bc38SKonrad Sztyber rpc.nvmf.nvmf_subsystem_remove_listener(self.client, **kwargs) 3597610bc38SKonrad Sztyber 3607610bc38SKonrad Sztyber @verbose 3617610bc38SKonrad Sztyber def nvmf_subsystem_add_host(self, **kwargs): 3627610bc38SKonrad Sztyber rpc.nvmf.nvmf_subsystem_add_host(self.client, **kwargs) 3637610bc38SKonrad Sztyber 3647610bc38SKonrad Sztyber @verbose 3657610bc38SKonrad Sztyber def nvmf_subsystem_remove_host(self, **kwargs): 3667610bc38SKonrad Sztyber rpc.nvmf.nvmf_subsystem_remove_host(self.client, **kwargs) 3677610bc38SKonrad Sztyber 3687610bc38SKonrad Sztyber @verbose 3697610bc38SKonrad Sztyber def nvmf_subsystem_allow_any_host(self, **kwargs): 3707610bc38SKonrad Sztyber rpc.nvmf.nvmf_subsystem_allow_any_host(self.client, **kwargs) 3717610bc38SKonrad Sztyber 3727610bc38SKonrad Sztyber @verbose 3737610bc38SKonrad Sztyber def nvmf_subsystem_add_ns(self, **kwargs): 3747610bc38SKonrad Sztyber rpc.nvmf.nvmf_subsystem_add_ns(self.client, **kwargs) 3757610bc38SKonrad Sztyber 3767610bc38SKonrad Sztyber @verbose 3777610bc38SKonrad Sztyber def nvmf_subsystem_remove_ns(self, **kwargs): 3787610bc38SKonrad Sztyber rpc.nvmf.nvmf_subsystem_remove_ns(self.client, **kwargs) 3797610bc38SKonrad Sztyber 3807610bc38SKonrad Sztyber @verbose 3817610bc38SKonrad Sztyber def nvmf_subsystem_allow_any_host(self, **kwargs): 3827610bc38SKonrad Sztyber rpc.nvmf.nvmf_subsystem_allow_any_host(self.client, **kwargs) 3837610bc38SKonrad Sztyber 3847610bc38SKonrad Sztyber @verbose 3857610bc38SKonrad Sztyber @is_method_available 3867610bc38SKonrad Sztyber def scsi_get_devices(self): 3877610bc38SKonrad Sztyber if self.is_init: 3887610bc38SKonrad Sztyber for device in rpc.iscsi.scsi_get_devices(self.client): 3897610bc38SKonrad Sztyber yield ScsiObj(device) 3907610bc38SKonrad Sztyber 3917610bc38SKonrad Sztyber @verbose 3927610bc38SKonrad Sztyber @is_method_available 3937610bc38SKonrad Sztyber def iscsi_get_target_nodes(self): 3947610bc38SKonrad Sztyber if self.is_init: 3957610bc38SKonrad Sztyber for tg in rpc.iscsi.iscsi_get_target_nodes(self.client): 3967610bc38SKonrad Sztyber yield tg 3977610bc38SKonrad Sztyber 3987610bc38SKonrad Sztyber @verbose 3997610bc38SKonrad Sztyber def iscsi_create_target_node(self, **kwargs): 4007610bc38SKonrad Sztyber rpc.iscsi.iscsi_create_target_node(self.client, **kwargs) 4017610bc38SKonrad Sztyber 4027610bc38SKonrad Sztyber @verbose 4037610bc38SKonrad Sztyber def iscsi_delete_target_node(self, **kwargs): 4047610bc38SKonrad Sztyber rpc.iscsi.iscsi_delete_target_node(self.client, **kwargs) 4057610bc38SKonrad Sztyber 4067610bc38SKonrad Sztyber @verbose 4077610bc38SKonrad Sztyber @is_method_available 4087610bc38SKonrad Sztyber def iscsi_get_portal_groups(self): 4097610bc38SKonrad Sztyber if self.is_init: 4107610bc38SKonrad Sztyber for pg in rpc.iscsi.iscsi_get_portal_groups(self.client): 4117610bc38SKonrad Sztyber yield ScsiObj(pg) 4127610bc38SKonrad Sztyber 4137610bc38SKonrad Sztyber @verbose 4147610bc38SKonrad Sztyber @is_method_available 4157610bc38SKonrad Sztyber def iscsi_get_initiator_groups(self): 4167610bc38SKonrad Sztyber if self.is_init: 4177610bc38SKonrad Sztyber for ig in rpc.iscsi.iscsi_get_initiator_groups(self.client): 4187610bc38SKonrad Sztyber yield ScsiObj(ig) 4197610bc38SKonrad Sztyber 4207610bc38SKonrad Sztyber @verbose 4217610bc38SKonrad Sztyber def construct_portal_group(self, **kwargs): 4227610bc38SKonrad Sztyber rpc.iscsi.iscsi_create_portal_group(self.client, **kwargs) 4237610bc38SKonrad Sztyber 4247610bc38SKonrad Sztyber @verbose 4257610bc38SKonrad Sztyber def iscsi_delete_portal_group(self, **kwargs): 4267610bc38SKonrad Sztyber rpc.iscsi.iscsi_delete_portal_group(self.client, **kwargs) 4277610bc38SKonrad Sztyber 4287610bc38SKonrad Sztyber @verbose 4297610bc38SKonrad Sztyber def construct_initiator_group(self, **kwargs): 4307610bc38SKonrad Sztyber rpc.iscsi.iscsi_create_initiator_group(self.client, **kwargs) 4317610bc38SKonrad Sztyber 4327610bc38SKonrad Sztyber @verbose 4337610bc38SKonrad Sztyber def iscsi_delete_initiator_group(self, **kwargs): 4347610bc38SKonrad Sztyber rpc.iscsi.iscsi_delete_initiator_group(self.client, **kwargs) 4357610bc38SKonrad Sztyber 4367610bc38SKonrad Sztyber @verbose 4377610bc38SKonrad Sztyber @is_method_available 4387610bc38SKonrad Sztyber def iscsi_get_connections(self, **kwargs): 4397610bc38SKonrad Sztyber if self.is_init: 4407610bc38SKonrad Sztyber for ic in rpc.iscsi.iscsi_get_connections(self.client, **kwargs): 4417610bc38SKonrad Sztyber yield ic 4427610bc38SKonrad Sztyber 4437610bc38SKonrad Sztyber @verbose 4447610bc38SKonrad Sztyber def iscsi_initiator_group_add_initiators(self, **kwargs): 4457610bc38SKonrad Sztyber rpc.iscsi.iscsi_initiator_group_add_initiators(self.client, **kwargs) 4467610bc38SKonrad Sztyber 4477610bc38SKonrad Sztyber @verbose 4487610bc38SKonrad Sztyber def iscsi_initiator_group_remove_initiators(self, **kwargs): 4497610bc38SKonrad Sztyber rpc.iscsi.iscsi_initiator_group_remove_initiators(self.client, **kwargs) 4507610bc38SKonrad Sztyber 4517610bc38SKonrad Sztyber @verbose 4527610bc38SKonrad Sztyber def iscsi_target_node_add_pg_ig_maps(self, **kwargs): 4537610bc38SKonrad Sztyber rpc.iscsi.iscsi_target_node_add_pg_ig_maps(self.client, **kwargs) 4547610bc38SKonrad Sztyber 4557610bc38SKonrad Sztyber @verbose 4567610bc38SKonrad Sztyber def iscsi_target_node_remove_pg_ig_maps(self, **kwargs): 4577610bc38SKonrad Sztyber rpc.iscsi.iscsi_target_node_remove_pg_ig_maps(self.client, **kwargs) 4587610bc38SKonrad Sztyber 4597610bc38SKonrad Sztyber @verbose 4607610bc38SKonrad Sztyber def iscsi_auth_group_add_secret(self, **kwargs): 4617610bc38SKonrad Sztyber rpc.iscsi.iscsi_auth_group_add_secret(self.client, **kwargs) 4627610bc38SKonrad Sztyber 4637610bc38SKonrad Sztyber @verbose 4647610bc38SKonrad Sztyber def iscsi_auth_group_remove_secret(self, **kwargs): 4657610bc38SKonrad Sztyber rpc.iscsi.iscsi_auth_group_remove_secret(self.client, **kwargs) 4667610bc38SKonrad Sztyber 4677610bc38SKonrad Sztyber @verbose 4687610bc38SKonrad Sztyber @is_method_available 4697610bc38SKonrad Sztyber def iscsi_get_auth_groups(self, **kwargs): 4707610bc38SKonrad Sztyber return rpc.iscsi.iscsi_get_auth_groups(self.client, **kwargs) 4717610bc38SKonrad Sztyber 4727610bc38SKonrad Sztyber @verbose 4737610bc38SKonrad Sztyber def iscsi_create_auth_group(self, **kwargs): 4747610bc38SKonrad Sztyber rpc.iscsi.iscsi_create_auth_group(self.client, **kwargs) 4757610bc38SKonrad Sztyber 4767610bc38SKonrad Sztyber @verbose 4777610bc38SKonrad Sztyber def iscsi_delete_auth_group(self, **kwargs): 4787610bc38SKonrad Sztyber rpc.iscsi.iscsi_delete_auth_group(self.client, **kwargs) 4797610bc38SKonrad Sztyber 4807610bc38SKonrad Sztyber @verbose 4817610bc38SKonrad Sztyber def iscsi_target_node_set_auth(self, **kwargs): 4827610bc38SKonrad Sztyber rpc.iscsi.iscsi_target_node_set_auth(self.client, **kwargs) 4837610bc38SKonrad Sztyber 4847610bc38SKonrad Sztyber @verbose 4857610bc38SKonrad Sztyber def iscsi_target_node_add_lun(self, **kwargs): 4867610bc38SKonrad Sztyber rpc.iscsi.iscsi_target_node_add_lun(self.client, **kwargs) 4877610bc38SKonrad Sztyber 4887610bc38SKonrad Sztyber @verbose 4897610bc38SKonrad Sztyber def iscsi_set_discovery_auth(self, **kwargs): 4907610bc38SKonrad Sztyber rpc.iscsi.iscsi_set_discovery_auth(self.client, **kwargs) 4917610bc38SKonrad Sztyber 4927610bc38SKonrad Sztyber @verbose 4937610bc38SKonrad Sztyber @is_method_available 4947610bc38SKonrad Sztyber def iscsi_get_options(self, **kwargs): 4957610bc38SKonrad Sztyber return rpc.iscsi.iscsi_get_options(self.client, **kwargs) 4967610bc38SKonrad Sztyber 4977610bc38SKonrad Sztyber def has_subsystem(self, subsystem): 4987610bc38SKonrad Sztyber for system in rpc.subsystem.framework_get_subsystems(self.client): 4997610bc38SKonrad Sztyber if subsystem.lower() == system["subsystem"].lower(): 5007610bc38SKonrad Sztyber return True 5017610bc38SKonrad Sztyber return False 5027610bc38SKonrad Sztyber 503*1758092cSYankun Li @verbose 504*1758092cSYankun Li def create_compress_bdev(self, **kwargs): 505*1758092cSYankun Li response = rpc.bdev.bdev_compress_create(self.client, **kwargs) 506*1758092cSYankun Li return response 507*1758092cSYankun Li 508*1758092cSYankun Li @verbose 509*1758092cSYankun Li def bdev_compress_delete(self, **kwargs): 510*1758092cSYankun Li rpc.bdev.bdev_compress_delete(self.client, **kwargs) 511*1758092cSYankun Li 5127610bc38SKonrad Sztyber 5137610bc38SKonrad Sztyberclass Bdev(object): 5147610bc38SKonrad Sztyber def __init__(self, bdev_info): 5157610bc38SKonrad Sztyber """ 5167610bc38SKonrad Sztyber All class attributes are set based on what information is received 5177610bc38SKonrad Sztyber from bdev_get_bdevs RPC call. 5187610bc38SKonrad Sztyber # TODO: Document in docstring parameters which describe bdevs. 5197610bc38SKonrad Sztyber # TODO: Possible improvement: JSON schema might be used here in future 5207610bc38SKonrad Sztyber """ 5217610bc38SKonrad Sztyber for i in list(bdev_info.keys()): 5227610bc38SKonrad Sztyber setattr(self, i, bdev_info[i]) 5237610bc38SKonrad Sztyber 5247610bc38SKonrad Sztyber 5257610bc38SKonrad Sztyberclass LvolStore(object): 5267610bc38SKonrad Sztyber def __init__(self, lvs_info): 5277610bc38SKonrad Sztyber """ 5287610bc38SKonrad Sztyber All class attributes are set based on what information is received 5297610bc38SKonrad Sztyber from bdev_get_bdevs RPC call. 5307610bc38SKonrad Sztyber # TODO: Document in docstring parameters which describe bdevs. 5317610bc38SKonrad Sztyber # TODO: Possible improvement: JSON schema might be used here in future 5327610bc38SKonrad Sztyber """ 5337610bc38SKonrad Sztyber for i in list(lvs_info.keys()): 5347610bc38SKonrad Sztyber setattr(self, i, lvs_info[i]) 5357610bc38SKonrad Sztyber 5367610bc38SKonrad Sztyber 5377610bc38SKonrad Sztyberclass VhostCtrlr(object): 5387610bc38SKonrad Sztyber def __init__(self, ctrlr_info): 5397610bc38SKonrad Sztyber """ 5407610bc38SKonrad Sztyber All class attributes are set based on what information is received 5417610bc38SKonrad Sztyber from vhost_get_controllers RPC call. 5427610bc38SKonrad Sztyber # TODO: Document in docstring parameters which describe bdevs. 5437610bc38SKonrad Sztyber # TODO: Possible improvement: JSON schema might be used here in future 5447610bc38SKonrad Sztyber """ 5457610bc38SKonrad Sztyber for i in list(ctrlr_info.keys()): 5467610bc38SKonrad Sztyber setattr(self, i, ctrlr_info[i]) 5477610bc38SKonrad Sztyber 5487610bc38SKonrad Sztyber 5497610bc38SKonrad Sztyberclass NvmfTransport(object): 5507610bc38SKonrad Sztyber def __init__(self, transport_info): 5517610bc38SKonrad Sztyber """ 5527610bc38SKonrad Sztyber All class attributes are set based on what information is received 5537610bc38SKonrad Sztyber from get_nvmf_transport RPC call. 5547610bc38SKonrad Sztyber # TODO: Document in docstring parameters which describe bdevs. 5557610bc38SKonrad Sztyber # TODO: Possible improvement: JSON schema might be used here in future 5567610bc38SKonrad Sztyber """ 5577610bc38SKonrad Sztyber for i in transport_info.keys(): 5587610bc38SKonrad Sztyber setattr(self, i, transport_info[i]) 5597610bc38SKonrad Sztyber 5607610bc38SKonrad Sztyber 5617610bc38SKonrad Sztyberclass NvmfSubsystem(object): 5627610bc38SKonrad Sztyber def __init__(self, subsystem_info): 5637610bc38SKonrad Sztyber """ 5647610bc38SKonrad Sztyber All class attributes are set based on what information is received 5657610bc38SKonrad Sztyber from get_nvmf_subsystem RPC call. 5667610bc38SKonrad Sztyber # TODO: Document in docstring parameters which describe bdevs. 5677610bc38SKonrad Sztyber # TODO: Possible improvement: JSON schema might be used here in future 5687610bc38SKonrad Sztyber """ 5697610bc38SKonrad Sztyber for i in subsystem_info.keys(): 5707610bc38SKonrad Sztyber setattr(self, i, subsystem_info[i]) 5717610bc38SKonrad Sztyber 5727610bc38SKonrad Sztyber 573470e8518SSlawomir Ptakclass NvmfReferral(object): 574470e8518SSlawomir Ptak def __init__(self, referral_info): 575470e8518SSlawomir Ptak """ 576470e8518SSlawomir Ptak All class attributes are set based on what information is received 577470e8518SSlawomir Ptak from get_nvmf_referrals RPC call. 578470e8518SSlawomir Ptak """ 579470e8518SSlawomir Ptak for i in referral_info.keys(): 580470e8518SSlawomir Ptak setattr(self, i, referral_info[i]) 581470e8518SSlawomir Ptak 582470e8518SSlawomir Ptak 5837610bc38SKonrad Sztyberclass ScsiObj(object): 5847610bc38SKonrad Sztyber def __init__(self, device_info): 5857610bc38SKonrad Sztyber """ 5867610bc38SKonrad Sztyber All class attributes are set based on what information is received 5877610bc38SKonrad Sztyber from iscsi related RPC calls. 5887610bc38SKonrad Sztyber # TODO: Document in docstring parameters which describe bdevs. 5897610bc38SKonrad Sztyber # TODO: Possible improvement: JSON schema might be used here in future 5907610bc38SKonrad Sztyber """ 5917610bc38SKonrad Sztyber for i in device_info.keys(): 5927610bc38SKonrad Sztyber setattr(self, i, device_info[i]) 593