Discussion:
[Libstoragemgmt-devel] [PATCH 0/4] V2 Disk status clean up
Gris Ge
2014-08-26 03:28:36 UTC
Permalink
Removed:
Disk.STATUS_OFFLINE

Added:
Disk.STATUS_REMOVED
Disk.STATUS_MAINTENANCE_MODE
Disk.STATUS_SPARE_DISK
Disk.STATUS_RECONSTRUCT

This patch set is based on:
[PATCH 00/13] Status clean up for System, Pool, volume.
[PATCH 1/3] simarray.py: Fix missing admin_state for volume_replicate
[PATCH 1/2] Get both simc and sim to work with plugin_test.py

Changes in V2:
* Remove debug code(print) from ONTAP plugin.
* Hide non-public constants in ONTAP plugin.

Gris Ge (4):
Python Library: Disk status clean up
C Library: Disk status clean up
SMI-S plugin: Move disk status converting to dmtf.py
ONTAP plugin: Improve disk status and disk type query

.../include/libstoragemgmt/libstoragemgmt_types.h | 18 +++--
plugin/ontap/na.py | 6 +-
plugin/ontap/ontap.py | 80 +++++++++++++++-------
plugin/smispy/dmtf.py | 25 ++++++-
plugin/smispy/smis.py | 56 +--------------
python_binding/lsm/_data.py | 10 ++-
tools/lsmcli/data_display.py | 27 ++++----
7 files changed, 122 insertions(+), 100 deletions(-)
--
1.8.3.1
Gris Ge
2014-08-26 03:28:37 UTC
Permalink
Removed:
Disk.STATUS_OFFLINE
# Blue definition

Added:
Disk.STATUS_REMOVED
# Removed or marked as removed by administrator.

Disk.STATUS_MAINTENANCE_MODE
# Running internal maintenance job. Could be online or stopped meanwhile.
# Example would be NetApp 'disk maint' command.

Disk.STATUS_SPARE_DISK
# Indicate this disk acting as a spare disk.

Disk.STATUS_RECONSTRUCT
# Indicate this disk is reconstructing. Even reconstruction is a status
# of pool, but showing at disk level could provide a much clear view of
# disk replacement or re-syncing.

Signed-off-by: Gris Ge <***@redhat.com>
---
python_binding/lsm/_data.py | 10 +++++++++-
tools/lsmcli/data_display.py | 27 +++++++++++++++------------
2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/python_binding/lsm/_data.py b/python_binding/lsm/_data.py
index 875d773..ef2483d 100644
--- a/python_binding/lsm/_data.py
+++ b/python_binding/lsm/_data.py
@@ -187,11 +187,19 @@ class Disk(IData):
STATUS_OTHER = 1 << 2
STATUS_PREDICTIVE_FAILURE = 1 << 3
STATUS_ERROR = 1 << 4
- STATUS_OFFLINE = 1 << 5
+ STATUS_REMOVED = 1 << 5
STATUS_STARTING = 1 << 6
STATUS_STOPPING = 1 << 7
STATUS_STOPPED = 1 << 8
STATUS_INITIALIZING = 1 << 9
+ STATUS_MAINTENANCE_MODE = 1 << 10
+ # In maintenance for bad sector scan, integerity check and etc
+ # It might be combined with STATUS_OK or
+ # STATUS_STOPPED for online maintenance or offline maintenance.
+ STATUS_SPARE_DISK = 1 << 11
+ # Indicate disk is a spare disk.
+ STATUS_RECONSTRUCT = 1 << 12
+ # Indicate disk is reconstructing data.

def __init__(self, _id, _name, _disk_type, _block_size, _num_of_blocks,
_status, _system_id, _plugin_data=None):
diff --git a/tools/lsmcli/data_display.py b/tools/lsmcli/data_display.py
index 371247d..7f4100e 100644
--- a/tools/lsmcli/data_display.py
+++ b/tools/lsmcli/data_display.py
@@ -161,8 +161,8 @@ def vol_rep_type_str_to_type(vol_rep_type_str):

