From 3c0de821ff8f4ee7c5290fbfc1f33d68f3eb419c Mon Sep 17 00:00:00 2001 From: Angus Salkeld Date: Fri, 30 Mar 2012 12:26:12 +1100 Subject: [PATCH] Add missing references Signed-off-by: Angus Salkeld --- heat/common/config.py | 34 ++++++++++++++++++++++ heat/common/utils.py | 65 +++++++++++++++++++++++++++++++++++++++++++ heat/rpc/common.py | 2 +- 3 files changed, 100 insertions(+), 1 deletion(-) diff --git a/heat/common/config.py b/heat/common/config.py index eebe86cc..1e367fed 100644 --- a/heat/common/config.py +++ b/heat/common/config.py @@ -57,6 +57,40 @@ class HeatEngineConfigOpts(cfg.CommonConfigOpts): cfg.StrOpt('instance_driver', default='heat.engine.nova', help='Driver to use for controlling instances'), + + cfg.StrOpt('rabbit_host', + default='localhost', + help='the RabbitMQ host'), + cfg.IntOpt('rabbit_port', + default=5672, + help='the RabbitMQ port'), + cfg.BoolOpt('rabbit_use_ssl', + default=False, + help='connect over SSL for RabbitMQ'), + cfg.StrOpt('rabbit_userid', + default='guest', + help='the RabbitMQ userid'), + cfg.StrOpt('rabbit_password', + default='guest', + help='the RabbitMQ password'), + cfg.StrOpt('rabbit_virtual_host', + default='/', + help='the RabbitMQ virtual host'), + cfg.IntOpt('rabbit_retry_interval', + default=1, + help='how frequently to retry connecting with RabbitMQ'), + cfg.IntOpt('rabbit_retry_backoff', + default=2, + help='how long to backoff for between retries when connecting ' + 'to RabbitMQ'), + cfg.IntOpt('rabbit_max_retries', + default=0, + help='maximum retries with trying to connect to RabbitMQ ' + '(the default of 0 implies an infinite retry count)'), + cfg.StrOpt('control_exchange', + default='nova', + help='the main RabbitMQ exchange to connect to'), + ] def __init__(self, default_config_files=None, **kwargs): diff --git a/heat/common/utils.py b/heat/common/utils.py index a1c55c73..3be57edd 100644 --- a/heat/common/utils.py +++ b/heat/common/utils.py @@ -24,6 +24,11 @@ import datetime import sys import uuid +from eventlet import event +from eventlet import greenthread +from eventlet import semaphore +from eventlet.green import subprocess + from heat.common import exception @@ -87,3 +92,63 @@ def utcnow(): return datetime.datetime.utcnow() utcnow.override_time = None + + +class LoopingCallDone(Exception): + """Exception to break out and stop a LoopingCall. + + The poll-function passed to LoopingCall can raise this exception to + break out of the loop normally. This is somewhat analogous to + StopIteration. + + An optional return-value can be included as the argument to the exception; + this return-value will be returned by LoopingCall.wait() + + """ + + def __init__(self, retvalue=True): + """:param retvalue: Value that LoopingCall.wait() should return.""" + self.retvalue = retvalue + + +class LoopingCall(object): + def __init__(self, f=None, *args, **kw): + self.args = args + self.kw = kw + self.f = f + self._running = False + + def start(self, interval, now=True): + self._running = True + done = event.Event() + + def _inner(): + if not now: + greenthread.sleep(interval) + try: + while self._running: + self.f(*self.args, **self.kw) + if not self._running: + break + greenthread.sleep(interval) + except LoopingCallDone, e: + self.stop() + done.send(e.retvalue) + except Exception: + LOG.exception(_('in looping call')) + done.send_exception(*sys.exc_info()) + return + else: + done.send(True) + + self.done = done + + greenthread.spawn(_inner) + return self.done + + def stop(self): + self._running = False + + def wait(self): + return self.done.wait() + diff --git a/heat/rpc/common.py b/heat/rpc/common.py index a425a204..fb621cc3 100644 --- a/heat/rpc/common.py +++ b/heat/rpc/common.py @@ -20,7 +20,7 @@ import copy import logging -from heat import exception +from heat.common import exception from heat.openstack.common import cfg from heat.common import config -- 2.45.2