Spdk/scripts/rpc/iscsi.py
Shuhei Matsumoto 10d6218444 lib/iscsi: Create portal group as public or private portal group
In SPDK iSCSI target, portal group works almost as identifier of
portal.

To support iSCSI login redirection, we need to have two types of
portal groups, public and private portal groups.

We need portals of public portal groups to redirect to a portal in
a private portal groups at login via temporary login redirection
funciton, and we need to make SendTargets return only portals in
public portal groups.

To do these simply, we mark primary or secondary portal group expicitly
at its creation by this patch.

Signed-off-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Change-Id: Iccf87a4b9dd1f4a8fbb857a399b8f2dbc7c0b3ab
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3491
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
2020-08-11 08:27:43 +00:00

563 lines
16 KiB
Python

from .helpers import deprecated_alias
@deprecated_alias('set_iscsi_options')
def iscsi_set_options(
client,
auth_file=None,
node_base=None,
nop_timeout=None,
nop_in_interval=None,
disable_chap=None,
require_chap=None,
mutual_chap=None,
chap_group=None,
max_sessions=None,
max_queue_depth=None,
max_connections_per_session=None,
default_time2wait=None,
default_time2retain=None,
first_burst_length=None,
immediate_data=None,
error_recovery_level=None,
allow_duplicated_isid=None):
"""Set iSCSI target options.
Args:
auth_file: Path to CHAP shared secret file (optional)
node_base: Prefix of the name of iSCSI target node (optional)
nop_timeout: Timeout in seconds to nop-in request to the initiator (optional)
nop_in_interval: Time interval in secs between nop-in requests by the target (optional)
disable_chap: CHAP for discovery session should be disabled (optional)
require_chap: CHAP for discovery session should be required
mutual_chap: CHAP for discovery session should be mutual
chap_group: Authentication group ID for discovery session
max_sessions: Maximum number of sessions in the host
max_queue_depth: Maximum number of outstanding I/Os per queue
max_connections_per_session: Negotiated parameter, MaxConnections
default_time2wait: Negotiated parameter, DefaultTime2Wait
default_time2retain: Negotiated parameter, DefaultTime2Retain
first_burst_length: Negotiated parameter, FirstBurstLength
immediate_data: Negotiated parameter, ImmediateData
error_recovery_level: Negotiated parameter, ErrorRecoveryLevel
allow_duplicated_isid: Allow duplicated initiator session ID
Returns:
True or False
"""
params = {}
if auth_file:
params['auth_file'] = auth_file
if node_base:
params['node_base'] = node_base
if nop_timeout:
params['nop_timeout'] = nop_timeout
if nop_in_interval:
params['nop_in_interval'] = nop_in_interval
if disable_chap:
params['disable_chap'] = disable_chap
if require_chap:
params['require_chap'] = require_chap
if mutual_chap:
params['mutual_chap'] = mutual_chap
if chap_group:
params['chap_group'] = chap_group
if max_sessions:
params['max_sessions'] = max_sessions
if max_queue_depth:
params['max_queue_depth'] = max_queue_depth
if max_connections_per_session:
params['max_connections_per_session'] = max_connections_per_session
if default_time2wait:
params['default_time2wait'] = default_time2wait
if default_time2retain:
params['default_time2retain'] = default_time2retain
if first_burst_length:
params['first_burst_length'] = first_burst_length
if immediate_data:
params['immediate_data'] = immediate_data
if error_recovery_level:
params['error_recovery_level'] = error_recovery_level
if allow_duplicated_isid:
params['allow_duplicated_isid'] = allow_duplicated_isid
return client.call('iscsi_set_options', params)
@deprecated_alias('set_iscsi_discovery_auth')
def iscsi_set_discovery_auth(
client,
disable_chap=None,
require_chap=None,
mutual_chap=None,
chap_group=None):
"""Set CHAP authentication for discovery service.
Args:
disable_chap: CHAP for discovery session should be disabled (optional)
require_chap: CHAP for discovery session should be required (optional)
mutual_chap: CHAP for discovery session should be mutual (optional)
chap_group: Authentication group ID for discovery session (optional)
Returns:
True or False
"""
params = {}
if disable_chap:
params['disable_chap'] = disable_chap
if require_chap:
params['require_chap'] = require_chap
if mutual_chap:
params['mutual_chap'] = mutual_chap
if chap_group:
params['chap_group'] = chap_group
return client.call('iscsi_set_discovery_auth', params)
@deprecated_alias('get_iscsi_auth_groups')
def iscsi_get_auth_groups(client):
"""Display current authentication group configuration.
Returns:
List of current authentication group configuration.
"""
return client.call('iscsi_get_auth_groups')
@deprecated_alias('get_portal_groups')
def iscsi_get_portal_groups(client):
"""Display current portal group configuration.
Returns:
List of current portal group configuration.
"""
return client.call('iscsi_get_portal_groups')
@deprecated_alias('get_initiator_groups')
def iscsi_get_initiator_groups(client):
"""Display current initiator group configuration.
Returns:
List of current initiator group configuration.
"""
return client.call('iscsi_get_initiator_groups')
@deprecated_alias('get_target_nodes')
def iscsi_get_target_nodes(client):
"""Display target nodes.
Returns:
List of ISCSI target node objects.
"""
return client.call('iscsi_get_target_nodes')
@deprecated_alias('construct_target_node')
def iscsi_create_target_node(
client,
luns,
pg_ig_maps,
name,
alias_name,
queue_depth,
chap_group=None,
disable_chap=None,
require_chap=None,
mutual_chap=None,
header_digest=None,
data_digest=None):
"""Add a target node.
Args:
luns: List of bdev_name_id_pairs, e.g. [{"bdev_name": "Malloc1", "lun_id": 1}]
pg_ig_maps: List of pg_ig_mappings, e.g. [{"pg_tag": pg, "ig_tag": ig}]
name: Target node name (ASCII)
alias_name: Target node alias name (ASCII)
queue_depth: Desired target queue depth
chap_group: Authentication group ID for this target node
disable_chap: CHAP authentication should be disabled for this target node
require_chap: CHAP authentication should be required for this target node
mutual_chap: CHAP authentication should be mutual/bidirectional
header_digest: Header Digest should be required for this target node
data_digest: Data Digest should be required for this target node
Returns:
True or False
"""
params = {
'name': name,
'alias_name': alias_name,
'pg_ig_maps': pg_ig_maps,
'luns': luns,
'queue_depth': queue_depth,
}
if chap_group:
params['chap_group'] = chap_group
if disable_chap:
params['disable_chap'] = disable_chap
if require_chap:
params['require_chap'] = require_chap
if mutual_chap:
params['mutual_chap'] = mutual_chap
if header_digest:
params['header_digest'] = header_digest
if data_digest:
params['data_digest'] = data_digest
return client.call('iscsi_create_target_node', params)
@deprecated_alias('target_node_add_lun')
def iscsi_target_node_add_lun(client, name, bdev_name, lun_id=None):
"""Add LUN to the target node.
Args:
name: Target node name (ASCII)
bdev_name: bdev name
lun_id: LUN ID (integer >= 0)
Returns:
True or False
"""
params = {
'name': name,
'bdev_name': bdev_name,
}
if lun_id:
params['lun_id'] = lun_id
return client.call('iscsi_target_node_add_lun', params)
@deprecated_alias('set_iscsi_target_node_auth')
def iscsi_target_node_set_auth(
client,
name,
chap_group=None,
disable_chap=None,
require_chap=None,
mutual_chap=None):
"""Set CHAP authentication for the target node.
Args:
name: Target node name (ASCII)
chap_group: Authentication group ID for this target node
disable_chap: CHAP authentication should be disabled for this target node
require_chap: CHAP authentication should be required for this target node
mutual_chap: CHAP authentication should be mutual/bidirectional
Returns:
True or False
"""
params = {
'name': name,
}
if chap_group:
params['chap_group'] = chap_group
if disable_chap:
params['disable_chap'] = disable_chap
if require_chap:
params['require_chap'] = require_chap
if mutual_chap:
params['mutual_chap'] = mutual_chap
return client.call('iscsi_target_node_set_auth', params)
@deprecated_alias('add_iscsi_auth_group')
def iscsi_create_auth_group(client, tag, secrets=None):
"""Create authentication group for CHAP authentication.
Args:
tag: Authentication group tag (unique, integer > 0).
secrets: Array of secrets objects (optional).
Returns:
True or False
"""
params = {'tag': tag}
if secrets:
params['secrets'] = secrets
return client.call('iscsi_create_auth_group', params)
@deprecated_alias('delete_iscsi_auth_group')
def iscsi_delete_auth_group(client, tag):
"""Delete an authentication group.
Args:
tag: Authentication group tag (unique, integer > 0)
Returns:
True or False
"""
params = {'tag': tag}
return client.call('iscsi_delete_auth_group', params)
@deprecated_alias('add_secret_to_iscsi_auth_group')
def iscsi_auth_group_add_secret(client, tag, user, secret, muser=None, msecret=None):
"""Add a secret to an authentication group.
Args:
tag: Authentication group tag (unique, integer > 0)
user: User name for one-way CHAP authentication
secret: Secret for one-way CHAP authentication
muser: User name for mutual CHAP authentication (optional)
msecret: Secret for mutual CHAP authentication (optional)
Returns:
True or False
"""
params = {'tag': tag, 'user': user, 'secret': secret}
if muser:
params['muser'] = muser
if msecret:
params['msecret'] = msecret
return client.call('iscsi_auth_group_add_secret', params)
@deprecated_alias('delete_secret_from_iscsi_auth_group')
def iscsi_auth_group_remove_secret(client, tag, user):
"""Remove a secret from an authentication group.
Args:
tag: Authentication group tag (unique, integer > 0)
user: User name for one-way CHAP authentication
Returns:
True or False
"""
params = {'tag': tag, 'user': user}
return client.call('iscsi_auth_group_remove_secret', params)
@deprecated_alias('delete_pg_ig_maps')
def iscsi_target_node_remove_pg_ig_maps(client, pg_ig_maps, name):
"""Delete PG-IG maps from the target node.
Args:
pg_ig_maps: List of pg_ig_mappings, e.g. [{"pg_tag": pg, "ig_tag": ig}]
name: Target node alias name (ASCII)
Returns:
True or False
"""
params = {
'name': name,
'pg_ig_maps': pg_ig_maps,
}
return client.call('iscsi_target_node_remove_pg_ig_maps', params)
@deprecated_alias('add_pg_ig_maps')
def iscsi_target_node_add_pg_ig_maps(client, pg_ig_maps, name):
"""Add PG-IG maps to the target node.
Args:
pg_ig_maps: List of pg_ig_mappings, e.g. [{"pg_tag": pg, "ig_tag": ig}]
name: Target node alias name (ASCII)
Returns:
True or False
"""
params = {
'name': name,
'pg_ig_maps': pg_ig_maps,
}
return client.call('iscsi_target_node_add_pg_ig_maps', params)
@deprecated_alias('add_portal_group')
def iscsi_create_portal_group(client, portals, tag, private):
"""Add a portal group.
Args:
portals: List of portals, e.g. [{'host': ip, 'port': port}]
tag: Initiator group tag (unique, integer > 0)
private: Public (false) or private (true) portal group for login redirection.
Returns:
True or False
"""
params = {'tag': tag, 'portals': portals}
if private:
params['private'] = private
return client.call('iscsi_create_portal_group', params)
@deprecated_alias('add_initiator_group')
def iscsi_create_initiator_group(client, tag, initiators, netmasks):
"""Add an initiator group.
Args:
tag: Initiator group tag (unique, integer > 0)
initiators: List of initiator hostnames or IP addresses, e.g. ["127.0.0.1","192.168.200.100"]
netmasks: List of initiator netmasks, e.g. ["255.255.0.0","255.248.0.0"]
Returns:
True or False
"""
params = {'tag': tag, 'initiators': initiators, 'netmasks': netmasks}
return client.call('iscsi_create_initiator_group', params)
@deprecated_alias('add_initiators_to_initiator_group')
def iscsi_initiator_group_add_initiators(
client,
tag,
initiators=None,
netmasks=None):
"""Add initiators to an existing initiator group.
Args:
tag: Initiator group tag (unique, integer > 0)
initiators: List of initiator hostnames or IP addresses, e.g. ["127.0.0.1","192.168.200.100"]
netmasks: List of initiator netmasks, e.g. ["255.255.0.0","255.248.0.0"]
Returns:
True or False
"""
params = {'tag': tag}
if initiators:
params['initiators'] = initiators
if netmasks:
params['netmasks'] = netmasks
return client.call('iscsi_initiator_group_add_initiators', params)
@deprecated_alias('delete_initiators_from_initiator_group')
def iscsi_initiator_group_remove_initiators(
client, tag, initiators=None, netmasks=None):
"""Delete initiators from an existing initiator group.
Args:
tag: Initiator group tag (unique, integer > 0)
initiators: List of initiator hostnames or IP addresses, e.g. ["127.0.0.1","192.168.200.100"]
netmasks: List of initiator netmasks, e.g. ["255.255.0.0","255.248.0.0"]
Returns:
True or False
"""
params = {'tag': tag}
if initiators:
params['initiators'] = initiators
if netmasks:
params['netmasks'] = netmasks
return client.call('iscsi_initiator_group_remove_initiators', params)
@deprecated_alias('delete_target_node')
def iscsi_delete_target_node(client, target_node_name):
"""Delete a target node.
Args:
target_node_name: Target node name to be deleted. Example: iqn.2016-06.io.spdk:disk1.
Returns:
True or False
"""
params = {'name': target_node_name}
return client.call('iscsi_delete_target_node', params)
@deprecated_alias('delete_portal_group')
def iscsi_delete_portal_group(client, tag):
"""Delete a portal group.
Args:
tag: Portal group tag (unique, integer > 0)
Returns:
True or False
"""
params = {'tag': tag}
return client.call('iscsi_delete_portal_group', params)
@deprecated_alias('delete_initiator_group')
def iscsi_delete_initiator_group(client, tag):
"""Delete an initiator group.
Args:
tag: Initiator group tag (unique, integer > 0)
Returns:
True or False
"""
params = {'tag': tag}
return client.call('iscsi_delete_initiator_group', params)
def iscsi_portal_group_set_auth(
client,
tag,
chap_group=None,
disable_chap=None,
require_chap=None,
mutual_chap=None):
"""Set CHAP authentication for discovery sessions specific for the portal group.
Args:
tag: Portal group tag (unique, integer > 0)
chap_group: Authentication group ID for this portal group
disable_chap: CHAP authentication should be disabled for this portal group
require_chap: CHAP authentication should be required for this portal group
mutual_chap: CHAP authentication should be mutual/bidirectional
Returns:
True or False
"""
params = {
'tag': tag,
}
if chap_group:
params['chap_group'] = chap_group
if disable_chap:
params['disable_chap'] = disable_chap
if require_chap:
params['require_chap'] = require_chap
if mutual_chap:
params['mutual_chap'] = mutual_chap
return client.call('iscsi_portal_group_set_auth', params)
@deprecated_alias('get_iscsi_connections')
def iscsi_get_connections(client):
"""Display iSCSI connections.
Returns:
List of iSCSI connection.
"""
return client.call('iscsi_get_connections')
@deprecated_alias('get_iscsi_global_params')
def iscsi_get_options(client):
"""Display iSCSI global parameters.
Returns:
List of iSCSI global parameter.
"""
return client.call('iscsi_get_options')
@deprecated_alias('get_iscsi_devices')
def scsi_get_devices(client):
"""Display SCSI devices.
Returns:
List of SCSI device.
"""
return client.call('scsi_get_devices')