Discussion:
[Libstoragemgmt-devel] [PATCH 0/3] Forcing Volume.vpd83 property as 32 lower hex digitals.
Gris Ge
2014-09-01 08:28:02 UTC
Permalink
* Unifying the format of Volume.vpd83 to 32 hex lower digitals.

Gris Ge (3):
Python Libray: Forcing Volume.vpd83 to be lower 32 hex digitals
Plugins: Change VPD83 to lower 32 hex digitals
lsmcli: Hide vpd83 in column display

plugin/nstor/nstor.py | 5 +-
plugin/sim/simarray.py | 4 +-
plugin/smispy/smis.py | 5 +-
python_binding/lsm/_data.py | 6 +
tools/lsmcli/data_display.py | 263 ++++++++++++++++++++-----------------------
5 files changed, 139 insertions(+), 144 deletions(-)
--
2.1.0
Gris Ge
2014-09-01 08:28:03 UTC
Permalink
* Raise error(INVALID_ARGUMENT) if got incorrect format of vpd83, should be
lower 32 hex digitals.

Signed-off-by: Gris Ge <***@redhat.com>
---
python_binding/lsm/_data.py | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/python_binding/lsm/_data.py b/python_binding/lsm/_data.py
index 3d902f3..5dbf0e1 100644
--- a/python_binding/lsm/_data.py
+++ b/python_binding/lsm/_data.py
@@ -255,10 +255,16 @@ class Volume(IData):
ADMIN_STATE_DISABLED = 0
ADMIN_STATE_ENABLED = 1

+ _regex_vpd83_str = re.compile(r"""^[0-9a-f]{32}$""")
+
def __init__(self, _id, _name, _vpd83, _block_size, _num_of_blocks,
_admin_state, _system_id, _pool_id, _plugin_data=None):
self._id = _id # Identifier
self._name = _name # Human recognisable name
+ if _vpd83 and not Volume._regex_vpd83_str.match(_vpd83):
+ raise LsmError(ErrorNumber.INVALID_ARGUMENT,
+ "Incorrect format of VPD 0x83 string: '%s'" %
+ _vpd83)
self._vpd83 = _vpd83 # SCSI page 83 unique ID
self._block_size = _block_size # Block size
self._num_of_blocks = _num_of_blocks # Number of blocks
--
2.1.0
Tony Asleson
2014-09-02 20:02:19 UTC
Permalink
Post by Gris Ge
* Raise error(INVALID_ARGUMENT) if got incorrect format of vpd83, should be
lower 32 hex digitals.
^^^^^^^^
digits
Post by Gris Ge
---
python_binding/lsm/_data.py | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/python_binding/lsm/_data.py b/python_binding/lsm/_data.py
index 3d902f3..5dbf0e1 100644
--- a/python_binding/lsm/_data.py
+++ b/python_binding/lsm/_data.py
ADMIN_STATE_DISABLED = 0
ADMIN_STATE_ENABLED = 1
+ _regex_vpd83_str = re.compile(r"""^[0-9a-f]{32}$""")
I will echo Andy's comment for a previous patch.

