Merge "Add new 'all' visibility filter for listing images"

This commit is contained in:
Zuul 2019-03-12 21:35:45 +00:00 committed by Gerrit Code Review
commit a772017d3e
5 changed files with 37 additions and 3 deletions

View File

@ -831,7 +831,8 @@ class RequestDeserializer(wsgi.JSONRequestDeserializer):
def _get_filters(self, filters):
visibility = filters.get('visibility')
if visibility:
if visibility not in ['community', 'public', 'private', 'shared']:
if visibility not in ['community', 'public', 'private', 'shared',
'all']:
msg = _('Invalid visibility value: %s') % visibility
raise webob.exc.HTTPBadRequest(explanation=msg)
changes_since = filters.get('changes-since')

View File

@ -658,8 +658,9 @@ def image_get_all(context, filters=None, marker=None, limit=None,
visibility)
if visibility is not None:
# with a visibility, we always and only include images with that
# visibility
query = query.filter(models.Image.visibility == visibility)
# visibility except when using the 'all' visibility
if visibility != 'all':
query = query.filter(models.Image.visibility == visibility)
elif context.owner is None:
# without either a visibility or an owner, we never include
# 'community' images

View File

@ -2204,6 +2204,11 @@ class VisibilityTests(object):
for i in images:
self.assertEqual('community', i['visibility'])
def test_unknown_admin_visibility_all(self):
images = self.db_api.image_get_all(self.admin_none_context,
filters={'visibility': 'all'})
self.assertEqual(16, len(images))
def test_known_admin_sees_all_but_others_community_images(self):
images = self.db_api.image_get_all(self.admin_context)
self.assertEqual(13, len(images))
@ -2262,6 +2267,11 @@ class VisibilityTests(object):
for i in images:
self.assertEqual('community', i['visibility'])
def test_known_admin_visibility_all(self):
images = self.db_api.image_get_all(self.admin_context,
filters={'visibility': 'all'})
self.assertEqual(16, len(images))
def test_what_unknown_user_sees(self):
images = self.db_api.image_get_all(self.none_context)
self.assertEqual(4, len(images))
@ -2308,6 +2318,11 @@ class VisibilityTests(object):
for i in images:
self.assertEqual('community', i['visibility'])
def test_unknown_user_visibility_all(self):
images = self.db_api.image_get_all(self.none_context,
filters={'visibility': 'all'})
self.assertEqual(8, len(images))
def test_what_tenant1_sees(self):
images = self.db_api.image_get_all(self.tenant1_context)
self.assertEqual(7, len(images))
@ -2366,6 +2381,11 @@ class VisibilityTests(object):
for i in images:
self.assertEqual('community', i['visibility'])
def test_tenant1_visibility_all(self):
images = self.db_api.image_get_all(self.tenant1_context,
filters={'visibility': 'all'})
self.assertEqual(10, len(images))
def _setup_is_public_red_herring(self):
values = {
'name': 'Red Herring',

View File

@ -263,6 +263,12 @@ class TestImageRepo(test_utils.BaseTestCase):
image_ids = set([i.image_id for i in images])
self.assertEqual(set([UUID2]), image_ids)
def test_list_all_images(self):
filters = {'visibility': 'all'}
images = self.image_repo.list(filters=filters)
image_ids = set([i.image_id for i in images])
self.assertEqual(set([UUID1, UUID2, UUID3]), image_ids)
def test_list_with_checksum_filter_single_image(self):
filters = {'checksum': CHECKSUM}
images = self.image_repo.list(filters=filters)

View File

@ -0,0 +1,6 @@
---
features:
- |
You can now list all images that are available to you. Use the 'all'
visibility option.