2022-01-05 09:32:09 +00:00
|
|
|
#!/usr/bin/env python3
|
2022-11-02 15:19:59 +00:00
|
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
# Copyright (C) 2022 Intel Corporation
|
|
|
|
# All rights reserved.
|
|
|
|
#
|
2022-01-05 09:32:09 +00:00
|
|
|
|
2022-01-05 15:54:14 +00:00
|
|
|
from argparse import ArgumentParser
|
2022-01-05 09:32:09 +00:00
|
|
|
import grpc
|
|
|
|
import google.protobuf.json_format as json_format
|
2022-02-18 08:15:36 +00:00
|
|
|
import importlib
|
2022-01-05 09:32:09 +00:00
|
|
|
import json
|
2022-02-18 08:15:36 +00:00
|
|
|
import logging
|
2022-01-05 09:32:09 +00:00
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
sys.path.append(os.path.dirname(__file__) + '/../python')
|
|
|
|
|
|
|
|
import spdk.sma.proto.sma_pb2 as sma_pb2 # noqa
|
|
|
|
import spdk.sma.proto.sma_pb2_grpc as sma_pb2_grpc # noqa
|
|
|
|
import spdk.sma.proto.nvmf_tcp_pb2 as nvmf_tcp_pb2 # noqa
|
|
|
|
import spdk.sma.proto.nvmf_tcp_pb2_grpc as nvmf_tcp_pb2_grpc # noqa
|
|
|
|
|
|
|
|
|
|
|
|
class Client:
|
|
|
|
def __init__(self, addr, port):
|
|
|
|
self._service = sma_pb2.DESCRIPTOR.services_by_name['StorageManagementAgent']
|
|
|
|
self.addr = addr
|
|
|
|
self.port = port
|
|
|
|
|
|
|
|
def _get_message_type(self, descriptor):
|
|
|
|
return getattr(sma_pb2, descriptor.name)
|
|
|
|
|
|
|
|
def _get_method_types(self, method_name):
|
|
|
|
method = self._service.methods_by_name.get(method_name)
|
|
|
|
return (self._get_message_type(method.input_type),
|
|
|
|
self._get_message_type(method.output_type))
|
|
|
|
|
|
|
|
def call(self, method, params):
|
|
|
|
with grpc.insecure_channel(f'{self.addr}:{self.port}') as channel:
|
|
|
|
stub = sma_pb2_grpc.StorageManagementAgentStub(channel)
|
|
|
|
func = getattr(stub, method)
|
|
|
|
input, output = self._get_method_types(method)
|
|
|
|
response = func(request=json_format.ParseDict(params, input()))
|
|
|
|
return json_format.MessageToDict(response,
|
|
|
|
preserving_proto_field_name=True)
|
|
|
|
|
|
|
|
|
2022-02-18 08:15:36 +00:00
|
|
|
def load_plugins(plugins):
|
|
|
|
for plugin in plugins:
|
|
|
|
logging.debug(f'Loading external plugin: {plugin}')
|
|
|
|
module = importlib.import_module(plugin)
|
|
|
|
|
|
|
|
|
2022-01-05 15:54:14 +00:00
|
|
|
def parse_argv():
|
|
|
|
parser = ArgumentParser(description='Storage Management Agent client')
|
|
|
|
parser.add_argument('--address', '-a', default='localhost',
|
|
|
|
help='IP address of SMA instance to connect to')
|
|
|
|
parser.add_argument('--port', '-p', default=8080, type=int,
|
|
|
|
help='Port number of SMA instance to connect to')
|
|
|
|
return parser.parse_args()
|
|
|
|
|
|
|
|
|
2022-01-05 09:32:09 +00:00
|
|
|
def main(args):
|
2022-01-05 15:54:14 +00:00
|
|
|
argv = parse_argv()
|
2022-02-18 08:15:36 +00:00
|
|
|
logging.basicConfig(level=os.environ.get('SMA_LOGLEVEL', 'WARNING').upper())
|
|
|
|
load_plugins(filter(None, os.environ.get('SMA_PLUGINS', '').split(':')))
|
2022-01-05 15:54:14 +00:00
|
|
|
client = Client(argv.address, argv.port)
|
2022-01-05 09:32:09 +00:00
|
|
|
request = json.loads(sys.stdin.read())
|
|
|
|
result = client.call(request['method'], request.get('params', {}))
|
|
|
|
print(json.dumps(result, indent=2))
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main(sys.argv[1:])
|