diff --git a/glance/api/v2/images.py b/glance/api/v2/images.py index b0fb908165..188d17c2d5 100644 --- a/glance/api/v2/images.py +++ b/glance/api/v2/images.py @@ -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') diff --git a/glance/db/sqlalchemy/api.py b/glance/db/sqlalchemy/api.py index 28fe3cc390..76363545fc 100644 --- a/glance/db/sqlalchemy/api.py +++ b/glance/db/sqlalchemy/api.py @@ -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 diff --git a/glance/tests/functional/db/base.py b/glance/tests/functional/db/base.py index 87cdb8aadb..3fa4b84c92 100644 --- a/glance/tests/functional/db/base.py +++ b/glance/tests/functional/db/base.py @@ -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', diff --git a/glance/tests/unit/test_db.py b/glance/tests/unit/test_db.py index 2f32509ea1..832b07f7eb 100644 --- a/glance/tests/unit/test_db.py +++ b/glance/tests/unit/test_db.py @@ -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) diff --git a/releasenotes/notes/add-all-visibility-image-filter-ea2f3948ff778fe3.yaml b/releasenotes/notes/add-all-visibility-image-filter-ea2f3948ff778fe3.yaml new file mode 100644 index 0000000000..524f547f32 --- /dev/null +++ b/releasenotes/notes/add-all-visibility-image-filter-ea2f3948ff778fe3.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + You can now list all images that are available to you. Use the 'all' + visibility option. +