Skip to content

Commit

Permalink
config-perf: Fix filter handling in bulk list api handler
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Hampapur Ajay committed Jun 17, 2015
1 parent 88edb11 commit b7d25aa
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 10 deletions.
6 changes: 6 additions & 0 deletions src/config/api-server/tests/test_crud_basic.py
Expand Up @@ -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):
Expand Down
21 changes: 11 additions & 10 deletions src/config/api-server/vnc_cfg_api_server.py
Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions src/config/api-server/vnc_cfg_ifmap.py
Expand Up @@ -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(
Expand Down

0 comments on commit b7d25aa

Please sign in to comment.