Commit 64debe04 authored by jiaqizho's avatar jiaqizho Committed by Tomasz Zawadzki
Browse files

rpc: add a command parser



The changes in the nvmf_create_transport show
how this command parser work. And there have
two benefit for this changed.

1. Simplify the definition of rpc method. no need add
so many args anymore. Also it retains its original
functions, so we can also check the input args.

2. Make the rpc call more versatile, for example.
when user extend the subparsers(add new args
into subparsers), they can pass some private args
into the rpc method by command parser.

Signed-off-by: default avatarjiaqizho <jiaqi.zhou@intel.com>
Change-Id: Iaf916e3454f23715cf9216794bb80c65b2b4603f
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6652


Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
parent 980a1396
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -173,6 +173,11 @@ use `enable-zerocopy-send-server` or `enable-zerocopy-send-client` instead.
Parameter `disable-zerocopy-send` of RPC `sock_impl_set_options` is deprecated and will be removed in SPDK 21.07,
use `disable-zerocopy-send-server` or `disable-zerocopy-send-client` instead.

Added cmd_parser.py used to parse the args from argparse. There are
two benefit to use command parser:
- Simplify the definition of rpc method. It will reduce the rpc method code.
- Make the rpc call more versatile. User can add private args into rpc method.

### rpm

Added support for new RPM spec, rpmbuild/spdk.spec, which can be used for packaging the
+2 −29
Original line number Diff line number Diff line
@@ -1864,28 +1864,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
    p.set_defaults(func=nvmf_set_config)

    def nvmf_create_transport(args):
        rpc.nvmf.nvmf_create_transport(args.client,
                                       trtype=args.trtype,
                                       tgt_name=args.tgt_name,
                                       max_queue_depth=args.max_queue_depth,
                                       max_qpairs_per_ctrlr=args.max_qpairs_per_ctrlr,
                                       max_io_qpairs_per_ctrlr=args.max_io_qpairs_per_ctrlr,
                                       in_capsule_data_size=args.in_capsule_data_size,
                                       max_io_size=args.max_io_size,
                                       io_unit_size=args.io_unit_size,
                                       max_aq_depth=args.max_aq_depth,
                                       num_shared_buffers=args.num_shared_buffers,
                                       buf_cache_size=args.buf_cache_size,
                                       num_cqe=args.num_cqe,
                                       max_srq_depth=args.max_srq_depth,
                                       no_srq=args.no_srq,
                                       c2h_success=args.c2h_success,
                                       dif_insert_or_strip=args.dif_insert_or_strip,
                                       sock_priority=args.sock_priority,
                                       acceptor_backlog=args.acceptor_backlog,
                                       abort_timeout_sec=args.abort_timeout_sec,
                                       no_wr_batching=args.no_wr_batching,
                                       control_msg_num=args.control_msg_num)
        rpc.nvmf.nvmf_create_transport(**vars(args))

    p = subparsers.add_parser('nvmf_create_transport', help='Create NVMf transport')
    p.add_argument('-t', '--trtype', help='Transport type (ex. RDMA)', type=str, required=True)
@@ -1969,13 +1948,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
    p.set_defaults(func=nvmf_delete_subsystem)

    def nvmf_subsystem_add_listener(args):
        rpc.nvmf.nvmf_subsystem_add_listener(args.client,
                                             nqn=args.nqn,
                                             trtype=args.trtype,
                                             traddr=args.traddr,
                                             tgt_name=args.tgt_name,
                                             adrfam=args.adrfam,
                                             trsvcid=args.trsvcid)
        rpc.nvmf.nvmf_subsystem_add_listener(**vars(args))

    p = subparsers.add_parser('nvmf_subsystem_add_listener', help='Add a listener to an NVMe-oF subsystem')
    p.add_argument('nqn', help='NVMe-oF subsystem NQN')
+31 −0
Original line number Diff line number Diff line
args_global = ['server_addr', 'port', 'timeout', 'verbose', 'dry_run', 'conn_retries',
               'is_server', 'rpc_plugin', 'called_rpc_name', 'func', 'client']


def strip_globals(kwargs):
    for arg in args_global:
        kwargs.pop(arg, None)


def remove_null(kwargs):
    keys = []
    for key, value in kwargs.items():
        if value is None:
            keys.append(key)

    for key in keys:
        kwargs.pop(key, None)


def apply_defaults(kwargs, **defaults):
    for key, value in defaults.items():
        if key not in kwargs:
            kwargs[key] = value


def group_as(kwargs, name, values):
    group = {}
    for arg in values:
        if arg in kwargs and kwargs[arg] is not None:
            group[arg] = kwargs.pop(arg, None)
    kwargs[name] = group
