Merge "Check ready status volume before extend volume"
This commit is contained in:
commit
d7aee60eec
|
@ -129,10 +129,11 @@ class VolumeDeleteProgress(object):
|
||||||
|
|
||||||
|
|
||||||
class VolumeResizeProgress(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.called = task_complete
|
||||||
self.complete = task_complete
|
self.complete = task_complete
|
||||||
self.size = size
|
self.size = size
|
||||||
|
self.pre_check = pre_check
|
||||||
|
|
||||||
|
|
||||||
class VolumeUpdateAccessModeProgress(object):
|
class VolumeUpdateAccessModeProgress(object):
|
||||||
|
|
|
@ -366,6 +366,16 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin):
|
||||||
|
|
||||||
return True
|
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):
|
def _check_extend_volume_complete(self):
|
||||||
vol = self.client().volumes.get(self.resource_id)
|
vol = self.client().volumes.get(self.resource_id)
|
||||||
if vol.status == 'extending':
|
if vol.status == 'extending':
|
||||||
|
@ -551,6 +561,13 @@ class CinderVolume(vb.BaseVolume, sh.SchedulerHintsMixin):
|
||||||
return prg_restore.complete and not prg_resize
|
return prg_restore.complete and not prg_resize
|
||||||
# resize volume
|
# resize volume
|
||||||
if prg_resize:
|
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:
|
if not prg_resize.called:
|
||||||
prg_resize.called = self._extend_volume(prg_resize.size)
|
prg_resize.called = self._extend_volume(prg_resize.size)
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -93,9 +93,13 @@ class CinderVolumeTest(vt_base.VolumeTestCase):
|
||||||
self.t = template_format.parse(cinder_volume_template)
|
self.t = template_format.parse(cinder_volume_template)
|
||||||
self.use_cinder = True
|
self.use_cinder = True
|
||||||
|
|
||||||
def create_volume(self, t, stack, resource_name):
|
def create_volume(self, t, stack, resource_name,
|
||||||
return super(CinderVolumeTest, self).create_volume(
|
mock_check_extend_ready=True):
|
||||||
|
rsrc = super(CinderVolumeTest, self).create_volume(
|
||||||
t, stack, resource_name, validate=False)
|
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,
|
def _mock_create_volume(self, fv, stack_name, size=1,
|
||||||
final_status='available', extra_get_mocks=[],
|
final_status='available', extra_get_mocks=[],
|
||||||
|
@ -1375,3 +1379,28 @@ class CinderVolumeTest(vt_base.VolumeTestCase):
|
||||||
name=vol_name,
|
name=vol_name,
|
||||||
metadata={}
|
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())
|
||||||
|
|
|
@ -122,6 +122,8 @@ class FakeVolume(object):
|
||||||
|
|
||||||
def __init__(self, status, **attrs):
|
def __init__(self, status, **attrs):
|
||||||
self.status = status
|
self.status = status
|
||||||
|
self.multiattach = True
|
||||||
|
|
||||||
for key, value in attrs.items():
|
for key, value in attrs.items():
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
if 'id' not in attrs:
|
if 'id' not in attrs:
|
||||||
|
|
Loading…
Reference in New Issue