rpc: Add possibility to load module with additional RPC commands

This patch adds '--plugin <module_name>' parameter
to rpc.py script which is used to provide module
name with additional RPC commands that should be
included in rpc.py script. User must export path
to rpc module with PYTHONPATH before calling rpc.py
with this new parameter.

Signed-off-by: Maciej Szwed <maciej.szwed@intel.com>
Change-Id: I971429a33cf4ea943d2b7f3abd5a6cb82398d2a4

Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2263
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Maciej Szwed 2020-05-08 10:05:17 +02:00 committed by Tomasz Zawadzki
parent 8cc72fe459
commit b0bac20ad6

View File

@ -5,6 +5,7 @@ from rpc.helpers import deprecated_aliases
import logging
import argparse
import importlib
import rpc
import sys
import shlex
@ -45,6 +46,7 @@ if __name__ == "__main__":
pipes and can be used as a faster way to send RPC commands. If enabled, rpc.py \
must be executed without any other parameters.")
parser.set_defaults(is_server=False)
parser.add_argument('--plugin', dest='rpc_plugin', help='Module name of plugin with additional RPC commands')
subparsers = parser.add_subparsers(help='RPC methods', dest='called_rpc_name', metavar='')
def framework_start_init(args):
@ -2401,6 +2403,21 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
print(ex.message)
exit(1)
# Create temporary parser, pull out the plugin parameter, load the module, and then run the real argument parser
plugin_parser = argparse.ArgumentParser(add_help=False)
plugin_parser.add_argument('--plugin', dest='rpc_plugin', help='Module name of plugin with additional RPC commands')
rpc_module = plugin_parser.parse_known_args()[0].rpc_plugin
if rpc_module is not None:
try:
rpc_plugin = importlib.import_module(rpc_module)
try:
rpc_plugin.spdk_rpc_plugin_initialize(subparsers)
except AttributeError:
print("Module %s does not contain 'spdk_rpc_plugin_initialize' function" % rpc_module)
except ModuleNotFoundError:
print("Module %s not found" % rpc_module)
args = parser.parse_args()
if sys.stdin.isatty() and not hasattr(args, 'func'):