From 8aa6d328f57b8981397751465d9d3d415a1d327a Mon Sep 17 00:00:00 2001 From: odonos12 Date: Wed, 4 Mar 2020 12:40:55 +0000 Subject: [PATCH] PowerMax Driver - Replication array serial check Add a check during common.py __init__ to compare serial numbers of local and remote replication arrays to prevent the user from defining the same array for both R1 and R2 sides. Change-Id: I83a712c739c315422e157f91cad1b87c01fb9cbc --- .../dell_emc/powermax/test_powermax_common.py | 21 +++++++++++++++++++ .../drivers/dell_emc/powermax/common.py | 15 ++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_common.py b/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_common.py index 563bdc0a6f2..08ff90f82ac 100644 --- a/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_common.py +++ b/cinder/tests/unit/volume/drivers/dell_emc/powermax/test_powermax_common.py @@ -84,6 +84,27 @@ class PowerMaxCommonTest(test.TestCase): self.assertTrue(self.common.next_gen) self.assertEqual(self.common.ucode_level, self.data.next_gen_ucode) + @mock.patch.object(rest.PowerMaxRest, 'get_array_ucode_version', + return_value=tpd.PowerMaxData.next_gen_ucode) + @mock.patch.object(rest.PowerMaxRest, 'get_array_model_info', + return_value=('PowerMax 2000', True)) + @mock.patch.object(rest.PowerMaxRest, 'set_rest_credentials') + @mock.patch.object( + common.PowerMaxCommon, 'get_attributes_from_cinder_config', + return_value={'SerialNumber': tpd.PowerMaxData.array}) + @mock.patch.object( + common.PowerMaxCommon, '_get_attributes_from_config') + def test_gather_info_rep_enabled_duplicate_serial_numbers( + self, mck_get_cnf, mck_get_c_cnf, mck_set, mck_model, mck_ucode): + is_enabled = self.common.replication_enabled + targets = self.common.replication_targets + self.common.replication_enabled = True + self.common.replication_targets = [self.data.array] + self.assertRaises( + exception.InvalidConfigurationValue, self.common._gather_info) + self.common.replication_enabled = is_enabled + self.common.replication_targets = targets + @mock.patch.object(common.PowerMaxCommon, '_gather_info') def test_get_attributes_from_config_short_host_template( diff --git a/cinder/volume/drivers/dell_emc/powermax/common.py b/cinder/volume/drivers/dell_emc/powermax/common.py index 4326c18c348..ae2eea00ad7 100644 --- a/cinder/volume/drivers/dell_emc/powermax/common.py +++ b/cinder/volume/drivers/dell_emc/powermax/common.py @@ -211,10 +211,19 @@ class PowerMaxCommon(object): "longer supported.") self.rest.set_rest_credentials(array_info) if array_info: + serial_number = array_info['SerialNumber'] self.array_model, self.next_gen = ( - self.rest.get_array_model_info(array_info['SerialNumber'])) - self.ucode_level = self.rest.get_array_ucode_version( - array_info['SerialNumber']) + self.rest.get_array_model_info(serial_number)) + self.ucode_level = self.rest.get_array_ucode_version(serial_number) + if self.replication_enabled: + if serial_number in self.replication_targets: + msg = (_("The same array serial number (%s) is defined " + "for powermax_array and replication_device in " + "cinder.conf. Please ensure your " + "target_device_id points to a different " + "array." % serial_number)) + LOG.error(msg) + raise exception.InvalidConfigurationValue(msg) finalarrayinfolist = self._get_slo_workload_combinations( array_info) self.pool_info['arrays_info'] = finalarrayinfolist