Make get_available_images() return all the images available

This patch fixes get_available_images() not returning images which
are shared with a project. Old version returns only public images
or project-owned ones, missing images which were shared with
the project.

Closes-bug: #1655259
Change-Id: I2a264d83f3e2b3f10c1e00ac7e88db29bb34bd02
(cherry picked from commit d20c941d0d)
This commit is contained in:
Mateusz Kowalski 2017-02-08 15:02:19 +01:00 committed by Rob Cresswell
parent e29f6dde77
commit af57db48aa
2 changed files with 75 additions and 4 deletions

View File

@ -146,6 +146,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
private_images = [image for image in self.images.list()
if (image.status == 'active' and
not image.is_public)]
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'is_public': True, 'status': 'active'}) \
@ -155,6 +158,10 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
filters={'property-owner_id': self.tenant.id,
'status': 'active'}) \
.AndReturn([private_images, False, False])
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'visibility': 'shared', 'status': 'active'}) \
.AndReturn([shared_images, False, False])
self.mox.ReplayAll()
@ -172,6 +179,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
private_images = [image for image in self.images.list()
if (image.status == 'active' and
not image.is_public)]
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'is_public': True, 'status': 'active'}) \
@ -181,6 +191,10 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
filters={'property-owner_id': self.tenant.id,
'status': 'active'}) \
.AndReturn([private_images, False, False])
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'visibility': 'shared', 'status': 'active'}) \
.AndReturn([shared_images, False, False])
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'property-owner_id': 'other-tenant',
@ -204,6 +218,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
self.assertEqual(
len(private_images),
len(images_cache['images_by_project'][self.tenant.id]))
self.assertEqual(
len(shared_images),
len(images_cache['shared_images']))
ret = utils.get_available_images(self.request, self.tenant.id,
images_cache)
@ -229,6 +246,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
private_images = [image for image in self.images.list()
if (image.status == 'active' and
not image.is_public)]
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'is_public': True, 'status': 'active'}) \
@ -240,6 +260,10 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
filters={'property-owner_id': self.tenant.id,
'status': 'active'}) \
.AndReturn([private_images, False, False])
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'visibility': 'shared', 'status': 'active'}) \
.AndReturn([shared_images, False, False])
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'is_public': True, 'status': 'active'}) \
@ -259,6 +283,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
self.assertEqual(
len(private_images),
len(images_cache['images_by_project'][self.tenant.id]))
self.assertEqual(
len(shared_images),
len(images_cache['shared_images']))
ret = utils.get_available_images(self.request, self.tenant.id,
images_cache)
@ -273,6 +300,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
self.assertEqual(
len(private_images),
len(images_cache['images_by_project'][self.tenant.id]))
self.assertEqual(
len(shared_images),
len(images_cache['shared_images']))
@test.create_stubs({api.glance: ('image_list_detailed',),
messages: ('error',)})
@ -282,6 +312,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
private_images = [image for image in self.images.list()
if (image.status == 'active' and
not image.is_public)]
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'is_public': True, 'status': 'active'}) \
@ -296,6 +329,10 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
filters={'property-owner_id': self.tenant.id,
'status': 'active'}) \
.AndReturn([private_images, False, False])
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'visibility': 'shared', 'status': 'active'}) \
.AndReturn([shared_images, False, False])
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'is_public': True, 'status': 'active'}) \
@ -315,6 +352,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
self.assertEqual(
len(private_images),
len(images_cache['images_by_project'][self.tenant.id]))
self.assertEqual(
len(shared_images),
len(images_cache['shared_images']))
ret = utils.get_available_images(self.request, self.tenant.id,
images_cache)
@ -329,6 +369,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
self.assertEqual(
len(private_images),
len(images_cache['images_by_project'][self.tenant.id]))
self.assertEqual(
len(shared_images),
len(images_cache['shared_images']))
@test.create_stubs({api.glance: ('image_list_detailed',),
exceptions: ('handle',)})
@ -338,6 +381,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
private_images = [image for image in self.images.list()
if (image.status == 'active' and
not image.is_public)]
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'is_public': True, 'status': 'active'}) \
@ -349,6 +395,10 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
.AndRaise(self.exceptions.glance)
exceptions.handle(IsA(http.HttpRequest),
"Unable to retrieve images for the current project.")
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'visibility': 'shared', 'status': 'active'}) \
.AndReturn([shared_images, False, False])
api.glance.image_list_detailed(
IsA(http.HttpRequest),
filters={'property-owner_id': self.tenant.id,
@ -368,6 +418,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
len(public_images),
len(images_cache['public_images']))
self.assertFalse(len(images_cache['images_by_project']))
self.assertEqual(
len(shared_images),
len(images_cache['shared_images']))
ret = utils.get_available_images(self.request, self.tenant.id,
images_cache)
@ -382,6 +435,9 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
self.assertEqual(
len(private_images),
len(images_cache['images_by_project'][self.tenant.id]))
self.assertEqual(
len(shared_images),
len(images_cache['shared_images']))
class SeleniumTests(test.SeleniumTestCase):

View File

@ -19,17 +19,21 @@ from openstack_dashboard.api import glance
def get_available_images(request, project_id=None, images_cache=None):
"""Returns a list of images that are public or owned by the given project.
"""Returns a list of available images
If project_id is not specified, only public images are returned.
Returns a list of images that are public, shared or owned by the given
project_id. If project_id is not specified, only public images are
returned.
:param images_cache: An optional dict-like object in which to
cache public and per-project id image metadata.
cache public and per-project id image metadata.
"""
if images_cache is None:
images_cache = {}
public_images = images_cache.get('public_images', [])
images_by_project = images_cache.get('images_by_project', {})
shared_images = images_cache.get('shared_images', [])
if 'public_images' not in images_cache:
public = {"is_public": True,
"status": "active"}
@ -61,10 +65,21 @@ def get_available_images(request, project_id=None, images_cache=None):
else:
owned_images = images_by_project[project_id]
if 'shared_images' not in images_cache:
shared = {"visibility": "shared",
"status": "active"}
try:
shared_images, _more, _prev = \
glance.image_list_detailed(request, filters=shared)
images_cache['shared_images'] = shared_images
except Exception:
exceptions.handle(request,
_("Unable to retrieve shared images."))
if 'images_by_project' not in images_cache:
images_cache['images_by_project'] = images_by_project
images = owned_images + public_images
images = owned_images + public_images + shared_images
image_ids = []
final_images = []