diff --git a/cinder/tests/unit/volume/drivers/dell_emc/vmax/test_vmax.py b/cinder/tests/unit/volume/drivers/dell_emc/vmax/test_vmax.py index f25d49c78b5..cd8c2496721 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/vmax/test_vmax.py +++ b/cinder/tests/unit/volume/drivers/dell_emc/vmax/test_vmax.py @@ -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): diff --git a/cinder/volume/drivers/dell_emc/vmax/common.py b/cinder/volume/drivers/dell_emc/vmax/common.py index 7d491d259d6..02b8081d911 100644 --- a/cinder/volume/drivers/dell_emc/vmax/common.py +++ b/cinder/volume/drivers/dell_emc/vmax/common.py @@ -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: diff --git a/cinder/volume/drivers/dell_emc/vmax/provision.py b/cinder/volume/drivers/dell_emc/vmax/provision.py index b356bbd4ca2..c4a85061528 100644 --- a/cinder/volume/drivers/dell_emc/vmax/provision.py +++ b/cinder/volume/drivers/dell_emc/vmax/provision.py @@ -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: diff --git a/cinder/volume/drivers/dell_emc/vmax/rest.py b/cinder/volume/drivers/dell_emc/vmax/rest.py index 6ce405020ba..726236273f5 100644 --- a/cinder/volume/drivers/dell_emc/vmax/rest.py +++ b/cinder/volume/drivers/dell_emc/vmax/rest.py @@ -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):