Merge "Don't replace failed volume always"

This commit is contained in:
Jenkins 2016-12-09 08:40:27 +00:00 committed by Gerrit Code Review
commit 5b81b67e1a
3 changed files with 55 additions and 3 deletions

View File

@ -1068,12 +1068,11 @@ class Resource(object):
def needs_replace_failed(self):
"""Needs replace if resource is in *_FAILED."""
if self.status == self.FAILED:
return True
return True
def _needs_update(self, after, before, after_props, before_props,
prev_resource, check_init_complete=True):
if self.needs_replace_failed():
if self.status == self.FAILED and self.needs_replace_failed():
raise UpdateReplace(self)
if (self.stack.convergence and

View File

@ -388,6 +388,16 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin):
LOG.info(_LI('Volume %(id)s backup restore complete'), {'id': vol.id})
return True
def needs_replace_failed(self):
if not self.resource_id:
return True
with self.client_plugin().ignore_not_found:
vol = self.client().volumes.get(self.resource_id)
return vol.status in ('error', 'deleting')
return True
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
vol = None
cinder = self.client()

View File

@ -621,6 +621,49 @@ class CinderVolumeTest(vt_base.BaseVolumeTest):
update_readonly_mock.assert_called_once_with(fv.id, True)
def test_cinder_volume_update_no_need_replace(self):
# update read only access mode
fv = vt_base.FakeVolume('creating')
stack_name = 'test_update_no_need_replace'
cinder.CinderClientPlugin._create().AndReturn(
self.cinder_fc)
vol_name = utils.PhysName(stack_name, 'volume2')
self.cinder_fc.volumes.create(
size=2, availability_zone='nova',
description=None,
name=vol_name,
multiattach=False
).AndReturn(fv)
fv_ready = vt_base.FakeVolume('available', id=fv.id, size=2,
attachments=[])
self.cinder_fc.volumes.get(fv.id).MultipleTimes().AndReturn(fv_ready)
self.cinder_fc.volumes.extend(fv.id, 3)
self.m.ReplayAll()
stack = utils.parse_stack(self.t, stack_name=stack_name)
rsrc = self.create_volume(self.t, stack, 'volume2')
props = copy.deepcopy(rsrc.properties.data)
props['size'] = 1
after = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), props)
update_task = scheduler.TaskRunner(rsrc.update, after)
ex = self.assertRaises(exception.ResourceFailure, update_task)
self.assertEqual((rsrc.UPDATE, rsrc.FAILED), rsrc.state)
self.assertIn("NotSupported: resources.volume2: Shrinking volume is "
"not supported", six.text_type(ex))
props = copy.deepcopy(rsrc.properties.data)
props['size'] = 3
after = rsrc_defn.ResourceDefinition(rsrc.name, rsrc.type(), props)
scheduler.TaskRunner(rsrc.update, after)()
self.assertEqual((rsrc.UPDATE, rsrc.COMPLETE), rsrc.state)
self.m.VerifyAll()
def _update_if_attached(self, stack_name, update_type='resize'):
# create script
self.stub_VolumeConstraint_validate()