scripts/rpc.py: pass named args to nvmf.py

Modify the /scripts/rpc/nvmf.py methods so that the upper
management apps can call these methods more conveniently.
There is a example [0] about how the upper application calls
these modified methods of the SPDK(/scripts/rpc/nvmf.py).

[0]https://github.com/hellowaywewe/call_spdk

Change-Id: Idb54643f3416f049f36e9564dc1401eaef66363b
Signed-off-by: heluwei <simple_hlw@163.com>
Reviewed-on: https://review.gerrithub.io/414296
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
heluwei 2018-06-08 02:57:42 +08:00 committed by Daniel Verkamp
parent 6546fd10f8
commit aceeb8cda3
2 changed files with 288 additions and 96 deletions

View File

@ -821,7 +821,13 @@ if __name__ == "__main__":
# NVMe-oF
@call_cmd
def set_nvmf_target_options(args):
rpc.nvmf.set_nvmf_target_options(args.client, args)
rpc.nvmf.set_nvmf_target_options(args.client,
max_queue_depth=args.max_queue_depth,
max_qpairs_per_ctrlr=args.max_qpairs_per_session,
in_capsule_data_size=args.in_capsule_data_size,
max_io_size=args.max_io_size,
max_subsystems=args.max_subsystems,
io_unit_size=args.io_unit_size)
p = subparsers.add_parser('set_nvmf_target_options', help='Set NVMf target options')
p.add_argument('-q', '--max-queue-depth', help='Max number of outstanding I/O per queue', type=int)
@ -834,7 +840,8 @@ if __name__ == "__main__":
@call_cmd
def set_nvmf_target_config(args):
rpc.nvmf.set_nvmf_target_config(args.client, args)
rpc.nvmf.set_nvmf_target_config(args.client,
acceptor_poll_rate=args.acceptor_poll_rate)
p = subparsers.add_parser('set_nvmf_target_config', help='Set NVMf target config')
p.add_argument('-r', '--acceptor-poll-rate', help='How often the acceptor polls for incoming connections', type=int)
@ -842,7 +849,7 @@ if __name__ == "__main__":
@call_cmd
def get_nvmf_subsystems(args):
print_dict(rpc.nvmf.get_nvmf_subsystems(args.client, args))
print_dict(rpc.nvmf.get_nvmf_subsystems(args.client))
p = subparsers.add_parser('get_nvmf_subsystems',
help='Display nvmf subsystems')
@ -850,7 +857,45 @@ if __name__ == "__main__":
@call_cmd
def construct_nvmf_subsystem(args):
rpc.nvmf.construct_nvmf_subsystem(args.client, args)
listen_addresses = None
hosts = None
namespaces = None
if args.listen:
listen_addresses = [
dict(
u.split(
":",
1) for u in a.split(" ")) for a in args.listen.split(",")]
if args.hosts:
hosts = []
for u in args.hosts.strip().split(" "):
hosts.append(u)
if args.namespaces:
namespaces = []
for u in args.namespaces.strip().split(" "):
bdev_name = u
nsid = 0
if ':' in u:
(bdev_name, nsid) = u.split(":")
ns_params = {'bdev_name': bdev_name}
nsid = int(nsid)
if nsid != 0:
ns_params['nsid'] = nsid
namespaces.append(ns_params)
rpc.nvmf.construct_nvmf_subsystem(args.client,
nqn=args.nqn,
listen_addresses=listen_addresses,
hosts=hosts,
allow_any_host=args.allow_any_host,
serial_number=args.serial_number,
namespaces=namespaces,
max_namespaces=args.max_namespaces)
p = subparsers.add_parser('construct_nvmf_subsystem', help='Add a nvmf subsystem')
p.add_argument('nqn', help='Target nqn(ASCII)')
@ -874,7 +919,8 @@ if __name__ == "__main__":
@call_cmd
def delete_nvmf_subsystem(args):
rpc.nvmf.delete_nvmf_subsystem(args.client, args)
rpc.nvmf.delete_nvmf_subsystem(args.client,
nqn=args.subsystem_nqn)
p = subparsers.add_parser('delete_nvmf_subsystem',
help='Delete a nvmf subsystem')
@ -884,7 +930,12 @@ if __name__ == "__main__":
@call_cmd
def nvmf_subsystem_add_listener(args):
rpc.nvmf.nvmf_subsystem_add_listener(args.client, args)
rpc.nvmf.nvmf_subsystem_add_listener(args.client,
nqn=args.nqn,
trtype=args.trtype,
traddr=args.traddr,
adrfam=args.adrfam,
trsvcid=args.trsvcid)
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')
@ -896,7 +947,12 @@ if __name__ == "__main__":
@call_cmd
def nvmf_subsystem_remove_listener(args):
rpc.nvmf.nvmf_subsystem_remove_listener(args.client, args)
rpc.nvmf.nvmf_subsystem_remove_listener(args.client,
nqn=args.nqn,
trtype=args.trtype,
traddr=args.traddr,
adrfam=args.adrfam,
trsvcid=args.trsvcid)
p = subparsers.add_parser('nvmf_subsystem_remove_listener', help='Remove a listener from an NVMe-oF subsystem')
p.add_argument('nqn', help='NVMe-oF subsystem NQN')
@ -908,7 +964,13 @@ if __name__ == "__main__":
@call_cmd
def nvmf_subsystem_add_ns(args):
rpc.nvmf.nvmf_subsystem_add_ns(args.client, args)
rpc.nvmf.nvmf_subsystem_add_ns(args.client,
nqn=args.nqn,
bdev_name=args.bdev_name,
nsid=args.nsid,
nguid=args.nguid,
eui64=args.eui64,
uuid=args.uuid)
p = subparsers.add_parser('nvmf_subsystem_add_ns', help='Add a namespace to an NVMe-oF subsystem')
p.add_argument('nqn', help='NVMe-oF subsystem NQN')
@ -921,7 +983,9 @@ if __name__ == "__main__":
@call_cmd
def nvmf_subsystem_remove_ns(args):
rpc.nvmf.nvmf_subsystem_remove_ns(args.client, args)
rpc.nvmf.nvmf_subsystem_remove_ns(args.client,
nqn=args.nqn,
nsid=args.nsid)
p = subparsers.add_parser('nvmf_subsystem_remove_ns', help='Remove a namespace to an NVMe-oF subsystem')
p.add_argument('nqn', help='NVMe-oF subsystem NQN')
@ -930,7 +994,9 @@ if __name__ == "__main__":
@call_cmd
def nvmf_subsystem_add_host(args):
rpc.nvmf.nvmf_subsystem_add_host(args.client, args)
rpc.nvmf.nvmf_subsystem_add_host(args.client,
nqn=args.nqn,
host=args.host)
p = subparsers.add_parser('nvmf_subsystem_add_host', help='Add a host to an NVMe-oF subsystem')
p.add_argument('nqn', help='NVMe-oF subsystem NQN')
@ -939,7 +1005,9 @@ if __name__ == "__main__":
@call_cmd
def nvmf_subsystem_remove_host(args):
rpc.nvmf.nvmf_subsystem_remove_host(args.client, args)
rpc.nvmf.nvmf_subsystem_remove_host(args.client,
nqn=args.nqn,
host=args.host)
p = subparsers.add_parser('nvmf_subsystem_remove_host', help='Remove a host from an NVMe-oF subsystem')
p.add_argument('nqn', help='NVMe-oF subsystem NQN')
@ -948,7 +1016,9 @@ if __name__ == "__main__":
@call_cmd
def nvmf_subsystem_allow_any_host(args):
rpc.nvmf.nvmf_subsystem_allow_any_host(args.client, args)
rpc.nvmf.nvmf_subsystem_allow_any_host(args.client,
nqn=args.nqn,
disable=args.disable)
p = subparsers.add_parser('nvmf_subsystem_allow_any_host', help='Allow any host to connect to the subsystem')
p.add_argument('nqn', help='NVMe-oF subsystem NQN')

