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
# 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)
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,
*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
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:
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):
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):
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):
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):
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:
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):
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]
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):
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)