diff --git a/magnum/api/controllers/v1/baymodel.py b/magnum/api/controllers/v1/baymodel.py index b591adb3e1..decdddce56 100644 --- a/magnum/api/controllers/v1/baymodel.py +++ b/magnum/api/controllers/v1/baymodel.py @@ -293,8 +293,9 @@ class BayModelsController(rest.RestController): """ context = pecan.request.context baymodel = api_utils.get_resource('BayModel', baymodel_ident) - policy.enforce(context, 'baymodel:get', baymodel, - action='baymodel:get') + if not baymodel.public: + policy.enforce(context, 'baymodel:get', baymodel, + action='baymodel:get') return BayModel.convert_with_links(baymodel) diff --git a/magnum/db/sqlalchemy/api.py b/magnum/db/sqlalchemy/api.py index ad4a9e1783..e54ce04396 100644 --- a/magnum/db/sqlalchemy/api.py +++ b/magnum/db/sqlalchemy/api.py @@ -292,6 +292,8 @@ class Connection(api.Connection): def get_baymodel_by_id(self, context, baymodel_id): query = model_query(models.BayModel) query = self._add_tenant_filters(context, query) + public_q = model_query(models.BayModel).filter_by(public=True) + query = query.union(public_q) query = query.filter_by(id=baymodel_id) try: return query.one() @@ -301,6 +303,8 @@ class Connection(api.Connection): def get_baymodel_by_uuid(self, context, baymodel_uuid): query = model_query(models.BayModel) query = self._add_tenant_filters(context, query) + public_q = model_query(models.BayModel).filter_by(public=True) + query = query.union(public_q) query = query.filter_by(uuid=baymodel_uuid) try: return query.one() @@ -310,6 +314,8 @@ class Connection(api.Connection): def get_baymodel_by_name(self, context, baymodel_name): query = model_query(models.BayModel) query = self._add_tenant_filters(context, query) + public_q = model_query(models.BayModel).filter_by(public=True) + query = query.union(public_q) query = query.filter_by(name=baymodel_name) try: return query.one() diff --git a/magnum/tests/unit/db/test_baymodel.py b/magnum/tests/unit/db/test_baymodel.py index 6ae6423768..055a1236b9 100644 --- a/magnum/tests/unit/db/test_baymodel.py +++ b/magnum/tests/unit/db/test_baymodel.py @@ -85,11 +85,21 @@ class DbBaymodelTestCase(base.DbTestCase): baymodel = self.dbapi.get_baymodel_by_id(self.context, bm['id']) self.assertEqual(bm['uuid'], baymodel.uuid) + def test_get_baymodel_by_id_public(self): + bm = utils.create_test_baymodel(user_id='not_me', public=True) + baymodel = self.dbapi.get_baymodel_by_id(self.context, bm['id']) + self.assertEqual(bm['uuid'], baymodel.uuid) + def test_get_baymodel_by_uuid(self): bm = utils.create_test_baymodel() baymodel = self.dbapi.get_baymodel_by_uuid(self.context, bm['uuid']) self.assertEqual(bm['id'], baymodel.id) + def test_get_baymodel_by_uuid_public(self): + bm = utils.create_test_baymodel(user_id='not_me', public=True) + baymodel = self.dbapi.get_baymodel_by_uuid(self.context, bm['uuid']) + self.assertEqual(bm['id'], baymodel.id) + def test_get_baymodel_that_does_not_exist(self): self.assertRaises(exception.BayModelNotFound, self.dbapi.get_baymodel_by_id, self.context, 666) @@ -100,6 +110,12 @@ class DbBaymodelTestCase(base.DbTestCase): self.assertEqual(bm['id'], res.id) self.assertEqual(bm['uuid'], res.uuid) + def test_get_baymodel_by_name_public(self): + bm = utils.create_test_baymodel(user_id='not_me', public=True) + res = self.dbapi.get_baymodel_by_name(self.context, bm['name']) + self.assertEqual(bm['id'], res.id) + self.assertEqual(bm['uuid'], res.uuid) + def test_get_baymodel_by_name_multiple_baymodel(self): utils.create_test_baymodel( id=1, name='bm',