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