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:
parent
e29f6dde77
commit
af57db48aa
|
@ -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):
|
||||
|
|
|
@ -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 = []
|
||||
|
|
Loading…
Reference in New Issue