Merge "VMAX driver - Incorrect service level reporting"
This commit is contained in:
commit
f9611c5e2a
cinder
tests/unit/volume/drivers/dell_emc/vmax
volume/drivers/dell_emc/vmax
@ -589,8 +589,10 @@ class VMAXCommonData(object):
|
||||
"remoteSymmetrixID": remote_array}]}}]}}
|
||||
|
||||
workloadtype = {"workloadId": ["OLTP", "OLTP_REP", "DSS", "DSS_REP"]}
|
||||
slo_details = {"sloId": ["Bronze", "Diamond", "Gold",
|
||||
"Optimized", "Platinum", "Silver"]}
|
||||
srp_slo_details = {"serviceLevelDemand": [
|
||||
{"serviceLevelId": "None"}, {"serviceLevelId": "Diamond"},
|
||||
{"serviceLevelId": "Gold"}, {"serviceLevelId": "Optimized"}]}
|
||||
slo_details = ['None', 'Diamond', 'Gold', 'Optimized']
|
||||
|
||||
# replication
|
||||
volume_snap_vx = {"snapshotLnks": [],
|
||||
@ -974,14 +976,14 @@ class FakeRequestsSession(object):
|
||||
return_object = self._sloprovisioning_ig(url)
|
||||
elif 'initiator' in url:
|
||||
return_object = self._sloprovisioning_initiator(url)
|
||||
elif 'service_level_demand_report' in url:
|
||||
return_object = self.data.srp_slo_details
|
||||
elif 'srp' in url:
|
||||
return_object = self.data.srp_details
|
||||
elif 'workloadtype' in url:
|
||||
return_object = self.data.workloadtype
|
||||
elif 'compressionCapable' in url:
|
||||
return_object = self.data.compression_info
|
||||
else:
|
||||
return_object = self.data.slo_details
|
||||
|
||||
elif 'replication' in url:
|
||||
return_object = self._replication(url)
|
||||
@ -1972,8 +1974,8 @@ class VMAXRestTest(test.TestCase):
|
||||
self.assertEqual(ref_details, srp_details)
|
||||
|
||||
def test_get_slo_list(self):
|
||||
ref_settings = self.data.slo_details['sloId']
|
||||
slo_settings = self.rest.get_slo_list(self.data.array)
|
||||
ref_settings = self.data.slo_details
|
||||
slo_settings = self.rest.get_slo_list(self.data.array, self.data.srp)
|
||||
self.assertEqual(ref_settings, slo_settings)
|
||||
|
||||
def test_get_workload_settings(self):
|
||||
|
@ -212,22 +212,26 @@ class VMAXCommon(object):
|
||||
"""
|
||||
try:
|
||||
array = array_info['SerialNumber']
|
||||
srp = array_info['srpName']
|
||||
if self.failover:
|
||||
array = self.active_backend_id
|
||||
# Get the srp slo & workload settings
|
||||
slo_settings = self.rest.get_slo_list(array)
|
||||
slo_settings = self.rest.get_slo_list(array, srp)
|
||||
# Remove 'None' from the list (so a 'None' slo is not combined
|
||||
# with a workload, which is not permitted)
|
||||
slo_settings = [x for x in slo_settings
|
||||
if x.lower() not in ['none', 'optimized']]
|
||||
slo_list = [x for x in slo_settings
|
||||
if x.lower() not in ['none', 'optimized']]
|
||||
workload_settings = self.rest.get_workload_settings(array)
|
||||
workload_settings.append("None")
|
||||
slo_workload_set = set(
|
||||
['%(slo)s:%(workload)s' % {'slo': slo, 'workload': workload}
|
||||
for slo in slo_settings for workload in workload_settings])
|
||||
for slo in slo_list for workload in workload_settings])
|
||||
# Add back in in the only allowed 'None' slo/ workload combination
|
||||
slo_workload_set.add('None:None')
|
||||
slo_workload_set.add('Optimized:None')
|
||||
for x in slo_settings:
|
||||
if 'optimized' == x.lower():
|
||||
slo_workload_set.add('Optimized:None')
|
||||
break
|
||||
|
||||
finalarrayinfolist = []
|
||||
for sloWorkload in slo_workload_set:
|
||||
@ -1536,13 +1540,17 @@ class VMAXCommon(object):
|
||||
elif pool_record.get('ServiceLevel'):
|
||||
slo_from_extra_spec = pool_record['ServiceLevel']
|
||||
workload_from_extra_spec = pool_record.get('Workload', 'None')
|
||||
# If workload is None in cinder.conf, convert to string
|
||||
if not workload_from_extra_spec:
|
||||
workload_from_extra_spec = 'NONE'
|
||||
LOG.info("Pool_name is not present in the extra_specs "
|
||||
"- using slo/ workload from xml file: %(slo)s/%(wl)s.",
|
||||
{'slo': slo_from_extra_spec,
|
||||
'wl': workload_from_extra_spec})
|
||||
|
||||
else:
|
||||
slo_list = self.rest.get_slo_list(pool_record['SerialNumber'])
|
||||
slo_list = self.rest.get_slo_list(
|
||||
pool_record['SerialNumber'], extra_specs[utils.SRP])
|
||||
if 'Optimized' in slo_list:
|
||||
slo_from_extra_spec = 'Optimized'
|
||||
elif 'Diamond' in slo_list:
|
||||
|
@ -436,7 +436,7 @@ class VMAXProvision(object):
|
||||
if slo and slo.lower() == 'none':
|
||||
slo = None
|
||||
|
||||
valid_slos = self.rest.get_slo_list(array)
|
||||
valid_slos = self.rest.get_slo_list(array, srp)
|
||||
valid_workloads = self.rest.get_workload_settings(array)
|
||||
for valid_slo in valid_slos:
|
||||
if slo == valid_slo:
|
||||
|
@ -457,16 +457,22 @@ class VMAXRest(object):
|
||||
resource_name=srp, params=None)
|
||||
return srp_details
|
||||
|
||||
def get_slo_list(self, array):
|
||||
def get_slo_list(self, array, srp):
|
||||
"""Retrieve the list of slo's from the array
|
||||
|
||||
:param array: the array serial number
|
||||
:param srp: return service levels associated with this srp
|
||||
:returns: slo_list -- list of service level names
|
||||
"""
|
||||
slo_list = []
|
||||
slo_dict = self.get_resource(array, SLOPROVISIONING, 'slo')
|
||||
if slo_dict and slo_dict.get('sloId'):
|
||||
slo_list = slo_dict['sloId']
|
||||
res_name = '%s/service_level_demand_report' % srp
|
||||
slo_dict = self.get_resource(array, SLOPROVISIONING, 'srp',
|
||||
resource_name=res_name, version='90')
|
||||
if slo_dict and slo_dict.get('serviceLevelDemand'):
|
||||
for d in slo_dict['serviceLevelDemand']:
|
||||
slo = d.get('serviceLevelId')
|
||||
if slo and slo not in slo_list:
|
||||
slo_list.append(slo)
|
||||
return slo_list
|
||||
|
||||
def get_workload_settings(self, array):
|
||||
|
Loading…
x
Reference in New Issue
Block a user