diff --git a/neutron/api/api_common.py b/neutron/api/api_common.py index e1b361a747c..435d3ba0b20 100644 --- a/neutron/api/api_common.py +++ b/neutron/api/api_common.py @@ -233,7 +233,9 @@ def get_sorts(request, attr_info): msg = _("The number of sort_keys and sort_dirs must be same") raise exc.HTTPBadRequest(explanation=msg) valid_dirs = [constants.SORT_DIRECTION_ASC, constants.SORT_DIRECTION_DESC] - absent_keys = [x for x in sort_keys if x not in attr_info] + valid_sort_keys = set(attr for attr, schema in attr_info.items() + if schema.get('is_sort_key', False)) + absent_keys = [x for x in sort_keys if x not in valid_sort_keys] if absent_keys: msg = _("%s is invalid attribute for sort_keys") % absent_keys raise exc.HTTPBadRequest(explanation=msg) diff --git a/neutron/tests/unit/api/v2/test_base.py b/neutron/tests/unit/api/v2/test_base.py index b3ae0fe2a62..31292e21542 100644 --- a/neutron/tests/unit/api/v2/test_base.py +++ b/neutron/tests/unit/api/v2/test_base.py @@ -1562,7 +1562,10 @@ class SortingTestCase(base.BaseTestCase): def test_get_sorts(self): path = '/?sort_key=foo&sort_dir=desc&sort_key=bar&sort_dir=asc' request = webob.Request.blank(path) - attr_info = {'foo': {'key': 'val'}, 'bar': {'key': 'val'}} + attr_info = { + 'foo': {'key': 'val', 'is_sort_key': True}, + 'bar': {'key': 'val', 'is_sort_key': True} + } expect_val = [('foo', False), ('bar', True)] actual_val = api_common.get_sorts(request, attr_info) self.assertEqual(expect_val, actual_val) @@ -1570,11 +1573,23 @@ class SortingTestCase(base.BaseTestCase): def test_get_sorts_with_project_id(self): path = '/?sort_key=project_id&sort_dir=desc' request = webob.Request.blank(path) - attr_info = {'tenant_id': {'key': 'val'}} + attr_info = {'tenant_id': {'key': 'val', 'is_sort_key': True}} expect_val = [('project_id', False)] actual_val = api_common.get_sorts(request, attr_info) self.assertEqual(expect_val, actual_val) + def test_get_sorts_with_non_sort_key(self): + path = '/?sort_key=created_at&sort_dir=desc' + request = webob.Request.blank(path) + attr_info = { + 'foo': {'key': 'val', 'is_sort_key': True}, + 'bar': {'key': 'val', 'is_sort_key': True}, + 'created_at': {'key': 'val'} + } + self.assertRaises(exc.HTTPBadRequest, + api_common.get_sorts, + request, attr_info) + class FiltersTestCase(base.BaseTestCase): def test_all_skip_args(self): diff --git a/releasenotes/notes/add-sort-keys-check-for-get-sorts-b9e3e86ddcb3bc3a.yaml b/releasenotes/notes/add-sort-keys-check-for-get-sorts-b9e3e86ddcb3bc3a.yaml new file mode 100644 index 00000000000..0f77727238d --- /dev/null +++ b/releasenotes/notes/add-sort-keys-check-for-get-sorts-b9e3e86ddcb3bc3a.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Add sort-keys validation logic to method ``get_sorts`` in + ``neutron.api.api_common``. See the link below for more: + https://bugs.launchpad.net/neutron/+bug/1659175