* New command to query target ports:
lsmcli list --type TARGET_PORTS [ --tgt <TGT_ID> ]
* Manpage updated.
Signed-off-by: Gris Ge <***@redhat.com>
---
doc/man/lsmcli.1.in | 6 +++++-
tools/lsmcli/cmdline.py | 23 +++++++++++++++++++++--
tools/lsmcli/data_display.py | 44 +++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 69 insertions(+), 4 deletions(-)
diff --git a/doc/man/lsmcli.1.in b/doc/man/lsmcli.1.in
index b22555c..a93788e 100644
--- a/doc/man/lsmcli.1.in
+++ b/doc/man/lsmcli.1.in
@@ -157,7 +157,7 @@ Required. Valid values are:
\fBEXPORTS\fR, \fBDISKS\fR,
.br
\fBNFS_CLIENT_AUTH\fR, \fBACCESS_GROUPS\fR,
-\fBSYSTEMS\fR, \fBPLUGINS.
+\fBSYSTEMS\fR, \fBTARGET_PORTS\fR, \fBPLUGINS\fR.
.TP
\fB--fs\fR \fI<FS_ID>\fR
Required for \fB--type\fR=\fBSNAPSHOTS\fR. List the snapshots of certain
@@ -198,6 +198,10 @@ of resources: \fBFS\fR.
\fB--nfs-export\fR \fI<NFS_EXPORT_ID>\fR
Search resources from NFS export with NFS_EXPORT_ID. Only supported by these
types of resources: \fBEXPORTS\fR.
+.TP
+\fB--tgt\fR \fI<TGT_ID>\fR
+Search resources from target port with target port ID. Only supported by these
+types of resources: \fBTARGET_PORTS\fR.
.SS job-status
Retrieve information about a job.
diff --git a/tools/lsmcli/cmdline.py b/tools/lsmcli/cmdline.py
index 97aed06..a637f04 100644
--- a/tools/lsmcli/cmdline.py
+++ b/tools/lsmcli/cmdline.py
@@ -29,7 +29,7 @@ from argparse import RawTextHelpFormatter
from lsm import (Client, Pool, VERSION, LsmError, Capabilities, Disk,
Volume, JobStatus, ErrorNumber, BlockRange,
uri_parse, Proxy, size_human_2_size_bytes,
- AccessGroup, FileSystem, NfsExport)
+ AccessGroup, FileSystem, NfsExport, TargetPort)
from lsm.lsmcli.data_display import (
DisplayData, PlugData, out,
@@ -101,7 +101,7 @@ def _get_item(l, the_id, friendly_name='item', raise_error=True):
list_choices = ['VOLUMES', 'POOLS', 'FS', 'SNAPSHOTS',
'EXPORTS', "NFS_CLIENT_AUTH", 'ACCESS_GROUPS',
- 'SYSTEMS', 'DISKS', 'PLUGINS']
+ 'SYSTEMS', 'DISKS', 'PLUGINS', 'TARGET_PORTS',]
init_types = ('WWPN', 'WWNN', 'ISCSI', 'HOSTNAME', 'SAS')
init_id_help = "Access Group Initiator type: " + \
@@ -173,6 +173,8 @@ size_opt = dict(name='--size', metavar='<SIZE>', help=size_help)
init_type_opt = dict(name="--init-type", help=init_id_help,
metavar='<INIT_TYPE>', choices=init_types,
type=str.upper)
+tgt_id_opt = dict(name="--tgt", help="Search by target port ID",
+ metavar='<TGT_ID>')
cmds = (
dict(
@@ -195,6 +197,7 @@ cmds = (
dict(ag_id_filter_opt),
dict(fs_id_opt),
dict(nfs_export_id_filter_opt),
+ dict(tgt_id_opt),
],
),
@@ -884,6 +887,9 @@ class CmdLine:
if args.nfs_export:
search_key = 'nfs_export_id'
search_value = args.nfs_export
+ if args.tgt:
+ search_key = 'tgt_port_id'
+ search_value = args.tgt
if args.type == 'VOLUMES':
if search_key == 'volume_id':
@@ -960,6 +966,15 @@ class CmdLine:
"disk listing" % search_key)
self.display_data(
self.c.disks(search_key, search_value))
+ elif args.type == 'TARGET_PORTS':
+ if search_key == 'tgt_port_id':
+ search_key = 'id'
+ if search_key and \
+ search_key not in TargetPort.SUPPORTED_SEARCH_KEYS:
+ raise ArgError("Search key '%s' is not supported by "
+ "target port listing" % search_key)
+ self.display_data(
+ self.c.target_ports(search_key, search_value))
elif args.type == 'PLUGINS':
self.display_available_plugins()
else:
@@ -1191,6 +1206,10 @@ class CmdLine:
cap.supported(Capabilities.ACCESS_GROUPS_QUICK_SEARCH))
self._cp("NFS_EXPORTS_QUICK_SEARCH",
cap.supported(Capabilities.NFS_EXPORTS_QUICK_SEARCH))
+ self._cp("TARGET_PORTS",
+ cap.supported(Capabilities.TARGET_PORTS))
+ self._cp("TARGET_PORTS_QUICK_SEARCH",
+ cap.supported(Capabilities.TARGET_PORTS_QUICK_SEARCH))
def plugin_info(self, args):
desc, version = self.c.plugin_info()
diff --git a/tools/lsmcli/data_display.py b/tools/lsmcli/data_display.py
index 9c040a5..23ca148 100644
--- a/tools/lsmcli/data_display.py
+++ b/tools/lsmcli/data_display.py
@@ -21,7 +21,7 @@ from datetime import datetime
from lsm import (size_bytes_2_size_human, LsmError, ErrorNumber,
System, Pool, Disk, Volume, AccessGroup,
- FileSystem, FsSnapshot, NfsExport)
+ FileSystem, FsSnapshot, NfsExport, TargetPort)
BIT_MAP_STRING_SPLITTER = ','
@@ -307,6 +307,19 @@ def ag_init_type_str_to_lsm(init_type_str):
return _str_to_enum(init_type_str, _AG_INIT_TYPE_CONV)
+_TGT_PORT_TYPE_CONV = {
+ TargetPort.PORT_TYPE_UNKNOWN: 'Unknown',
+ TargetPort.PORT_TYPE_OTHER: 'Other',
+ TargetPort.PORT_TYPE_FC: 'FC',
+ TargetPort.PORT_TYPE_FCOE: 'FCoE',
+ TargetPort.PORT_TYPE_ISCSI: 'iSCSI',
+}
+
+
+def tgt_port_type_to_str(port_type):
+ return _enum_type_to_str(port_type, _TGT_PORT_TYPE_CONV)
+
+
class PlugData(object):
def __init__(self, description, plugin_version):
self.desc = description
@@ -563,6 +576,35 @@ class DisplayData(object):
'value_conv_human': NFS_EXPORT_VALUE_CONV_HUMAN,
}
+ # lsm.TargetPort
+ TGT_PORT_MAN_HEADER = OrderedDict()
+ TGT_PORT_MAN_HEADER['id'] = 'ID'
+ TGT_PORT_MAN_HEADER['port_type'] = 'Type'
+ TGT_PORT_MAN_HEADER['physical_name'] = 'Physical Name'
+ TGT_PORT_MAN_HEADER['service_address'] = 'Address'
+ TGT_PORT_MAN_HEADER['network_address'] = 'Network Address'
+ TGT_PORT_MAN_HEADER['physical_address'] = 'Physical Address'
+ TGT_PORT_MAN_HEADER['system_id'] = 'System ID'
+
+ TGT_PORT_COLUMN_KEYS = []
+ for key_name in TGT_PORT_MAN_HEADER.keys():
+ # Skip these keys for column display
+ if key_name not in ['physical_address', 'network_address']:
+ TGT_PORT_COLUMN_KEYS.extend([key_name])
+
+ TGT_PORT_VALUE_CONV_ENUM = {
+ 'port_type': tgt_port_type_to_str,
+ }
+
+ TGT_PORT_VALUE_CONV_HUMAN = []
+
+ VALUE_CONVERT[TargetPort] = {
+ 'mandatory_headers': TGT_PORT_MAN_HEADER,
+ 'column_keys': TGT_PORT_COLUMN_KEYS,
+ 'value_conv_enum': TGT_PORT_VALUE_CONV_ENUM,
+ 'value_conv_human': TGT_PORT_VALUE_CONV_HUMAN,
+ }
+
@staticmethod
def _get_man_pro_value(obj, key, value_conv_enum, value_conv_human,
flag_human, flag_enum):
--
1.8.3.1