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.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): | ||||
|         describe_image_attribute = self.cloud.describe_image_attribute | ||||
|  | ||||
| @@ -679,10 +808,10 @@ class CloudTestCase(test.TestCase): | ||||
|                   'max_count': 1, | ||||
|                   'block_device_mapping': [{'device_name': '/dev/vdb', | ||||
|                                             'volume_id': vol1['id'], | ||||
|                                             'delete_on_termination': False, }, | ||||
|                                             'delete_on_termination': False}, | ||||
|                                            {'device_name': '/dev/vdc', | ||||
|                                             'volume_id': vol2['id'], | ||||
|                                             'delete_on_termination': True, }, | ||||
|                                             'delete_on_termination': True}, | ||||
|                                            ]} | ||||
|         ec2_instance_id = self._run_instance_wait(**kwargs) | ||||
|         instance_id = ec2utils.ec2_id_to_id(ec2_instance_id) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Isaku Yamahata
					Isaku Yamahata