Don't replace failed volume always
Overide needs_replace_failed() to decide whether to replace the volume resource if it's in *_FAILED. Change-Id: I7c0f0de2e251f1ba695f8b5566c96d659bb66e20 Closes-Bug: #1490134
This commit is contained in:
parent
592d7c5aa6
commit
ca71c69667
@ -1068,12 +1068,11 @@ class Resource(object):
|
|||||||
|
|
||||||
def needs_replace_failed(self):
|
def needs_replace_failed(self):
|
||||||
"""Needs replace if resource is in *_FAILED."""
|
"""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,
|
def _needs_update(self, after, before, after_props, before_props,
|
||||||
prev_resource, check_init_complete=True):
|
prev_resource, check_init_complete=True):
|
||||||
if self.needs_replace_failed():
|
if self.status == self.FAILED and self.needs_replace_failed():
|
||||||
raise UpdateReplace(self)
|
raise UpdateReplace(self)
|
||||||
|
|
||||||
if (self.stack.convergence and
|
if (self.stack.convergence and
|
||||||
|
@ -388,6 +388,16 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin):
|
|||||||
LOG.info(_LI('Volume %(id)s backup restore complete'), {'id': vol.id})
|
LOG.info(_LI('Volume %(id)s backup restore complete'), {'id': vol.id})
|
||||||
return True
|
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):
|
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
|
||||||
vol = None
|
vol = None
|
||||||
cinder = self.client()
|
cinder = self.client()
|
||||||
|
@ -621,6 +621,49 @@ class CinderVolumeTest(vt_base.BaseVolumeTest):
|
|||||||
|
|
||||||
update_readonly_mock.assert_called_once_with(fv.id, True)
|
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'):
|
def _update_if_attached(self, stack_name, update_type='resize'):
|
||||||
# create script
|
# create script
|
||||||
self.stub_VolumeConstraint_validate()
|
self.stub_VolumeConstraint_validate()
|
||||||
|
Loading…
Reference in New Issue
Block a user