numam-spdk/scripts/rpc/nvmf.py
Michael Haeuptle c9874b91a7 lib/nvmf: custom admin handler config
This commit disables the custom identify handler by default.
The user has to explictly enable this handler via the set_nvmf_config
RPC or conf file.

Change-Id: I767816ba7639ebe78683993408ce6db02c7620fe
Signed-off-by: Michael Haeuptle <michael.haeuptle@hpe.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/479603
Community-CI: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
2020-01-20 09:56:35 +00:00

471 lines
13 KiB
Python

from .helpers import deprecated_alias
@deprecated_alias('set_nvmf_target_max_subsystems')
def nvmf_set_max_subsystems(client,
max_subsystems=None):
"""Set NVMe-oF target options.
Args:
max_subsystems: Maximum number of NVMe-oF subsystems (e.g. 1024)
Returns:
True or False
"""
params = {}
params['max_subsystems'] = max_subsystems
return client.call('nvmf_set_max_subsystems', params)
@deprecated_alias('set_nvmf_target_config')
def nvmf_set_config(client,
acceptor_poll_rate=None,
conn_sched=None,
passthru_identify_ctrlr=None):
"""Set NVMe-oF target subsystem configuration.
Args:
acceptor_poll_rate: Acceptor poll period in microseconds (optional)
conn_sched: Scheduling of incoming connections (optional)
Returns:
True or False
"""
params = {}
if acceptor_poll_rate:
params['acceptor_poll_rate'] = acceptor_poll_rate
if conn_sched:
params['conn_sched'] = conn_sched
if passthru_identify_ctrlr:
admin_cmd_passthru = {}
admin_cmd_passthru['identify_ctrlr'] = passthru_identify_ctrlr
params['admin_cmd_passthru'] = admin_cmd_passthru
return client.call('nvmf_set_config', params)
def nvmf_create_target(client,
name,
max_subsystems=0):
"""Create a new NVMe-oF Target.
Args:
name: Must be unique within the application
max_subsystems: Maximum number of NVMe-oF subsystems (e.g. 1024). default: 0 (Uses SPDK_NVMF_DEFAULT_MAX_SUBSYSTEMS).
Returns:
The name of the new target.
"""
params = {}
params['name'] = name
params['max_subsystems'] = max_subsystems
return client.call("nvmf_create_target", params)
def nvmf_delete_target(client,
name):
"""Destroy an NVMe-oF Target.
Args:
name: The name of the target you wish to destroy
Returns:
True on success or False
"""
params = {}
params['name'] = name
return client.call("nvmf_delete_target", params)
def nvmf_get_targets(client):
"""Get a list of all the NVMe-oF targets in this application
Returns:
An array of target names.
"""
return client.call("nvmf_get_targets")
def nvmf_create_transport(client,
trtype,
tgt_name=None,
max_queue_depth=None,
max_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,
max_srq_depth=None,
no_srq=False,
c2h_success=True,
dif_insert_or_strip=None,
sock_priority=None):
"""NVMf Transport Create options.
Args:
trtype: Transport type (ex. RDMA)
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)
io_unit_size: I/O unit size in bytes (optional)
max_aq_depth: Max size admin quque per controller (optional)
num_shared_buffers: The number of pooled data buffers available to the transport (optional)
buf_cache_size: The number of shared buffers to reserve for each poll group (optional)
max_srq_depth: Max number of outstanding I/O per shared receive queue - RDMA specific (optional)
no_srq: Boolean flag to disable SRQ even for devices that support it - RDMA specific (optional)
c2h_success: Boolean flag to disable the C2H success optimization - TCP specific (optional)
dif_insert_or_strip: Boolean flag to enable DIF insert/strip for I/O - TCP specific (optional)
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:
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 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:
params['buf_cache_size'] = buf_cache_size
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:
params['sock_priority'] = sock_priority
return client.call('nvmf_create_transport', params)
@deprecated_alias('get_nvmf_transports')
def nvmf_get_transports(client, tgt_name=None):
"""Get list of NVMe-oF transports.
Args:
tgt_name: name of the parent NVMe-oF target (optional).
Returns:
List of NVMe-oF transport objects.
"""
params = {}
if tgt_name:
params = {
'tgt_name': tgt_name,
}
return client.call('nvmf_get_transports', params)
@deprecated_alias('get_nvmf_subsystems')
def nvmf_get_subsystems(client, tgt_name=None):
"""Get list of NVMe-oF subsystems.
Args:
tgt_name: name of the parent NVMe-oF target (optional).
Returns:
List of NVMe-oF subsystem objects.
"""
params = {}
if tgt_name:
params = {
'tgt_name': tgt_name,
}
return client.call('nvmf_get_subsystems', params)
@deprecated_alias('nvmf_subsystem_create')
def nvmf_create_subsystem(client,
nqn,
serial_number,
tgt_name=None,
model_number='SPDK bdev Controller',
allow_any_host=False,
max_namespaces=0):
"""Construct an NVMe over Fabrics target subsystem.
Args:
nqn: Subsystem NQN.
tgt_name: name of the parent NVMe-oF target (optional).
serial_number: Serial number of virtual controller.
model_number: Model number of virtual controller.
allow_any_host: Allow any host (True) or enforce allowed host whitelist (False). Default: False.
max_namespaces: Maximum number of namespaces that can be attached to the subsystem (optional). Default: 0 (Unlimited).
Returns:
True or False
"""
params = {
'nqn': nqn,
}
if serial_number:
params['serial_number'] = serial_number
if model_number:
params['model_number'] = model_number
if allow_any_host:
params['allow_any_host'] = True
if max_namespaces:
params['max_namespaces'] = max_namespaces
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_create_subsystem', params)
def nvmf_subsystem_add_listener(client, nqn, trtype, traddr, trsvcid, adrfam, tgt_name=None):
"""Add a new listen address to an NVMe-oF subsystem.
Args:
nqn: Subsystem NQN.
trtype: Transport type ("RDMA").
traddr: Transport address.
trsvcid: Transport service ID.
tgt_name: name of the parent NVMe-oF target (optional).
adrfam: Address family ("IPv4", "IPv6", "IB", or "FC").
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}
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_subsystem_add_listener', params)
def nvmf_subsystem_remove_listener(
client,
nqn,
trtype,
traddr,
trsvcid,
adrfam,
tgt_name=None):
"""Remove existing listen address from an NVMe-oF subsystem.
Args:
nqn: Subsystem NQN.
trtype: Transport type ("RDMA").
traddr: Transport address.
trsvcid: Transport service ID.
tgt_name: name of the parent NVMe-oF target (optional).
adrfam: Address family ("IPv4", "IPv6", "IB", or "FC").
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}
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_subsystem_remove_listener', params)
def nvmf_subsystem_add_ns(client, nqn, bdev_name, tgt_name=None, ptpl_file=None, nsid=None, nguid=None, eui64=None, uuid=None):
"""Add a namespace to a subsystem.
Args:
nqn: Subsystem NQN.
bdev_name: Name of bdev to expose as a namespace.
tgt_name: name of the parent NVMe-oF target (optional).
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).
Returns:
The namespace ID
"""
ns = {'bdev_name': bdev_name}
if ptpl_file:
ns['ptpl_file'] = ptpl_file
if nsid:
ns['nsid'] = nsid
if nguid:
ns['nguid'] = nguid
if eui64:
ns['eui64'] = eui64
if uuid:
ns['uuid'] = uuid
params = {'nqn': nqn,
'namespace': ns}
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_subsystem_add_ns', params)
def nvmf_subsystem_remove_ns(client, nqn, nsid, tgt_name=None):
"""Remove a existing namespace from a subsystem.
Args:
nqn: Subsystem NQN.
nsid: Namespace ID.
tgt_name: name of the parent NVMe-oF target (optional).
Returns:
True or False
"""
params = {'nqn': nqn,
'nsid': nsid}
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_subsystem_remove_ns', params)
def nvmf_subsystem_add_host(client, nqn, host, tgt_name=None):
"""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
tgt_name: name of the parent NVMe-oF target (optional).
Returns:
True or False
"""
params = {'nqn': nqn,
'host': host}
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_subsystem_add_host', params)
def nvmf_subsystem_remove_host(client, nqn, host, tgt_name=None):
"""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
tgt_name: name of the parent NVMe-oF target (optional).
Returns:
True or False
"""
params = {'nqn': nqn,
'host': host}
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_subsystem_remove_host', params)
def nvmf_subsystem_allow_any_host(client, nqn, disable, tgt_name=None):
"""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).
tgt_name: name of the parent NVMe-oF target (optional).
Returns:
True or False
"""
params = {'nqn': nqn, 'allow_any_host': False if disable else True}
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_subsystem_allow_any_host', params)
@deprecated_alias('delete_nvmf_subsystem')
def nvmf_delete_subsystem(client, nqn, tgt_name=None):
"""Delete an existing NVMe-oF subsystem.
Args:
nqn: Subsystem NQN.
tgt_name: name of the parent NVMe-oF target (optional).
Returns:
True or False
"""
params = {'nqn': nqn}
if tgt_name:
params['tgt_name'] = tgt_name
return client.call('nvmf_delete_subsystem', params)
def nvmf_get_stats(client, tgt_name=None):
"""Query NVMf statistics.
Args:
tgt_name: name of the parent NVMe-oF target (optional).
Returns:
Current NVMf statistics.
"""
params = {}
if tgt_name:
params = {
'tgt_name': tgt_name,
}
return client.call('nvmf_get_stats', params)