From 2b5d1fdd1f68a5231e57b8c55abfc84c9a6a48a0 Mon Sep 17 00:00:00 2001 From: Lajos Katona Date: Wed, 2 May 2018 16:30:26 +0200 Subject: [PATCH] Fix list_resource_providers filters list_resource_providers failed filtering as the filter parameters like name, or in_tree must be added to the url as query strings: /resource_providers?name=foo&in_tree= Related-Bug: #1578989 Change-Id: I794972e93dbcf7310154cc1cceef25b9df618450 --- neutron_lib/clients/placement.py | 4 +++- .../tests/unit/clients/test_placement.py | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/neutron_lib/clients/placement.py b/neutron_lib/clients/placement.py index 76fe35b0a..8c677e8cc 100644 --- a/neutron_lib/clients/placement.py +++ b/neutron_lib/clients/placement.py @@ -20,6 +20,7 @@ from keystoneauth1 import exceptions as ks_exc from keystoneauth1 import loading as keystone from oslo_log import log as logging from oslo_utils import versionutils +from six.moves.urllib.parse import urlencode from neutron_lib._i18n import _ from neutron_lib.exceptions import placement as n_exc @@ -203,7 +204,8 @@ class PlacementAPIClient(object): filters['in_tree'] = in_tree if uuid: filters['uuid'] = uuid - return self._get(url, **filters).json() + url = '%s?%s' % (url, urlencode(filters)) + return self._get(url).json() @_check_placement_api_available def update_resource_provider_inventories( diff --git a/neutron_lib/tests/unit/clients/test_placement.py b/neutron_lib/tests/unit/clients/test_placement.py index afe259316..2bdffa916 100644 --- a/neutron_lib/tests/unit/clients/test_placement.py +++ b/neutron_lib/tests/unit/clients/test_placement.py @@ -75,21 +75,28 @@ class TestPlacementAPIClient(base.BaseTestCase): def test_list_resource_providers(self): filter_1 = {'name': 'name1', 'in_tree': 'tree1_uuid'} self.placement_api_client.list_resource_providers(**filter_1) - self.placement_fixture.mock_get.assert_called_once_with( - '/resource_providers', **filter_1) + args = str(self.placement_fixture.mock_get.call_args) + self.placement_fixture.mock_get.assert_called_once() + self.assertIn('name=name1', args) + self.assertIn('in_tree=tree1_uuid', args) filter_2 = {'member_of': ['aggregate_uuid'], 'uuid': 'uuid_1', 'resources': {'r_class1': 'value1'}} self.placement_fixture.mock_get.reset_mock() self.placement_api_client.list_resource_providers(**filter_2) - self.placement_fixture.mock_get.assert_called_once_with( - '/resource_providers', **filter_2) + args = str(self.placement_fixture.mock_get.call_args) + self.placement_fixture.mock_get.assert_called_once() + self.assertIn('member_of', args) + self.assertIn('uuid', args) + self.assertIn('resources', args) filter_1.update(filter_2) self.placement_fixture.mock_get.reset_mock() self.placement_api_client.list_resource_providers(**filter_1) - self.placement_fixture.mock_get.assert_called_once_with( - '/resource_providers', **filter_1) + args = str(self.placement_fixture.mock_get.call_args) + self.placement_fixture.mock_get.assert_called_once() + for key in filter_1: + self.assertIn(key, args) def test_list_resource_providers_placement_api_version_too_low(self): self.placement_api_client._target_version = (1, 1)