PowerMax Driver - Replication Settings Fix

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.

Change-Id: Ia5a86eeec0bfff7de1a8f6ade1c16d70cce72160
Closes-Bug: #1812685
This commit is contained in:
Michael McAleer 2019-01-21 15:38:33 +00:00 committed by Helen Walsh
parent c41156434c
commit 9fc3b1ac03
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(
extra_specs1, rep_config)
self.assertEqual(ref_specs2, rep_extra_specs2)
# Path three - slo not valid
extra_specs3 = deepcopy(self.extra_specs)
ref_specs3 = deepcopy(ref_specs1)
ref_specs3['slo'] = None
ref_specs3['workload'] = None
def test_get_replication_extra_specs_powermax(self):
rep_config = self.utils.get_replication_config(
[self.replication_device])
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',
return_value=(False, False)):
rep_extra_specs3 = self.common._get_replication_extra_specs(
extra_specs3, rep_config)
self.assertEqual(ref_specs3, rep_extra_specs3)
rep_extra_specs = self.common._get_replication_extra_specs(
extra_specs, rep_config)
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):
rep_config = self.utils.get_replication_config(

View File

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

View File

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

View File

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