diff options
author | Dmitry Tantsur <divius.inside@gmail.com> | 2019-02-19 13:14:36 +0100 |
---|---|---|
committer | Dmitry Tantsur <divius.inside@gmail.com> | 2019-02-19 13:36:02 +0100 |
commit | b1cfcb7c9867ea55a458b6f0ef67e916b2de5e9d (patch) | |
tree | ae9a04b0d377f63d48dbfeae91f6f14e686ecb2f /ironic/db | |
parent | d1b572091bc579981fe9188384e63c29faab8522 (diff) | |
download | ironic-b1cfcb7c9867ea55a458b6f0ef67e916b2de5e9d.tar.gz |
Allocation API: resume allocations on conductor restart
This change allows allocations that were not finished because of
conductor restarting or crashing to be finished after start up.
Change-Id: I016e08dcb59613b59ae753ef7d3bc9ac4a4a950a
Story: #2004341
Task: #29544
Diffstat (limited to 'ironic/db')
-rw-r--r-- | ironic/db/sqlalchemy/api.py | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/ironic/db/sqlalchemy/api.py b/ironic/db/sqlalchemy/api.py index ec7e9dd67..468d01c93 100644 --- a/ironic/db/sqlalchemy/api.py +++ b/ironic/db/sqlalchemy/api.py @@ -199,6 +199,17 @@ def add_allocation_filter_by_node(query, value): return query.filter(models.Node.uuid == value) +def add_allocation_filter_by_conductor(query, value): + if strutils.is_int_like(value): + return query.filter_by(conductor_affinity=value) + else: + # Assume hostname and join with the conductor table + query = query.join( + models.Conductor, + models.Allocation.conductor_affinity == models.Conductor.id) + return query.filter(models.Conductor.hostname == value) + + def _paginate_query(model, limit=None, marker=None, sort_key=None, sort_dir=None, query=None): if not query: @@ -339,7 +350,8 @@ class Connection(api.Connection): def _add_allocations_filters(self, query, filters): if filters is None: filters = dict() - supported_filters = {'state', 'resource_class', 'node_uuid'} + supported_filters = {'state', 'resource_class', 'node_uuid', + 'conductor_affinity'} unsupported_filters = set(filters).difference(supported_filters) if unsupported_filters: msg = _("SqlAlchemy API does not support " @@ -353,6 +365,13 @@ class Connection(api.Connection): else: query = add_allocation_filter_by_node(query, node_uuid) + try: + conductor = filters.pop('conductor_affinity') + except KeyError: + pass + else: + query = add_allocation_filter_by_conductor(query, conductor) + if filters: query = query.filter_by(**filters) return query |