From cbc7cd6cc4d4cc9cce9c7698b807629812247d3b Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Tue, 15 Sep 2015 10:07:51 -0700 Subject: [PATCH] Add basic bulk support to collection controller This patch adds very basic bulk support to the collection controller for bulk operations. TODOs are inline for the things that still need to be done. Functionality was verified with api tests. Change-Id: I2c2e6f6e449a51ea60de75325855affa62869692 --- neutron/pecan_wsgi/controllers/root.py | 14 ++++++++------ neutron/pecan_wsgi/hooks/attribute_population.py | 8 ++++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/neutron/pecan_wsgi/controllers/root.py b/neutron/pecan_wsgi/controllers/root.py index 396778bac..b277ce28f 100644 --- a/neutron/pecan_wsgi/controllers/root.py +++ b/neutron/pecan_wsgi/controllers/root.py @@ -137,10 +137,14 @@ class CollectionsController(object): @when(index, method='POST') def post(self, *args, **kwargs): - # TODO(kevinbenton): bulk! - creator = getattr(request.plugin, 'create_%s' % request.resource_type) - return {request.resource_type: creator(request.context, - request.prepared_data)} + # TODO(kevinbenton): emulated bulk! + if request.bulk: + method = 'create_%s_bulk' % request.resource_type + else: + method = 'create_%s' % request.resource_type + creator = getattr(request.plugin, method) + key = self.collection if request.bulk else request.resource_type + return {key: creator(request.context, request.prepared_data)} class ItemController(object): @@ -163,12 +167,10 @@ class ItemController(object): request.member_action) return member_action_method(request.context, self.item, request.prepared_data) - # TODO(kevinbenton): bulk? updater = getattr(request.plugin, 'update_%s' % request.resource_type) return updater(request.context, self.item, request.prepared_data) @when(index, method='DELETE') def delete(self): - # TODO(kevinbenton): bulk? deleter = getattr(request.plugin, 'delete_%s' % request.resource_type) return deleter(request.context, self.item) diff --git a/neutron/pecan_wsgi/hooks/attribute_population.py b/neutron/pecan_wsgi/hooks/attribute_population.py index cb95cbce7..d85eea586 100644 --- a/neutron/pecan_wsgi/hooks/attribute_population.py +++ b/neutron/pecan_wsgi/hooks/attribute_population.py @@ -42,7 +42,9 @@ class AttributePopulationHook(hooks.PecanHook): state.request.prepared_data = ( v2base.Controller.prepare_request_body( state.request.context, state.request.json, is_create, - resource, _attributes_for_resource(resource))) + resource, _attributes_for_resource(resource), + allow_bulk=True)) + # TODO(kevinbenton): conditional allow_bulk state.request.resources = _extract_resources_from_state(state) # make the original object available: if not is_create and not state.request.member_action: @@ -89,9 +91,11 @@ def _extract_resources_from_state(state): data = state.request.prepared_data # single item if resource_type in data: + state.request.bulk = False return [data[resource_type]] # multiple items if _plural(resource_type) in data: - return data[_plural(resource_type)] + state.request.bulk = True + return [x[resource_type] for x in data[_plural(resource_type)]] return [] -- 2.45.2