PowerMax driver - do an rdf_group check earlier

When creating a replicated volume we first create a source volume
before checking that an rdf_group exists.  If an rdf_group does not
exist a lengthy rollback is initiated.  This fix prevents that.

Change-Id: I432cb8c904536d63c1877ee0768f2b979723bc3c
This commit is contained in:
Helen Walsh 2019-01-29 17:39:49 +00:00
parent 75ba4f0db6
commit 306de66ed7
2 changed files with 31 additions and 0 deletions

View File

@ -8325,6 +8325,33 @@ class PowerMaxCommonReplicationTest(test.TestCase):
self.common.create_volume(self.data.test_volume_group_member)
mock_add.assert_called_once()
@mock.patch.object(
common.PowerMaxCommon, '_replicate_volume',
return_value=({
'replication_driver_data':
PowerMaxCommonData.test_volume.replication_driver_data}, {}))
@mock.patch.object(utils.PowerMaxUtils, 'is_replication_enabled',
return_value=True)
@mock.patch.object(rest.PowerMaxRest, 'get_rdf_group_number',
side_effect=['4', None])
def test_create_replicated_vol_side_effect(
self, mock_rdf_no, mock_rep_enabled, mock_rep_vol):
self.common.rep_config = self.utils.get_replication_config(
[self.replication_device])
ref_rep_data = {'array': six.text_type(self.data.remote_array),
'device_id': self.data.device_id2}
ref_model_update = {
'provider_location': six.text_type(
self.data.test_volume.provider_location),
'replication_driver_data': six.text_type(ref_rep_data)}
model_update = self.common.create_volume(self.data.test_volume)
self.assertEqual(ref_model_update, model_update)
self.assertRaises(exception.VolumeBackendAPIException,
self.common.create_volume,
self.data.test_volume)
def test_create_cloned_replicated_volume(self):
extra_specs = deepcopy(self.extra_specs)
extra_specs[utils.PORTGROUPNAME] = self.data.port_group_name_f

View File

@ -419,6 +419,10 @@ class PowerMaxCommon(object):
group_name = None
group_id = None
extra_specs = self._initial_setup(volume)
# Check if the RDF group is valid
if self.utils.is_replication_enabled(extra_specs):
self.get_rdf_details(extra_specs[utils.ARRAY])
if 'qos' in extra_specs:
del extra_specs['qos']