Merge "Fixup handle_create backup restore."
This commit is contained in:
commit
aef9899002
@ -55,7 +55,7 @@ class Volume(resource.Resource):
|
|||||||
if volume_backups is None:
|
if volume_backups is None:
|
||||||
raise exception.Error(
|
raise exception.Error(
|
||||||
'%s not supported' % self._restore_property)
|
'%s not supported' % self._restore_property)
|
||||||
vol_id = cinder.restores.restore(backup_id)['volume_id']
|
vol_id = cinder.restores.restore(backup_id).volume_id
|
||||||
|
|
||||||
vol = cinder.volumes.get(vol_id)
|
vol = cinder.volumes.get(vol_id)
|
||||||
vol.update(
|
vol.update(
|
||||||
@ -77,6 +77,8 @@ class Volume(resource.Resource):
|
|||||||
return True
|
return True
|
||||||
elif vol.status == 'creating':
|
elif vol.status == 'creating':
|
||||||
return False
|
return False
|
||||||
|
elif vol.status == 'restoring-backup':
|
||||||
|
return False
|
||||||
else:
|
else:
|
||||||
raise exception.Error(vol.status)
|
raise exception.Error(vol.status)
|
||||||
|
|
||||||
|
@ -464,20 +464,22 @@ class VolumeTest(HeatTestCase):
|
|||||||
@skipIf(volume_backups is None, 'unable to import volume_backups')
|
@skipIf(volume_backups is None, 'unable to import volume_backups')
|
||||||
def test_create_from_snapshot(self):
|
def test_create_from_snapshot(self):
|
||||||
stack_name = 'test_volume_stack'
|
stack_name = 'test_volume_stack'
|
||||||
fv = FakeVolume('creating', 'available')
|
fv = FakeVolumeFromBackup('restoring-backup', 'available')
|
||||||
|
fvbr = FakeBackupRestore('vol-123')
|
||||||
|
|
||||||
# create script
|
# create script
|
||||||
clients.OpenStackClients.cinder().MultipleTimes().AndReturn(
|
clients.OpenStackClients.cinder().MultipleTimes().AndReturn(
|
||||||
self.cinder_fc)
|
self.cinder_fc)
|
||||||
self.m.StubOutWithMock(self.cinder_fc.restores, 'restore')
|
self.m.StubOutWithMock(self.cinder_fc.restores, 'restore')
|
||||||
self.cinder_fc.restores.restore('backup-123').AndReturn(
|
self.cinder_fc.restores.restore('backup-123').AndReturn(fvbr)
|
||||||
{'volume_id': 'vol-123'})
|
|
||||||
self.cinder_fc.volumes.get('vol-123').AndReturn(fv)
|
self.cinder_fc.volumes.get('vol-123').AndReturn(fv)
|
||||||
self.m.StubOutWithMock(fv, 'update')
|
self.m.StubOutWithMock(fv, 'update')
|
||||||
vol_name = utils.PhysName(stack_name, 'DataVolume')
|
vol_name = utils.PhysName(stack_name, 'DataVolume')
|
||||||
fv.update(
|
fv.update(
|
||||||
display_description=vol_name,
|
display_description=vol_name,
|
||||||
display_name=vol_name)
|
display_name=vol_name)
|
||||||
|
# sleep will be called since backup will not complete right away
|
||||||
|
scheduler.TaskRunner._sleep(mox.IsA(int)).AndReturn(None)
|
||||||
|
|
||||||
self.m.ReplayAll()
|
self.m.ReplayAll()
|
||||||
|
|
||||||
@ -490,6 +492,41 @@ class VolumeTest(HeatTestCase):
|
|||||||
|
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
@skipIf(volume_backups is None, 'unable to import volume_backups')
|
||||||
|
def test_create_from_snapshot_error(self):
|
||||||
|
stack_name = 'test_volume_stack'
|
||||||
|
fv = FakeVolumeFromBackup('restoring-backup', 'error')
|
||||||
|
fvbr = FakeBackupRestore('vol-123')
|
||||||
|
|
||||||
|
# create script
|
||||||
|
clients.OpenStackClients.cinder().MultipleTimes().AndReturn(
|
||||||
|
self.cinder_fc)
|
||||||
|
self.m.StubOutWithMock(self.cinder_fc.restores, 'restore')
|
||||||
|
self.cinder_fc.restores.restore('backup-123').AndReturn(fvbr)
|
||||||
|
self.cinder_fc.volumes.get('vol-123').AndReturn(fv)
|
||||||
|
self.m.StubOutWithMock(fv, 'update')
|
||||||
|
vol_name = utils.PhysName(stack_name, 'DataVolume')
|
||||||
|
fv.update(
|
||||||
|
display_description=vol_name,
|
||||||
|
display_name=vol_name)
|
||||||
|
# sleep will be called since backup will not complete right away
|
||||||
|
scheduler.TaskRunner._sleep(mox.IsA(int)).AndReturn(None)
|
||||||
|
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
t = template_format.parse(volume_template)
|
||||||
|
t['Resources']['DataVolume']['Properties']['SnapshotId'] = 'backup-123'
|
||||||
|
t['Resources']['DataVolume']['Properties']['AvailabilityZone'] = 'nova'
|
||||||
|
stack = parse_stack(t, stack_name=stack_name)
|
||||||
|
|
||||||
|
rsrc = vol.Volume('DataVolume',
|
||||||
|
t['Resources']['DataVolume'],
|
||||||
|
stack)
|
||||||
|
create = scheduler.TaskRunner(rsrc.create)
|
||||||
|
self.assertRaises(exception.ResourceFailure, create)
|
||||||
|
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
def test_cinder_create(self):
|
def test_cinder_create(self):
|
||||||
fv = FakeVolume('creating', 'available')
|
fv = FakeVolume('creating', 'available')
|
||||||
stack_name = 'test_volume_stack'
|
stack_name = 'test_volume_stack'
|
||||||
@ -698,3 +735,24 @@ class FakeVolume:
|
|||||||
class FakeBackup(FakeVolume):
|
class FakeBackup(FakeVolume):
|
||||||
status = 'creating'
|
status = 'creating'
|
||||||
id = 'backup-123'
|
id = 'backup-123'
|
||||||
|
|
||||||
|
|
||||||
|
class FakeBackupRestore(object):
|
||||||
|
volume_id = 'vol-123'
|
||||||
|
|
||||||
|
def __init__(self, volume_id):
|
||||||
|
self.volume_id = volume_id
|
||||||
|
|
||||||
|
|
||||||
|
class FakeVolumeFromBackup(FakeVolume):
|
||||||
|
status = 'restoring-backup'
|
||||||
|
get_call_count = 0
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
# Allow get to be called once without changing the status
|
||||||
|
# This is to allow the check_create_complete method to
|
||||||
|
# check the inital status.
|
||||||
|
if self.get_call_count < 1:
|
||||||
|
self.get_call_count += 1
|
||||||
|
else:
|
||||||
|
self.status = self.final_status
|
||||||
|
Loading…
Reference in New Issue
Block a user