Merge "Add a fullstack test protecting a server which boots from a volume"
This commit is contained in:
commit
9b6ff17882
|
@ -219,15 +219,24 @@ class Server(object):
|
|||
"name": self._name,
|
||||
}
|
||||
|
||||
def create(self, name=None, image=None, flavor=DEFAULT_FLAVOR,
|
||||
def create(self, name=None, image=None, volume=None, flavor=DEFAULT_FLAVOR,
|
||||
network=DEFAULT_NETWORK, timeout=LONG_TIMEOUT):
|
||||
if not image:
|
||||
images = self.glance_client.images.list()
|
||||
for image_iter in images:
|
||||
if image_iter['disk_format'] not in ('aki', 'ari'):
|
||||
image = image_iter['id']
|
||||
break
|
||||
assert image
|
||||
block_device_mapping_v2 = None
|
||||
if volume:
|
||||
block_device_mapping_v2 = [{
|
||||
'uuid': volume,
|
||||
'source_type': 'volume',
|
||||
'destination_type': 'volume',
|
||||
'boot_index': 0,
|
||||
'delete_on_termination': False}]
|
||||
else:
|
||||
if not image:
|
||||
images = self.glance_client.images.list()
|
||||
for image_iter in images:
|
||||
if image_iter['disk_format'] not in ('aki', 'ari'):
|
||||
image = image_iter['id']
|
||||
break
|
||||
assert image
|
||||
flavor = self.nova_client.flavors.find(name=flavor)
|
||||
if name is None:
|
||||
name = "KarborFullstack-Server-{id}".format(
|
||||
|
@ -243,6 +252,7 @@ class Server(object):
|
|||
server = self.nova_client.servers.create(
|
||||
name=name,
|
||||
image=image,
|
||||
block_device_mapping_v2=block_device_mapping_v2,
|
||||
flavor=flavor,
|
||||
nics=[{"net-id": network_id}],
|
||||
)
|
||||
|
@ -296,6 +306,7 @@ class Volume(object):
|
|||
self.id = None
|
||||
self._name = None
|
||||
self.cinder_client = base._get_cinder_client()
|
||||
self.glance_client = base._get_glance_client()
|
||||
|
||||
def _volume_status(self, status=None):
|
||||
try:
|
||||
|
@ -316,7 +327,8 @@ class Volume(object):
|
|||
"extra_info": {'availability_zone': 'az1'},
|
||||
}
|
||||
|
||||
def create(self, size, name=None, timeout=LONG_TIMEOUT):
|
||||
def create(self, size, name=None, create_from_image=False,
|
||||
timeout=LONG_TIMEOUT):
|
||||
if name is None:
|
||||
name = "KarborFullstack-Volume-{id}".format(
|
||||
id=self.__class__._name_id
|
||||
|
@ -324,7 +336,16 @@ class Volume(object):
|
|||
self.__class__._name_id += 1
|
||||
|
||||
self._name = name
|
||||
volume = self.cinder_client.volumes.create(size, name=name)
|
||||
image = None
|
||||
if create_from_image:
|
||||
images = self.glance_client.images.list()
|
||||
for image_iter in images:
|
||||
if image_iter['disk_format'] not in ('aki', 'ari'):
|
||||
image = image_iter['id']
|
||||
break
|
||||
assert image
|
||||
volume = self.cinder_client.volumes.create(size, name=name,
|
||||
imageRef=image)
|
||||
self.id = volume.id
|
||||
utils.wait_until_true(partial(self._volume_status, 'available'),
|
||||
timeout=timeout, sleep=MEDIUM_SLEEP)
|
||||
|
|
|
@ -148,3 +148,35 @@ class CheckpointsTest(karbor_base.KarborBaseTest):
|
|||
backups = self.cinder_client.backups.list(search_opts=search_opts)
|
||||
self.assertEqual(1, len(backups))
|
||||
server.detach_volume(volume.id)
|
||||
|
||||
def test_server_boot_from_volume_with_attached_volume(self):
|
||||
"""Test checkpoint for server with a bootable volume
|
||||
|
||||
Test checkpoint for server which has booted form one bootable
|
||||
volume.
|
||||
"""
|
||||
bootable_volume = self.store(objects.Volume())
|
||||
bootable_volume_id = bootable_volume.create(1, create_from_image=True)
|
||||
volume = self.store(objects.Volume())
|
||||
volume.create(1)
|
||||
server = self.store(objects.Server())
|
||||
server.create(volume=bootable_volume_id)
|
||||
server.attach_volume(volume.id)
|
||||
|
||||
plan = self.store(objects.Plan())
|
||||
plan.create(self.provider_id, [server, ])
|
||||
|
||||
checkpoint = self.store(objects.Checkpoint())
|
||||
checkpoint.create(self.provider_id, plan.id, timeout=2400)
|
||||
|
||||
items = self.karbor_client.checkpoints.list(self.provider_id)
|
||||
ids = [item.id for item in items]
|
||||
self.assertTrue(checkpoint.id in ids)
|
||||
search_opts = {"volume_id": volume.id}
|
||||
backups = self.cinder_client.backups.list(search_opts=search_opts)
|
||||
self.assertEqual(1, len(backups))
|
||||
search_opts = {"volume_id": bootable_volume_id}
|
||||
bootable_backups = self.cinder_client.backups.list(
|
||||
search_opts=search_opts)
|
||||
self.assertEqual(1, len(bootable_backups))
|
||||
server.detach_volume(volume.id)
|
||||
|
|
Loading…
Reference in New Issue