No need to detach if there is no attachment

If volume-attachment resource has not been created
successful, no need to enter detach progress when deleting.

Change-Id: Ic5e0146e10b113115dd49e0626897b70ba77d609
Closes-Bug: #1493772
This commit is contained in:
huangtianhua 2015-09-16 17:11:53 +08:00
parent a8ae73b35e
commit a6ebd93119
2 changed files with 33 additions and 7 deletions

View File

@ -181,16 +181,23 @@ class BaseVolumeAttachment(resource.Resource):
return self.client_plugin().check_attach_volume_complete(volume_id)
def handle_delete(self):
server_id = self.properties[self.INSTANCE_ID]
vol_id = self.properties[self.VOLUME_ID]
self.client_plugin('nova').detach_volume(server_id,
self.resource_id)
prg = progress.VolumeDetachProgress(
server_id, vol_id, self.resource_id)
prg.called = True
prg = None
if self.resource_id:
server_id = self.properties[self.INSTANCE_ID]
vol_id = self.properties[self.VOLUME_ID]
self.client_plugin('nova').detach_volume(server_id,
self.resource_id)
prg = progress.VolumeDetachProgress(
server_id, vol_id, self.resource_id)
prg.called = True
return prg
def check_delete_complete(self, prg):
if prg is None:
return True
if not prg.cinder_complete:
prg.cinder_complete = self.client_plugin(
).check_detach_volume_complete(prg.vol_id)

View File

@ -22,6 +22,7 @@ from heat.common import exception
from heat.common import template_format
from heat.engine.clients.os import cinder
from heat.engine.clients.os import glance
from heat.engine.clients.os import nova
from heat.engine.resources.openstack.cinder import volume as c_vol
from heat.engine.resources import scheduler_hints as sh
from heat.engine import rsrc_defn
@ -889,6 +890,24 @@ class CinderVolumeTest(vt_base.BaseVolumeTest):
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
self.m.VerifyAll()
def test_delete_attachment_has_not_been_created(self):
stack_name = 'test_delete_attachment_has_not_been_created'
stack = utils.parse_stack(self.t, stack_name=stack_name)
resource_defn = stack.t.resource_definitions(stack)
att_rsrc = c_vol.CinderVolumeAttachment(
'test_attachment',
resource_defn['attachment'],
stack)
att_rsrc.state_set(att_rsrc.UPDATE, att_rsrc.COMPLETE)
self.assertIsNone(att_rsrc.resource_id)
# assert even not to create the novaclient instance
nc = self.patchobject(nova.NovaClientPlugin, '_create')
scheduler.TaskRunner(att_rsrc.delete)()
self.assertEqual(0, nc.call_count)
self.assertEqual((att_rsrc.DELETE, att_rsrc.COMPLETE), att_rsrc.state)
def test_cinder_create_with_scheduler_hints(self):
fv = vt_base.FakeVolume('creating')