Merge "VMAX driver - Incorrect service level reporting"

This commit is contained in:
Zuul 2018-06-22 03:09:06 +00:00 committed by Gerrit Code Review
commit f9611c5e2a
4 changed files with 33 additions and 17 deletions

View File

@ -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):

View File

@ -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:

View File

@ -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:

View File

@ -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):