diff --git a/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_base.py b/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_base.py index c4933536225..ff2846b93f3 100644 --- a/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_base.py +++ b/cinder/tests/unit/volume/drivers/netapp/dataontap/test_nfs_base.py @@ -1161,3 +1161,9 @@ class NetAppNfsDriverTestCase(test.TestCase): def test__is_flexgroup_clone_file_supported(self): self.assertRaises(NotImplementedError, self.driver._is_flexgroup_clone_file_supported) + + def test_update_migrated_volume(self): + self.assertRaises(NotImplementedError, + self.driver.update_migrated_volume, self.ctxt, + fake.test_volume, mock.sentinel.new_volume, + mock.sentinel.original_status) diff --git a/cinder/tests/unit/volume/drivers/netapp/fakes.py b/cinder/tests/unit/volume/drivers/netapp/fakes.py index 1ee5b288966..f6dc8db3bdc 100644 --- a/cinder/tests/unit/volume/drivers/netapp/fakes.py +++ b/cinder/tests/unit/volume/drivers/netapp/fakes.py @@ -16,6 +16,7 @@ # under the License. +from cinder.tests.unit import fake_volume from cinder.volume import configuration as conf import cinder.volume.drivers.netapp.options as na_opts @@ -71,13 +72,12 @@ VOLUME_NAME = 'fake_volume_name' VOLUME_ID = 'fake_volume_id' VOLUME_TYPE_ID = 'fake_volume_type_id' -VOLUME = { - 'name': VOLUME_NAME, - 'size': 42, - 'id': VOLUME_ID, - 'host': 'fake_host@fake_backend#fake_pool', - 'volume_type_id': VOLUME_TYPE_ID, -} +VOLUME = fake_volume.fake_volume_obj(None, + name=VOLUME_NAME, + size=42, + id=VOLUME_ID, + host='fake_host@fake_backend#fake_pool', + volume_type_id=VOLUME_TYPE_ID) SNAPSHOT_NAME = 'fake_snapshot_name' SNAPSHOT_ID = 'fake_snapshot_id' diff --git a/cinder/tests/unit/volume/drivers/netapp/test_utils.py b/cinder/tests/unit/volume/drivers/netapp/test_utils.py index cf075d45020..fe24c734109 100644 --- a/cinder/tests/unit/volume/drivers/netapp/test_utils.py +++ b/cinder/tests/unit/volume/drivers/netapp/test_utils.py @@ -557,13 +557,24 @@ class NetAppDriverUtilsTestCase(test.TestCase): self.assertEqual(expected, result) def test_get_qos_policy_group_name_no_id(self): - volume = copy.deepcopy(fake.VOLUME) - del(volume['id']) - - result = na_utils.get_qos_policy_group_name(volume) + delattr(fake.VOLUME, '_obj_id') + try: + result = na_utils.get_qos_policy_group_name(fake.VOLUME) + finally: + fake.VOLUME._obj_id = fake.VOLUME_ID self.assertIsNone(result) + def test_get_qos_policy_group_name_migrated_volume(self): + fake.VOLUME._name_id = 'asdf' + try: + expected = 'openstack-' + fake.VOLUME.name_id + result = na_utils.get_qos_policy_group_name(fake.VOLUME) + finally: + fake.VOLUME._name_id = None + + self.assertEqual(expected, result) + def test_get_qos_policy_group_name_from_info(self): expected = 'openstack-%s' % fake.VOLUME_ID result = na_utils.get_qos_policy_group_name_from_info( diff --git a/cinder/volume/drivers/netapp/dataontap/nfs_base.py b/cinder/volume/drivers/netapp/dataontap/nfs_base.py index d9b49448723..541ed1b1f27 100644 --- a/cinder/volume/drivers/netapp/dataontap/nfs_base.py +++ b/cinder/volume/drivers/netapp/dataontap/nfs_base.py @@ -1223,3 +1223,10 @@ class NetAppNfsDriver(driver.ManageableVD, def _is_flexgroup_clone_file_supported(self): """Check whether storage can perform clone file for FlexGroup""" raise NotImplementedError() + + def update_migrated_volume(self, ctxt, volume, new_volume, + original_volume_status): + # Implemented to prevent NFSDriver's implementation renaming the file + # and breaking volume's backend QoS. + msg = _("The method update_migrated_volume is not implemented.") + raise NotImplementedError(msg) diff --git a/cinder/volume/drivers/netapp/utils.py b/cinder/volume/drivers/netapp/utils.py index 82e465e737d..d30c2cafb20 100644 --- a/cinder/volume/drivers/netapp/utils.py +++ b/cinder/volume/drivers/netapp/utils.py @@ -390,7 +390,7 @@ def map_dict_to_lower(input_dict): def get_qos_policy_group_name(volume): """Return the name of backend QOS policy group based on its volume id.""" if 'id' in volume: - return OPENSTACK_PREFIX + volume['id'] + return OPENSTACK_PREFIX + volume.name_id return None @@ -437,7 +437,7 @@ def get_valid_qos_policy_group_info(volume, extra_specs=None): info = dict(legacy=None, spec=None) try: volume_type = get_volume_type_from_volume(volume) - except KeyError: + except (KeyError, exception.NotFound): LOG.exception('Cannot get QoS spec for volume %s.', volume['id']) return info if volume_type is None: diff --git a/releasenotes/notes/netapp-migrated-qos-c0c8aae50d010c75.yaml b/releasenotes/notes/netapp-migrated-qos-c0c8aae50d010c75.yaml new file mode 100644 index 00000000000..d2d285e8653 --- /dev/null +++ b/releasenotes/notes/netapp-migrated-qos-c0c8aae50d010c75.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + NetApp ONTAP `bug #1906291 + `_: Fix volume losing its + QoS policy on the backend after moving it (migrate or retype with migrate) + to a NetApp NFS backend.