From b7d25aa34920f9842be8cf8533c4b72a8cc8bb18 Mon Sep 17 00:00:00 2001 From: Hampapur Ajay Date: Wed, 17 Jun 2015 06:24:53 -0700 Subject: [PATCH] config-perf: Fix filter handling in bulk list api handler Pick key/val list from 'filters' key in POST body when bulk list API is used (POST instead of GET when query-params too large). Change-Id: Ibb462f78a85cd2ae8ac788d7ef74da2793d007d7 Partial-Bug: #1462156 --- .../api-server/tests/test_crud_basic.py | 6 ++++++ src/config/api-server/vnc_cfg_api_server.py | 21 ++++++++++--------- src/config/api-server/vnc_cfg_ifmap.py | 3 +++ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/config/api-server/tests/test_crud_basic.py b/src/config/api-server/tests/test_crud_basic.py index 101f412cf61..1c1405347ef 100644 --- a/src/config/api-server/tests/test_crud_basic.py +++ b/src/config/api-server/tests/test_crud_basic.py @@ -1007,6 +1007,12 @@ def test_list_bulk_collection(self): for ret in ret_list['virtual-machine-interfaces']] self.assertThat(set(vmi_uuids), Equals(set(ret_uuids))) + logger.info("Querying RIs by parent_id and filter.") + flexmock(self._api_server).should_call('_list_collection').once() + ret_list = self._vnc_lib.resource_list('routing-instance', + parent_id=vn_uuids, + filters={'display_name':'%s-ri-5' %(self.id())}) + self.assertThat(len(ret_list['routing-instances']), Equals(1)) # end test_list_bulk_collection def test_list_lib_api(self): diff --git a/src/config/api-server/vnc_cfg_api_server.py b/src/config/api-server/vnc_cfg_api_server.py index a5fc82f634d..e821d2f42e1 100644 --- a/src/config/api-server/vnc_cfg_api_server.py +++ b/src/config/api-server/vnc_cfg_api_server.py @@ -846,16 +846,17 @@ def list_bulk_collection_http_post(self): is_count = bottle.request.json.get('count', False) is_detail = bottle.request.json.get('detail', False) - filters = {} - filter_fnames = bottle.request.json.get( - 'filter_field_names', '').split(',') - filter_fvalues = bottle.request.json.get( - 'filter_field_values', '').split(',') - if len(filter_fnames) or len(filter_fvalues): - if len(filter_fnames) != len(filter_fvalues): - bottle.abort(400, "Bad Request, filter parameters unequal") - filters['field_names'] = filter_fnames - filters['field_values'] = filter_fvalues + filter_params = bottle.request.json.get('filters', {}) + if filter_params: + try: + ff_key_vals = filter_params.split(',') + ff_names = [ff.split('==')[0] for ff in ff_key_vals] + ff_values = [ff.split('==')[1] for ff in ff_key_vals] + filters = {'field_names': ff_names, 'field_values': ff_values} + except Exception as e: + bottle.abort(400, 'Invalid filter ' + filter_params) + else: + filters = None return self._list_collection(obj_type, parent_uuids, back_ref_uuids, obj_uuids, is_count, is_detail, filters) diff --git a/src/config/api-server/vnc_cfg_ifmap.py b/src/config/api-server/vnc_cfg_ifmap.py index db10499e236..e229ec7ca9b 100644 --- a/src/config/api-server/vnc_cfg_ifmap.py +++ b/src/config/api-server/vnc_cfg_ifmap.py @@ -1463,6 +1463,9 @@ def dbe_count_children(self, obj_type, obj_id, child_type): # end dbe_read def dbe_read_multi(self, obj_type, obj_ids_list, obj_fields=None): + if not obj_ids_list: + return (True, []) + method_name = obj_type.replace('-', '_') try: (ok, cassandra_result) = self._cassandra_db.read(