* Removed these system status as no plugin support it:
stress
starting
stopping
stopped
* Updated SMI-S plugin to fit this change:
1. Split DMTF class to dmtf.py(Makefile and RPM SPEC file updated).
2. If facing other status, will mark as STATUS_OTHER and store the
name into system_info.
I tried on many SMI-S providers, I only got degraded.
Signed-off-by: Gris Ge <***@redhat.com>
---
.../include/libstoragemgmt/libstoragemgmt_types.h | 6 +-
packaging/libstoragemgmt.spec.in | 1 +
plugin/Makefile.am | 3 +-
plugin/smispy/dmtf.py | 192 +++++++++++++++++++++
plugin/smispy/smis.py | 111 ++----------
python_binding/lsm/_data.py | 69 +-------
tools/lsmcli/data_display.py | 4 -
7 files changed, 207 insertions(+), 179 deletions(-)
create mode 100644 plugin/smispy/dmtf.py
diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_types.h b/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
index 82a23a8..de163a2 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
@@ -165,11 +165,7 @@ typedef enum {
#define LSM_SYSTEM_STATUS_ERROR 0x00000004 /**< Error(s) exist */
#define LSM_SYSTEM_STATUS_DEGRADED 0x00000008 /**< Degraded */
#define LSM_SYSTEM_STATUS_PREDICTIVE_FAILURE 0x00000010 /**< System has predictive failure(s) */
-#define LSM_SYSTEM_STATUS_STRESSED 0x00000020 /**< Temp or excessive IO */
-#define LSM_SYSTEM_STATUS_STARTING 0x00000040 /**< Booting */
-#define LSM_SYSTEM_STATUS_STOPPING 0x00000080 /**< Shutting down */
-#define LSM_SYSTEM_STATUS_STOPPED 0x00000100 /**< Stopped by admin */
-#define LSM_SYSTEM_STATUS_OTHER 0x00000200 /**< Vendor specific */
+#define LSM_SYSTEM_STATUS_OTHER 0x00000020 /**< Vendor specific */
typedef enum {
diff --git a/packaging/libstoragemgmt.spec.in b/packaging/libstoragemgmt.spec.in
index 37398f1..479a04d 100644
--- a/packaging/libstoragemgmt.spec.in
+++ b/packaging/libstoragemgmt.spec.in
@@ -314,6 +314,7 @@ fi
%{python_sitelib}/lsm/plugin/smispy/eseries.*
%{python_sitelib}/lsm/plugin/smispy/smis.*
%{python_sitelib}/lsm/plugin/smispy/smisproxy.*
+%{python_sitelib}/lsm/plugin/smispy/dmtf.*
%{_bindir}/smispy_lsmplugin
%files netapp-plugin
diff --git a/plugin/Makefile.am b/plugin/Makefile.am
index 96a243a..5a4dca2 100644
--- a/plugin/Makefile.am
+++ b/plugin/Makefile.am
@@ -26,7 +26,8 @@ smispy_PYTHON = \
smispy/__init__.py \
smispy/smis.py \
smispy/smisproxy.py \
- smispy/eseries.py
+ smispy/eseries.py \
+ smispy/dmtf.py
nstordir = $(plugindir)/nstor
nstor_PYTHON = \
diff --git a/plugin/smispy/dmtf.py b/plugin/smispy/dmtf.py
new file mode 100644
index 0000000..0a34ddc
--- /dev/null
+++ b/plugin/smispy/dmtf.py
@@ -0,0 +1,192 @@
+# Copyright (C) 2011-2014 Red Hat, Inc.
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+# USA
+#
+# Author: Gris Ge <***@redhat.com>
+
+# This class handle DMTF CIM constants and convert to LSM type.
+
+from lsm import (System, Pool)
+from pywbem import Uint16
+
+
+class DMTF(object):
+ # CIM_ManagedSystemElement['OperationalStatus']
+ OP_STATUS_UNKNOWN = 0
+ OP_STATUS_OTHER = 1
+ OP_STATUS_OK = 2
+ OP_STATUS_DEGRADED = 3
+ OP_STATUS_STRESSED = 4
+ OP_STATUS_PREDICTIVE_FAILURE = 5
+ OP_STATUS_ERROR = 6
+ OP_STATUS_NON_RECOVERABLE_ERROR = 7
+ OP_STATUS_STARTING = 8
+ OP_STATUS_STOPPING = 9
+ OP_STATUS_STOPPED = 10
+ OP_STATUS_IN_SERVICE = 11
+ OP_STATUS_NO_CONTACT = 12
+ OP_STATUS_LOST_COMMUNICATION = 13
+ OP_STATUS_ABORTED = 14
+ OP_STATUS_DORMANT = 15
+ OP_STATUS_SUPPORTING_ENTITY_IN_ERROR = 16
+ OP_STATUS_COMPLETED = 17
+ OP_STATUS_POWER_MODE = 18
+
+ _OP_STATUS_STR_CONV = {
+ OP_STATUS_UNKNOWN: "UNKNOWN",
+ OP_STATUS_OTHER: "OTHER",
+ OP_STATUS_OK: "OK",
+ OP_STATUS_DEGRADED: "DEGRADED",
+ OP_STATUS_STRESSED: "STRESSED",
+ OP_STATUS_PREDICTIVE_FAILURE: "PREDICTIVE_FAILURE",
+ OP_STATUS_ERROR: "ERROR",
+ OP_STATUS_NON_RECOVERABLE_ERROR: "NON_RECOVERABLE_ERROR",
+ OP_STATUS_STARTING: "STARTING",
+ OP_STATUS_STOPPING: "STOPPING",
+ OP_STATUS_STOPPED: "STOPPED",
+ OP_STATUS_IN_SERVICE: "IN_SERVICE",
+ OP_STATUS_NO_CONTACT: "NO_CONTACT",
+ OP_STATUS_LOST_COMMUNICATION: "LOST_COMMUNICATION",
+ OP_STATUS_ABORTED: "ABORTED",
+ OP_STATUS_DORMANT: "DORMANT",
+ OP_STATUS_SUPPORTING_ENTITY_IN_ERROR: "SUPPORTING_ENTITY_IN_ERROR",
+ OP_STATUS_COMPLETED: "COMPLETED",
+ OP_STATUS_POWER_MODE: "POWER_MODE",
+ }
+
+ @staticmethod
+ def dmtf_op_status_to_str(dmtf_op_status):
+ """
+ Just convert integer to string. NOT ALLOWING provide a list.
+ Return emtpy string is not found.
+ """
+ try:
+ return DMTF._OP_STATUS_STR_CONV[dmtf_op_status]
+ except KeyError:
+ return ''
+
+ _LSM_SYS_OP_STATUS_CONV = {
+ OP_STATUS_OK: System.STATUS_OK,
+ OP_STATUS_ERROR: System.STATUS_ERROR,
+ OP_STATUS_DEGRADED: System.STATUS_DEGRADED,
+ OP_STATUS_NON_RECOVERABLE_ERROR: System.STATUS_ERROR,
+ OP_STATUS_PREDICTIVE_FAILURE: System.STATUS_PREDICTIVE_FAILURE,
+ OP_STATUS_SUPPORTING_ENTITY_IN_ERROR: System.STATUS_ERROR,
+ }
+
+ @staticmethod
+ def _dmtf_op_status_list_conv(conv_dict, dmtf_op_status_list,
+ unknown_value, other_value):
+ status = 0
+ status_info_list = []
+ for dmtf_op_status in dmtf_op_status_list:
+ if dmtf_op_status in conv_dict.keys():
+ status |= conv_dict[dmtf_op_status]
+ else:
+ if dmtf_op_status in DMTF._OP_STATUS_STR_CONV.keys():
+ status |= other_value
+ status_info_list.append(
+ DMTF.dmtf_op_status_to_str(dmtf_op_status))
+ continue
+ if status == 0:
+ status = unknown_value
+ return status, " ".join(status_info_list)
+
+
+ @staticmethod
+ def cim_sys_status_of(dmtf_op_status_list):
+ """
+ Convert CIM_ComputerSystem['OperationalStatus']
+ """
+ return DMTF._dmtf_op_status_list_conv(
+ DMTF._LSM_SYS_OP_STATUS_CONV, dmtf_op_status_list,
+ System.STATUS_UNKNOWN, System.STATUS_OTHER)
+
+ _LSM_POOL_OP_STATUS_CONV = {
+ OP_STATUS_OK: Pool.STATUS_OK,
+ OP_STATUS_ERROR: Pool.STATUS_ERROR,
+ OP_STATUS_DEGRADED: Pool.STATUS_DEGRADED,
+ OP_STATUS_NON_RECOVERABLE_ERROR: Pool.STATUS_ERROR,
+ OP_STATUS_SUPPORTING_ENTITY_IN_ERROR: Pool.STATUS_ERROR,
+ }
+
+ @staticmethod
+ def cim_pool_status_of(dmtf_op_status_list):
+ """
+ Convert CIM_StoragePool['OperationalStatus'] to LSM
+ """
+ return DMTF._dmtf_op_status_list_conv(
+ DMTF._LSM_POOL_OP_STATUS_CONV, dmtf_op_status_list,
+ Pool.STATUS_UNKNOWN, Pool.STATUS_OTHER)
+
+
+ # CIM_StorageHardwareID['IDType']
+ ID_TYPE_OTHER = Uint16(1)
+ ID_TYPE_WWPN = Uint16(2)
+ ID_TYPE_ISCSI = Uint16(5)
+
+ TGT_PORT_USAGE_FRONTEND_ONLY = Uint16(2)
+ TGT_PORT_USAGE_UNRESTRICTED = Uint16(4)
+ # CIM_FCPort['PortDiscriminator']
+ FC_PORT_PORT_DISCRIMINATOR_FCOE = Uint16(10)
+ # CIM_NetworkPort['LinkTechnology']
+ NET_PORT_LINK_TECH_ETHERNET = Uint16(2)
+ # CIM_iSCSIProtocolEndpoint['Role']
+ ISCSI_TGT_ROLE_TARGET = Uint16(3)
+ # CIM_SCSIProtocolController['NameFormat']
+ SPC_NAME_FORMAT_ISCSI = Uint16(3)
+ # CIM_IPProtocolEndpoint['IPv6AddressType']
+ IPV6_ADDR_TYPE_GUA = Uint16(6)
+ # GUA: Global Unicast Address.
+ # 2000::/3
+ IPV6_ADDR_TYPE_6TO4 = Uint16(7)
+ # IPv6 to IPv4 transition
+ # ::ffff:0:0/96
+ # ::ffff:0:0:0/96
+ # 64:ff9b::/96 # well-known prefix
+ # 2002::/16 # 6to4
+ IPV6_ADDR_TYPE_ULA = Uint16(8)
+ # ULA: Unique Local Address, aka Site Local Unicast.
+ # fc00::/7
+
+ # CIM_GroupMaskingMappingService.CreateGroup('Type')
+ MASK_GROUP_TYPE_INIT = Uint16(2)
+ MASK_GROUP_TYPE_TGT = Uint16(3)
+ MASK_GROUP_TYPE_DEV = Uint16(4)
+
+ # CIM_GroupMaskingMappingCapabilities['SupportedDeviceGroupFeatures']
+ # Allowing empty DeviceMaskingGroup associated to SPC
+ GMM_CAP_DEV_MG_ALLOW_EMPTY_W_SPC = Uint16(5)
+
+ # CIM_GroupMaskingMappingCapabilities['SupportedInitiatorGroupFeatures']
+ # Allowing empty DeviceMaskingGroup
+ GMM_CAP_INIT_MG_ALLOW_EMPTY = Uint16(4)
+ # Allowing empty DeviceMaskingGroup associated to SPC
+ GMM_CAP_INIT_MG_ALLOW_EMPTY_W_SPC = Uint16(5)
+
+ # CIM_GroupMaskingMappingCapabilities['SupportedAsynchronousActions']
+ # and 'SupportedSynchronousActions'. They are using the same value map.
+ GMM_CAP_DELETE_SPC = Uint16(24)
+ GMM_CAP_DELETE_GROUP = Uint16(20)
+
+ # CIM_StorageConfigurationCapabilities['SupportedStorageElementTypes']
+ SCS_CAP_SUP_ST_VOLUME = Uint16(2)
+ SCS_CAP_SUP_THIN_ST_VOLUME = Uint16(5)
+
+ # CIM_StorageConfigurationCapabilities['SupportedAsynchronousActions']
+ # and also for 'SupportedSynchronousActions'
+ SCS_CAP_VOLUME_CREATE = Uint16(5)
+ SCS_CAP_VOLUME_DELETE = Uint16(6)
+ SCS_CAP_VOLUME_MODIFY = Uint16(7)
diff --git a/plugin/smispy/smis.py b/plugin/smispy/smis.py
index 5bb02ad..5cc6d09 100644
--- a/plugin/smispy/smis.py
+++ b/plugin/smispy/smis.py
@@ -32,6 +32,8 @@ from lsm import (IStorageAreaNetwork, error, uri_parse, LsmError, ErrorNumber,
Capabilities, Disk, VERSION, TargetPort,
search_property)
+from dmtf import DMTF
+
## Variable Naming scheme:
# cim_xxx CIMInstance
# cim_xxx_path CIMInstanceName
@@ -148,68 +150,6 @@ def _lsm_init_id_to_snia(lsm_init_id):
return lsm_init_id.replace(':', '').upper()
return lsm_init_id
-
-class DMTF(object):
- # CIM_StorageHardwareID['IDType']
- ID_TYPE_OTHER = pywbem.Uint16(1)
- ID_TYPE_WWPN = pywbem.Uint16(2)
- ID_TYPE_ISCSI = pywbem.Uint16(5)
-
- TGT_PORT_USAGE_FRONTEND_ONLY = pywbem.Uint16(2)
- TGT_PORT_USAGE_UNRESTRICTED = pywbem.Uint16(4)
- # CIM_FCPort['PortDiscriminator']
- FC_PORT_PORT_DISCRIMINATOR_FCOE = pywbem.Uint16(10)
- # CIM_NetworkPort['LinkTechnology']
- NET_PORT_LINK_TECH_ETHERNET = pywbem.Uint16(2)
- # CIM_iSCSIProtocolEndpoint['Role']
- ISCSI_TGT_ROLE_TARGET = pywbem.Uint16(3)
- # CIM_SCSIProtocolController['NameFormat']
- SPC_NAME_FORMAT_ISCSI = pywbem.Uint16(3)
- # CIM_IPProtocolEndpoint['IPv6AddressType']
- IPV6_ADDR_TYPE_GUA = pywbem.Uint16(6)
- # GUA: Global Unicast Address.
- # 2000::/3
- IPV6_ADDR_TYPE_6TO4 = pywbem.Uint16(7)
- # IPv6 to IPv4 transition
- # ::ffff:0:0/96
- # ::ffff:0:0:0/96
- # 64:ff9b::/96 # well-known prefix
- # 2002::/16 # 6to4
- IPV6_ADDR_TYPE_ULA = pywbem.Uint16(8)
- # ULA: Unique Local Address, aka Site Local Unicast.
- # fc00::/7
-
- # CIM_GroupMaskingMappingService.CreateGroup('Type')
- MASK_GROUP_TYPE_INIT = pywbem.Uint16(2)
- MASK_GROUP_TYPE_TGT = pywbem.Uint16(3)
- MASK_GROUP_TYPE_DEV = pywbem.Uint16(4)
-
- # CIM_GroupMaskingMappingCapabilities['SupportedDeviceGroupFeatures']
- # Allowing empty DeviceMaskingGroup associated to SPC
- GMM_CAP_DEV_MG_ALLOW_EMPTY_W_SPC = pywbem.Uint16(5)
-
- # CIM_GroupMaskingMappingCapabilities['SupportedInitiatorGroupFeatures']
- # Allowing empty DeviceMaskingGroup
- GMM_CAP_INIT_MG_ALLOW_EMPTY = pywbem.Uint16(4)
- # Allowing empty DeviceMaskingGroup associated to SPC
- GMM_CAP_INIT_MG_ALLOW_EMPTY_W_SPC = pywbem.Uint16(5)
-
- # CIM_GroupMaskingMappingCapabilities['SupportedAsynchronousActions']
- # and 'SupportedSynchronousActions'. They are using the same value map.
- GMM_CAP_DELETE_SPC = pywbem.Uint16(24)
- GMM_CAP_DELETE_GROUP = pywbem.Uint16(20)
-
- # CIM_StorageConfigurationCapabilities['SupportedStorageElementTypes']
- SCS_CAP_SUP_ST_VOLUME = pywbem.Uint16(2)
- SCS_CAP_SUP_THIN_ST_VOLUME = pywbem.Uint16(5)
-
- # CIM_StorageConfigurationCapabilities['SupportedAsynchronousActions']
- # and also for 'SupportedSynchronousActions'
- SCS_CAP_VOLUME_CREATE = pywbem.Uint16(5)
- SCS_CAP_VOLUME_DELETE = pywbem.Uint16(6)
- SCS_CAP_VOLUME_MODIFY = pywbem.Uint16(7)
-
-
def _dmtf_init_type_to_lsm(cim_init):
if 'IDType' in cim_init:
if cim_init['IDType'] == DMTF.ID_TYPE_WWPN:
@@ -244,7 +184,6 @@ def _lsm_init_type_to_dmtf(init_type):
raise LsmError(ErrorNumber.NO_SUPPORT,
"Does not support provided init_type: %d" % init_type)
-
class SNIA(object):
BLK_ROOT_PROFILE = 'Array'
BLK_SRVS_PROFILE = 'Block Services'
@@ -516,28 +455,6 @@ class Smis(IStorageAreaNetwork):
VOL_OP_STATUS_STARTING,
VOL_OP_STATUS_DORMANT) = (2, 3, 6, 8, 15)
- # SMI-S CIM_ComputerSystem OperationalStatus for system
- class SystemOperationalStatus(object):
- UNKNOWN = 0
- OTHER = 1
- OK = 2
- DEGRADED = 3
- STRESSED = 4
- PREDICTIVE_FAILURE = 5
- ERROR = 6
- NON_RECOVERABLE_ERROR = 7
- STARTING = 8
- STOPPING = 9
- STOPPED = 10
- IN_SERVICE = 11
- NO_CONTACT = 12
- LOST_COMMUNICATION = 13
- ABORTED = 14
- DORMANT = 15
- SUPPORTING_ENTITY_IN_ERROR = 16
- COMPLETED = 17
- POWER_MODE = 18
-
# SMI-S ExposePaths device access enumerations
(EXPOSE_PATHS_DA_READ_WRITE, EXPOSE_PATHS_DA_READ_ONLY) = (2, 3)
@@ -1819,26 +1736,18 @@ class Smis(IStorageAreaNetwork):
status, status_info, system_id)
@staticmethod
- def _cim_sys_2_lsm_sys(cim_sys):
+ def _cim_sys_to_lsm(cim_sys):
# In the case of systems we are assuming that the System Name is
# unique.
status = System.STATUS_UNKNOWN
+ status_info = ''
if 'OperationalStatus' in cim_sys:
- for op_st in cim_sys['OperationalStatus']:
- if op_st == Smis.SystemOperationalStatus.OK:
- status |= System.STATUS_OK
- elif op_st == Smis.SystemOperationalStatus.DEGRADED:
- status |= System.STATUS_DEGRADED
- elif (op_st == Smis.SystemOperationalStatus.ERROR or
- op_st == Smis.SystemOperationalStatus.STRESSED or
- op_st ==
- Smis.SystemOperationalStatus.NON_RECOVERABLE_ERROR):
- status |= System.STATUS_ERROR
- elif op_st == Smis.SystemOperationalStatus.PREDICTIVE_FAILURE:
- status |= System.STATUS_PREDICTIVE_FAILURE
-
- return System(cim_sys['Name'], cim_sys['ElementName'], status, '')
+ (status, status_info) = \
+ DMTF.cim_sys_status_of(cim_sys['OperationalStatus'])
+
+ return System(cim_sys['Name'], cim_sys['ElementName'], status,
+ status_info)
def _cim_sys_pros(self):
"""
@@ -1861,7 +1770,7 @@ class Smis(IStorageAreaNetwork):
cim_sys_pros = self._cim_sys_pros()
cim_syss = self._root_cim_syss(cim_sys_pros)
- return [Smis._cim_sys_2_lsm_sys(s) for s in cim_syss]
+ return [Smis._cim_sys_to_lsm(s) for s in cim_syss]
@handle_cim_errors
def volume_create(self, pool, volume_name, size_bytes, provisioning,
diff --git a/python_binding/lsm/_data.py b/python_binding/lsm/_data.py
index 426b809..990e25c 100644
--- a/python_binding/lsm/_data.py
+++ b/python_binding/lsm/_data.py
@@ -272,79 +272,12 @@ class Volume(IData):
@default_property('status_info', doc="Detail status information of system")
@default_property("plugin_data", doc="Private plugin data")
class System(IData):
- """
-### 11.3 System -- lsm.System
-
-#### 11.3.1 System Properties
- * id
- String. Free form string used to identify certain system at plugin level.
- Plugin can use this property for performance improvement
- when concerting between LSM object to internal object. When displaying this
- property to user, use the ID hashed string(like md5) is suggested.
- * name
- String. Human friendly name for this system.
- * status
- Integer. Byte Map(Check Appendix.D). The health status of system.
- Could be any combination of these values:
- * **lsm.System.STATUS_UNKNOWN**
- Plugin failed to determine the status.
- * **lsm.System.STATUS_OK**
- Everything is OK.
- * **lsm.System.STATUS_ERROR**
- System is having errors which causing 'Data Unavailable' or 'Data Lose'.
- Example:
- * A RAID5 pool lose two disks.
- * All controllers down.
- * Internal hardware(like, memory) down and no redundant part.
- The 'status_info' property will explain the detail.
- * **lsm.System.STATUS_DEGRADED**
- System is still functional but lose protection of redundant parts,
- Example:
- * One or more controller offline, but existing controller is taking
- over all works.
- * A RAID 5 pool lose 1 disk, no spare disk or spare disk is rebuilding.
- * One or more battery changed from online to offline.
- The 'status_info' property will explain the detail.
- * **lsm.System.STATUS_PREDICTIVE_FAILURE**
- System is still functional and protected by redundant parts, but
- certain parts will soon be unfunctional.
- * One or more battery voltage low.
- * SMART information indicate some disk is dieing.
- The 'status_info' property will explain the detail.
- * **lsm.System.STATUS_STRESSED**
- System is having too much I/O in progress or temperature exceeded the
- limit. The 'status_info' property will explain the detail.
- * **lsm.System.STATUS_STARTING**
- System is booting up.
- * **lsm.System.STATUS_STOPPING**
- System is shutting down.
- * **lsm.System.STATUS_STOPPED**
- System is stopped by administrator.
- * **lsm.System.STATUS_OTHER**
- Vendor specifice status. The 'status_info' property will explain the
- detail.
- * status_info
- String. Free form string used for explaining system status. For example:
- "Disk <disk_id> is in Offline state. Battery X is near end of life"
-
-##### 11.3.3 System Extra Constants
-
-The lsm.System class does not have any extra constants.
-
-##### 11.3.4 System Class Methods
-
-The lsm.System class does not have class methods.
- """
STATUS_UNKNOWN = 1 << 0
STATUS_OK = 1 << 1
STATUS_ERROR = 1 << 2
STATUS_DEGRADED = 1 << 3
STATUS_PREDICTIVE_FAILURE = 1 << 4
- STATUS_STRESSED = 1 << 5
- STATUS_STARTING = 1 << 6
- STATUS_STOPPING = 1 << 7
- STATUS_STOPPED = 1 << 8
- STATUS_OTHER = 1 << 9
+ STATUS_OTHER = 1 << 5
def __init__(self, _id, _name, _status, _status_info, _plugin_data=None):
self._id = _id
diff --git a/tools/lsmcli/data_display.py b/tools/lsmcli/data_display.py
index 3c7a83d..4f22812 100644
--- a/tools/lsmcli/data_display.py
+++ b/tools/lsmcli/data_display.py
@@ -80,10 +80,6 @@ _SYSTEM_STATUS_CONV = {
System.STATUS_ERROR: 'Error',
System.STATUS_DEGRADED: 'Degraded',
System.STATUS_PREDICTIVE_FAILURE: 'Predictive failure',
- System.STATUS_STRESSED: 'Stressed',
- System.STATUS_STARTING: 'Starting',
- System.STATUS_STOPPING: 'Stopping',
- System.STATUS_STOPPED: 'Stopped',
System.STATUS_OTHER: 'Other',
}
--
2.1.0