summaryrefslogtreecommitdiff
path: root/ironic/common
diff options
context:
space:
mode:
authorDmitry Tantsur <dtantsur@protonmail.com>2021-11-29 11:36:06 +0100
committerDmitry Tantsur <dtantsur@protonmail.com>2021-12-07 09:31:12 +0100
commit9a6f2d101ba734126b3e7f0d475b747ebcb84b62 (patch)
treea1d33fcb4f8689d38fa50bd8234c55d29f096ecb /ironic/common
parent3f990beb97c2f72a6af28dd24f70b016606acc61 (diff)
downloadironic-9a6f2d101ba734126b3e7f0d475b747ebcb84b62.tar.gz
All-in-one Ironic service with a local RPC bus
This adds a new executable /usr/bin/ironic (cool that we no longer have a CLI with this name) that starts API and conductor together in the same process. When an RPC host name matches the current one, the call is not routed through the remote RPC, a local function call is done instead. Story: #2009676 Task: #43953 Change-Id: I51bf7226aea145dc7c8fd93d61caa233ca16c9c9
Diffstat (limited to 'ironic/common')
-rw-r--r--ironic/common/rpc.py10
-rw-r--r--ironic/common/rpc_service.py4
2 files changed, 13 insertions, 1 deletions
diff --git a/ironic/common/rpc.py b/ironic/common/rpc.py
index 95647a72a..285ee1f06 100644
--- a/ironic/common/rpc.py
+++ b/ironic/common/rpc.py
@@ -31,6 +31,9 @@ ALLOWED_EXMODS = [
exception.__name__,
]
EXTRA_EXMODS = []
+GLOBAL_MANAGER = None
+
+MANAGER_TOPIC = 'ironic.conductor_manager'
def init(conf):
@@ -148,3 +151,10 @@ def get_versioned_notifier(publisher_id=None):
assert VERSIONED_NOTIFIER is not None
assert publisher_id is not None
return VERSIONED_NOTIFIER.prepare(publisher_id=publisher_id)
+
+
+def set_global_manager(manager):
+ global GLOBAL_MANAGER
+ if GLOBAL_MANAGER is not None and manager is not None:
+ raise RuntimeError("An attempt to set a global manager twice")
+ GLOBAL_MANAGER = manager
diff --git a/ironic/common/rpc_service.py b/ironic/common/rpc_service.py
index c0a550c64..bbf38d7f4 100644
--- a/ironic/common/rpc_service.py
+++ b/ironic/common/rpc_service.py
@@ -38,7 +38,7 @@ class RPCService(service.Service):
self.host = host
manager_module = importutils.try_import(manager_module)
manager_class = getattr(manager_module, manager_class)
- self.manager = manager_class(host, manager_module.MANAGER_TOPIC)
+ self.manager = manager_class(host, rpc.MANAGER_TOPIC)
self.topic = self.manager.topic
self.rpcserver = None
self.deregister = True
@@ -61,6 +61,7 @@ class RPCService(service.Service):
self.handle_signal()
self.manager.init_host(admin_context)
+ rpc.set_global_manager(self.manager)
LOG.info('Created RPC server for service %(service)s on host '
'%(host)s.',
@@ -84,6 +85,7 @@ class RPCService(service.Service):
LOG.info('Stopped RPC server for service %(service)s on host '
'%(host)s.',
{'service': self.topic, 'host': self.host})
+ rpc.set_global_manager(None)
def _handle_signal(self, signo, frame):
LOG.info('Got signal SIGUSR1. Not deregistering on next shutdown '