summaryrefslogtreecommitdiffstats
path: root/src/spdk/scripts/rpc/nvmf.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/spdk/scripts/rpc/nvmf.py')
-rw-r--r--src/spdk/scripts/rpc/nvmf.py483
1 files changed, 483 insertions, 0 deletions
diff --git a/src/spdk/scripts/rpc/nvmf.py b/src/spdk/scripts/rpc/nvmf.py
new file mode 100644
index 000000000..7b2bc3bb6
--- /dev/null
+++ b/src/spdk/scripts/rpc/nvmf.py
@@ -0,0 +1,483 @@
+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: (Deprecated) Ignored
+
+ Returns:
+ True or False
+ """
+ params = {}
+
+ if acceptor_poll_rate:
+ params['acceptor_poll_rate'] = acceptor_poll_rate
+ if conn_sched:
+ print("WARNING: conn_sched is deprecated and ignored.")
+ 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,
+ 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,
+ 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):
+ """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, deprecated, use max_io_qpairs_per_ctrlr)
+ max_io_qpairs_per_ctrlr: Max number of IO qpairs 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)
+ acceptor_backlog: Pending connections allowed at one time - RDMA specific (optional)
+ abort_timeout_sec: Abort execution timeout value, in seconds (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:
+ 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:
+ 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
+ if acceptor_backlog is not None:
+ params['acceptor_backlog'] = acceptor_backlog
+ if abort_timeout_sec:
+ params['abort_timeout_sec'] = abort_timeout_sec
+ 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)