summaryrefslogtreecommitdiff
path: root/ironic/conductor
diff options
context:
space:
mode:
authorDmitry Tantsur <dtantsur@redhat.com>2015-01-15 15:22:36 +0100
committerDmitry Tantsur <dtantsur@redhat.com>2015-02-03 16:36:12 +0100
commitd3d3164a6b8bc4ff5fdd02ea4ba22e411868b729 (patch)
tree79f2fd864d3219216f6934f6842f0af319c59190 /ironic/conductor
parentdc5b9c65d00a7d7a1f153f9d4d0243754bb39761 (diff)
downloadironic-d3d3164a6b8bc4ff5fdd02ea4ba22e411868b729.tar.gz
Add support for driver-specific periodic tasks
Syncs openstack.common.periodic_task to commit 0848516902444ca83dd4998655cae3901d038d (https://review.openstack.org/#/c/148854/). This patch also makes service start running periodic tasks after init_host() is called. Change-Id: I63ee4ce30b3684e53158fe5f985efd04e4e88fef Implements: blueprint driver-periodic-tasks
Diffstat (limited to 'ironic/conductor')
-rw-r--r--ironic/conductor/manager.py16
1 files changed, 16 insertions, 0 deletions
diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py
index 67c3c0a98..9bc69de1b 100644
--- a/ironic/conductor/manager.py
+++ b/ironic/conductor/manager.py
@@ -43,6 +43,7 @@ a change, etc.
import collections
import datetime
+import inspect
import tempfile
import threading
@@ -212,6 +213,16 @@ class ConductorManager(periodic_task.PeriodicTasks):
LOG.error(msg, self.host)
raise exception.NoDriversLoaded(conductor=self.host)
+ # Collect driver-specific periodic tasks
+ for driver_obj in driver_factory.drivers().values():
+ self._collect_periodic_tasks(driver_obj)
+ for iface_name in (driver_obj.core_interfaces +
+ driver_obj.standard_interfaces +
+ ['vendor']):
+ iface = getattr(driver_obj, iface_name, None)
+ if iface:
+ self._collect_periodic_tasks(iface)
+
# clear all locks held by this conductor before registering
self.dbapi.clear_node_reservations_for_conductor(self.host)
try:
@@ -248,6 +259,11 @@ class ConductorManager(periodic_task.PeriodicTasks):
LOG.critical(_LC('Failed to start keepalive'))
self.del_host()
+ def _collect_periodic_tasks(self, obj):
+ for n, method in inspect.getmembers(obj, inspect.ismethod):
+ if getattr(method, '_periodic_enabled', False):
+ self.add_periodic_task(method)
+
def del_host(self):
self._keepalive_evt.set()
try: