From a4305884e529705f5edd98a7f0c13cdd1d472cbc Mon Sep 17 00:00:00 2001 From: Gerald McBrearty Date: Fri, 14 Apr 2017 10:10:23 -0500 Subject: [PATCH] attach_volume first check for existing attachment Attach_volume has logic to check for an existing attachment and return that attachment. Moved this logic before checking to see if the status of the volume is 'is-use'. If a first call to attach fails with a time out, cinderclient will retry the operation therefore attach_volume needs to return the already existing attachment if it exists for this instance. Updated testcase. Change-Id: I86d7f01b6aca376f9d8cf9de6cdfecd436726a0e Closes-bug: 1681543 --- cinder/tests/unit/volume/test_connection.py | 6 ++++++ cinder/volume/manager.py | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/cinder/tests/unit/volume/test_connection.py b/cinder/tests/unit/volume/test_connection.py index 7465f1bb4..f6ca70289 100644 --- a/cinder/tests/unit/volume/test_connection.py +++ b/cinder/tests/unit/volume/test_connection.py @@ -220,6 +220,12 @@ class VolumeAttachDetachTestCase(base.BaseVolumeTestCase): instance_uuid, None, mountpoint, 'ro', volume=volume_passed) + attachment2 = self.volume.attach_volume(self.user_context, + volume_id, + instance_uuid, None, + mountpoint, 'ro', + volume=volume_passed) + self.assertEqual(attachment.id, attachment2.id) vol = objects.Volume.get_by_id(self.context, volume_id) self.assertEqual("in-use", vol.status) self.assertEqual(fields.VolumeAttachStatus.ATTACHED, diff --git a/cinder/volume/manager.py b/cinder/volume/manager.py index a856c44e3..67dcc268d 100644 --- a/cinder/volume/manager.py +++ b/cinder/volume/manager.py @@ -1005,11 +1005,6 @@ class VolumeManager(manager.CleanableManager, raise exception.InvalidVolume( reason=_("being attached by different mode")) - if (volume.status == 'in-use' and not volume.multiattach - and not volume.migration_status): - raise exception.InvalidVolume( - reason=_("volume is already attached")) - host_name_sanitized = utils.sanitize_hostname( host_name) if host_name else None if instance_uuid: @@ -1028,6 +1023,11 @@ class VolumeManager(manager.CleanableManager, volume.save() return attachment + if (volume.status == 'in-use' and not volume.multiattach + and not volume.migration_status): + raise exception.InvalidVolume( + reason=_("volume is already attached")) + self._notify_about_volume_usage(context, volume, "attach.start")