"You shouldn't need triple quotes, or even the r, since you're not using
regexp escape values."
Post by Gris Ge
+
def __init__(self, _id, _name, _vpd83, _block_size, _num_of_blocks,
self._id = _id # Identifier
self._name = _name # Human recognisable name
+ raise LsmError(ErrorNumber.INVALID_ARGUMENT,
+ "Incorrect format of VPD 0x83 string: '%s'" %
+ _vpd83)
Would it be useful to specify what the expected format is in addition to
returning what they passed in?

"Expected format for VPD 0x83 is 32 lower case hexadecimal characters,
you provided %s" % _vpd83
Post by Gris Ge
self._vpd83 = _vpd83 # SCSI page 83 unique ID
self._block_size = _block_size # Block size
self._num_of_blocks = _num_of_blocks # Number of blocks
Regards,
Tony
Gris Ge
2014-09-01 08:28:04 UTC
Permalink
* Updated these plugins for Volume.vpd83 property:
SMI-S
Nstor
sim

* These plugins already set correct vpd83:
simc
ontap

Signed-off-by: Gris Ge <***@redhat.com>
---
plugin/nstor/nstor.py | 5 +++--
plugin/sim/simarray.py | 4 ++--
plugin/smispy/smis.py | 5 ++++-
3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/plugin/nstor/nstor.py b/plugin/nstor/nstor.py
index 98b73be..fb81c9d 100644
--- a/plugin/nstor/nstor.py
+++ b/plugin/nstor/nstor.py
@@ -466,8 +466,9 @@ class NexentaStor(INfs, IStorageAreaNetwork):
admin_state = Volume.ADMIN_STATE_ENABLED

vol_list.append(
- Volume(lu, lu, lu_props['guid'], block_size, num_of_blocks,
- admin_state, self._system.id,
+ Volume(lu, lu, lu_props['guid'].lower(),
+ block_size, num_of_blocks,
+ admin_state, self.system.id,
NexentaStor._get_pool_id(lu)))

return search_property(vol_list, search_key, search_value)
diff --git a/plugin/sim/simarray.py b/plugin/sim/simarray.py
index 0d38e73..d27714d 100644
--- a/plugin/sim/simarray.py
+++ b/plugin/sim/simarray.py
@@ -543,7 +543,7 @@ class SimData(object):
}
"""
SIM_DATA_BLK_SIZE = 512
- SIM_DATA_VERSION = "2.8"
+ SIM_DATA_VERSION = "2.9"
SIM_DATA_SYS_ID = 'sim-01'
SIM_DATA_INIT_NAME = 'NULL'
SIM_DATA_TMO = 30000 # ms
@@ -786,7 +786,7 @@ class SimData(object):
"""
vpd = []
for i in range(0, l):
- vpd.append(str('%02X' % (random.randint(0, 255))))
+ vpd.append(str('%02x' % (random.randint(0, 255))))
return "".join(vpd)

def _size_of_raid(self, member_type, member_ids, raid_type,
diff --git a/plugin/smispy/smis.py b/plugin/smispy/smis.py
index 6f43c14..95654cd 100644
--- a/plugin/smispy/smis.py
+++ b/plugin/smispy/smis.py
@@ -23,6 +23,7 @@ import traceback
import copy
import os
import datetime
+import re

import pywbem
from pywbem import CIMError
@@ -1268,7 +1269,9 @@ class Smis(IStorageAreaNetwork):
if vpd_83 is None:
vpd_83 = Smis._vpd83_in_cv_ibm_xiv(cv)

- if vpd_83 is None:
+ if vpd_83 and re.match(r"""^[a-fA-F0-9]{32}$""", vpd_83):
+ vpd_83 = vpd_83.lower()
+ else:
vpd_83 = ''

#This is a fairly expensive operation, so it's in our best interest
--
2.1.0
Tony Asleson
2014-09-02 20:05:24 UTC
Permalink
Post by Gris Ge
--- a/plugin/smispy/smis.py
+++ b/plugin/smispy/smis.py
@@ -23,6 +23,7 @@ import traceback
import copy
import os
import datetime
+import re
import pywbem
from pywbem import CIMError
vpd_83 = Smis._vpd83_in_cv_ibm_xiv(cv)
+ vpd_83 = vpd_83.lower()
vpd_83 = ''
Just thinking that by doing this we are setting ourselves up for an
INVALID_EXCEPTION when the plug-in instantiates instances of Volume with
the newly added vpd check.

Looks like we should add a check to handle this case too.

Regards,
Tony
Gris Ge
2014-09-01 08:28:05 UTC
Permalink
* Hide vpd83 in colume display of 'list --type volumes' command.
It's normally used by script, so we display it in script mode.

* Clean up data_display.py:
1. No optional properties anymore, hence no need for XXX_MAN_HEADER,
change to XXX_MAN_HEADER
2. Replace XXX_COLUMN_KEYS with XXX_COLUMN_SKIP_KEYS for better
maintenance.

Signed-off-by: Gris Ge <***@redhat.com>
---
tools/lsmcli/data_display.py | 263 ++++++++++++++++++++-----------------------
1 file changed, 124 insertions(+), 139 deletions(-)

diff --git a/tools/lsmcli/data_display.py b/tools/lsmcli/data_display.py
index 080f6fa..124ba71 100644
--- a/tools/lsmcli/data_display.py
+++ b/tools/lsmcli/data_display.py
@@ -262,18 +262,15 @@ class DisplayData(object):
VALUE_CONVERT = {}

# lsm.System
- SYSTEM_MAN_HEADER = OrderedDict()
- SYSTEM_MAN_HEADER['id'] = 'ID'
- SYSTEM_MAN_HEADER['name'] = 'Name'
- SYSTEM_MAN_HEADER['status'] = 'Status'
- SYSTEM_MAN_HEADER['status_info'] = 'Status Info'
-
- SYSTEM_COLUMN_KEYS = SYSTEM_MAN_HEADER.keys()
- # SYSTEM_COLUMN_KEYS should be subset of SYSTEM_MAN_HEADER.keys()
- # XXX_COLUMN_KEYS contain a list of mandatory properties which will be
- # displayed in column way. It was used to limit the output of properties
- # in sure the column display way does not exceeded the column width 78.
- # All mandatory_headers will be displayed in script way.
+ SYSTEM_HEADER = OrderedDict()
+ SYSTEM_HEADER['id'] = 'ID'
+ SYSTEM_HEADER['name'] = 'Name'
+ SYSTEM_HEADER['status'] = 'Status'
+ SYSTEM_HEADER['status_info'] = 'Status Info'
+
+ SYSTEM_COLUMN_SKIP_KEYS = []
+ # XXX_COLUMN_SKIP_KEYS contain a list of property should be skipped when
+ # displaying in column way.

SYSTEM_VALUE_CONV_ENUM = {
'status': system_status_to_str,
@@ -282,41 +279,41 @@ class DisplayData(object):
SYSTEM_VALUE_CONV_HUMAN = []

VALUE_CONVERT[System] = {
- 'mandatory_headers': SYSTEM_MAN_HEADER,
- 'column_keys': SYSTEM_COLUMN_KEYS,
+ 'headers': SYSTEM_HEADER,
+ 'column_skip_keys': SYSTEM_COLUMN_SKIP_KEYS,
'value_conv_enum': SYSTEM_VALUE_CONV_ENUM,
'value_conv_human': SYSTEM_VALUE_CONV_HUMAN,
}

- PLUG_DATA_MAN_HEADER = OrderedDict()
- PLUG_DATA_MAN_HEADER['desc'] = 'Description'
- PLUG_DATA_MAN_HEADER['version'] = 'Version'
+ PLUG_DATA_HEADER = OrderedDict()
+ PLUG_DATA_HEADER['desc'] = 'Description'
+ PLUG_DATA_HEADER['version'] = 'Version'

- PLUG_DATA_COLUMN_KEYS = PLUG_DATA_MAN_HEADER.keys()
+ PLUG_DATA_COLUMN_SKIP_KEYS = []

PLUG_DATA_VALUE_CONV_ENUM = {}
PLUG_DATA_VALUE_CONV_HUMAN = []

VALUE_CONVERT[PlugData] = {
- 'mandatory_headers': PLUG_DATA_MAN_HEADER,
- 'column_keys': PLUG_DATA_COLUMN_KEYS,
+ 'headers': PLUG_DATA_HEADER,
+ 'column_skip_keys': PLUG_DATA_COLUMN_SKIP_KEYS,
'value_conv_enum': PLUG_DATA_VALUE_CONV_ENUM,
'value_conv_human': PLUG_DATA_VALUE_CONV_HUMAN,
}

# lsm.Pool
- POOL_MAN_HEADER = OrderedDict()
- POOL_MAN_HEADER['id'] = 'ID'
- POOL_MAN_HEADER['name'] = 'Name'
- POOL_MAN_HEADER['element_type'] = 'Element type'
- POOL_MAN_HEADER['unsupported_actions'] = 'Does not support'
- POOL_MAN_HEADER['total_space'] = 'Total Space'
- POOL_MAN_HEADER['free_space'] = 'Free Space'
- POOL_MAN_HEADER['status'] = 'Status'
- POOL_MAN_HEADER['status_info'] = 'Status Info'
- POOL_MAN_HEADER['system_id'] = 'System ID'
-
- POOL_COLUMN_KEYS = POOL_MAN_HEADER.keys()
+ POOL_HEADER = OrderedDict()
+ POOL_HEADER['id'] = 'ID'
+ POOL_HEADER['name'] = 'Name'
+ POOL_HEADER['element_type'] = 'Element type'
+ POOL_HEADER['unsupported_actions'] = 'Does not support'
+ POOL_HEADER['total_space'] = 'Total Space'
+ POOL_HEADER['free_space'] = 'Free Space'
+ POOL_HEADER['status'] = 'Status'
+ POOL_HEADER['status_info'] = 'Status Info'
+ POOL_HEADER['system_id'] = 'System ID'
+
+ POOL_COLUMN_SKIP_KEYS = []

POOL_VALUE_CONV_ENUM = {
'status': pool_status_to_str,
@@ -327,29 +324,26 @@ class DisplayData(object):
POOL_VALUE_CONV_HUMAN = ['total_space', 'free_space']

VALUE_CONVERT[Pool] = {
- 'mandatory_headers': POOL_MAN_HEADER,
- 'column_keys': POOL_COLUMN_KEYS,
+ 'headers': POOL_HEADER,
+ 'column_skip_keys': POOL_COLUMN_SKIP_KEYS,
'value_conv_enum': POOL_VALUE_CONV_ENUM,
'value_conv_human': POOL_VALUE_CONV_HUMAN,
}

# lsm.Volume
- VOL_MAN_HEADER = OrderedDict()
- VOL_MAN_HEADER['id'] = 'ID'
- VOL_MAN_HEADER['name'] = 'Name'
- VOL_MAN_HEADER['vpd83'] = 'SCSI VPD 0x83'
- VOL_MAN_HEADER['block_size'] = 'Block Size'
- VOL_MAN_HEADER['num_of_blocks'] = '#blocks'
- VOL_MAN_HEADER['size_bytes'] = 'Size'
- VOL_MAN_HEADER['admin_state'] = 'Disabled'
- VOL_MAN_HEADER['pool_id'] = 'Pool ID'
- VOL_MAN_HEADER['system_id'] = 'System ID'
-
- VOL_COLUMN_KEYS = []
- for key_name in VOL_MAN_HEADER.keys():
- # Skip these keys for column display
- if key_name not in ['block_size', 'num_of_blocks', 'system_id']:
- VOL_COLUMN_KEYS.extend([key_name])
+ VOL_HEADER = OrderedDict()
+ VOL_HEADER['id'] = 'ID'
+ VOL_HEADER['name'] = 'Name'
+ VOL_HEADER['vpd83'] = 'SCSI VPD 0x83'
+ VOL_HEADER['block_size'] = 'Block Size'
+ VOL_HEADER['num_of_blocks'] = '#blocks'
+ VOL_HEADER['size_bytes'] = 'Size'
+ VOL_HEADER['admin_state'] = 'Disabled'
+ VOL_HEADER['pool_id'] = 'Pool ID'
+ VOL_HEADER['system_id'] = 'System ID'
+
+ VOL_COLUMN_SKIP_KEYS = ['block_size', 'vpd83', 'num_of_blocks',
+ 'system_id']

VOL_VALUE_CONV_ENUM = {
'admin_state': vol_admin_state_to_str
@@ -358,28 +352,24 @@ class DisplayData(object):
VOL_VALUE_CONV_HUMAN = ['size_bytes', 'block_size']

VALUE_CONVERT[Volume] = {
- 'mandatory_headers': VOL_MAN_HEADER,
- 'column_keys': VOL_COLUMN_KEYS,
+ 'headers': VOL_HEADER,
+ 'column_skip_keys': VOL_COLUMN_SKIP_KEYS,
'value_conv_enum': VOL_VALUE_CONV_ENUM,
'value_conv_human': VOL_VALUE_CONV_HUMAN,
}

# lsm.Disk
- DISK_MAN_HEADER = OrderedDict()
- DISK_MAN_HEADER['id'] = 'ID'
- DISK_MAN_HEADER['name'] = 'Name'
- DISK_MAN_HEADER['disk_type'] = 'Type'
- DISK_MAN_HEADER['block_size'] = 'Block Size'
- DISK_MAN_HEADER['num_of_blocks'] = '#blocks'
- DISK_MAN_HEADER['size_bytes'] = 'Size'
- DISK_MAN_HEADER['status'] = 'Status'
- DISK_MAN_HEADER['system_id'] = 'System ID'
-
- DISK_COLUMN_KEYS = []
- for key_name in DISK_MAN_HEADER.keys():
- # Skip these keys for column display
- if key_name not in ['block_size', 'num_of_blocks']:
- DISK_COLUMN_KEYS.extend([key_name])
+ DISK_HEADER = OrderedDict()
+ DISK_HEADER['id'] = 'ID'
+ DISK_HEADER['name'] = 'Name'
+ DISK_HEADER['disk_type'] = 'Type'
+ DISK_HEADER['block_size'] = 'Block Size'
+ DISK_HEADER['num_of_blocks'] = '#blocks'
+ DISK_HEADER['size_bytes'] = 'Size'
+ DISK_HEADER['status'] = 'Status'
+ DISK_HEADER['system_id'] = 'System ID'
+
+ DISK_COLUMN_SKIP_KEYS = ['block_size', 'num_of_blocks']

DISK_VALUE_CONV_ENUM = {
'status': disk_status_to_str,
@@ -389,21 +379,21 @@ class DisplayData(object):
DISK_VALUE_CONV_HUMAN = ['size_bytes', 'block_size']

VALUE_CONVERT[Disk] = {
- 'mandatory_headers': DISK_MAN_HEADER,
- 'column_keys': DISK_COLUMN_KEYS,
+ 'headers': DISK_HEADER,
+ 'column_skip_keys': DISK_COLUMN_SKIP_KEYS,
'value_conv_enum': DISK_VALUE_CONV_ENUM,
'value_conv_human': DISK_VALUE_CONV_HUMAN,
}

# lsm.AccessGroup
- AG_MAN_HEADER = OrderedDict()
- AG_MAN_HEADER['id'] = 'ID'
- AG_MAN_HEADER['name'] = 'Name'
- AG_MAN_HEADER['init_ids'] = 'Initiator IDs'
- AG_MAN_HEADER['init_type'] = 'Type'
- AG_MAN_HEADER['system_id'] = 'System ID'
+ AG_HEADER = OrderedDict()
+ AG_HEADER['id'] = 'ID'
+ AG_HEADER['name'] = 'Name'
+ AG_HEADER['init_ids'] = 'Initiator IDs'
+ AG_HEADER['init_type'] = 'Type'
+ AG_HEADER['system_id'] = 'System ID'

- AG_COLUMN_KEYS = AG_MAN_HEADER.keys()
+ AG_COLUMN_SKIP_KEYS = []

AG_VALUE_CONV_ENUM = {
'init_type': ag_init_type_to_str,
@@ -412,26 +402,22 @@ class DisplayData(object):
AG_VALUE_CONV_HUMAN = []

VALUE_CONVERT[AccessGroup] = {
- 'mandatory_headers': AG_MAN_HEADER,
- 'column_keys': AG_COLUMN_KEYS,
+ 'headers': AG_HEADER,
+ 'column_skip_keys': AG_COLUMN_SKIP_KEYS,
'value_conv_enum': AG_VALUE_CONV_ENUM,
'value_conv_human': AG_VALUE_CONV_HUMAN,
}

# lsm.FileSystem
- FS_MAN_HEADER = OrderedDict()
- FS_MAN_HEADER['id'] = 'ID'
- FS_MAN_HEADER['name'] = 'Name'
- FS_MAN_HEADER['total_space'] = 'Total Space'
- FS_MAN_HEADER['free_space'] = 'Free Space'
- FS_MAN_HEADER['pool_id'] = 'Pool ID'
- FS_MAN_HEADER['system_id'] = 'System ID'
-
- FS_COLUMN_KEYS = []
- for key_name in FS_MAN_HEADER.keys():
- # Skip these keys for column display
- if key_name not in ['system_id']:
- FS_COLUMN_KEYS.extend([key_name])
+ FS_HEADER = OrderedDict()
+ FS_HEADER['id'] = 'ID'
+ FS_HEADER['name'] = 'Name'
+ FS_HEADER['total_space'] = 'Total Space'
+ FS_HEADER['free_space'] = 'Free Space'
+ FS_HEADER['pool_id'] = 'Pool ID'
+ FS_HEADER['system_id'] = 'System ID'
+
+ FS_COLUMN_SKIP_KEYS = ['system_id']

FS_VALUE_CONV_ENUM = {
}
@@ -439,19 +425,19 @@ class DisplayData(object):
FS_VALUE_CONV_HUMAN = ['total_space', 'free_space']

VALUE_CONVERT[FileSystem] = {
- 'mandatory_headers': FS_MAN_HEADER,
- 'column_keys': FS_COLUMN_KEYS,
+ 'headers': FS_HEADER,
+ 'column_skip_keys': FS_COLUMN_SKIP_KEYS,
'value_conv_enum': FS_VALUE_CONV_ENUM,
'value_conv_human': FS_VALUE_CONV_HUMAN,
}

# lsm.FsSnapshot
- FS_SNAP_MAN_HEADER = OrderedDict()
- FS_SNAP_MAN_HEADER['id'] = 'ID'
- FS_SNAP_MAN_HEADER['name'] = 'Name'
- FS_SNAP_MAN_HEADER['ts'] = 'Time Stamp'
+ FS_SNAP_HEADER = OrderedDict()
+ FS_SNAP_HEADER['id'] = 'ID'
+ FS_SNAP_HEADER['name'] = 'Name'
+ FS_SNAP_HEADER['ts'] = 'Time Stamp'

- FS_SNAP_COLUMN_KEYS = FS_SNAP_MAN_HEADER.keys()
+ FS_SNAP_COLUMN_SKIP_KEYS = []

FS_SNAP_VALUE_CONV_ENUM = {
'ts': datetime.fromtimestamp
@@ -460,57 +446,49 @@ class DisplayData(object):
FS_SNAP_VALUE_CONV_HUMAN = []

VALUE_CONVERT[FsSnapshot] = {
- 'mandatory_headers': FS_SNAP_MAN_HEADER,
- 'column_keys': FS_SNAP_COLUMN_KEYS,
+ 'headers': FS_SNAP_HEADER,
+ 'column_skip_keys': FS_SNAP_COLUMN_SKIP_KEYS,
'value_conv_enum': FS_SNAP_VALUE_CONV_ENUM,
'value_conv_human': FS_SNAP_VALUE_CONV_HUMAN,
}

# lsm.NfsExport
- NFS_EXPORT_MAN_HEADER = OrderedDict()
- NFS_EXPORT_MAN_HEADER['id'] = 'ID'
- NFS_EXPORT_MAN_HEADER['fs_id'] = 'FileSystem ID'
- NFS_EXPORT_MAN_HEADER['export_path'] = 'Export Path'
- NFS_EXPORT_MAN_HEADER['auth'] = 'Auth Type'
- NFS_EXPORT_MAN_HEADER['root'] = 'Root Hosts'
- NFS_EXPORT_MAN_HEADER['rw'] = 'RW Hosts'
- NFS_EXPORT_MAN_HEADER['ro'] = 'RO Hosts'
- NFS_EXPORT_MAN_HEADER['anonuid'] = 'Anonymous UID'
- NFS_EXPORT_MAN_HEADER['anongid'] = 'Anonymous GID'
- NFS_EXPORT_MAN_HEADER['options'] = 'Options'
-
- NFS_EXPORT_COLUMN_KEYS = []
- for key_name in NFS_EXPORT_MAN_HEADER.keys():
- # Skip these keys for column display
- if key_name not in ['root', 'anonuid', 'anongid', 'auth']:
- NFS_EXPORT_COLUMN_KEYS.extend([key_name])
+ NFS_EXPORT_HEADER = OrderedDict()
+ NFS_EXPORT_HEADER['id'] = 'ID'
+ NFS_EXPORT_HEADER['fs_id'] = 'FileSystem ID'
+ NFS_EXPORT_HEADER['export_path'] = 'Export Path'
+ NFS_EXPORT_HEADER['auth'] = 'Auth Type'
+ NFS_EXPORT_HEADER['root'] = 'Root Hosts'
+ NFS_EXPORT_HEADER['rw'] = 'RW Hosts'
+ NFS_EXPORT_HEADER['ro'] = 'RO Hosts'
+ NFS_EXPORT_HEADER['anonuid'] = 'Anonymous UID'
+ NFS_EXPORT_HEADER['anongid'] = 'Anonymous GID'
+ NFS_EXPORT_HEADER['options'] = 'Options'
+
+ NFS_EXPORT_COLUMN_SKIP_KEYS = ['root', 'anonuid', 'anongid', 'auth']

NFS_EXPORT_VALUE_CONV_ENUM = {}

NFS_EXPORT_VALUE_CONV_HUMAN = []

VALUE_CONVERT[NfsExport] = {
- 'mandatory_headers': NFS_EXPORT_MAN_HEADER,
- 'column_keys': NFS_EXPORT_COLUMN_KEYS,
+ 'headers': NFS_EXPORT_HEADER,
+ 'column_skip_keys': NFS_EXPORT_COLUMN_SKIP_KEYS,
'value_conv_enum': NFS_EXPORT_VALUE_CONV_ENUM,
'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', 'physical_name']:
- TGT_PORT_COLUMN_KEYS.extend([key_name])
+ TGT_PORT_HEADER = OrderedDict()
+ TGT_PORT_HEADER['id'] = 'ID'
+ TGT_PORT_HEADER['port_type'] = 'Type'
+ TGT_PORT_HEADER['physical_name'] = 'Physical Name'
+ TGT_PORT_HEADER['service_address'] = 'Address'
+ TGT_PORT_HEADER['network_address'] = 'Network Address'
+ TGT_PORT_HEADER['physical_address'] = 'Physical Address'
+ TGT_PORT_HEADER['system_id'] = 'System ID'
+
+ TGT_PORT_COLUMN_SKIP_KEYS = ['physical_address', 'physical_name']

TGT_PORT_VALUE_CONV_ENUM = {
'port_type': tgt_port_type_to_str,
@@ -519,8 +497,8 @@ class DisplayData(object):
TGT_PORT_VALUE_CONV_HUMAN = []

VALUE_CONVERT[TargetPort] = {
- 'mandatory_headers': TGT_PORT_MAN_HEADER,
- 'column_keys': TGT_PORT_COLUMN_KEYS,
+ 'headers': TGT_PORT_HEADER,
+ 'column_skip_keys': TGT_PORT_COLUMN_SKIP_KEYS,
'value_conv_enum': TGT_PORT_VALUE_CONV_ENUM,
'value_conv_human': TGT_PORT_VALUE_CONV_HUMAN,
}
@@ -551,7 +529,7 @@ class DisplayData(object):
extra_properties=None, flag_dsp_all_data=False):
data_dict = OrderedDict()
value_convert = DisplayData.VALUE_CONVERT[type(obj)]
- mandatory_headers = value_convert['mandatory_headers']
+ headers = value_convert['headers']
value_conv_enum = value_convert['value_conv_enum']
value_conv_human = value_convert['value_conv_human']

@@ -561,12 +539,19 @@ class DisplayData(object):
display_keys = []

if display_way == DisplayData.DISPLAY_WAY_COLUMN:
- display_keys = value_convert['column_keys']
+ for key_name in headers.keys():
+ if key_name not in value_convert['column_skip_keys']:
+ display_keys.append(key_name)
elif display_way == DisplayData.DISPLAY_WAY_SCRIPT:
- display_keys = mandatory_headers.keys()
+ display_keys = headers.keys()
+
+ if extra_properties:
+ for extra_key_name in extra_properties:
+ if extra_key_name not in display_keys:
+ display_keys.append(extra_key_name)

for key in display_keys:
- key_str = mandatory_headers[key]
+ key_str = headers[key]
value = DisplayData._get_man_pro_value(
obj, key, value_conv_enum, value_conv_human, flag_human,
flag_enum)
--
2.1.0
Tony Asleson
2014-09-02 20:09:37 UTC
Permalink
Post by Gris Ge
* Hide vpd83 in colume display of 'list --type volumes' command.
It's normally used by script, so we display it in script mode.
I don't agree that it is only used in a script. The VPD is the
correlatable data, thus a user creating a new volume to mask will likely
need it to make sure they are manually adding/unmasking the correct one
by comparing it to /dev/disk/by-id/scsi*

Maybe we should introduce a generic command line argument for allowing
the user to specifically include or exclude specific column(s) of output?

Regards,
Tony
Tony Asleson
2014-09-02 20:14:03 UTC
Permalink
See additional comments below.

Thanks,
Tony
Post by Gris Ge
* Hide vpd83 in colume display of 'list --type volumes' command.
It's normally used by script, so we display it in script mode.
1. No optional properties anymore, hence no need for XXX_MAN_HEADER,
change to XXX_MAN_HEADER
2. Replace XXX_COLUMN_KEYS with XXX_COLUMN_SKIP_KEYS for better
maintenance.
---
tools/lsmcli/data_display.py | 263 ++++++++++++++++++++-----------------------
1 file changed, 124 insertions(+), 139 deletions(-)
diff --git a/tools/lsmcli/data_display.py b/tools/lsmcli/data_display.py
index 080f6fa..124ba71 100644
--- a/tools/lsmcli/data_display.py
+++ b/tools/lsmcli/data_display.py
VALUE_CONVERT = {}
# lsm.System
- SYSTEM_MAN_HEADER = OrderedDict()
- SYSTEM_MAN_HEADER['id'] = 'ID'
- SYSTEM_MAN_HEADER['name'] = 'Name'
- SYSTEM_MAN_HEADER['status'] = 'Status'
- SYSTEM_MAN_HEADER['status_info'] = 'Status Info'
-
- SYSTEM_COLUMN_KEYS = SYSTEM_MAN_HEADER.keys()
- # SYSTEM_COLUMN_KEYS should be subset of SYSTEM_MAN_HEADER.keys()
- # XXX_COLUMN_KEYS contain a list of mandatory properties which will be
- # displayed in column way. It was used to limit the output of properties
- # in sure the column display way does not exceeded the column width 78.
- # All mandatory_headers will be displayed in script way.
+ SYSTEM_HEADER = OrderedDict()
+ SYSTEM_HEADER['id'] = 'ID'
+ SYSTEM_HEADER['name'] = 'Name'
+ SYSTEM_HEADER['status'] = 'Status'
+ SYSTEM_HEADER['status_info'] = 'Status Info'
+
+ SYSTEM_COLUMN_SKIP_KEYS = []
+ # XXX_COLUMN_SKIP_KEYS contain a list of property should be skipped when
+ # displaying in column way.
SYSTEM_VALUE_CONV_ENUM = {
'status': system_status_to_str,
SYSTEM_VALUE_CONV_HUMAN = []
VALUE_CONVERT[System] = {
- 'mandatory_headers': SYSTEM_MAN_HEADER,
- 'column_keys': SYSTEM_COLUMN_KEYS,
+ 'headers': SYSTEM_HEADER,
+ 'column_skip_keys': SYSTEM_COLUMN_SKIP_KEYS,
'value_conv_enum': SYSTEM_VALUE_CONV_ENUM,
'value_conv_human': SYSTEM_VALUE_CONV_HUMAN,
}
- PLUG_DATA_MAN_HEADER = OrderedDict()
- PLUG_DATA_MAN_HEADER['desc'] = 'Description'
- PLUG_DATA_MAN_HEADER['version'] = 'Version'
+ PLUG_DATA_HEADER = OrderedDict()
+ PLUG_DATA_HEADER['desc'] = 'Description'
+ PLUG_DATA_HEADER['version'] = 'Version'
- PLUG_DATA_COLUMN_KEYS = PLUG_DATA_MAN_HEADER.keys()
+ PLUG_DATA_COLUMN_SKIP_KEYS = []
PLUG_DATA_VALUE_CONV_ENUM = {}
PLUG_DATA_VALUE_CONV_HUMAN = []
VALUE_CONVERT[PlugData] = {
- 'mandatory_headers': PLUG_DATA_MAN_HEADER,
- 'column_keys': PLUG_DATA_COLUMN_KEYS,
+ 'headers': PLUG_DATA_HEADER,
+ 'column_skip_keys': PLUG_DATA_COLUMN_SKIP_KEYS,
'value_conv_enum': PLUG_DATA_VALUE_CONV_ENUM,
'value_conv_human': PLUG_DATA_VALUE_CONV_HUMAN,
}
# lsm.Pool
- POOL_MAN_HEADER = OrderedDict()
- POOL_MAN_HEADER['id'] = 'ID'
- POOL_MAN_HEADER['name'] = 'Name'
- POOL_MAN_HEADER['element_type'] = 'Element type'
- POOL_MAN_HEADER['unsupported_actions'] = 'Does not support'
- POOL_MAN_HEADER['total_space'] = 'Total Space'
- POOL_MAN_HEADER['free_space'] = 'Free Space'
- POOL_MAN_HEADER['status'] = 'Status'
- POOL_MAN_HEADER['status_info'] = 'Status Info'
- POOL_MAN_HEADER['system_id'] = 'System ID'
-
- POOL_COLUMN_KEYS = POOL_MAN_HEADER.keys()
+ POOL_HEADER = OrderedDict()
+ POOL_HEADER['id'] = 'ID'
+ POOL_HEADER['name'] = 'Name'
+ POOL_HEADER['element_type'] = 'Element type'
+ POOL_HEADER['unsupported_actions'] = 'Does not support'
+ POOL_HEADER['total_space'] = 'Total Space'
+ POOL_HEADER['free_space'] = 'Free Space'
+ POOL_HEADER['status'] = 'Status'
+ POOL_HEADER['status_info'] = 'Status Info'
+ POOL_HEADER['system_id'] = 'System ID'
+
+ POOL_COLUMN_SKIP_KEYS = []
POOL_VALUE_CONV_ENUM = {
'status': pool_status_to_str,
POOL_VALUE_CONV_HUMAN = ['total_space', 'free_space']
VALUE_CONVERT[Pool] = {
- 'mandatory_headers': POOL_MAN_HEADER,
- 'column_keys': POOL_COLUMN_KEYS,
+ 'headers': POOL_HEADER,
+ 'column_skip_keys': POOL_COLUMN_SKIP_KEYS,
'value_conv_enum': POOL_VALUE_CONV_ENUM,
'value_conv_human': POOL_VALUE_CONV_HUMAN,
}
# lsm.Volume
- VOL_MAN_HEADER = OrderedDict()
- VOL_MAN_HEADER['id'] = 'ID'
- VOL_MAN_HEADER['name'] = 'Name'
- VOL_MAN_HEADER['vpd83'] = 'SCSI VPD 0x83'
- VOL_MAN_HEADER['block_size'] = 'Block Size'
- VOL_MAN_HEADER['num_of_blocks'] = '#blocks'
- VOL_MAN_HEADER['size_bytes'] = 'Size'
- VOL_MAN_HEADER['admin_state'] = 'Disabled'
- VOL_MAN_HEADER['pool_id'] = 'Pool ID'
- VOL_MAN_HEADER['system_id'] = 'System ID'
-
- VOL_COLUMN_KEYS = []
- # Skip these keys for column display
- VOL_COLUMN_KEYS.extend([key_name])
+ VOL_HEADER = OrderedDict()
+ VOL_HEADER['id'] = 'ID'
+ VOL_HEADER['name'] = 'Name'
+ VOL_HEADER['vpd83'] = 'SCSI VPD 0x83'
+ VOL_HEADER['block_size'] = 'Block Size'
+ VOL_HEADER['num_of_blocks'] = '#blocks'
+ VOL_HEADER['size_bytes'] = 'Size'
+ VOL_HEADER['admin_state'] = 'Disabled'
+ VOL_HEADER['pool_id'] = 'Pool ID'
+ VOL_HEADER['system_id'] = 'System ID'
+
+ VOL_COLUMN_SKIP_KEYS = ['block_size', 'vpd83', 'num_of_blocks',
+ 'system_id']
We need to keep the system id. I use that all the time in the output
when using SMI-S.
Post by Gris Ge
VOL_VALUE_CONV_ENUM = {
'admin_state': vol_admin_state_to_str
VOL_VALUE_CONV_HUMAN = ['size_bytes', 'block_size']
VALUE_CONVERT[Volume] = {
- 'mandatory_headers': VOL_MAN_HEADER,
- 'column_keys': VOL_COLUMN_KEYS,
+ 'headers': VOL_HEADER,
+ 'column_skip_keys': VOL_COLUMN_SKIP_KEYS,
'value_conv_enum': VOL_VALUE_CONV_ENUM,
'value_conv_human': VOL_VALUE_CONV_HUMAN,
}
# lsm.Disk
- DISK_MAN_HEADER = OrderedDict()
- DISK_MAN_HEADER['id'] = 'ID'
- DISK_MAN_HEADER['name'] = 'Name'
- DISK_MAN_HEADER['disk_type'] = 'Type'
- DISK_MAN_HEADER['block_size'] = 'Block Size'
- DISK_MAN_HEADER['num_of_blocks'] = '#blocks'
- DISK_MAN_HEADER['size_bytes'] = 'Size'
- DISK_MAN_HEADER['status'] = 'Status'
- DISK_MAN_HEADER['system_id'] = 'System ID'
-
- DISK_COLUMN_KEYS = []
- # Skip these keys for column display
- DISK_COLUMN_KEYS.extend([key_name])
+ DISK_HEADER = OrderedDict()
+ DISK_HEADER['id'] = 'ID'
+ DISK_HEADER['name'] = 'Name'
+ DISK_HEADER['disk_type'] = 'Type'
+ DISK_HEADER['block_size'] = 'Block Size'
+ DISK_HEADER['num_of_blocks'] = '#blocks'
+ DISK_HEADER['size_bytes'] = 'Size'
+ DISK_HEADER['status'] = 'Status'
+ DISK_HEADER['system_id'] = 'System ID'
+
+ DISK_COLUMN_SKIP_KEYS = ['block_size', 'num_of_blocks']
DISK_VALUE_CONV_ENUM = {
'status': disk_status_to_str,
DISK_VALUE_CONV_HUMAN = ['size_bytes', 'block_size']
VALUE_CONVERT[Disk] = {
- 'mandatory_headers': DISK_MAN_HEADER,
- 'column_keys': DISK_COLUMN_KEYS,
+ 'headers': DISK_HEADER,
+ 'column_skip_keys': DISK_COLUMN_SKIP_KEYS,
'value_conv_enum': DISK_VALUE_CONV_ENUM,
'value_conv_human': DISK_VALUE_CONV_HUMAN,
}
# lsm.AccessGroup
- AG_MAN_HEADER = OrderedDict()
- AG_MAN_HEADER['id'] = 'ID'
- AG_MAN_HEADER['name'] = 'Name'
- AG_MAN_HEADER['init_ids'] = 'Initiator IDs'
- AG_MAN_HEADER['init_type'] = 'Type'
- AG_MAN_HEADER['system_id'] = 'System ID'
+ AG_HEADER = OrderedDict()
+ AG_HEADER['id'] = 'ID'
+ AG_HEADER['name'] = 'Name'
+ AG_HEADER['init_ids'] = 'Initiator IDs'
+ AG_HEADER['init_type'] = 'Type'
+ AG_HEADER['system_id'] = 'System ID'
- AG_COLUMN_KEYS = AG_MAN_HEADER.keys()
+ AG_COLUMN_SKIP_KEYS = []
AG_VALUE_CONV_ENUM = {
'init_type': ag_init_type_to_str,
AG_VALUE_CONV_HUMAN = []
VALUE_CONVERT[AccessGroup] = {
- 'mandatory_headers': AG_MAN_HEADER,
- 'column_keys': AG_COLUMN_KEYS,
+ 'headers': AG_HEADER,
+ 'column_skip_keys': AG_COLUMN_SKIP_KEYS,
'value_conv_enum': AG_VALUE_CONV_ENUM,
'value_conv_human': AG_VALUE_CONV_HUMAN,
}
# lsm.FileSystem
- FS_MAN_HEADER = OrderedDict()
- FS_MAN_HEADER['id'] = 'ID'
- FS_MAN_HEADER['name'] = 'Name'
- FS_MAN_HEADER['total_space'] = 'Total Space'
- FS_MAN_HEADER['free_space'] = 'Free Space'
- FS_MAN_HEADER['pool_id'] = 'Pool ID'
- FS_MAN_HEADER['system_id'] = 'System ID'
-
- FS_COLUMN_KEYS = []
- # Skip these keys for column display
- FS_COLUMN_KEYS.extend([key_name])
+ FS_HEADER = OrderedDict()
+ FS_HEADER['id'] = 'ID'
+ FS_HEADER['name'] = 'Name'
+ FS_HEADER['total_space'] = 'Total Space'
+ FS_HEADER['free_space'] = 'Free Space'
+ FS_HEADER['pool_id'] = 'Pool ID'
+ FS_HEADER['system_id'] = 'System ID'
+
+ FS_COLUMN_SKIP_KEYS = ['system_id']
I would like to keep this too.
Post by Gris Ge
FS_VALUE_CONV_ENUM = {
}
FS_VALUE_CONV_HUMAN = ['total_space', 'free_space']
VALUE_CONVERT[FileSystem] = {
- 'mandatory_headers': FS_MAN_HEADER,
- 'column_keys': FS_COLUMN_KEYS,
+ 'headers': FS_HEADER,
+ 'column_skip_keys': FS_COLUMN_SKIP_KEYS,
'value_conv_enum': FS_VALUE_CONV_ENUM,
'value_conv_human': FS_VALUE_CONV_HUMAN,
}
# lsm.FsSnapshot
- FS_SNAP_MAN_HEADER = OrderedDict()
- FS_SNAP_MAN_HEADER['id'] = 'ID'
- FS_SNAP_MAN_HEADER['name'] = 'Name'
- FS_SNAP_MAN_HEADER['ts'] = 'Time Stamp'
+ FS_SNAP_HEADER = OrderedDict()
+ FS_SNAP_HEADER['id'] = 'ID'
+ FS_SNAP_HEADER['name'] = 'Name'
+ FS_SNAP_HEADER['ts'] = 'Time Stamp'
- FS_SNAP_COLUMN_KEYS = FS_SNAP_MAN_HEADER.keys()
+ FS_SNAP_COLUMN_SKIP_KEYS = []
FS_SNAP_VALUE_CONV_ENUM = {
'ts': datetime.fromtimestamp
FS_SNAP_VALUE_CONV_HUMAN = []
VALUE_CONVERT[FsSnapshot] = {
- 'mandatory_headers': FS_SNAP_MAN_HEADER,
- 'column_keys': FS_SNAP_COLUMN_KEYS,
+ 'headers': FS_SNAP_HEADER,
+ 'column_skip_keys': FS_SNAP_COLUMN_SKIP_KEYS,
'value_conv_enum': FS_SNAP_VALUE_CONV_ENUM,
'value_conv_human': FS_SNAP_VALUE_CONV_HUMAN,
}
# lsm.NfsExport
- NFS_EXPORT_MAN_HEADER = OrderedDict()
- NFS_EXPORT_MAN_HEADER['id'] = 'ID'
- NFS_EXPORT_MAN_HEADER['fs_id'] = 'FileSystem ID'
- NFS_EXPORT_MAN_HEADER['export_path'] = 'Export Path'
- NFS_EXPORT_MAN_HEADER['auth'] = 'Auth Type'
- NFS_EXPORT_MAN_HEADER['root'] = 'Root Hosts'
- NFS_EXPORT_MAN_HEADER['rw'] = 'RW Hosts'
- NFS_EXPORT_MAN_HEADER['ro'] = 'RO Hosts'
- NFS_EXPORT_MAN_HEADER['anonuid'] = 'Anonymous UID'
- NFS_EXPORT_MAN_HEADER['anongid'] = 'Anonymous GID'
- NFS_EXPORT_MAN_HEADER['options'] = 'Options'
-
- NFS_EXPORT_COLUMN_KEYS = []
- # Skip these keys for column display
- NFS_EXPORT_COLUMN_KEYS.extend([key_name])
+ NFS_EXPORT_HEADER = OrderedDict()
+ NFS_EXPORT_HEADER['id'] = 'ID'
+ NFS_EXPORT_HEADER['fs_id'] = 'FileSystem ID'
+ NFS_EXPORT_HEADER['export_path'] = 'Export Path'
+ NFS_EXPORT_HEADER['auth'] = 'Auth Type'
+ NFS_EXPORT_HEADER['root'] = 'Root Hosts'
+ NFS_EXPORT_HEADER['rw'] = 'RW Hosts'
+ NFS_EXPORT_HEADER['ro'] = 'RO Hosts'
+ NFS_EXPORT_HEADER['anonuid'] = 'Anonymous UID'
+ NFS_EXPORT_HEADER['anongid'] = 'Anonymous GID'
+ NFS_EXPORT_HEADER['options'] = 'Options'
+
+ NFS_EXPORT_COLUMN_SKIP_KEYS = ['root', 'anonuid', 'anongid', 'auth']
I don't think we should remove 'root', the other ones should be OK.
Post by Gris Ge
NFS_EXPORT_VALUE_CONV_ENUM = {}
NFS_EXPORT_VALUE_CONV_HUMAN = []
VALUE_CONVERT[NfsExport] = {
- 'mandatory_headers': NFS_EXPORT_MAN_HEADER,
- 'column_keys': NFS_EXPORT_COLUMN_KEYS,
+ 'headers': NFS_EXPORT_HEADER,
+ 'column_skip_keys': NFS_EXPORT_COLUMN_SKIP_KEYS,
'value_conv_enum': NFS_EXPORT_VALUE_CONV_ENUM,
'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 = []
- # Skip these keys for column display
- TGT_PORT_COLUMN_KEYS.extend([key_name])
+ TGT_PORT_HEADER = OrderedDict()
+ TGT_PORT_HEADER['id'] = 'ID'
+ TGT_PORT_HEADER['port_type'] = 'Type'
+ TGT_PORT_HEADER['physical_name'] = 'Physical Name'
+ TGT_PORT_HEADER['service_address'] = 'Address'
+ TGT_PORT_HEADER['network_address'] = 'Network Address'
+ TGT_PORT_HEADER['physical_address'] = 'Physical Address'
+ TGT_PORT_HEADER['system_id'] = 'System ID'
+
+ TGT_PORT_COLUMN_SKIP_KEYS = ['physical_address', 'physical_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,
+ 'headers': TGT_PORT_HEADER,
+ 'column_skip_keys': TGT_PORT_COLUMN_SKIP_KEYS,
'value_conv_enum': TGT_PORT_VALUE_CONV_ENUM,
'value_conv_human': TGT_PORT_VALUE_CONV_HUMAN,
}
data_dict = OrderedDict()
value_convert = DisplayData.VALUE_CONVERT[type(obj)]
- mandatory_headers = value_convert['mandatory_headers']
+ headers = value_convert['headers']
value_conv_enum = value_convert['value_conv_enum']
value_conv_human = value_convert['value_conv_human']
display_keys = []
- display_keys = value_convert['column_keys']
+ display_keys.append(key_name)
- display_keys = mandatory_headers.keys()
+ display_keys = headers.keys()
+
+ display_keys.append(extra_key_name)
- key_str = mandatory_headers[key]
+ key_str = headers[key]
value = DisplayData._get_man_pro_value(
obj, key, value_conv_enum, value_conv_human, flag_human,
flag_enum)
Loading...