summaryrefslogtreecommitdiff
path: root/ironic/db/sqlalchemy
diff options
context:
space:
mode:
authorDmitry Tantsur <divius.inside@gmail.com>2019-02-19 13:14:36 +0100
committerDmitry Tantsur <divius.inside@gmail.com>2019-02-19 13:36:02 +0100
commitb1cfcb7c9867ea55a458b6f0ef67e916b2de5e9d (patch)
treeae9a04b0d377f63d48dbfeae91f6f14e686ecb2f /ironic/db/sqlalchemy
parentd1b572091bc579981fe9188384e63c29faab8522 (diff)
downloadironic-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/sqlalchemy')
-rw-r--r--ironic/db/sqlalchemy/api.py21
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