From 08ba20c8d217713a140b90240176bc7959125b62 Mon Sep 17 00:00:00 2001 From: hardikj Date: Mon, 8 Oct 2018 19:07:26 +0530 Subject: [PATCH] Fix next link in get resource list rest API Fix the issue where `next` link in the response of the REST API, when used with pagination, gets corrupted and makes it unusable. After this fix, next link should be readily usable. Change-Id: Idf45a59e0b07d8306cc82391679fe30a9cd2f0c1 Closes-Bug: #1793344 --- mistral/api/controllers/resource.py | 11 ++++-- mistral/tests/unit/api/test_resource_list.py | 38 +++++++++++++++++++ ...-next-url-formatting-2cc0d8a27625c73a.yaml | 9 +++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 mistral/tests/unit/api/test_resource_list.py create mode 100644 releasenotes/notes/fix-next-url-formatting-2cc0d8a27625c73a.yaml diff --git a/mistral/api/controllers/resource.py b/mistral/api/controllers/resource.py index 020f118e6..47c6b3fef 100644 --- a/mistral/api/controllers/resource.py +++ b/mistral/api/controllers/resource.py @@ -115,9 +115,14 @@ class ResourceList(Resource): if not self.has_next(limit): return wtypes.Unset - q_args = ''.join( - ['%s=%s&' % (key, value) for key, value in kwargs.items()] - ) + q_args = '' + + for key, value in kwargs.items(): + if isinstance(value, dict): + q_args += '%s=%s:%s&' % \ + (key, list(value.keys())[0], list(value.values())[0]) + else: + q_args += '%s=%s&' % (key, value) resource_args = ( '?%(args)slimit=%(limit)d&marker=%(marker)s' % diff --git a/mistral/tests/unit/api/test_resource_list.py b/mistral/tests/unit/api/test_resource_list.py new file mode 100644 index 000000000..ec314977b --- /dev/null +++ b/mistral/tests/unit/api/test_resource_list.py @@ -0,0 +1,38 @@ +# Copyright 2018 Nokia Networks. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslotest import base + +from mistral.api.controllers.v2 import resources + + +class TestResourceList(base.BaseTestCase): + + def test_next_link_correctness(self): + task = resources.Task.sample() + + result = resources.Tasks.convert_with_links( + resources=[task], + limit=1, + url='https://localhost:8080', + sort_keys='created_at,id', + sort_dirs='asc,asc', + fields='', + state='eq:RUNNING' + ) + + next_link = result.next + + self.assertIn('state=eq:RUNNING', next_link) + self.assertIn('sort_keys=created_at,id', next_link) diff --git a/releasenotes/notes/fix-next-url-formatting-2cc0d8a27625c73a.yaml b/releasenotes/notes/fix-next-url-formatting-2cc0d8a27625c73a.yaml new file mode 100644 index 000000000..2ba2acc87 --- /dev/null +++ b/releasenotes/notes/fix-next-url-formatting-2cc0d8a27625c73a.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + Fix issue where next link in some list APIs, + when invoked with pagination and filter(s), + contained JSON string. This made next link + an invalid URL. This issue impacted all REST + APIs where filters can be used. +