View File

@ -1,153 +1,275 @@
def set_nvmf_target_options(client, args):
def set_nvmf_target_options(client,
max_queue_depth=None,
max_qpairs_per_ctrlr=None,
in_capsule_data_size=None,
max_io_size=None,
max_subsystems=None,
io_unit_size=None):
"""Set NVMe-oF target options.
Args:
max_queue_depth: Max number of outstanding I/O per queue (optional)
max_qpairs_per_ctrlr: Max number of SQ and CQ per controller (optional)
in_capsule_data_size: Maximum in-capsule data size in bytes (optional)
max_io_size: Maximum I/O data size in bytes (optional)
max_subsystems: Maximum number of NVMe-oF subsystems (optional)
io_unit_size: I/O unit size in bytes (optional)
Returns:
True or False
"""
params = {}
if args.max_queue_depth:
params['max_queue_depth'] = args.max_queue_depth
if args.max_qpairs_per_session:
params['max_qpairs_per_session'] = args.max_qpairs_per_session
if args.in_capsule_data_size:
params['in_capsule_data_size'] = args.in_capsule_data_size
if args.max_io_size:
params['max_io_size'] = args.max_io_size
if args.max_subsystems:
params['max_subsystems'] = args.max_subsystems
if args.io_unit_size:
params['io_unit_size'] = args.io_unit_size
if max_queue_depth:
params['max_queue_depth'] = max_queue_depth
if max_qpairs_per_ctrlr:
params['max_qpairs_per_ctrlr'] = max_qpairs_per_ctrlr
if in_capsule_data_size:
params['in_capsule_data_size'] = in_capsule_data_size
if max_io_size:
params['max_io_size'] = max_io_size
if max_subsystems:
params['max_subsystems'] = max_subsystems
if io_unit_size:
params['io_unit_size'] = io_unit_size
return client.call('set_nvmf_target_options', params)
def set_nvmf_target_config(client, args):
def set_nvmf_target_config(client, acceptor_poll_rate=None):
"""Set NVMe-oF target subsystem configuration.
Args:
acceptor_poll_rate: Acceptor poll period in microseconds (optional)
Returns:
True or False
"""
params = {}
if args.acceptor_poll_rate:
params['acceptor_poll_rate'] = args.acceptor_poll_rate
if acceptor_poll_rate:
params['acceptor_poll_rate'] = acceptor_poll_rate
return client.call('set_nvmf_target_config', params)
def get_nvmf_subsystems(client, args):
def get_nvmf_subsystems(client):
"""Get list of NVMe-oF subsystems.
Returns:
List of NVMe-oF subsystem objects.
"""
return client.call('get_nvmf_subsystems')
def construct_nvmf_subsystem(client, args):
def construct_nvmf_subsystem(client,
nqn,
serial_number,
listen_addresses=None,
hosts=None,
allow_any_host=False,
namespaces=None,
max_namespaces=0):
"""Construct an NVMe over Fabrics target subsystem.
Args:
nqn: Subsystem NQN.
serial_number: Serial number of virtual controller.
listen_addresses: Array of listen_address objects (optional).
hosts: Array of strings containing allowed host NQNs (optional). Default: No hosts allowed.
allow_any_host: Allow any host (True) or enforce allowed host whitelist (False). Default: False.
namespaces: Array of namespace objects (optional). Default: No namespaces.
max_namespaces: Maximum number of namespaces that can be attached to the subsystem (optional). Default: 0 (Unlimited).
Returns:
True or False
"""
params = {
'nqn': args.nqn,
'serial_number': args.serial_number,
'nqn': nqn,
'serial_number': serial_number,
}
if args.max_namespaces:
params['max_namespaces'] = args.max_namespaces
if max_namespaces:
params['max_namespaces'] = max_namespaces
if args.listen:
params['listen_addresses'] = [dict(u.split(":", 1) for u in a.split(" "))
for a in args.listen.split(",")]
if listen_addresses:
params['listen_addresses'] = listen_addresses
if args.hosts:
hosts = []
for u in args.hosts.strip().split(" "):
hosts.append(u)
if hosts:
params['hosts'] = hosts
if args.allow_any_host:
if allow_any_host:
params['allow_any_host'] = True
if args.namespaces:
namespaces = []
for u in args.namespaces.strip().split(" "):
bdev_name = u
nsid = 0
if ':' in u:
(bdev_name, nsid) = u.split(":")
ns_params = {'bdev_name': bdev_name}
nsid = int(nsid)
if nsid != 0:
ns_params['nsid'] = nsid
namespaces.append(ns_params)
if namespaces:
params['namespaces'] = namespaces
return client.call('construct_nvmf_subsystem', params)
def nvmf_subsystem_add_listener(client, args):
listen_address = {'trtype': args.trtype,
'traddr': args.traddr,
'trsvcid': args.trsvcid}
def nvmf_subsystem_add_listener(client, nqn, trtype, traddr, trsvcid, adrfam):
"""Add a new listen address to an NVMe-oF subsystem.
if args.adrfam:
listen_address['adrfam'] = args.adrfam
Args:
nqn: Subsystem NQN.
trtype: Transport type ("RDMA").
traddr: Transport address.
trsvcid: Transport service ID.
adrfam: Address family ("IPv4", "IPv6", "IB", or "FC").
params = {'nqn': args.nqn,
Returns:
True or False
"""
listen_address = {'trtype': trtype,
'traddr': traddr,
'trsvcid': trsvcid}
if adrfam:
listen_address['adrfam'] = adrfam
params = {'nqn': nqn,
'listen_address': listen_address}
return client.call('nvmf_subsystem_add_listener', params)
def nvmf_subsystem_remove_listener(client, args):
listen_address = {'trtype': args.trtype,
'traddr': args.traddr,
'trsvcid': args.trsvcid}
def nvmf_subsystem_remove_listener(
client,
nqn,
trtype,
traddr,
trsvcid,
adrfam):
"""Remove existing listen address from an NVMe-oF subsystem.
if args.adrfam:
listen_address['adrfam'] = args.adrfam
Args:
nqn: Subsystem NQN.
trtype: Transport type ("RDMA").
traddr: Transport address.
trsvcid: Transport service ID.
adrfam: Address family ("IPv4", "IPv6", "IB", or "FC").
params = {'nqn': args.nqn,
Returns:
True or False
"""
listen_address = {'trtype': trtype,
'traddr': traddr,
'trsvcid': trsvcid}
if adrfam:
listen_address['adrfam'] = adrfam
params = {'nqn': nqn,
'listen_address': listen_address}
return client.call('nvmf_subsystem_remove_listener', params)
def nvmf_subsystem_add_ns(client, args):
ns = {'bdev_name': args.bdev_name}
def nvmf_subsystem_add_ns(client, nqn, bdev_name, nsid=None, nguid=None, eui64=None, uuid=None):
"""Add a namespace to a subsystem.
if args.nsid:
ns['nsid'] = args.nsid
Args:
nqn: Subsystem NQN.
bdev_name: Name of bdev to expose as a namespace.
nsid: Namespace ID (optional).
nguid: 16-byte namespace globally unique identifier in hexadecimal (optional).
eui64: 8-byte namespace EUI-64 in hexadecimal (e.g. "ABCDEF0123456789") (optional).
uuid: Namespace UUID (optional).
if args.nguid:
ns['nguid'] = args.nguid
Returns:
The namespace ID
"""
ns = {'bdev_name': bdev_name}
if args.eui64:
ns['eui64'] = args.eui64
if nsid:
ns['nsid'] = nsid
if args.uuid:
ns['uuid'] = args.uuid
if nguid:
ns['nguid'] = nguid
params = {'nqn': args.nqn,
if eui64:
ns['eui64'] = eui64
if uuid:
ns['uuid'] = uuid
params = {'nqn': nqn,
'namespace': ns}
return client.call('nvmf_subsystem_add_ns', params)
def nvmf_subsystem_remove_ns(client, args):
def nvmf_subsystem_remove_ns(client, nqn, nsid):
"""Remove a existing namespace from a subsystem.
params = {'nqn': args.nqn,
'nsid': args.nsid}
Args:
nqn: Subsystem NQN.
nsid: Namespace ID.
Returns:
True or False
"""
params = {'nqn': nqn,
'nsid': nsid}
return client.call('nvmf_subsystem_remove_ns', params)
def nvmf_subsystem_add_host(client, args):
params = {'nqn': args.nqn,
'host': args.host}
def nvmf_subsystem_add_host(client, nqn, host):
"""Add a host NQN to the whitelist of allowed hosts.
Args:
nqn: Subsystem NQN.
host: Host NQN to add to the list of allowed host NQNs
Returns:
True or False
"""
params = {'nqn': nqn,
'host': host}
return client.call('nvmf_subsystem_add_host', params)
def nvmf_subsystem_remove_host(client, args):
params = {'nqn': args.nqn,
'host': args.host}
def nvmf_subsystem_remove_host(client, nqn, host):
"""Remove a host NQN from the whitelist of allowed hosts.
Args:
nqn: Subsystem NQN.
host: Host NQN to remove to the list of allowed host NQNs
Returns:
True or False
"""
params = {'nqn': nqn,
'host': host}
return client.call('nvmf_subsystem_remove_host', params)
def nvmf_subsystem_allow_any_host(client, args):
params = {'nqn': args.nqn}
params['allow_any_host'] = False if args.disable else True
def nvmf_subsystem_allow_any_host(client, nqn, disable):
"""Configure a subsystem to allow any host to connect or to enforce the host NQN whitelist.
Args:
nqn: Subsystem NQN.
disable: Allow any host (true) or enforce allowed host whitelist (false).
Returns:
True or False
"""
params = {'nqn': nqn, 'allow_any_host': False if disable else True}
return client.call('nvmf_subsystem_allow_any_host', params)
def delete_nvmf_subsystem(client, args):
params = {'nqn': args.subsystem_nqn}
def delete_nvmf_subsystem(client, nqn):
"""Delete an existing NVMe-oF subsystem.
Args:
nqn: Subsystem NQN.
Returns:
True or False
"""
params = {'nqn': nqn}
return client.call('delete_nvmf_subsystem', params)