Merge "PowerMax Driver - Replication Settings Fix"

This commit is contained in:
Zuul 2019-02-18 14:50:23 +00:00 committed by Gerrit Code Review
commit 45408cc4d9
5 changed files with 46 additions and 20 deletions

View File

@ -8434,16 +8434,29 @@ class PowerMaxCommonReplicationTest(test.TestCase):
rep_extra_specs2 = self.common._get_replication_extra_specs( rep_extra_specs2 = self.common._get_replication_extra_specs(
extra_specs1, rep_config) extra_specs1, rep_config)
self.assertEqual(ref_specs2, rep_extra_specs2) self.assertEqual(ref_specs2, rep_extra_specs2)
# Path three - slo not valid
extra_specs3 = deepcopy(self.extra_specs) def test_get_replication_extra_specs_powermax(self):
ref_specs3 = deepcopy(ref_specs1) rep_config = self.utils.get_replication_config(
ref_specs3['slo'] = None [self.replication_device])
ref_specs3['workload'] = None rep_specs = deepcopy(self.data.rep_extra_specs2)
extra_specs = deepcopy(self.extra_specs)
# SLO not valid, both SLO and Workload set to NONE
rep_specs['slo'] = None
rep_specs['workload'] = None
with mock.patch.object(self.provision, 'verify_slo_workload', with mock.patch.object(self.provision, 'verify_slo_workload',
return_value=(False, False)): return_value=(False, False)):
rep_extra_specs3 = self.common._get_replication_extra_specs( rep_extra_specs = self.common._get_replication_extra_specs(
extra_specs3, rep_config) extra_specs, rep_config)
self.assertEqual(ref_specs3, rep_extra_specs3) self.assertEqual(rep_specs, rep_extra_specs)
# SL valid, workload invalid, only workload set to NONE
rep_specs['slo'] = 'Diamond'
rep_specs['workload'] = None
with mock.patch.object(self.provision, 'verify_slo_workload',
return_value=(True, False)):
rep_extra_specs = self.common._get_replication_extra_specs(
extra_specs, rep_config)
self.assertEqual(rep_specs, rep_extra_specs)
def test_get_secondary_stats(self): def test_get_secondary_stats(self):
rep_config = self.utils.get_replication_config( rep_config = self.utils.get_replication_config(

View File

@ -184,9 +184,9 @@ class PowerMaxCommon(object):
self.failover = False self.failover = False
self._get_replication_info() self._get_replication_info()
self._get_u4p_failover_info() self._get_u4p_failover_info()
self.nextGen = False
self._gather_info() self._gather_info()
self.version_dict = {} self.version_dict = {}
self.nextGen = False
def _gather_info(self): def _gather_info(self):
"""Gather the relevant information for update_volume_stats.""" """Gather the relevant information for update_volume_stats."""
@ -1651,8 +1651,8 @@ class PowerMaxCommon(object):
:raises: VolumeBackendAPIException: :raises: VolumeBackendAPIException:
""" """
array = extra_specs[utils.ARRAY] array = extra_specs[utils.ARRAY]
self.nextGen = self.rest.is_next_gen_array(array) nextGen = self.rest.is_next_gen_array(array)
if self.nextGen: if nextGen:
extra_specs[utils.WORKLOAD] = 'NONE' extra_specs[utils.WORKLOAD] = 'NONE'
is_valid_slo, is_valid_workload = self.provision.verify_slo_workload( is_valid_slo, is_valid_workload = self.provision.verify_slo_workload(
array, extra_specs[utils.SLO], array, extra_specs[utils.SLO],
@ -3852,15 +3852,17 @@ class PowerMaxCommon(object):
extra_specs[utils.SLO], extra_specs[utils.SLO],
rep_extra_specs[utils.WORKLOAD], rep_extra_specs[utils.WORKLOAD],
rep_extra_specs[utils.SRP])) rep_extra_specs[utils.SRP]))
if not is_valid_slo or not is_valid_workload: if not is_valid_slo:
LOG.warning("The target array does not support the storage " LOG.warning("The target array does not support the "
"pool setting for SLO %(slo)s or workload " "storage pool setting for SLO %(slo)s, "
"%(workload)s. Not assigning any SLO or " "setting to NONE.",
"workload.", {'slo': extra_specs[utils.SLO]})
{'slo': extra_specs[utils.SLO],
'workload': extra_specs[utils.WORKLOAD]})
rep_extra_specs[utils.SLO] = None rep_extra_specs[utils.SLO] = None
if extra_specs[utils.WORKLOAD]: if not is_valid_workload:
LOG.warning("The target array does not support the "
"storage pool setting for workload "
"%(workload)s, setting to NONE.",
{'workload': extra_specs[utils.WORKLOAD]})
rep_extra_specs[utils.WORKLOAD] = None rep_extra_specs[utils.WORKLOAD] = None
return rep_extra_specs return rep_extra_specs

View File

@ -105,6 +105,7 @@ class PowerMaxFCDriver(san.SanDriver, driver.FibreChannelDriver):
(bp/vmax-unisphere-failover) (bp/vmax-unisphere-failover)
- Rebrand from VMAX to PowerMax(bp/vmax-powermax-rebrand) - Rebrand from VMAX to PowerMax(bp/vmax-powermax-rebrand)
- Change from 84 to 90 REST endpoints (bug #1808539) - Change from 84 to 90 REST endpoints (bug #1808539)
- Fix for PowerMax OS replication settings (bug #1812685)
""" """
VERSION = "4.0.0" VERSION = "4.0.0"

View File

@ -110,6 +110,7 @@ class PowerMaxISCSIDriver(san.SanISCSIDriver):
(bp/vmax-unisphere-failover) (bp/vmax-unisphere-failover)
- Rebrand from VMAX to PowerMax(bp/vmax-powermax-rebrand) - Rebrand from VMAX to PowerMax(bp/vmax-powermax-rebrand)
- Change from 84 to 90 REST endpoints (bug #1808539) - Change from 84 to 90 REST endpoints (bug #1808539)
- Fix for PowerMax OS replication settings (bug #1812685)
""" """
VERSION = "4.0.0" VERSION = "4.0.0"

View File

@ -0,0 +1,9 @@
---
fixes:
- When using a PowerMax OS array as a replication target, where the source is
an All-Flash/Hybrid array running HyperMax OS, service level and workload
settings are not correctly applied for devices on the replication target if
a workload is specified. Instead of setting only the workload to None, both
service level and workload are set to None. This fix corrects the
application of service level and workload settings for replication sessions
where the source is HyperMax OS and the target is PowerMax OS.