api/ec2: an unit test for create image
unit test for ec2 create image. This is incomplete as there is no unit test for register image.
This commit is contained in:
		| @@ -294,6 +294,24 @@ class CloudTestCase(test.TestCase): | |||||||
|         db.service_destroy(self.context, comp1['id']) |         db.service_destroy(self.context, comp1['id']) | ||||||
|         db.service_destroy(self.context, comp2['id']) |         db.service_destroy(self.context, comp2['id']) | ||||||
|  |  | ||||||
|  |     def _block_device_mapping_create(self, instance_id, mappings): | ||||||
|  |         volumes = [] | ||||||
|  |         for bdm in mappings: | ||||||
|  |             db.block_device_mapping_create(self.context, bdm) | ||||||
|  |             if 'volume_id' in bdm: | ||||||
|  |                 values = {'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_key in bdm: | ||||||
|  |                         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) | ||||||
|  |         return volumes | ||||||
|  |  | ||||||
|     def _assertInstance(self, instance_id): |     def _assertInstance(self, instance_id): | ||||||
|         ec2_instance_id = ec2utils.id_to_ec2_id(instance_id) |         ec2_instance_id = ec2utils.id_to_ec2_id(instance_id) | ||||||
|         result = self.cloud.describe_instances(self.context, |         result = self.cloud.describe_instances(self.context, | ||||||
| @@ -334,7 +352,8 @@ class CloudTestCase(test.TestCase): | |||||||
|              'volume_id': '2'}, |              'volume_id': '2'}, | ||||||
|             {'instance_id': instance_id, |             {'instance_id': instance_id, | ||||||
|              'device_name': '/dev/sdb2', |              'device_name': '/dev/sdb2', | ||||||
|              'volume_id': '3'}, |              'volume_id': '3', | ||||||
|  |              'volume_size': 1}, | ||||||
|             {'instance_id': instance_id, |             {'instance_id': instance_id, | ||||||
|              'device_name': '/dev/sdb3', |              'device_name': '/dev/sdb3', | ||||||
|              'delete_on_termination': True, |              'delete_on_termination': True, | ||||||
| @@ -365,21 +384,7 @@ class CloudTestCase(test.TestCase): | |||||||
|              'device_name': '/dev/sdb9', |              'device_name': '/dev/sdb9', | ||||||
|              'virtual_name': 'ephemeral3'}] |              'virtual_name': 'ephemeral3'}] | ||||||
|  |  | ||||||
|         volumes = [] |         volumes = self._block_device_mapping_create(instance_id, mappings) | ||||||
|         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) |         ec2_instance_id, result = self._assertInstance(instance_id) | ||||||
|         expected_result = {'instanceId': ec2_instance_id, |         expected_result = {'instanceId': ec2_instance_id, | ||||||
| @@ -472,7 +477,7 @@ class CloudTestCase(test.TestCase): | |||||||
|                 if d1[key] == d2[key]: |                 if d1[key] == d2[key]: | ||||||
|                     self.assertDictMatch(d1, d2) |                     self.assertDictMatch(d1, d2) | ||||||
|  |  | ||||||
|     def _setUpImageSet(self): |     def _setUpImageSet(self, create_volumes_and_snapshots=False): | ||||||
|         mappings1 = [ |         mappings1 = [ | ||||||
|             {'device': '/dev/sda1', 'virtual': 'root'}, |             {'device': '/dev/sda1', 'virtual': 'root'}, | ||||||
|  |  | ||||||
| @@ -502,6 +507,7 @@ class CloudTestCase(test.TestCase): | |||||||
|             'properties': { |             'properties': { | ||||||
|                 'kernel_id': 1, |                 'kernel_id': 1, | ||||||
|                 'type': 'machine', |                 'type': 'machine', | ||||||
|  |                 'image_state': 'available', | ||||||
|                 'mappings': mappings1, |                 'mappings': mappings1, | ||||||
|                 'block_device_mapping': block_device_mapping1, |                 'block_device_mapping': block_device_mapping1, | ||||||
|                 } |                 } | ||||||
| @@ -531,6 +537,22 @@ class CloudTestCase(test.TestCase): | |||||||
|         self.stubs.Set(fake._FakeImageService, 'show', fake_show) |         self.stubs.Set(fake._FakeImageService, 'show', fake_show) | ||||||
|         self.stubs.Set(fake._FakeImageService, 'detail', fake_detail) |         self.stubs.Set(fake._FakeImageService, 'detail', fake_detail) | ||||||
|  |  | ||||||
|  |         volumes = [] | ||||||
|  |         snapshots = [] | ||||||
|  |         if create_volumes_and_snapshots: | ||||||
|  |             for bdm in block_device_mapping1: | ||||||
|  |                 if 'volume_id' in bdm: | ||||||
|  |                     vol = self._volume_create(bdm['volume_id']) | ||||||
|  |                     volumes.append(vol['id']) | ||||||
|  |                 if 'snapshot_id' in bdm: | ||||||
|  |                     snap = db.snapshot_create(self.context, | ||||||
|  |                                               {'id': bdm['snapshot_id'], | ||||||
|  |                                                'volume_id': 76543210, | ||||||
|  |                                                'status': "available", | ||||||
|  |                                                'volume_size': 1}) | ||||||
|  |                     snapshots.append(snap['id']) | ||||||
|  |         return (volumes, snapshots) | ||||||
|  |  | ||||||
|     def _assertImageSet(self, result, root_device_type, root_device_name): |     def _assertImageSet(self, result, root_device_type, root_device_name): | ||||||
|         self.assertEqual(1, len(result['imagesSet'])) |         self.assertEqual(1, len(result['imagesSet'])) | ||||||
|         result = result['imagesSet'][0] |         result = result['imagesSet'][0] | ||||||
| @@ -951,11 +973,13 @@ class CloudTestCase(test.TestCase): | |||||||
|  |  | ||||||
|         self._restart_compute_service() |         self._restart_compute_service() | ||||||
|  |  | ||||||
|     def _volume_create(self): |     def _volume_create(self, volume_id=None): | ||||||
|         kwargs = {'status': 'available', |         kwargs = {'status': 'available', | ||||||
|                   'host': self.volume.host, |                   'host': self.volume.host, | ||||||
|                   'size': 1, |                   'size': 1, | ||||||
|                   'attach_status': 'detached', } |                   'attach_status': 'detached', } | ||||||
|  |         if volume_id: | ||||||
|  |             kwargs['id'] = volume_id | ||||||
|         return db.volume_create(self.context, kwargs) |         return db.volume_create(self.context, kwargs) | ||||||
|  |  | ||||||
|     def _assert_volume_attached(self, vol, instance_id, mountpoint): |     def _assert_volume_attached(self, vol, instance_id, mountpoint): | ||||||
| @@ -1175,3 +1199,33 @@ class CloudTestCase(test.TestCase): | |||||||
|             self.cloud.delete_snapshot(self.context, snapshot_id) |             self.cloud.delete_snapshot(self.context, snapshot_id) | ||||||
|             greenthread.sleep(0.3) |             greenthread.sleep(0.3) | ||||||
|         db.volume_destroy(self.context, vol['id']) |         db.volume_destroy(self.context, vol['id']) | ||||||
|  |  | ||||||
|  |     def test_create_image(self): | ||||||
|  |         """Make sure that CreateImage works""" | ||||||
|  |         # enforce periodic tasks run in short time to avoid wait for 60s. | ||||||
|  |         self._restart_compute_service(periodic_interval=0.3) | ||||||
|  |  | ||||||
|  |         (volumes, snapshots) = self._setUpImageSet( | ||||||
|  |             create_volumes_and_snapshots=True) | ||||||
|  |  | ||||||
|  |         kwargs = {'image_id': 'ami-1', | ||||||
|  |                   'instance_type': FLAGS.default_instance_type, | ||||||
|  |                   'max_count': 1} | ||||||
|  |         ec2_instance_id = self._run_instance_wait(**kwargs) | ||||||
|  |  | ||||||
|  |         # TODO(yamahata): s3._s3_create() can't be tested easily by unit test | ||||||
|  |         #                 as there is no unit test for s3.create() | ||||||
|  |         ## result = self.cloud.create_image(self.context, ec2_instance_id, | ||||||
|  |         ##                                  no_reboot=True) | ||||||
|  |         ## ec2_image_id = result['imageId'] | ||||||
|  |         ## created_image = self.cloud.describe_images(self.context, | ||||||
|  |         ##                                            [ec2_image_id]) | ||||||
|  |  | ||||||
|  |         self.cloud.terminate_instances(self.context, [ec2_instance_id]) | ||||||
|  |         for vol in volumes: | ||||||
|  |             db.volume_destroy(self.context, vol) | ||||||
|  |         for snap in snapshots: | ||||||
|  |             db.snapshot_destroy(self.context, snap) | ||||||
|  |         # TODO(yamahata): clean up snapshot created by CreateImage. | ||||||
|  |  | ||||||
|  |         self._restart_compute_service() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Isaku Yamahata
					Isaku Yamahata