summaryrefslogtreecommitdiff
path: root/ironic/conductor/rpcapi.py
diff options
context:
space:
mode:
authorDmitry Tantsur <divius.inside@gmail.com>2019-01-08 17:02:55 +0100
committerDmitry Tantsur <divius.inside@gmail.com>2019-01-09 13:21:30 +0100
commit1b019ddf84586fd2012f29b473b38ec271b928f2 (patch)
treebd409182e382aa9d7a786535149e41f5fa86c8d7 /ironic/conductor/rpcapi.py
parentcea8d74914db22cb8478d6382e281140dd071253 (diff)
downloadironic-1b019ddf84586fd2012f29b473b38ec271b928f2.tar.gz
Allocation API: allow picking random conductor for RPC topic
Allocations are not initially tied to nodes, so to process them we need to pick a random alive conductor. This change enables that. Change-Id: I6c950bc4f49aa03026bc7925f8c699d10cedc310 Story: #2004341
Diffstat (limited to 'ironic/conductor/rpcapi.py')
-rw-r--r--ironic/conductor/rpcapi.py11
1 files changed, 11 insertions, 0 deletions
diff --git a/ironic/conductor/rpcapi.py b/ironic/conductor/rpcapi.py
index 8971360cb..6284e4034 100644
--- a/ironic/conductor/rpcapi.py
+++ b/ironic/conductor/rpcapi.py
@@ -29,6 +29,7 @@ from ironic.common import release_mappings as versions
from ironic.common import rpc
from ironic.conductor import manager
from ironic.conf import CONF
+from ironic.db import api as dbapi
from ironic.objects import base as objects_base
@@ -154,6 +155,16 @@ class ConductorAPI(object):
hostname = self.get_conductor_for(node)
return '%s.%s' % (self.topic, hostname)
+ def get_random_topic(self):
+ """Get an RPC topic for a random conductor service."""
+ conductors = dbapi.get_instance().get_online_conductors()
+ try:
+ hostname = random.choice(conductors)
+ except IndexError:
+ # There are no conductors - return 503 Service Unavailable
+ raise exception.TemporaryFailure()
+ return '%s.%s' % (self.topic, hostname)
+
def get_topic_for_driver(self, driver_name):
"""Get RPC topic name for a conductor supporting the given driver.