Get rid of normalization for image service

Stop using any normalization in the image service.

Change-Id: Id64199794214f282165836a76725b606c1a6947b
This commit is contained in:
Artem Goncharov
2021-12-28 15:11:49 +01:00
parent b23de23ee7
commit 6c905301de
3 changed files with 100 additions and 87 deletions

View File

@@ -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)

View File

@@ -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()

View File

@@ -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()