From a757b8f8426881eaf02e13e2a922fd7ae90cf4ee Mon Sep 17 00:00:00 2001 From: Aaron-DH Date: Tue, 5 Jan 2016 09:23:28 +0800 Subject: [PATCH] Modify filter by 'Name' in Package Definition Search with name only matches package name and search with keyword can matches names, tags ..etc Change-Id: Ia86befcf0a126f4e532c847df44170a898b38824 Closes-Bug: #1500865 --- .../specification/murano-repository.rst | 4 +- murano/api/v1/__init__.py | 2 +- murano/db/catalog/api.py | 2 + murano/tests/unit/api/v1/test_catalog.py | 79 +++++++++++++++++++ ...n-package-definition-43edaf12rad81b88.yaml | 3 + 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 releasenotes/notes/filter-in-package-definition-43edaf12rad81b88.yaml diff --git a/doc/source/specification/murano-repository.rst b/doc/source/specification/murano-repository.rst index eb26b7e8b..170fee13a 100644 --- a/doc/source/specification/murano-repository.rst +++ b/doc/source/specification/murano-repository.rst @@ -42,7 +42,7 @@ Methods for application package management List packages ------------- -`/v1/catalog/packages?{marker}{limit}{order_by}{type}{category}{fqn}{owned}{id}{catalog}{class_name} [GET]` +`/v1/catalog/packages?{marker}{limit}{order_by}{type}{category}{fqn}{owned}{id}{catalog}{class_name}{name} [GET]` This is the compound request to list and search through application catalog. If there are no search parameters all packages that is_public, enabled and belong to the user's tenant will be listed. @@ -81,6 +81,8 @@ For an admin role all packages are available. +----------------------+-------------+------------------------------------------------------------------------------------------------------------------------------+ | ``class_name`` | string | Search only for packages, that use specified class | +----------------------+-------------+------------------------------------------------------------------------------------------------------------------------------+ +| ``name`` | string | Allows to point a package name for a search | ++----------------------+-------------+------------------------------------------------------------------------------------------------------------------------------+ **Response 200 (application/json)** diff --git a/murano/api/v1/__init__.py b/murano/api/v1/__init__.py index c037ca1e7..f1154f9ad 100644 --- a/murano/api/v1/__init__.py +++ b/murano/api/v1/__init__.py @@ -19,7 +19,7 @@ stats = None SUPPORTED_PARAMS = ('id', 'order_by', 'category', 'marker', 'tag', 'class_name', 'limit', 'type', 'fqn', 'category', 'owned', - 'search', 'include_disabled', 'sort_dir') + 'search', 'include_disabled', 'sort_dir', 'name') LIST_PARAMS = ('id', 'category', 'tag', 'class', 'order_by') ORDER_VALUES = ('fqn', 'name', 'created') PKG_PARAMS_MAP = {'display_name': 'name', diff --git a/murano/db/catalog/api.py b/murano/db/catalog/api.py index cb4d4282c..c9a17e586 100644 --- a/murano/db/catalog/api.py +++ b/murano/db/catalog/api.py @@ -308,6 +308,8 @@ def package_search(filters, context, manage_public=False, models.Class.name == filters['class_name'])) if 'fqn' in filters.keys(): query = query.filter(pkg.fully_qualified_name == filters['fqn']) + if 'name' in filters.keys(): + query = query.filter(pkg.name == filters['name']) if 'search' in filters.keys(): fk_fields = {'categories': 'Category', diff --git a/murano/tests/unit/api/v1/test_catalog.py b/murano/tests/unit/api/v1/test_catalog.py index 68615a548..f8e9b6e0d 100644 --- a/murano/tests/unit/api/v1/test_catalog.py +++ b/murano/tests/unit/api/v1/test_catalog.py @@ -197,6 +197,85 @@ class TestCatalogApi(test_base.ControllerTest, test_base.MuranoApiTestCase): self.assertEqual(found_package['id'], expected_package.id) + def test_packages_filter_by_name(self): + """GET /catalog/packages with parameter "name" returns packages + filtered by name. + """ + self._set_policy_rules( + {'get_package': '', + 'manage_public_package': ''} + ) + + expected_pkg1 = self._add_pkg("test_tenant", name="test_pkgname_1") + expected_pkg2 = self._add_pkg("test_tenant", name="test_pkgname_2") + + req_pkgname1 = self._get('/catalog/packages', + params={'name': expected_pkg1.name}) + req_pkgname2 = self._get('/catalog/packages', + params={'name': expected_pkg2.name}) + + for dummy in range(2): + self.expect_policy_check('get_package') + self.expect_policy_check('manage_public_package') + + res_pkgname1 = req_pkgname1.get_response(self.api) + self.assertEqual(200, res_pkgname1.status_code) + self.assertEqual(len(res_pkgname1.json['packages']), 1) + self.assertEqual(res_pkgname1.json['packages'][0]['name'], + expected_pkg1.name) + + res_pkgname2 = req_pkgname2.get_response(self.api) + self.assertEqual(200, res_pkgname2.status_code) + self.assertEqual(len(res_pkgname2.json['packages']), 1) + self.assertEqual(res_pkgname2.json['packages'][0]['name'], + expected_pkg2.name) + + def test_packages_filter_by_type(self): + """GET /catalog/packages with parameter "type" returns packages + filtered by type. + """ + self._set_policy_rules( + {'get_package': '', + 'manage_public_package': ''} + ) + excepted_pkg1 = self._add_pkg("test_tenant", type='Library') + excepted_pkg2 = self._add_pkg("test_tenant", type='Library') + excepted_pkg3 = self._add_pkg("test_tenant", type='Application') + + # filter by type=Library can see 2 pkgs + req_lib = self._get('/catalog/packages', + params={'type': 'Library'}) + + # filter by type=Application only see 1 pkgs + req_app = self._get('/catalog/packages', + params={'type': 'Application'}) + + for dummy in range(2): + self.expect_policy_check('get_package') + self.expect_policy_check('manage_public_package') + + res_lib = req_lib.get_response(self.api) + + self.assertEqual(200, res_lib.status_code) + self.assertEqual(len(res_lib.json['packages']), 2) + + self.assertEqual(res_lib.json['packages'][0]['type'], 'Library') + self.assertEqual(res_lib.json['packages'][0]['name'], + excepted_pkg1.name) + + self.assertEqual(res_lib.json['packages'][1]['type'], 'Library') + self.assertEqual(res_lib.json['packages'][1]['name'], + excepted_pkg2.name) + + res_app = req_app.get_response(self.api) + + self.assertEqual(200, res_app.status_code) + self.assertEqual(len(res_app.json['packages']), 1) + + self.assertEqual(res_app.json['packages'][0]['type'], 'Application') + self.assertEqual(res_app.json['packages'][0]['name'], + excepted_pkg3.name) + def test_packages(self): self._set_policy_rules( {'get_package': '', diff --git a/releasenotes/notes/filter-in-package-definition-43edaf12rad81b88.yaml b/releasenotes/notes/filter-in-package-definition-43edaf12rad81b88.yaml new file mode 100644 index 000000000..8496731f9 --- /dev/null +++ b/releasenotes/notes/filter-in-package-definition-43edaf12rad81b88.yaml @@ -0,0 +1,3 @@ +--- +features: + - Added filter by 'Name' which only matches package name.