xref: /spdk/scripts/sma-client.py (revision 17538bdc67021ec097536c683124234db1aac374)
1048fb36aSKonrad Sztyber#!/usr/bin/env python3
2*17538bdcSpaul luse#  SPDX-License-Identifier: BSD-3-Clause
3*17538bdcSpaul luse#  Copyright (C) 2022 Intel Corporation
4*17538bdcSpaul luse#  All rights reserved.
5*17538bdcSpaul luse#
6048fb36aSKonrad Sztyber
7f0f65d24Ssberbzfrom argparse import ArgumentParser
8048fb36aSKonrad Sztyberimport grpc
9048fb36aSKonrad Sztyberimport google.protobuf.json_format as json_format
10d045916fSSebastian Brzezinkaimport importlib
11048fb36aSKonrad Sztyberimport json
12d045916fSSebastian Brzezinkaimport logging
13048fb36aSKonrad Sztyberimport os
14048fb36aSKonrad Sztyberimport sys
15048fb36aSKonrad Sztyber
16048fb36aSKonrad Sztybersys.path.append(os.path.dirname(__file__) + '/../python')
17048fb36aSKonrad Sztyber
18048fb36aSKonrad Sztyberimport spdk.sma.proto.sma_pb2 as sma_pb2                        # noqa
19048fb36aSKonrad Sztyberimport spdk.sma.proto.sma_pb2_grpc as sma_pb2_grpc              # noqa
20048fb36aSKonrad Sztyberimport spdk.sma.proto.nvmf_tcp_pb2 as nvmf_tcp_pb2              # noqa
21048fb36aSKonrad Sztyberimport spdk.sma.proto.nvmf_tcp_pb2_grpc as nvmf_tcp_pb2_grpc    # noqa
22048fb36aSKonrad Sztyber
23048fb36aSKonrad Sztyber
24048fb36aSKonrad Sztyberclass Client:
25048fb36aSKonrad Sztyber    def __init__(self, addr, port):
26048fb36aSKonrad Sztyber        self._service = sma_pb2.DESCRIPTOR.services_by_name['StorageManagementAgent']
27048fb36aSKonrad Sztyber        self.addr = addr
28048fb36aSKonrad Sztyber        self.port = port
29048fb36aSKonrad Sztyber
30048fb36aSKonrad Sztyber    def _get_message_type(self, descriptor):
31048fb36aSKonrad Sztyber        return getattr(sma_pb2, descriptor.name)
32048fb36aSKonrad Sztyber
33048fb36aSKonrad Sztyber    def _get_method_types(self, method_name):
34048fb36aSKonrad Sztyber        method = self._service.methods_by_name.get(method_name)
35048fb36aSKonrad Sztyber        return (self._get_message_type(method.input_type),
36048fb36aSKonrad Sztyber                self._get_message_type(method.output_type))
37048fb36aSKonrad Sztyber
38048fb36aSKonrad Sztyber    def call(self, method, params):
39048fb36aSKonrad Sztyber        with grpc.insecure_channel(f'{self.addr}:{self.port}') as channel:
40048fb36aSKonrad Sztyber            stub = sma_pb2_grpc.StorageManagementAgentStub(channel)
41048fb36aSKonrad Sztyber            func = getattr(stub, method)
42048fb36aSKonrad Sztyber            input, output = self._get_method_types(method)
43048fb36aSKonrad Sztyber            response = func(request=json_format.ParseDict(params, input()))
44048fb36aSKonrad Sztyber            return json_format.MessageToDict(response,
45048fb36aSKonrad Sztyber                                             preserving_proto_field_name=True)
46048fb36aSKonrad Sztyber
47048fb36aSKonrad Sztyber
48d045916fSSebastian Brzezinkadef load_plugins(plugins):
49d045916fSSebastian Brzezinka    for plugin in plugins:
50d045916fSSebastian Brzezinka        logging.debug(f'Loading external plugin: {plugin}')
51d045916fSSebastian Brzezinka        module = importlib.import_module(plugin)
52d045916fSSebastian Brzezinka
53d045916fSSebastian Brzezinka
54f0f65d24Ssberbzdef parse_argv():
55f0f65d24Ssberbz    parser = ArgumentParser(description='Storage Management Agent client')
56f0f65d24Ssberbz    parser.add_argument('--address', '-a', default='localhost',
57f0f65d24Ssberbz                        help='IP address of SMA instance to connect to')
58f0f65d24Ssberbz    parser.add_argument('--port', '-p', default=8080, type=int,
59f0f65d24Ssberbz                        help='Port number of SMA instance to connect to')
60f0f65d24Ssberbz    return parser.parse_args()
61f0f65d24Ssberbz
62f0f65d24Ssberbz
63048fb36aSKonrad Sztyberdef main(args):
64f0f65d24Ssberbz    argv = parse_argv()
65d045916fSSebastian Brzezinka    logging.basicConfig(level=os.environ.get('SMA_LOGLEVEL', 'WARNING').upper())
66d045916fSSebastian Brzezinka    load_plugins(filter(None, os.environ.get('SMA_PLUGINS', '').split(':')))
67f0f65d24Ssberbz    client = Client(argv.address, argv.port)
68048fb36aSKonrad Sztyber    request = json.loads(sys.stdin.read())
69048fb36aSKonrad Sztyber    result = client.call(request['method'], request.get('params', {}))
70048fb36aSKonrad Sztyber    print(json.dumps(result, indent=2))
71048fb36aSKonrad Sztyber
72048fb36aSKonrad Sztyber
73048fb36aSKonrad Sztyberif __name__ == '__main__':
74048fb36aSKonrad Sztyber    main(sys.argv[1:])
75