1#!/usr/bin/env python3 2 3from argparse import ArgumentParser 4import importlib 5import logging 6import os 7import sys 8 9sys.path.append(os.path.dirname(__file__) + '/../python') 10 11import spdk.sma as sma # noqa 12from spdk.rpc.client import JSONRPCClient # noqa 13 14 15def parse_argv(): 16 parser = ArgumentParser(description='Storage Management Agent command line interface') 17 parser.add_argument('--address', '-a', default='localhost', 18 help='IP address to listen on') 19 parser.add_argument('--socket', '-s', default='/var/tmp/spdk.sock', 20 help='SPDK RPC socket') 21 parser.add_argument('--port', '-p', default=8080, type=int, 22 help='IP port to listen on') 23 return parser.parse_args() 24 25 26def get_build_client(sock): 27 def build_client(): 28 return JSONRPCClient(sock) 29 30 return build_client 31 32 33def register_device(agent, device): 34 device.init(None) 35 agent.register_device(device) 36 37 38def load_plugins(agent, client, plugins): 39 for plugin in plugins: 40 module = importlib.import_module(plugin) 41 for device in getattr(module, 'devices', []): 42 logging.debug(f'Loading external device: {plugin}.{device.__name__}') 43 register_device(agent, device(client)) 44 45 46if __name__ == '__main__': 47 argv = parse_argv() 48 logging.basicConfig(level=os.environ.get('SMA_LOGLEVEL', 'WARNING').upper()) 49 agent = sma.StorageManagementAgent(argv.address, argv.port) 50 register_device(agent, sma.NvmfTcpDeviceManager(get_build_client(argv.socket))) 51 load_plugins(agent, get_build_client(argv.socket), 52 filter(None, os.environ.get('SMA_PLUGINS', '').split(':'))) 53 agent.run() 54