+14 −78
Original line number Diff line number Diff line
from .helpers import deprecated_alias
from .cmd_parser import *


@deprecated_alias('set_nvmf_target_max_subsystems')
@@ -91,28 +92,7 @@ def nvmf_get_targets(client):
    return client.call("nvmf_get_targets")


def nvmf_create_transport(client,
                          trtype,
                          tgt_name=None,
                          max_queue_depth=None,
                          max_qpairs_per_ctrlr=None,
                          max_io_qpairs_per_ctrlr=None,
                          in_capsule_data_size=None,
                          max_io_size=None,
                          io_unit_size=None,
                          max_aq_depth=None,
                          num_shared_buffers=None,
                          buf_cache_size=None,
                          num_cqe=None,
                          max_srq_depth=None,
                          no_srq=False,
                          c2h_success=True,
                          dif_insert_or_strip=None,
                          sock_priority=None,
                          acceptor_backlog=None,
                          abort_timeout_sec=None,
                          no_wr_batching=None,
                          control_msg_num=None):
def nvmf_create_transport(client, **params):
    """NVMf Transport Create options.

    Args:
@@ -138,50 +118,14 @@ def nvmf_create_transport(client,
    Returns:
        True or False
    """
    params = {}

    params['trtype'] = trtype
    if tgt_name:
        params['tgt_name'] = tgt_name
    if max_queue_depth:
        params['max_queue_depth'] = max_queue_depth
    if max_qpairs_per_ctrlr:
    strip_globals(params)
    apply_defaults(params, no_srq=False, c2h_success=True)
    remove_null(params)

    if 'max_qpairs_per_ctrlr' in params:
        print("WARNING: max_qpairs_per_ctrlr is deprecated, please use max_io_qpairs_per_ctrlr.")
        params['max_qpairs_per_ctrlr'] = max_qpairs_per_ctrlr
    if max_io_qpairs_per_ctrlr:
        params['max_io_qpairs_per_ctrlr'] = max_io_qpairs_per_ctrlr
    if in_capsule_data_size is not None:
        params['in_capsule_data_size'] = in_capsule_data_size
    if max_io_size:
        params['max_io_size'] = max_io_size
    if io_unit_size:
        params['io_unit_size'] = io_unit_size
    if max_aq_depth:
        params['max_aq_depth'] = max_aq_depth
    if num_shared_buffers:
        params['num_shared_buffers'] = num_shared_buffers
    if buf_cache_size is not None:
        params['buf_cache_size'] = buf_cache_size
    if num_cqe:
        params['num_cqe'] = num_cqe
    if max_srq_depth:
        params['max_srq_depth'] = max_srq_depth
    if no_srq:
        params['no_srq'] = no_srq
    if c2h_success is not None:
        params['c2h_success'] = c2h_success
    if dif_insert_or_strip:
        params['dif_insert_or_strip'] = dif_insert_or_strip
    if sock_priority is not None:
        params['sock_priority'] = sock_priority
    if acceptor_backlog is not None:
        params['acceptor_backlog'] = acceptor_backlog
    if abort_timeout_sec:
        params['abort_timeout_sec'] = abort_timeout_sec
    if no_wr_batching is not None:
        params['no_wr_batching'] = no_wr_batching
    if control_msg_num is not None:
        params['control_msg_num'] = control_msg_num

    return client.call('nvmf_create_transport', params)


@@ -274,7 +218,8 @@ def nvmf_create_subsystem(client,
    return client.call('nvmf_create_subsystem', params)


def nvmf_subsystem_add_listener(client, nqn, trtype, traddr, trsvcid, adrfam, tgt_name=None):
def nvmf_subsystem_add_listener(client, **params):

    """Add a new listen address to an NVMe-oF subsystem.

    Args:
@@ -288,20 +233,11 @@ def nvmf_subsystem_add_listener(client, nqn, trtype, traddr, trsvcid, adrfam, tg
    Returns:
        True or False
    """
    listen_address = {'trtype': trtype,
                      'traddr': traddr}

    if trsvcid:
        listen_address['trsvcid'] = trsvcid

    if adrfam:
        listen_address['adrfam'] = adrfam

    params = {'nqn': nqn,
              'listen_address': listen_address}

    if tgt_name:
        params['tgt_name'] = tgt_name
    strip_globals(params)
    apply_defaults(params, tgt_name=None)
    group_as(params, 'listen_address', ['trtype', 'traddr', 'trsvcid', 'adrfam'])
    remove_null(params)

    return client.call('nvmf_subsystem_add_listener', params)