test_cloud: an unit test for describe image with block device mapping
This commit is contained in:
@@ -323,6 +323,135 @@ class CloudTestCase(test.TestCase):
|
|||||||
self.assertRaises(exception.ImageNotFound, describe_images,
|
self.assertRaises(exception.ImageNotFound, describe_images,
|
||||||
self.context, ['ami-fake'])
|
self.context, ['ami-fake'])
|
||||||
|
|
||||||
|
def assertDictListUnorderedMatch(self, L1, L2, key):
|
||||||
|
self.assertEqual(len(L1), len(L2))
|
||||||
|
for d1 in L1:
|
||||||
|
self.assertTrue(key in d1)
|
||||||
|
for d2 in L2:
|
||||||
|
self.assertTrue(key in d2)
|
||||||
|
if d1[key] == d2[key]:
|
||||||
|
self.assertDictMatch(d1, d2)
|
||||||
|
|
||||||
|
def _assertImageSet(self, result, root_device_type, root_device_name):
|
||||||
|
self.assertEqual(1, len(result['imagesSet']))
|
||||||
|
result = result['imagesSet'][0]
|
||||||
|
self.assertTrue('rootDeviceType' in result)
|
||||||
|
self.assertEqual(result['rootDeviceType'], root_device_type)
|
||||||
|
self.assertTrue('rootDeviceName' in result)
|
||||||
|
self.assertEqual(result['rootDeviceName'], root_device_name)
|
||||||
|
self.assertTrue('blockDeviceMapping' in result)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
||||||
|
# NOTE(yamahata):
|
||||||
|
# InstanceBlockDeviceMappingItemType
|
||||||
|
# rootDeviceType
|
||||||
|
# rootDeviceName
|
||||||
|
# blockDeviceMapping
|
||||||
|
# deviceName
|
||||||
|
# virtualName
|
||||||
|
# ebs
|
||||||
|
# snapshotId
|
||||||
|
# volumeSize
|
||||||
|
# deleteOnTermination
|
||||||
|
# noDevice
|
||||||
|
def test_describe_image_mapping(self):
|
||||||
|
"""test for rootDeviceName and blockDeiceMapping"""
|
||||||
|
describe_images = self.cloud.describe_images
|
||||||
|
mappings1 = [
|
||||||
|
{'device': '/dev/sda1', 'virtual': 'root'},
|
||||||
|
|
||||||
|
{'device': '/dev/sdb0', 'virtual': 'ephemeral0'},
|
||||||
|
{'device': '/dev/sdb1', 'virtual': 'ephemeral1'},
|
||||||
|
{'device': '/dev/sdb2', 'virtual': 'ephemeral2'},
|
||||||
|
{'device': '/dev/sdb3', 'virtual': 'ephemeral3'},
|
||||||
|
{'device': '/dev/sdb4', 'virtual': 'ephemeral4'},
|
||||||
|
|
||||||
|
{'device': '/dev/sdc0', 'virtual': 'swap'},
|
||||||
|
{'device': '/dev/sdc1', 'virtual': 'swap'},
|
||||||
|
{'device': '/dev/sdc2', 'virtual': 'swap'},
|
||||||
|
{'device': '/dev/sdc3', 'virtual': 'swap'},
|
||||||
|
{'device': '/dev/sdc4', 'virtual': 'swap'}]
|
||||||
|
block_device_mapping1 = [
|
||||||
|
{'device_name': '/dev/sdb1', 'snapshot_id': 01234567},
|
||||||
|
{'device_name': '/dev/sdb2', 'volume_id': 01234567},
|
||||||
|
{'device_name': '/dev/sdb3', 'virtual_name': 'ephemeral5'},
|
||||||
|
{'device_name': '/dev/sdb4', 'no_device': True},
|
||||||
|
|
||||||
|
{'device_name': '/dev/sdc1', 'snapshot_id': 12345678},
|
||||||
|
{'device_name': '/dev/sdc2', 'volume_id': 12345678},
|
||||||
|
{'device_name': '/dev/sdc3', 'virtual_name': 'ephemeral6'},
|
||||||
|
{'device_name': '/dev/sdc4', 'no_device': True}]
|
||||||
|
image1 = {
|
||||||
|
'id': 1,
|
||||||
|
'properties': {
|
||||||
|
'kernel_id': 1,
|
||||||
|
'type': 'machine',
|
||||||
|
'mappings': mappings1,
|
||||||
|
'block_device_mapping': block_device_mapping1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mappings2 = [{'device': '/dev/sda1', 'virtual': 'root'}]
|
||||||
|
block_device_mapping2 = [{'device_name': '/dev/sdb1',
|
||||||
|
'snapshot_id': 01234567}]
|
||||||
|
image2 = {
|
||||||
|
'id': 2,
|
||||||
|
'properties': {
|
||||||
|
'kernel_id': 2,
|
||||||
|
'type': 'machine',
|
||||||
|
'root_device_name': '/dev/sdb1',
|
||||||
|
'mappings': mappings2,
|
||||||
|
'block_device_mapping': block_device_mapping2}}
|
||||||
|
|
||||||
|
def fake_show(meh, context, image_id):
|
||||||
|
for i in [image1, image2]:
|
||||||
|
if i['id'] == image_id:
|
||||||
|
return i
|
||||||
|
raise exception.ImageNotFound(image_id=image_id)
|
||||||
|
|
||||||
|
def fake_detail(meh, context):
|
||||||
|
return [image1, image2]
|
||||||
|
|
||||||
|
self.stubs.Set(fake._FakeImageService, 'show', fake_show)
|
||||||
|
self.stubs.Set(fake._FakeImageService, 'detail', fake_detail)
|
||||||
|
|
||||||
|
result = describe_images(self.context, ['ami-00000001'])
|
||||||
|
result = self._assertImageSet(result, 'instance-store', '/dev/sda1')
|
||||||
|
|
||||||
|
# NOTE(yamahata): noDevice doesn't make sense when returning mapping
|
||||||
|
# It makes sense only when user overriding existing
|
||||||
|
# mapping.
|
||||||
|
expected_bdms = [
|
||||||
|
{'deviceName': '/dev/sdb0', 'virtualName': 'ephemeral0'},
|
||||||
|
{'deviceName': '/dev/sdb1', 'ebs': {'snapshotId':
|
||||||
|
'snap-00053977'}},
|
||||||
|
{'deviceName': '/dev/sdb2', 'ebs': {'snapshotId':
|
||||||
|
'vol-00053977'}},
|
||||||
|
{'deviceName': '/dev/sdb3', 'virtualName': 'ephemeral5'},
|
||||||
|
# {'deviceName': '/dev/sdb4', 'noDevice': True},
|
||||||
|
|
||||||
|
{'deviceName': '/dev/sdc0', 'virtualName': 'swap'},
|
||||||
|
{'deviceName': '/dev/sdc1', 'ebs': {'snapshotId':
|
||||||
|
'snap-00bc614e'}},
|
||||||
|
{'deviceName': '/dev/sdc2', 'ebs': {'snapshotId':
|
||||||
|
'vol-00bc614e'}},
|
||||||
|
{'deviceName': '/dev/sdc3', 'virtualName': 'ephemeral6'},
|
||||||
|
# {'deviceName': '/dev/sdc4', 'noDevice': True}
|
||||||
|
]
|
||||||
|
self.assertDictListUnorderedMatch(result['blockDeviceMapping'],
|
||||||
|
expected_bdms, 'deviceName')
|
||||||
|
|
||||||
|
result = describe_images(self.context, ['ami-00000002'])
|
||||||
|
result = self._assertImageSet(result, 'ebs', '/dev/sdb1')
|
||||||
|
|
||||||
|
expected_bdms = [{'deviceName': '/dev/sdb1',
|
||||||
|
'ebs': {'snapshotId': 'snap-00053977'}}]
|
||||||
|
self.assertDictListUnorderedMatch(result['blockDeviceMapping'],
|
||||||
|
expected_bdms, 'deviceName')
|
||||||
|
|
||||||
|
self.stubs.UnsetAll()
|
||||||
|
|
||||||
def test_describe_image_attribute(self):
|
def test_describe_image_attribute(self):
|
||||||
describe_image_attribute = self.cloud.describe_image_attribute
|
describe_image_attribute = self.cloud.describe_image_attribute
|
||||||
|
|
||||||
@@ -679,10 +808,10 @@ class CloudTestCase(test.TestCase):
|
|||||||
'max_count': 1,
|
'max_count': 1,
|
||||||
'block_device_mapping': [{'device_name': '/dev/vdb',
|
'block_device_mapping': [{'device_name': '/dev/vdb',
|
||||||
'volume_id': vol1['id'],
|
'volume_id': vol1['id'],
|
||||||
'delete_on_termination': False, },
|
'delete_on_termination': False},
|
||||||
{'device_name': '/dev/vdc',
|
{'device_name': '/dev/vdc',
|
||||||
'volume_id': vol2['id'],
|
'volume_id': vol2['id'],
|
||||||
'delete_on_termination': True, },
|
'delete_on_termination': True},
|
||||||
]}
|
]}
|
||||||
ec2_instance_id = self._run_instance_wait(**kwargs)
|
ec2_instance_id = self._run_instance_wait(**kwargs)
|
||||||
instance_id = ec2utils.ec2_id_to_id(ec2_instance_id)
|
instance_id = ec2utils.ec2_id_to_id(ec2_instance_id)
|
||||||
|
|||||||
Reference in New Issue
Block a user