From add4a7ce267e933d845aa0eaf9077bcf311f4695 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Tue, 22 Feb 2022 15:41:24 +0100 Subject: [PATCH] sma: register devices based on config file This allows a user to specify the types of devices to support. Those not specified in the config, won't get initialized and will not service user's requests. Additionally, each device manager can now receive its own configuration in its init() method. The device configuration is structured as a list of objects with two properties: "name" and "params". The former identifies a device to enable, while the latter contains a set of options (if any) specific to that device manager. For instance: ``` devices: - name: 'nvmf-tcp' params: max_queue_depth: 256 io_unit_size: 8192 - name: 'nvmf-vfiouser' ``` Signed-off-by: Konrad Sztyber Change-Id: I967016502ad93c243b3a7af58992bde14c44953c Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11713 Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Tomasz Zawadzki --- scripts/sma.py | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/scripts/sma.py b/scripts/sma.py index 303181f8c..cfaa7a302 100755 --- a/scripts/sma.py +++ b/scripts/sma.py @@ -50,26 +50,40 @@ def get_build_client(sock): return build_client -def register_device(agent, device): - device.init(None) - agent.register_device(device) +def register_devices(agent, devices, config): + for device_config in config.get('devices') or []: + name = device_config.get('name') + device_manager = next(filter(lambda s: s.name == name, devices), None) + if device_manager is None: + logging.error(f'Couldn\'t find device: {name}') + sys.exit(1) + logging.info(f'Registering device: {name}') + device_manager.init(device_config.get('params')) + agent.register_device(device_manager) -def load_plugins(agent, client, plugins): +def load_plugins(plugins, client): + devices = [] for plugin in plugins: module = importlib.import_module(plugin) for device in getattr(module, 'devices', []): logging.debug(f'Loading external device: {plugin}.{device.__name__}') - register_device(agent, device(client)) + devices.append(device(client)) + return devices if __name__ == '__main__': logging.basicConfig(level=os.environ.get('SMA_LOGLEVEL', 'WARNING').upper()) config = parse_argv() + client = get_build_client(config['socket']) + agent = sma.StorageManagementAgent(config['address'], config['port']) - register_device(agent, sma.NvmfTcpDeviceManager(get_build_client(config['socket']))) - load_plugins(agent, get_build_client(config['socket']), config.get('plugins') or []) - load_plugins(agent, get_build_client(config['socket']), - filter(None, os.environ.get('SMA_PLUGINS', '').split(':'))) + + devices = [sma.NvmfTcpDeviceManager(client)] + devices += load_plugins(config.get('plugins') or [], client) + devices += load_plugins(filter(None, os.environ.get('SMA_PLUGINS', '').split(':')), + client) + register_devices(agent, devices, config) + agent.run()