summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2016-07-11 18:42:56 +0000
committerGerrit Code Review <review@openstack.org>2016-07-11 18:42:56 +0000
commit6d47d8be5efc49fab933f37c67fd45e92b5fc9be (patch)
tree7e706608fcd672005196768b26f974d7d49777b1
parentffe584da91d7bac2bf5651bb9efe4c0964661aa1 (diff)
parent0da34c543df7dd5d1e3fa89663eced284c511f99 (diff)
downloadkeystone-6d47d8be5efc49fab933f37c67fd45e92b5fc9be.tar.gz
Merge "/services?name=<name> API fails when using list_limit" into stable/mitaka
-rw-r--r--keystone/common/driver_hints.py2
-rw-r--r--keystone/common/sql/core.py6
-rw-r--r--keystone/tests/unit/test_v3_catalog.py11
-rw-r--r--releasenotes/notes/bug-1594482-52a5dd1d8477b694.yaml8
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.