_DISK_TYPE_CONV = {
Disk.DISK_TYPE_UNKNOWN: 'UNKNOWN',
- Disk.DISK_TYPE_OTHER: 'OTHER',
- Disk.DISK_TYPE_NOT_APPLICABLE: 'NOT_APPLICABLE',
+ Disk.DISK_TYPE_OTHER: 'Other',
+ Disk.DISK_TYPE_NOT_APPLICABLE: 'Not applicable',
Disk.DISK_TYPE_ATA: 'ATA',
Disk.DISK_TYPE_SATA: 'SATA',
Disk.DISK_TYPE_SAS: 'SAS',
@@ -171,7 +171,7 @@ _DISK_TYPE_CONV = {
Disk.DISK_TYPE_NL_SAS: 'NL_SAS',
Disk.DISK_TYPE_HDD: 'HDD',
Disk.DISK_TYPE_SSD: 'SSD',
- Disk.DISK_TYPE_HYBRID: 'HYBRID',
+ Disk.DISK_TYPE_HYBRID: 'Hybrid',
Disk.DISK_TYPE_LUN: 'Remote LUN',
}

@@ -181,16 +181,19 @@ def disk_type_to_str(disk_type):


_DISK_STATUS_CONV = {
- Disk.STATUS_UNKNOWN: 'UNKNOWN',
+ Disk.STATUS_UNKNOWN: 'Unknown',
Disk.STATUS_OK: 'OK',
- Disk.STATUS_OTHER: 'OTHER',
- Disk.STATUS_PREDICTIVE_FAILURE: 'PREDICTIVE_FAILURE',
- Disk.STATUS_ERROR: 'ERROR',
- Disk.STATUS_OFFLINE: 'OFFLINE',
- Disk.STATUS_STARTING: 'STARTING',
- Disk.STATUS_STOPPING: 'STOPPING',
- Disk.STATUS_STOPPED: 'STOPPED',
- Disk.STATUS_INITIALIZING: 'INITIALIZING',
+ Disk.STATUS_OTHER: 'Other',
+ Disk.STATUS_PREDICTIVE_FAILURE: 'Predictive failure',
+ Disk.STATUS_ERROR: 'Error',
+ Disk.STATUS_REMOVED: 'Removed',
+ Disk.STATUS_STARTING: 'Starting',
+ Disk.STATUS_STOPPING: 'Stopping',
+ Disk.STATUS_STOPPED: 'Stopped',
+ Disk.STATUS_INITIALIZING: 'Initializing',
+ Disk.STATUS_MAINTENANCE_MODE: 'Maintenance',
+ Disk.STATUS_SPARE_DISK: 'Spare',
+ Disk.STATUS_RECONSTRUCT: 'Reconstruct',
}
--
1.8.3.1
Gris Ge
2014-08-26 03:28:38 UTC
Permalink
* Sync with python library for constant value.
* Removed:
LSM_DISK_STATUS_OFFLINE
* Added:
LSM_DISK_STATUS_OTHER
LSM_DISK_STATUS_MAINTENANCE_MODE
LSM_DISK_STATUS_SPARE_DISK
LSM_DISK_STATUS_RECONSTRUCT

Signed-off-by: Gris Ge <***@redhat.com>
---
.../include/libstoragemgmt/libstoragemgmt_types.h | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/c_binding/include/libstoragemgmt/libstoragemgmt_types.h b/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
index 8184335..053dec3 100644
--- a/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
+++ b/c_binding/include/libstoragemgmt/libstoragemgmt_types.h
@@ -207,13 +207,17 @@ typedef enum {

#define LSM_DISK_STATUS_UNKNOWN 0x0000000000000001
#define LSM_DISK_STATUS_OK 0x0000000000000002
-#define LSM_DISK_STATUS_PREDICTIVE_FAILURE 0x0000000000000004
-#define LSM_DISK_STATUS_ERROR 0x0000000000000008
-#define LSM_DISK_STATUS_OFFLINE 0x0000000000000010
-#define LSM_DISK_STATUS_STARTING 0x0000000000000020
-#define LSM_DISK_STATUS_STOPPING 0x0000000000000040
-#define LSM_DISK_STATUS_STOPPED 0x0000000000000080
-#define LSM_DISK_STATUS_INITIALIZING 0x0000000000000100
+#define LSM_DISK_STATUS_OTHER 0x0000000000000004
+#define LSM_DISK_STATUS_PREDICTIVE_FAILURE 0x0000000000000008
+#define LSM_DISK_STATUS_ERROR 0x0000000000000010
+#define LSM_DISK_STATUS_STATUS_REMOVED 0x0000000000000020
+#define LSM_DISK_STATUS_STARTING 0x0000000000000040
+#define LSM_DISK_STATUS_STOPPING 0x0000000000000080
+#define LSM_DISK_STATUS_STOPPED 0x0000000000000100
+#define LSM_DISK_STATUS_INITIALIZING 0x0000000000000200
+#define LSM_DISK_STATUS_MAINTENANCE_MODE 0x0000000000000400
+#define LSM_DISK_STATUS_SPARE_DISK 0x0000000000000800
+#define LSM_DISK_STATUS_RECONSTRUCT 0x0000000000001000

#define LSM_DISK_BLOCK_SIZE_NOT_FOUND -1
#define LSM_DISK_BLOCK_COUNT_NOT_FOUND -1
--
1.8.3.1
Gris Ge
2014-08-26 03:28:39 UTC
Permalink
* Just move disk status query to dmtf.py.
* Remove Disk.STATUS_OFFLINE as library required.

Signed-off-by: Gris Ge <***@redhat.com>
---
plugin/smispy/dmtf.py | 25 ++++++++++++++++++++++-
plugin/smispy/smis.py | 56 +--------------------------------------------------
2 files changed, 25 insertions(+), 56 deletions(-)

diff --git a/plugin/smispy/dmtf.py b/plugin/smispy/dmtf.py
index 0a34ddc..7c89ba2 100644
--- a/plugin/smispy/dmtf.py
+++ b/plugin/smispy/dmtf.py
@@ -18,7 +18,7 @@

# This class handle DMTF CIM constants and convert to LSM type.

-from lsm import (System, Pool)
+from lsm import (System, Pool, Disk)
from pywbem import Uint16


@@ -131,6 +131,29 @@ class DMTF(object):
DMTF._LSM_POOL_OP_STATUS_CONV, dmtf_op_status_list,
Pool.STATUS_UNKNOWN, Pool.STATUS_OTHER)

+ EMC_DISK_STATUS_REMOVED = 32768
+
+ _LSM_DISK_OP_STATUS_CONV = {
+ OP_STATUS_UNKNOWN: Disk.STATUS_UNKNOWN,
+ OP_STATUS_OK: Disk.STATUS_OK,
+ OP_STATUS_PREDICTIVE_FAILURE: Disk.STATUS_PREDICTIVE_FAILURE,
+ OP_STATUS_ERROR: Disk.STATUS_ERROR,
+ OP_STATUS_NON_RECOVERABLE_ERROR: Disk.STATUS_ERROR,
+ OP_STATUS_STARTING: Disk.STATUS_STARTING,
+ OP_STATUS_STOPPING: Disk.STATUS_STOPPING,
+ OP_STATUS_STOPPED: Disk.STATUS_STOPPED,
+ }
+
+ @staticmethod
+ def cim_disk_status_of(dmtf_op_status_list):
+ """
+ Convert CIM_DiskDrive['OperationalStatus'] to LSM
+ Only return status, no status_info
+ """
+ return DMTF._dmtf_op_status_list_conv(
+ DMTF._LSM_DISK_OP_STATUS_CONV, dmtf_op_status_list,
+ Disk.STATUS_UNKNOWN, Disk.STATUS_OTHER)[0]
+

# CIM_StorageHardwareID['IDType']
ID_TYPE_OTHER = Uint16(1)
diff --git a/plugin/smispy/smis.py b/plugin/smispy/smis.py
index 8dbf3e4..41cf94e 100644
--- a/plugin/smispy/smis.py
+++ b/plugin/smispy/smis.py
@@ -318,37 +318,6 @@ class Smis(IStorageAreaNetwork):
DMTF_STATUS_COMPLETED = 17
DMTF_STATUS_POWER_MODE = 18

- _DMTF_STATUS_TO_DISK_STATUS = {
- DMTF_STATUS_UNKNOWN: Disk.STATUS_UNKNOWN,
- DMTF_STATUS_OTHER: Disk.STATUS_OTHER,
- DMTF_STATUS_OK: Disk.STATUS_OK,
- DMTF_STATUS_DEGRADED: Disk.STATUS_OTHER,
- DMTF_STATUS_STRESSED: Disk.STATUS_OTHER,
- DMTF_STATUS_PREDICTIVE_FAILURE: Disk.STATUS_PREDICTIVE_FAILURE,
- DMTF_STATUS_ERROR: Disk.STATUS_ERROR,
- DMTF_STATUS_NON_RECOVERABLE_ERROR: Disk.STATUS_ERROR,
- DMTF_STATUS_STARTING: Disk.STATUS_STARTING,
- DMTF_STATUS_STOPPING: Disk.STATUS_STOPPING,
- DMTF_STATUS_STOPPED: Disk.STATUS_STOPPED,
- DMTF_STATUS_IN_SERVICE: Disk.STATUS_OTHER,
- DMTF_STATUS_NO_CONTACT: Disk.STATUS_OTHER,
- DMTF_STATUS_LOST_COMMUNICATION: Disk.STATUS_OTHER,
- DMTF_STATUS_DORMANT: Disk.STATUS_OFFLINE,
- DMTF_STATUS_SUPPORTING_ENTITY_IN_ERROR: Disk.STATUS_OTHER,
- DMTF_STATUS_COMPLETED: Disk.STATUS_OTHER,
- DMTF_STATUS_POWER_MODE: Disk.STATUS_OTHER,
- }
-
- _DMTF_STATUS_TO_DISK_STATUS_INFO = {
- DMTF_STATUS_DORMANT: 'Dormant',
- DMTF_STATUS_IN_SERVICE: 'In service',
- DMTF_STATUS_NO_CONTACT: 'No contact',
- DMTF_STATUS_LOST_COMMUNICATION: 'Lost communication',
- DMTF_STATUS_SUPPORTING_ENTITY_IN_ERROR: 'Supporting entity in error',
- DMTF_STATUS_COMPLETED: 'Completed',
- DMTF_STATUS_POWER_MODE: 'Power mode',
- }
-
# DSP 1033 Profile Registration
DMTF_INTEROP_NAMESPACES = ['interop', 'root/interop']
SMIS_DEFAULT_NAMESPACE = 'interop'
@@ -3069,29 +3038,6 @@ class Smis(IStorageAreaNetwork):
"""
return ['BlockSize', 'NumberOfBlocks']

- @staticmethod
- def _disk_status_of(cim_disk):
- """
- Converting CIM_StorageDisk['OperationalStatus'] LSM Disk.status.
- This might change since OperationalStatus does not provide enough
- information.
- Return (status, status_info)
- """
- status = Disk.STATUS_UNKNOWN
- status_info = []
- dmtf_statuses = cim_disk['OperationalStatus']
- for dmtf_status in dmtf_statuses:
- if dmtf_status in Smis._DMTF_STATUS_TO_DISK_STATUS.keys():
- lsm_status = Smis._DMTF_STATUS_TO_DISK_STATUS[dmtf_status]
- if status == Disk.STATUS_UNKNOWN:
- status = lsm_status
- else:
- status |= lsm_status
- if dmtf_status in Smis._DMTF_STATUS_TO_DISK_STATUS_INFO.keys():
- status_info.append(
- Smis._DMTF_STATUS_TO_DISK_STATUS_INFO[dmtf_status])
- return (status, ", ".join(status_info))
-
def _new_disk(self, cim_disk, cim_ext):
"""
Takes a CIM_DiskDrive and CIM_StorageExtent, returns a lsm Disk
@@ -3109,7 +3055,7 @@ class Smis(IStorageAreaNetwork):
# These are mandatory
# we do not check whether they follow the SNIA standard.
if 'OperationalStatus' in cim_disk:
- (status, status_info) = Smis._disk_status_of(cim_disk)
+ status = DMTF.cim_disk_status_of(cim_disk['OperationalStatus'])
if 'Name' in cim_disk:
name = cim_disk["Name"]
if 'BlockSize' in cim_ext:
--
1.8.3.1
Gris Ge
2014-08-26 03:28:40 UTC
Permalink
* Fix a trivial problem when no volume/LUN.
* Improve disk type query by using 'effective-disk-type'.
NetApp allowing disks with the same 'effective-disk-type' to create
aggregate(Pool).
* Improve disk status.
* Tested in ONTAP simulator for all coded status except this:
Disk.STATUS_ERROR
# I cannot actually broke a disk in ONTAP simulator.

Changes in V2:
* Remove debug code(print) from ONTAP plugin.
* Hide non-public constants in ONTAP plugin.

Signed-off-by: Gris Ge <***@redhat.com>
---
plugin/ontap/na.py | 6 +++-
plugin/ontap/ontap.py | 80 ++++++++++++++++++++++++++++++++++++---------------
2 files changed, 62 insertions(+), 24 deletions(-)

diff --git a/plugin/ontap/na.py b/plugin/ontap/na.py
index 89d58c1..4fd1bc2 100644
--- a/plugin/ontap/na.py
+++ b/plugin/ontap/na.py
@@ -278,7 +278,11 @@ class Filer(object):
"""
Return all lun-info
"""
- return to_list(self._invoke('lun-list-info')['luns']['lun-info'])
+ try:
+ return to_list(self._invoke('lun-list-info')['luns']['lun-info'])
+ except TypeError:
+ # No LUN found.
+ return []

def lun_create(self, full_path_name, size_bytes):
"""
diff --git a/plugin/ontap/ontap.py b/plugin/ontap/ontap.py
index bb76a11..c13caec 100644
--- a/plugin/ontap/ontap.py
+++ b/plugin/ontap/ontap.py
@@ -197,18 +197,31 @@ class Ontap(IStorageAreaNetwork, INfs):
return FsSnapshot(md5(s['name'] + s['access-time']), s['name'],
s['access-time'])

+ _NA_DISK_TYPE_TO_LSM = {
+ 'ATA': Disk.DISK_TYPE_ATA,
+ 'BSAS': Disk.DISK_TYPE_SATA,
+ 'EATA': Disk.DISK_TYPE_ATA,
+ 'FCAL': Disk.DISK_TYPE_FC,
+ 'FSAS': Disk.DISK_TYPE_NL_SAS,
+ 'LUN': Disk.DISK_TYPE_OTHER,
+ 'MSATA': Disk.DISK_TYPE_SATA,
+ 'SAS': Disk.DISK_TYPE_SAS,
+ 'SATA': Disk.DISK_TYPE_SATA,
+ 'SCSI': Disk.DISK_TYPE_SCSI,
+ 'SSD': Disk.DISK_TYPE_SSD,
+ 'XATA': Disk.DISK_TYPE_ATA,
+ 'XSAS': Disk.DISK_TYPE_SAS,
+ 'unknown': Disk.DISK_TYPE_UNKNOWN,
+ }
+
@staticmethod
- def _disk_type(netapp_disk_type):
- conv = {'ATA': Disk.DISK_TYPE_ATA, 'BSAS': Disk.DISK_TYPE_SAS,
- 'EATA': Disk.DISK_TYPE_ATA, 'FCAL': Disk.DISK_TYPE_FC,
- 'FSAS': Disk.DISK_TYPE_SAS, 'LUN': Disk.DISK_TYPE_LUN,
- 'SAS': Disk.DISK_TYPE_SAS, 'SATA': Disk.DISK_TYPE_SATA,
- 'SCSI': Disk.DISK_TYPE_SCSI, 'SSD': Disk.DISK_TYPE_SSD,
- 'XATA': Disk.DISK_TYPE_ATA, 'XSAS': Disk.DISK_TYPE_SAS,
- 'unknown': Disk.DISK_TYPE_UNKNOWN}
-
- if netapp_disk_type in conv:
- return conv[netapp_disk_type]
+ def _disk_type_of(na_disk):
+ """
+ Convert na_disk['effective-disk-type'] to LSM disk type.
+ """
+ na_disk_type = na_disk['effective-disk-type']
+ if na_disk_type in Ontap._NA_DISK_TYPE_TO_LSM.keys():
+ return Ontap._NA_DISK_TYPE_TO_LSM[na_disk_type]
return Disk.DISK_TYPE_UNKNOWN

@staticmethod
@@ -225,26 +238,48 @@ class Ontap(IStorageAreaNetwork, INfs):
TODO: API document does not provide enough explaination.
Need lab test to verify.
"""
- status = Disk.STATUS_OK
+ status = 0

if 'raid-state' in na_disk:
rs = na_disk['raid-state']
if rs == "broken":
- status = Disk.STATUS_ERROR
+ if na_disk['broken-details'] == 'admin removed' or \
+ na_disk['broken-details'] == 'admin failed':
+ status |= Disk.STATUS_REMOVED
+ elif na_disk['broken-details'] == 'admin testing':
+ status |= Disk.STATUS_STOPPED | \
+ Disk.STATUS_MAINTENANCE_MODE
+ else:
+ status |= Disk.STATUS_ERROR
elif rs == "unknown":
- status = Disk.STATUS_UNKNOWN
+ status |= Disk.STATUS_UNKNOWN
elif rs == 'zeroing':
- status = Disk.STATUS_INITIALIZING
- elif rs == 'reconstructing':
+ status |= Disk.STATUS_INITIALIZING | Disk.STATUS_SPARE_DISK
+ elif rs == 'reconstructing' or rs == 'copy':
# "reconstructing' should be a pool status, not disk status.
# disk under reconstructing should be considered as OK.
- status = Disk.STATUS_OK
+ status |= Disk.STATUS_OK | Disk.STATUS_RECONSTRUCT
+ elif rs == 'spare':
+ if 'is-zeroed' in na_disk and na_disk['is-zeroed'] == 'true':
+ status |= Disk.STATUS_OK | Disk.STATUS_SPARE_DISK
+ else:
+ status |= Disk.STATUS_STOPPED | Disk.STATUS_SPARE_DISK
+ elif rs == 'present':
+ status |= Disk.STATUS_OK
+ elif rs == 'partner':
+ # Before we have good way to connect two controller,
+ # we have to mark partner disk as OTHER
+ status |= Disk.STATUS_OTHER

if 'is-prefailed' in na_disk and na_disk['is-prefailed'] == 'true':
- status = Disk.STATUS_PREDICTIVE_FAILURE
+ status |= Disk.STATUS_STOPPING

if 'is-offline' in na_disk and na_disk['is-offline'] == 'true':
- status = Disk.STATUS_ERROR
+ status |= Disk.STATUS_ERROR
+
+ if status == 0:
+ status = Disk.STATUS_UNKNOWN
+
return status

@staticmethod
@@ -267,7 +302,7 @@ class Ontap(IStorageAreaNetwork, INfs):
def _disk(self, d, flag):
status = Ontap._status_of_na_disk(d)
return Disk(self._disk_id(d), d['name'],
- Ontap._disk_type(d['disk-type']),
+ Ontap._disk_type_of(d),
int(d['bytes-per-sector']), int(d['physical-blocks']),
status, self.sys_info.id)

@@ -327,7 +362,6 @@ class Ontap(IStorageAreaNetwork, INfs):
"current node from another node. "
}

