neutron-lib/doc/source/contributor/db_model_query.rst
Boden R 108a598252 rehome model_query and its dependencies
This patch rehomes neutron.db._model_query into neutron-lib. While
our longer term goal is to use OVO rather than queries and tables, this
module is provided as a stepping stone (as mentioned in release note
herein). The patch also includes a few other APIs that are required for
the rehome including some utils and an exception class.

For more details see the spec on [1].

Also a sample consumption patch can be found on [2]. While it won't work
as-is with the depends on approach (it needs to be rebased on multiple
other DNMs in neutron) I tested it locally. In addition this change
was tested locally with a sample vmware-nsx consumption patch [3].

[1] https://review.openstack.org/#/c/473531/
[2] https://review.openstack.org/#/c/557786/
[3] https://review.openstack.org/#/c/557788/

Change-Id: I3e4b38aa3b6460ce916091c020adedd4ed2c4d26
2018-04-20 06:18:11 -06:00

2.3 KiB

DB Model Query

The implementation in neutron_lib.db.model_query is intended to be used as a stepping stone for existing consumers using standard database models/tables. Moving forward new database implementations should all use neutron's Versioned Object approach, while existing model based implementations should begin migrating to Versioned Objects.

Registering Hooks

The neutron_lib.db.model_query.register_hook function allows hooks to be registered for invocation during a respective database query.

Each hook has three components:

  • "query": used to build the query expression
  • "filter": used to build the filter expression
  • "result_filters": used for final filtering on the query result

Query hooks take as input the query being built and return a transformed query expression. For example:

def mymodel_query_hook(context, original_model, query):
    augmented_query = ...
    return augmented_query

Filter hooks take as input the filter expression being built and return a transformed filter expression. For example:

def mymodel_filter_hook(context, original_model, filters):
    refined_filters = ...
    return refined_filters

Result filter hooks take as input the query expression and the filter expression, and return a final transformed query expression. For example:

def mymodel_result_filter_hook(query, filters):
    final_filters = ...
    return query.filter(final_filters)