diff options
author | Jenkins <jenkins@review.openstack.org> | 2016-07-11 18:42:56 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2016-07-11 18:42:56 +0000 |
commit | 6d47d8be5efc49fab933f37c67fd45e92b5fc9be (patch) | |
tree | 7e706608fcd672005196768b26f974d7d49777b1 | |
parent | ffe584da91d7bac2bf5651bb9efe4c0964661aa1 (diff) | |
parent | 0da34c543df7dd5d1e3fa89663eced284c511f99 (diff) | |
download | keystone-6d47d8be5efc49fab933f37c67fd45e92b5fc9be.tar.gz |
Merge "/services?name=<name> API fails when using list_limit" into stable/mitaka
-rw-r--r-- | keystone/common/driver_hints.py | 2 | ||||
-rw-r--r-- | keystone/common/sql/core.py | 6 | ||||
-rw-r--r-- | keystone/tests/unit/test_v3_catalog.py | 11 | ||||
-rw-r--r-- | releasenotes/notes/bug-1594482-52a5dd1d8477b694.yaml | 8 |
4 files changed, 23 insertions, 4 deletions
diff --git a/keystone/common/driver_hints.py b/keystone/common/driver_hints.py index e7c2f2efc..15980e454 100644 --- a/keystone/common/driver_hints.py +++ b/keystone/common/driver_hints.py @@ -38,7 +38,7 @@ def truncated(f): _('Cannot truncate a driver call without hints list as ' 'first parameter after self ')) - if hints.limit is None: + if hints.limit is None or hints.filters: return f(self, hints, *args, **kwargs) # A limit is set, so ask for one more entry than we need diff --git a/keystone/common/sql/core.py b/keystone/common/sql/core.py index cb026356f..3bf6f293a 100644 --- a/keystone/common/sql/core.py +++ b/keystone/common/sql/core.py @@ -353,7 +353,11 @@ def _limit(query, hints): # If we satisfied all the filters, set an upper limit if supplied if hints.limit: - query = query.limit(hints.limit['limit']) + original_len = query.count() + limit_query = query.limit(hints.limit['limit']) + if limit_query.count() < original_len: + hints.limit['truncated'] = True + query = limit_query return query diff --git a/keystone/tests/unit/test_v3_catalog.py b/keystone/tests/unit/test_v3_catalog.py index 1852ec342..e37487d5c 100644 --- a/keystone/tests/unit/test_v3_catalog.py +++ b/keystone/tests/unit/test_v3_catalog.py @@ -339,12 +339,13 @@ class CatalogTestCase(test_v3.RestfulTestCase): def test_filter_list_services_by_name(self): """Call ``GET /services?name=<some name>``.""" - target_ref = self._create_random_service() - # create unrelated services self._create_random_service() self._create_random_service() + # create the desired service + target_ref = self._create_random_service() + response = self.get('/services?name=' + target_ref['name']) self.assertValidServiceListResponse(response, ref=target_ref) @@ -354,6 +355,12 @@ class CatalogTestCase(test_v3.RestfulTestCase): filtered_service = filtered_service_list[0] self.assertEqual(target_ref['name'], filtered_service['name']) + def test_filter_list_services_by_name_with_list_limit(self): + """Call ``GET /services?name=<some name>``.""" + self.config_fixture.config(list_limit=1) + + self.test_filter_list_services_by_name() + def test_get_service(self): """Call ``GET /services/{service_id}``.""" r = self.get('/services/%(service_id)s' % { diff --git a/releasenotes/notes/bug-1594482-52a5dd1d8477b694.yaml b/releasenotes/notes/bug-1594482-52a5dd1d8477b694.yaml new file mode 100644 index 000000000..656d2f697 --- /dev/null +++ b/releasenotes/notes/bug-1594482-52a5dd1d8477b694.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - > + [`bug 1594482 <https://bugs.launchpad.net/keystone/+bug/1594482>`_] + When using list_limit config option, the GET /services?name={service_name} + API was first truncating the list and afterwards filtering by name. + The API was fixed to first filter by name and only afterwards truncate the + result list to the desired limit. |