'SnapshotId': {'Type': 'String'},
'Tags': {'Type': 'List'}}
- def __init__(self, name, json_snippet, stack):
- super(Volume, self).__init__(name, json_snippet, stack)
-
def handle_create(self):
- vol = self.cinder().volumes.create(
- self.properties['Size'],
- display_name=self.physical_resource_name(),
- display_description=self.physical_resource_name())
+ backup_id = self.properties.get('SnapshotId')
+ cinder = self.cinder()
+ if backup_id is not None:
+ if volume_backups is None:
+ raise exception.Error('SnapshotId not supported')
+ vol_id = cinder.restores.restore(backup_id)['volume_id']
+
+ vol = cinder.volumes.get(vol_id)
+ vol.update(
+ display_name=self.physical_resource_name(),
+ display_description=self.physical_resource_name())
+ else:
+ vol = cinder.volumes.create(
+ self.properties['Size'],
+ display_name=self.physical_resource_name(),
+ display_description=self.physical_resource_name())
while vol.status == 'creating':
eventlet.sleep(1)
self.m.VerifyAll()
+ def test_create_from_snapshot(self):
+ stack_name = 'test_volume_stack'
+ fv = FakeVolume('creating', 'available')
+
+ # 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(
+ {'volume_id': 'vol-123'})
+ self.cinder_fc.volumes.get('vol-123').AndReturn(fv)
+ self.m.StubOutWithMock(fv, 'update')
+ fv.update(
+ display_description='%s.DataVolume' % stack_name,
+ display_name='%s.DataVolume' % stack_name)
+ eventlet.sleep(1).AndReturn(None)
+
+ self.m.ReplayAll()
+
+ t = self.load_template()
+ t['Resources']['DataVolume']['Properties']['SnapshotId'] = 'backup-123'
+ stack = self.parse_stack(t, stack_name)
+
+ self.create_volume(t, stack, 'DataVolume')
+ self.assertEqual(fv.status, 'available')
+
+ self.m.VerifyAll()
+
class FakeVolume:
status = 'attaching'
def get(self):
self.status = self.final_status
+ def update(self, **kw):
+ pass
+
class FakeBackup(FakeVolume):
status = 'creating'