]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Add basic bulk support to collection controller
authorKevin Benton <blak111@gmail.com>
Tue, 15 Sep 2015 17:07:51 +0000 (10:07 -0700)
committerKevin Benton <blak111@gmail.com>
Tue, 15 Sep 2015 18:05:29 +0000 (11:05 -0700)
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
neutron/pecan_wsgi/hooks/attribute_population.py

index 396778bac880923cee39fac91b11724b6130348d..b277ce28fa9625a3b04036e9b0a16077c6ab6d13 100644 (file)
@@ -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)
index cb95cbce783921f5e134bf6d91dc09d6899f106e..d85eea586241e7b8d5c2b13b9f645624cf5cdc1a 100644 (file)
@@ -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 []