xref: /spdk/scripts/sma.py (revision 1eca87c39c854777f96a08d78c0c7fa1b76aae67)
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