]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Use db model hook to filter external network
authorHe Jie Xu <xuhj@linux.vnet.ibm.com>
Mon, 25 Feb 2013 13:50:54 +0000 (21:50 +0800)
committerHe Jie Xu <xuhj@linux.vnet.ibm.com>
Mon, 25 Feb 2013 16:05:52 +0000 (00:05 +0800)
Fixes bug 1132849

Change-Id: I47e01a11afaf6e6bcf06da7bd713fd39b05600ff

quantum/db/db_base_plugin_v2.py
quantum/db/l3_db.py
quantum/plugins/hyperv/hyperv_quantum_plugin.py
quantum/plugins/linuxbridge/lb_quantum_plugin.py
quantum/plugins/midonet/plugin.py
quantum/plugins/nec/nec_plugin.py
quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py
quantum/plugins/openvswitch/ovs_quantum_plugin.py
quantum/plugins/ryu/ryu_quantum_plugin.py
quantum/tests/unit/test_l3_plugin.py

index 675ad86eb482b7074feddafa7f477f4f6f270ce9..7792a03aafee6cbe32285ecf8a3965b903724add 100644 (file)
@@ -118,7 +118,8 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
         return query
 
     @classmethod
-    def register_model_query_hook(cls, model, name, query_hook, filter_hook):
+    def register_model_query_hook(cls, model, name, query_hook, filter_hook,
+                                  result_filters=None):
         """ register an hook to be invoked when a query is executed.
 
         Add the hooks to the _model_query_hooks dict. Models are the keys
@@ -138,7 +139,8 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
             # add key to dict
             model_hooks = {}
             cls._model_query_hooks[model] = model_hooks
-        model_hooks[name] = {'query': query_hook, 'filter': filter_hook}
+        model_hooks[name] = {'query': query_hook, 'filter': filter_hook,
+                             'result_filters': result_filters}
 
     def _get_by_id(self, context, model, id):
         query = self._model_query(context, model)
@@ -208,6 +210,11 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2):
                 column = getattr(model, key, None)
                 if column:
                     query = query.filter(column.in_(value))
+            for _name, hooks in self._model_query_hooks.get(model,
+                                                            {}).iteritems():
+                result_filter = hooks.get('result_filters', None)
+                if result_filter:
+                    query = result_filter(self, query, filters)
         return query
 
     def _get_collection_query(self, context, model, filters=None,
index dd51d11040c5e8878c19ec5ee014f61bb504d856..d18e59668f42de69c14a24d909e39b33528e44ab 100644 (file)
@@ -92,6 +92,14 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
                                   *conditions)
         return conditions
 
+    def _network_result_filter_hook(self, query, filters):
+        vals = filters and filters.get('router:external', [])
+        if not vals:
+            return query
+        if vals[0]:
+            return query.filter((ExternalNetwork.network_id != expr.null()))
+        return query.filter((ExternalNetwork.network_id == expr.null()))
+
     # TODO(salvatore-orlando): Perform this operation without explicitly
     # referring to db_base_plugin_v2, as plugins that do not extend from it
     # might exist in the future
@@ -99,7 +107,8 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
         models_v2.Network,
         "external_net",
         _network_model_hook,
-        _network_filter_hook)
+        _network_filter_hook,
+        _network_result_filter_hook)
 
     def _get_router(self, context, id):
         try:
index 8f2fae99d4763207058d11134051588e837c259f..63cce83677c2ea20bb96ce8b4afbbd09e289fc6a 100644 (file)
@@ -347,8 +347,6 @@ class HyperVQuantumPlugin(db_base_plugin_v2.QuantumDbPluginV2,
             self._extend_network_dict_provider(context, net)
             self._extend_network_dict_l3(context, net)
 
-        # TODO(rkukura): Filter on extended provider attributes.
-        nets = self._filter_nets_l3(context, nets, filters)
         return [self._fields(net, fields) for net in nets]
 
     def _extend_port_dict_binding(self, context, port):
index 54e4beea22671b10aa6befba796a46f390a8a346..43ce8de0233af007c9d3a18ba7b2c1a3278b8fac 100644 (file)
@@ -449,9 +449,6 @@ class LinuxBridgePluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                 self._extend_network_dict_provider(context, net)
                 self._extend_network_dict_l3(context, net)
 
-            # TODO(rkukura): Filter on extended provider attributes.
-            nets = self._filter_nets_l3(context, nets, filters)
-
         return [self._fields(net, fields) for net in nets]
 
     def _extend_port_dict_binding(self, context, port):
index 714364a32172ec62a950cd5392d953d6574d6256..ed92efad7e8b6cf327a6b56449561b661fdb2f6d 100644 (file)
@@ -374,7 +374,6 @@ class MidonetPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                                               id=n['id'])
             self._extend_network_dict_l3(context, n)
 
-        qnets = self._filter_nets_l3(context, qnets, filters)
         return [self._fields(net, fields) for net in qnets]
 
     def delete_network(self, context, id):
index 52a677be71db1affa789c0ec6a5a8ab77d8630a7..e6ea05d53ac4c00f8ad11b2f9d6462899fe7093d 100644 (file)
@@ -342,7 +342,6 @@ class NECPluginV2(nec_plugin_base.NECPluginV2Base,
         nets = super(NECPluginV2, self).get_networks(context, filters, None)
         for net in nets:
             self._extend_network_dict_l3(context, net)
-        nets = self._filter_nets_l3(context, nets, filters)
         return [self._fields(net, fields) for net in nets]
 
     def _extend_port_dict_binding(self, context, port):
index 3ec2ddda8e6d3adf05ab69f84a4ed95a99dcab41..1b87c041552fffc4fc124e8f3173002c47137f90 100644 (file)
@@ -1041,9 +1041,6 @@ class NvpPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                 self._extend_network_dict_l3(context, net)
                 self._extend_network_qos_queue(context, net)
 
-            quantum_lswitches = self._filter_nets_l3(context,
-                                                     quantum_lswitches,
-                                                     filters)
             tenant_ids = filters and filters.get('tenant_id') or None
         filter_fmt = "&tag=%s&tag_scope=os_tid"
         if context.is_admin and not tenant_ids:
index ce22d9edb50601c3376e25a2b6df7be6f0d65731..a2382149d55ae9a6a8176276061425b37e4bed20 100644 (file)
@@ -538,9 +538,6 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                 self._extend_network_dict_provider(context, net)
                 self._extend_network_dict_l3(context, net)
 
-            # TODO(rkukura): Filter on extended provider attributes.
-            nets = self._filter_nets_l3(context, nets, filters)
-
         return [self._fields(net, fields) for net in nets]
 
     def _extend_port_dict_binding(self, context, port):
index 58dc0e4e452204b4426467dd89a96c227d280049..f51280caa4cb2ae1d82db2a503ed4aa9bd1bf52a 100644 (file)
@@ -187,7 +187,6 @@ class RyuQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
                                                             None)
         for net in nets:
             self._extend_network_dict_l3(context, net)
-        nets = self._filter_nets_l3(context, nets, filters)
 
         return [self._fields(net, fields) for net in nets]
 
index 48c97f4cbc542de9afebcdf888419dfb4d2cc77e..ff86f25d049ffd600f0f3fc966180ccee086b588 100644 (file)
@@ -293,8 +293,6 @@ class TestL3NatPlugin(db_base_plugin_v2.QuantumDbPluginV2,
             marker=marker, page_reverse=page_reverse)
         for net in nets:
             self._extend_network_dict_l3(context, net)
-        nets = self._filter_nets_l3(context, nets, filters)
-
         return [self._fields(net, fields) for net in nets]
 
     def delete_port(self, context, id, l3_port_check=True):
@@ -1400,6 +1398,21 @@ class L3NatDBTestCase(L3NatTestCaseBase):
                                   query_params="%s=False" % l3.EXTERNAL)
                 self.assertEqual(len(body['networks']), 1)
 
+    def test_list_nets_external_pagination(self):
+        if self._skip_native_pagination:
+            self.skipTest("Skip test for not implemented pagination feature")
+        with contextlib.nested(self.network(name='net1'),
+                               self.network(name='net3')) as (n1, n3):
+            self._set_net_external(n1['network']['id'])
+            self._set_net_external(n3['network']['id'])
+            with self.network(name='net2') as n2:
+                self._test_list_with_pagination(
+                    'network', (n1, n3), ('name', 'asc'), 1, 3,
+                    query_params='router:external=True')
+                self._test_list_with_pagination(
+                    'network', (n2, ), ('name', 'asc'), 1, 2,
+                    query_params='router:external=False')
+
     def test_get_network_succeeds_without_filter(self):
         plugin = QuantumManager.get_plugin()
         ctx = context.Context(None, None, is_admin=True)