-
@staticmethod
def _status_of_na_aggr(na_aggr):
"""
@@ -338,7 +372,7 @@ class Ontap(IStorageAreaNetwork, INfs):
status = 0
status_info = ''
na_aggr_raid_status_list = list(
- x.strip() for x in na_aggr['raid-status'].split(',') )
+ x.strip() for x in na_aggr['raid-status'].split(','))
for na_aggr_raid_status in na_aggr_raid_status_list:
if na_aggr_raid_status in Ontap._AGGR_RAID_STATUS_CONV.keys():
status |= Ontap._AGGR_RAID_STATUS_CONV[na_aggr_raid_status]
@@ -566,7 +600,7 @@ class Ontap(IStorageAreaNetwork, INfs):
if pool is None or self._volume_on_aggr(pool, volume_src):
#Thin provision copy the logical unit
dest = os.path.dirname(_lsm_vol_to_na_vol_path(volume_src)) + '/' \
- + name
+ + name
self.f.clone(_lsm_vol_to_na_vol_path(volume_src), dest)
return None, self._get_volume(dest, volume_src.pool_id)
else:
--
1.8.3.1
Tony Asleson
2014-08-26 14:37:51 UTC
Permalink
Patch series committed.

Thanks,
Tony
Post by Gris Ge
Disk.STATUS_OFFLINE
Disk.STATUS_REMOVED
Disk.STATUS_MAINTENANCE_MODE
Disk.STATUS_SPARE_DISK
Disk.STATUS_RECONSTRUCT
[PATCH 00/13] Status clean up for System, Pool, volume.
[PATCH 1/3] simarray.py: Fix missing admin_state for volume_replicate
[PATCH 1/2] Get both simc and sim to work with plugin_test.py
* Remove debug code(print) from ONTAP plugin.
* Hide non-public constants in ONTAP plugin.
Python Library: Disk status clean up
C Library: Disk status clean up
SMI-S plugin: Move disk status converting to dmtf.py
ONTAP plugin: Improve disk status and disk type query
.../include/libstoragemgmt/libstoragemgmt_types.h | 18 +++--
plugin/ontap/na.py | 6 +-
plugin/ontap/ontap.py | 80 +++++++++++++++-------
plugin/smispy/dmtf.py | 25 ++++++-
plugin/smispy/smis.py | 56 +--------------
python_binding/lsm/_data.py | 10 ++-
tools/lsmcli/data_display.py | 27 ++++----
7 files changed, 122 insertions(+), 100 deletions(-)
Loading...