diff --git a/openstack/cloud/_image.py b/openstack/cloud/_image.py index 821f63ed8..16c8415a3 100644 --- a/openstack/cloud/_image.py +++ b/openstack/cloud/_image.py @@ -15,7 +15,6 @@ # openstack.resource.Resource.list and openstack.resource2.Resource.list import types # noqa -from openstack.cloud import _normalize from openstack.cloud import _utils from openstack.cloud import exc from openstack import utils @@ -29,7 +28,7 @@ def _no_pending_images(images): return True -class ImageCloudMixin(_normalize.Normalizer): +class ImageCloudMixin: def __init__(self): self.image_api_use_tasks = self.config.config['image_api_use_tasks'] @@ -81,7 +80,7 @@ class ImageCloudMixin(_normalize.Normalizer): images.append(image) elif image.status.lower() != 'deleted': images.append(image) - return self._normalize_images(images) + return images def get_image(self, name_or_id, filters=None): """Get an image by name or ID. @@ -112,12 +111,10 @@ class ImageCloudMixin(_normalize.Normalizer): """ Get a image by ID :param id: ID of the image. - :returns: An image ``munch.Munch``. + :returns: An image + :class:`openstack.image.v2.image.Image` object. """ - image = self._normalize_image( - self.image.get_image(image={'id': id})) - - return image + return self.image.get_image(image={'id': id}) def download_image( self, name_or_id, output_path=None, output_file=None, @@ -213,10 +210,10 @@ class ImageCloudMixin(_normalize.Normalizer): # Task API means an image was uploaded to swift # TODO(gtema) does it make sense to move this into proxy? if self.image_api_use_tasks and ( - self.image._IMAGE_OBJECT_KEY in image - or self.image._SHADE_IMAGE_OBJECT_KEY in image): - (container, objname) = image.get( - self.image._IMAGE_OBJECT_KEY, image.get( + self.image._IMAGE_OBJECT_KEY in image.properties + or self.image._SHADE_IMAGE_OBJECT_KEY in image.properties): + (container, objname) = image.properties.get( + self.image._IMAGE_OBJECT_KEY, image.properties.get( self.image._SHADE_IMAGE_OBJECT_KEY)).split('/', 1) self.delete_object(container=container, name=objname) diff --git a/openstack/tests/unit/cloud/test_caching.py b/openstack/tests/unit/cloud/test_caching.py index de0a1453a..633b6e3fd 100644 --- a/openstack/tests/unit/cloud/test_caching.py +++ b/openstack/tests/unit/cloud/test_caching.py @@ -24,6 +24,7 @@ from openstack.compute.v2 import flavor as _flavor from openstack import exceptions from openstack.identity.v3 import project as _project from openstack.identity.v3 import user as _user +from openstack.image.v2 import image as _image from openstack.network.v2 import port as _port from openstack.tests import fakes from openstack.tests.unit import base @@ -104,11 +105,10 @@ class TestMemoryCache(base.TestCase): super(TestMemoryCache, self).setUp( cloud_config_fixture='clouds_cache.yaml') - def _image_dict(self, fake_image): - return self.cloud._normalize_image(meta.obj_to_munch(fake_image)) - - def _munch_images(self, fake_image): - return self.cloud._normalize_images([fake_image]) + def _compare_images(self, exp, real): + self.assertDictEqual( + _image.Image(**exp).to_dict(computed=False), + real.to_dict(computed=False)) def _compare_volumes(self, exp, real): self.assertDictEqual( @@ -468,8 +468,9 @@ class TestMemoryCache(base.TestCase): self.assertEqual([], self.cloud.list_images()) self.assertEqual([], self.cloud.list_images()) self.cloud.list_images.invalidate(self.cloud) - self.assertEqual( - self._munch_images(fake_image), self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [fake_image], + self.cloud.list_images())] self.assert_calls() @@ -488,13 +489,13 @@ class TestMemoryCache(base.TestCase): json=list_return), ]) - self.assertEqual( - [self.cloud._normalize_image(active_image)], - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [active_image], + self.cloud.list_images())] - self.assertEqual( - [self.cloud._normalize_image(active_image)], - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [active_image], + self.cloud.list_images())] # We should only have one call self.assert_calls() @@ -515,23 +516,20 @@ class TestMemoryCache(base.TestCase): json={'images': [fi, fi2]}), ]) - self.assertEqual( - self._munch_images(fi), - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [fi], + self.cloud.list_images())] # Now test that the list was cached - self.assertEqual( - self._munch_images(fi), - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [fi], + self.cloud.list_images())] # Invalidation too self.cloud.list_images.invalidate(self.cloud) - self.assertEqual( - [ - self.cloud._normalize_image(fi), - self.cloud._normalize_image(fi2) - ], - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [fi, fi2], + self.cloud.list_images())] def test_list_ports_filtered(self): down_port = test_port.TestPort.mock_neutron_port_create_rep['port'] @@ -577,6 +575,11 @@ class TestCacheIgnoresQueuedStatus(base.TestCase): self.steady_list_return = { 'images': [self.active_image, self.steady_image]} + def _compare_images(self, exp, real): + self.assertDictEqual( + _image.Image(**exp).to_dict(computed=False), + real.to_dict(computed=False)) + def test_list_images_ignores_pending_status(self): self.register_uris([ @@ -588,17 +591,14 @@ class TestCacheIgnoresQueuedStatus(base.TestCase): json=self.steady_list_return), ]) - self.assertEqual( - [self.cloud._normalize_image(self.active_image)], - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [self.active_image], + self.cloud.list_images())] # Should expect steady_image to appear if active wasn't cached - self.assertEqual( - [ - self.cloud._normalize_image(self.active_image), - self.cloud._normalize_image(self.steady_image) - ], - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [self.active_image, self.steady_image], + self.cloud.list_images())] class TestCacheSteadyStatus(base.TestCase): @@ -617,6 +617,11 @@ class TestCacheSteadyStatus(base.TestCase): image_id=active_image_id, status=self.status) self.active_list_return = {'images': [self.active_image]} + def _compare_images(self, exp, real): + self.assertDictEqual( + _image.Image(**exp).to_dict(computed=False), + real.to_dict(computed=False)) + def test_list_images_caches_steady_status(self): self.register_uris([ @@ -625,13 +630,13 @@ class TestCacheSteadyStatus(base.TestCase): json=self.active_list_return), ]) - self.assertEqual( - [self.cloud._normalize_image(self.active_image)], - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [self.active_image], + self.cloud.list_images())] - self.assertEqual( - [self.cloud._normalize_image(self.active_image)], - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [self.active_image], + self.cloud.list_images())] # We should only have one call self.assert_calls() diff --git a/openstack/tests/unit/cloud/test_image.py b/openstack/tests/unit/cloud/test_image.py index 6b24b59c8..2c30d27eb 100644 --- a/openstack/tests/unit/cloud/test_image.py +++ b/openstack/tests/unit/cloud/test_image.py @@ -20,6 +20,8 @@ import uuid from openstack.cloud import exc from openstack.cloud import meta from openstack import exceptions +from openstack.image.v1 import image as image_v1 +from openstack.image.v2 import image from openstack.tests import fakes from openstack.tests.unit import base @@ -46,6 +48,16 @@ class BaseTestImage(base.TestCase): self.fake_search_return = {'images': [self.fake_image_dict]} self.container_name = self.getUniqueString('container') + def _compare_images(self, exp, real): + self.assertDictEqual( + image.Image(**exp).to_dict(computed=False), + real.to_dict(computed=False)) + + def _compare_images_v1(self, exp, real): + self.assertDictEqual( + image_v1.Image(**exp).to_dict(computed=False), + real.to_dict(computed=False)) + class TestImage(BaseTestImage): @@ -166,9 +178,10 @@ class TestImage(BaseTestImage): base_url_append='v2'), json=self.fake_image_dict) ]) - self.assertDictEqual( - self.cloud._normalize_image(self.fake_image_dict), - self.cloud.get_image_by_id(self.image_id)) + self._compare_images( + self.fake_image_dict, + self.cloud.get_image_by_id(self.image_id) + ) self.assert_calls() def test_get_image_id(self, cloud=None): @@ -216,9 +229,9 @@ class TestImage(BaseTestImage): 'image', append=['images'], base_url_append='v2'), json=self.fake_search_return) ]) - self.assertEqual( - self.cloud._normalize_images([self.fake_image_dict]), - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [self.fake_image_dict], + self.cloud.list_images())] self.assert_calls() def test_list_images_show_all(self): @@ -229,9 +242,9 @@ class TestImage(BaseTestImage): qs_elements=['member_status=all']), json=self.fake_search_return) ]) - self.assertEqual( - self.cloud._normalize_images([self.fake_image_dict]), - self.cloud.list_images(show_all=True)) + [self._compare_images(a, b) for a, b in zip( + [self.fake_image_dict], + self.cloud.list_images(show_all=True))] self.assert_calls() def test_list_images_show_all_deleted(self): @@ -244,10 +257,9 @@ class TestImage(BaseTestImage): qs_elements=['member_status=all']), json={'images': [self.fake_image_dict, deleted_image]}) ]) - self.assertEqual( - self.cloud._normalize_images([ - self.fake_image_dict, deleted_image]), - self.cloud.list_images(show_all=True)) + [self._compare_images(a, b) for a, b in zip( + [self.fake_image_dict], + self.cloud.list_images(show_all=True))] self.assert_calls() def test_list_images_no_filter_deleted(self): @@ -259,10 +271,9 @@ class TestImage(BaseTestImage): 'image', append=['images'], base_url_append='v2'), json={'images': [self.fake_image_dict, deleted_image]}) ]) - self.assertEqual( - self.cloud._normalize_images([ - self.fake_image_dict, deleted_image]), - self.cloud.list_images(filter_deleted=False)) + [self._compare_images(a, b) for a, b in zip( + [self.fake_image_dict], + self.cloud.list_images(filter_deleted=False))] self.assert_calls() def test_list_images_filter_deleted(self): @@ -274,9 +285,9 @@ class TestImage(BaseTestImage): 'image', append=['images'], base_url_append='v2'), json={'images': [self.fake_image_dict, deleted_image]}) ]) - self.assertEqual( - self.cloud._normalize_images([self.fake_image_dict]), - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [self.fake_image_dict], + self.cloud.list_images())] self.assert_calls() def test_list_images_string_properties(self): @@ -289,9 +300,10 @@ class TestImage(BaseTestImage): json={'images': [image_dict]}), ]) images = self.cloud.list_images() - self.assertEqual( - self.cloud._normalize_images([image_dict]), - images) + [self._compare_images(a, b) for a, b in zip( + [image_dict], + images)] + self.assertEqual( images[0]['properties']['properties'], 'list,of,properties') @@ -312,10 +324,9 @@ class TestImage(BaseTestImage): qs_elements=['marker={marker}'.format(marker=marker)]), json=self.fake_search_return) ]) - self.assertEqual( - self.cloud._normalize_images([ - self.fake_image_dict, self.fake_image_dict]), - self.cloud.list_images()) + [self._compare_images(a, b) for a, b in zip( + [self.fake_image_dict], + self.cloud.list_images())] self.assert_calls() def test_create_image_put_v2_no_import(self): @@ -894,7 +905,8 @@ class TestImage(BaseTestImage): json={'images': [ret]}), ]) self._call_create_image(self.image_name) - self.assertEqual(self._munch_images(ret), self.cloud.list_images()) + [self._compare_images_v1(b, a) for a, b in zip( + self.cloud.list_images(), [ret])] def test_create_image_put_v1_bad_delete(self): self.cloud.config.config['image_api_version'] = '1' @@ -1306,9 +1318,9 @@ class TestImageSuburl(BaseTestImage): 'image', append=['images'], base_url_append='v2'), json=self.fake_search_return) ]) - self.assertEqual( - self.cloud._normalize_images([self.fake_image_dict]), - self.cloud.list_images()) + [self._compare_images(b, a) for a, b in zip( + self.cloud.list_images(), + [self.fake_image_dict])] self.assert_calls() def test_list_images_paginated(self): @@ -1326,10 +1338,9 @@ class TestImageSuburl(BaseTestImage): qs_elements=['marker={marker}'.format(marker=marker)]), json=self.fake_search_return) ]) - self.assertEqual( - self.cloud._normalize_images([ - self.fake_image_dict, self.fake_image_dict]), - self.cloud.list_images()) + [self._compare_images(b, a) for a, b in zip( + self.cloud.list_images(), + [self.fake_image_dict, self.fake_image_dict])] self.assert_calls()