api/ec2, boot-from-volume: an unit test for describe instances
This commit is contained in:
12
nova/test.py
12
nova/test.py
@@ -252,3 +252,15 @@ class TestCase(unittest.TestCase):
|
||||
for d1, d2 in zip(L1, L2):
|
||||
self.assertDictMatch(d1, d2, approx_equal=approx_equal,
|
||||
tolerance=tolerance)
|
||||
|
||||
def assertSubDictMatch(self, sub_dict, super_dict):
|
||||
"""Assert a sub_dict is subset of super_dict."""
|
||||
self.assertTrue(set(sub_dict.keys()).issubset(set(super_dict.keys())))
|
||||
for k, sub_value in sub_dict.items():
|
||||
super_value = super_dict[k]
|
||||
if isinstance(sub_value, dict):
|
||||
self.assertSubDictMatch(sub_value, super_value)
|
||||
elif 'DONTCARE' in (sub_value, super_value):
|
||||
continue
|
||||
else:
|
||||
self.assertEqual(sub_value, super_value)
|
||||
|
||||
@@ -294,6 +294,146 @@ class CloudTestCase(test.TestCase):
|
||||
db.service_destroy(self.context, comp1['id'])
|
||||
db.service_destroy(self.context, comp2['id'])
|
||||
|
||||
def _assertInstance(self, instance_id):
|
||||
ec2_instance_id = ec2utils.id_to_ec2_id(instance_id)
|
||||
result = self.cloud.describe_instances(self.context,
|
||||
instance_id=[ec2_instance_id])
|
||||
result = result['reservationSet'][0]
|
||||
self.assertEqual(len(result['instancesSet']), 1)
|
||||
result = result['instancesSet'][0]
|
||||
self.assertEqual(result['instanceId'], ec2_instance_id)
|
||||
return (ec2_instance_id, result)
|
||||
|
||||
def _assertEqualBlockDeviceMapping(self, expected, result):
|
||||
self.assertEqual(len(expected), len(result))
|
||||
for x in expected:
|
||||
found = False
|
||||
for y in result:
|
||||
if x['deviceName'] == y['deviceName']:
|
||||
self.assertSubDictMatch(x, y)
|
||||
found = True
|
||||
break
|
||||
self.assertTrue(found)
|
||||
|
||||
def test_describe_instances_bdm(self):
|
||||
"""Make sure describe_instances works with root_device_name and
|
||||
block device mappings
|
||||
"""
|
||||
inst1 = db.instance_create(self.context,
|
||||
{'image_ref': 1,
|
||||
'root_device_name': '/dev/sdb1'})
|
||||
inst2 = db.instance_create(self.context,
|
||||
{'image_ref': 2,
|
||||
'root_device_name': '/dev/sdc1'})
|
||||
|
||||
instance_id = inst1['id']
|
||||
mappings = [
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb1',
|
||||
'snapshot_id': '1',
|
||||
'volume_id': '2'},
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb2',
|
||||
'volume_id': '3'},
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb3',
|
||||
'delete_on_termination': True,
|
||||
'snapshot_id': '4',
|
||||
'volume_id': '5'},
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb4',
|
||||
'delete_on_termination': False,
|
||||
'snapshot_id': '6',
|
||||
'volume_id': '7'},
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb5',
|
||||
'snapshot_id': '8',
|
||||
'volume_id': '9',
|
||||
'volume_size': 0},
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb6',
|
||||
'snapshot_id': '10',
|
||||
'volume_id': '11',
|
||||
'volume_size': 1},
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb7',
|
||||
'no_device': True},
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb8',
|
||||
'virtual_name': 'swap'},
|
||||
{'instance_id': instance_id,
|
||||
'device_name': '/dev/sdb9',
|
||||
'virtual_name': 'ephemeral3'}]
|
||||
|
||||
volumes = []
|
||||
for bdm in mappings:
|
||||
db.block_device_mapping_create(self.context, bdm)
|
||||
if bdm.get('volume_id'):
|
||||
values = {'volume_id': bdm['volume_id']}
|
||||
for bdm_key, vol_key in [('snapshot_id', 'snapshot_id'),
|
||||
('snapshot_size', 'volume_size'),
|
||||
('delete_on_termination',
|
||||
'delete_on_termination')]:
|
||||
if bdm.get(bdm_key):
|
||||
values[vol_key] = bdm[bdm_key]
|
||||
vol = db.volume_create(self.context, values)
|
||||
db.volume_attached(self.context, vol['id'],
|
||||
instance_id, bdm['device_name'])
|
||||
volumes.append(vol)
|
||||
|
||||
ec2_instance_id, result = self._assertInstance(instance_id)
|
||||
expected_result = {'instanceId': ec2_instance_id,
|
||||
'rootDeviceName': '/dev/sdb1',
|
||||
'rootDeviceType': 'ebs'}
|
||||
expected_block_device_mapping = [
|
||||
{'deviceName': '/dev/sdb1',
|
||||
'ebs': {'status': 'in-use',
|
||||
'deleteOnTermination': False,
|
||||
'volumeId': 2,
|
||||
}},
|
||||
{'deviceName': '/dev/sdb2',
|
||||
'ebs': {'status': 'in-use',
|
||||
'deleteOnTermination': False,
|
||||
'volumeId': 3,
|
||||
}},
|
||||
{'deviceName': '/dev/sdb3',
|
||||
'ebs': {'status': 'in-use',
|
||||
'deleteOnTermination': True,
|
||||
'volumeId': 5,
|
||||
}},
|
||||
{'deviceName': '/dev/sdb4',
|
||||
'ebs': {'status': 'in-use',
|
||||
'deleteOnTermination': False,
|
||||
'volumeId': 7,
|
||||
}},
|
||||
{'deviceName': '/dev/sdb5',
|
||||
'ebs': {'status': 'in-use',
|
||||
'deleteOnTermination': False,
|
||||
'volumeId': 9,
|
||||
}},
|
||||
{'deviceName': '/dev/sdb6',
|
||||
'ebs': {'status': 'in-use',
|
||||
'deleteOnTermination': False,
|
||||
'volumeId': 11, }}]
|
||||
# NOTE(yamahata): swap/ephemeral device case isn't supported yet.
|
||||
self.assertSubDictMatch(expected_result, result)
|
||||
self._assertEqualBlockDeviceMapping(expected_block_device_mapping,
|
||||
result['blockDeviceMapping'])
|
||||
|
||||
ec2_instance_id, result = self._assertInstance(inst2['id'])
|
||||
expected_result = {'instanceId': ec2_instance_id,
|
||||
'rootDeviceName': '/dev/sdc1',
|
||||
'rootDeviceType': 'instance-store'}
|
||||
self.assertSubDictMatch(expected_result, result)
|
||||
|
||||
for vol in volumes:
|
||||
db.volume_destroy(self.context, vol['id'])
|
||||
for bdm in db.block_device_mapping_get_all_by_instance(self.context,
|
||||
instance_id):
|
||||
db.block_device_mapping_destroy(self.context, bdm['id'])
|
||||
db.instance_destroy(self.context, inst2['id'])
|
||||
db.instance_destroy(self.context, inst1['id'])
|
||||
|
||||
def test_describe_images(self):
|
||||
describe_images = self.cloud.describe_images
|
||||
|
||||
|
||||
Reference in New Issue
Block a user