diff --git a/heat/engine/volume_tasks.py b/heat/engine/volume_tasks.py index e2d8377d9e..e19f9bd524 100644 --- a/heat/engine/volume_tasks.py +++ b/heat/engine/volume_tasks.py @@ -174,6 +174,9 @@ class VolumeDetachTask(object): else: raise + if vol.status == 'deleting': + return + # detach the volume using volume_attachment try: server_api.delete_server_volume(self.server_id, self.attachment_id) @@ -193,7 +196,7 @@ class VolumeDetachTask(object): LOG.info(_LI('%(name)s - status: %(status)s'), {'name': str(self), 'status': vol.status}) - if vol.status != 'available': + if vol.status not in ['available', 'deleting']: LOG.info(_LI("Detachment failed - volume %(vol)s " "is in %(status)s status"), {"vol": vol.id, diff --git a/heat/tests/aws/test_volume.py b/heat/tests/aws/test_volume.py index 9044dc9a5a..64e6fc443e 100644 --- a/heat/tests/aws/test_volume.py +++ b/heat/tests/aws/test_volume.py @@ -322,6 +322,30 @@ class VolumeTest(vt_base.BaseVolumeTest): self.m.VerifyAll() + def test_volume_detach_deleting_volume(self): + fv = vt_base.FakeVolume('creating') + fva = vt_base.FakeVolume('deleting') + stack_name = 'test_volume_detach_deleting_volume_stack' + + self._mock_create_volume(fv, stack_name) + self._mock_create_server_volume_script(fva) + self.stub_VolumeConstraint_validate() + # delete script + self.fc.volumes.get_server_volume(u'WikiDatabase', + 'vol-123').AndReturn(fva) + self.cinder_fc.volumes.get(fva.id).AndReturn(fva) + + self.m.ReplayAll() + + stack = utils.parse_stack(self.t, stack_name=stack_name) + + self.create_volume(self.t, stack, 'DataVolume') + rsrc = self.create_attachment(self.t, stack, 'MountPoint') + + scheduler.TaskRunner(rsrc.delete)() + + self.m.VerifyAll() + def test_volume_detach_with_latency(self): stack_name = 'test_volume_detach_latency_stack'