diff options
author | Dmitry Tantsur <divius.inside@gmail.com> | 2019-01-08 17:02:55 +0100 |
---|---|---|
committer | Dmitry Tantsur <divius.inside@gmail.com> | 2019-01-09 13:21:30 +0100 |
commit | 1b019ddf84586fd2012f29b473b38ec271b928f2 (patch) | |
tree | bd409182e382aa9d7a786535149e41f5fa86c8d7 /ironic/conductor/rpcapi.py | |
parent | cea8d74914db22cb8478d6382e281140dd071253 (diff) | |
download | ironic-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.py | 11 |
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. |