Merge "Check ready status volume before extend volume"

This commit is contained in:
Zuul 2021-04-07 14:12:35 +00:00 committed by Gerrit Code Review
commit d7aee60eec
4 changed files with 52 additions and 3 deletions

View File

@ -129,10 +129,11 @@ class VolumeDeleteProgress(object):
class VolumeResizeProgress(object):
def __init__(self, task_complete=False, size=None):
def __init__(self, task_complete=False, size=None, pre_check=False):
self.called = task_complete
self.complete = task_complete
self.size = size
self.pre_check = pre_check
class VolumeUpdateAccessModeProgress(object):

View File

@ -366,6 +366,16 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin):
return True
def _ready_to_extend_volume(self):
vol = self.client().volumes.get(self.resource_id)
expected_status = (
'available', 'in-use') if vol.multiattach else ('available',)
if vol.status in expected_status:
LOG.debug("Volume %s is ready to extend.", vol.id)
return True
return False
def _check_extend_volume_complete(self):
vol = self.client().volumes.get(self.resource_id)
if vol.status == 'extending':
@ -551,6 +561,13 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin):
return prg_restore.complete and not prg_resize
# resize volume
if prg_resize:
# Make sure volume status ready for resize.
if not prg_resize.pre_check:
prg_resize.pre_check = self._ready_to_extend_volume()
# allow directly extend volume if it's ready
if not prg_resize.pre_check:
return False
if not prg_resize.called:
prg_resize.called = self._extend_volume(prg_resize.size)
return False

View File

@ -93,9 +93,13 @@ class CinderVolumeTest(vt_base.VolumeTestCase):
self.t = template_format.parse(cinder_volume_template)
self.use_cinder = True
def create_volume(self, t, stack, resource_name):
return super(CinderVolumeTest, self).create_volume(
def create_volume(self, t, stack, resource_name,
mock_check_extend_ready=True):
rsrc = super(CinderVolumeTest, self).create_volume(
t, stack, resource_name, validate=False)
if mock_check_extend_ready:
rsrc._ready_to_extend_volume = mock.Mock(return_value=True)
return rsrc
def _mock_create_volume(self, fv, stack_name, size=1,
final_status='available', extra_get_mocks=[],
@ -1375,3 +1379,28 @@ class CinderVolumeTest(vt_base.VolumeTestCase):
name=vol_name,
metadata={}
)
def test_ready_to_extend_volume(self):
self.stack_name = 'test_ready_to_extend_volume'
self._mock_create_volume(vt_base.FakeVolume('creating'),
self.stack_name,
extra_get_mocks=[
vt_base.FakeVolume('extending'),
vt_base.FakeVolume('reserved'),
vt_base.FakeVolume('in-use',
multiattach=True),
vt_base.FakeVolume('in-use',
multiattach=False),
vt_base.FakeVolume('available')])
stack = utils.parse_stack(self.t, stack_name=self.stack_name)
rsrc = self.create_volume(self.t, stack, 'volume',
mock_check_extend_ready=False)
self.assertEqual(False, rsrc._ready_to_extend_volume())
self.assertEqual(False, rsrc._ready_to_extend_volume())
self.assertEqual(True, rsrc._ready_to_extend_volume())
self.assertEqual(False, rsrc._ready_to_extend_volume())
self.assertEqual(True, rsrc._ready_to_extend_volume())

View File

@ -122,6 +122,8 @@ class FakeVolume(object):
def __init__(self, status, **attrs):
self.status = status
self.multiattach = True
for key, value in attrs.items():
setattr(self, key, value)
if 'id' not in attrs: