From 6a816b012a096147f3570ce1792e95acabdecc02 Mon Sep 17 00:00:00 2001 From: Dan Prince Date: Mon, 5 Nov 2012 16:41:41 -0500 Subject: [PATCH] Sync latest notifier changes from openstack-common Updates Quantum with the latest changes from openstack-commons notifier package: Rename rabbit_notifier to rpc_notifier. The previous rabbit_notifier module is generic and can be used for all RPC notifications. This commit moves the rabbit_notifier module to rpc_notifier and adds a new deprecated rabbit_notifier module which can be used for Grizzly so that users can have a chance to easily upgrade this config setting. Also updates the agent code and config file to reflect this change (and get unit tests to pass) Fixes LP Bug #1075330. Change-Id: If9a4f5fa27638b25a29b66dbfed757554358ff7c --- etc/quantum.conf | 4 +- quantum/agent/rpc.py | 4 +- quantum/openstack/common/cfg.py | 4 +- quantum/openstack/common/log.py | 20 +++++++- .../common/notifier/rabbit_notifier.py | 31 +++---------- .../openstack/common/notifier/rpc_notifier.py | 46 +++++++++++++++++++ 6 files changed, 78 insertions(+), 31 deletions(-) create mode 100644 quantum/openstack/common/notifier/rpc_notifier.py diff --git a/etc/quantum.conf b/etc/quantum.conf index e767102ef2..8733590492 100644 --- a/etc/quantum.conf +++ b/etc/quantum.conf @@ -164,7 +164,7 @@ control_exchange = quantum # Logging driver # notification_driver = quantum.openstack.common.notifier.log_notifier # RPC driver. DHCP agents needs it. -notification_driver = quantum.openstack.common.notifier.rabbit_notifier +notification_driver = quantum.openstack.common.notifier.rpc_notifier # default_notification_level is used to form actual topic name(s) or to set logging level default_notification_level = INFO @@ -173,7 +173,7 @@ default_notification_level = INFO # host = myhost.com # default_publisher_id = $host -# Defined in rabbit_notifier for rpc way, can be comma separated values. +# Defined in rpc_notifier, can be comma separated values. # The actual topic names will be %s.%(default_notification_level)s notification_topics = notifications diff --git a/quantum/agent/rpc.py b/quantum/agent/rpc.py index 81b3e291d8..cab2c2ae2b 100644 --- a/quantum/agent/rpc.py +++ b/quantum/agent/rpc.py @@ -19,7 +19,7 @@ from quantum.common import topics from quantum.openstack.common import log as logging from quantum.openstack.common.notifier import api -from quantum.openstack.common.notifier import rabbit_notifier +from quantum.openstack.common.notifier import rpc_notifier from quantum.openstack.common import rpc from quantum.openstack.common.rpc import proxy @@ -84,7 +84,7 @@ class NotificationDispatcher(object): # being buffered in the process. self.queue = eventlet.queue.Queue(1) self.connection = rpc.create_connection(new=True) - topic = '%s.%s' % (rabbit_notifier.CONF.notification_topics[0], + topic = '%s.%s' % (rpc_notifier.CONF.notification_topics[0], api.CONF.default_notification_level.lower()) self.connection.declare_topic_consumer(topic=topic, callback=self._add_to_queue) diff --git a/quantum/openstack/common/cfg.py b/quantum/openstack/common/cfg.py index bcd1f05fdf..4fcd242517 100644 --- a/quantum/openstack/common/cfg.py +++ b/quantum/openstack/common/cfg.py @@ -239,7 +239,7 @@ in order to support a common usage pattern in OpenStack: from openstack.common import cfg opts = [ - cfg.StrOpt('bind_host' default='0.0.0.0'), + cfg.StrOpt('bind_host', default='0.0.0.0'), cfg.IntOpt('bind_port', default=9292), ] @@ -1507,7 +1507,7 @@ class ConfigOpts(collections.Mapping): if ('default' in info or 'override' in info): continue - if self._get(opt.name, group) is None: + if self._get(opt.dest, group) is None: raise RequiredOptError(opt.name, group) def _parse_cli_opts(self, args): diff --git a/quantum/openstack/common/log.py b/quantum/openstack/common/log.py index be29bf8ad9..acdf96def0 100644 --- a/quantum/openstack/common/log.py +++ b/quantum/openstack/common/log.py @@ -76,6 +76,9 @@ log_opts = [ cfg.BoolOpt('publish_errors', default=False, help='publish error events'), + cfg.BoolOpt('fatal_deprecations', + default=False, + help='make deprecations fatal'), # NOTE(mikal): there are two options here because sometimes we are handed # a full instance (and could include more information), and other times we @@ -170,6 +173,14 @@ class ContextAdapter(logging.LoggerAdapter): def audit(self, msg, *args, **kwargs): self.log(logging.AUDIT, msg, *args, **kwargs) + def deprecated(self, msg, *args, **kwargs): + stdmsg = _("Deprecated Config: %s") % msg + if CONF.fatal_deprecations: + self.critical(stdmsg, *args, **kwargs) + raise DeprecatedConfig(msg=stdmsg) + else: + self.warn(stdmsg, *args, **kwargs) + def process(self, msg, kwargs): if 'extra' not in kwargs: kwargs['extra'] = {} @@ -246,7 +257,7 @@ class JSONFormatter(logging.Formatter): class PublishErrorsHandler(logging.Handler): def emit(self, record): - if ('quantum.openstack.common.notifier.log_notifier' in + if ('openstack.common.notifier.log_notifier' in CONF.notification_driver): return notifier.api.notify(None, 'error.publisher', @@ -450,3 +461,10 @@ class ColorHandler(logging.StreamHandler): def format(self, record): record.color = self.LEVEL_COLORS[record.levelno] return logging.StreamHandler.format(self, record) + + +class DeprecatedConfig(Exception): + message = _("Fatal call to deprecated config: %(msg)s") + + def __init__(self, msg): + super(Exception, self).__init__(self.message % dict(msg=msg)) diff --git a/quantum/openstack/common/notifier/rabbit_notifier.py b/quantum/openstack/common/notifier/rabbit_notifier.py index e11c418fea..428ec7b7f5 100644 --- a/quantum/openstack/common/notifier/rabbit_notifier.py +++ b/quantum/openstack/common/notifier/rabbit_notifier.py @@ -1,4 +1,4 @@ -# Copyright 2011 OpenStack LLC. +# Copyright 2012 Red Hat, Inc. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -14,33 +14,16 @@ # under the License. -from quantum.openstack.common import cfg -from quantum.openstack.common import context as req_context from quantum.openstack.common.gettextutils import _ from quantum.openstack.common import log as logging -from quantum.openstack.common import rpc +from quantum.openstack.common.notifier import rpc_notifier LOG = logging.getLogger(__name__) -notification_topic_opt = cfg.ListOpt( - 'notification_topics', default=['notifications', ], - help='AMQP topic used for openstack notifications') - -CONF = cfg.CONF -CONF.register_opt(notification_topic_opt) - def notify(context, message): - """Sends a notification to the RabbitMQ""" - if not context: - context = req_context.get_admin_context() - priority = message.get('priority', - CONF.default_notification_level) - priority = priority.lower() - for topic in CONF.notification_topics: - topic = '%s.%s' % (topic, priority) - try: - rpc.notify(context, topic, message) - except Exception, e: - LOG.exception(_("Could not send notification to %(topic)s. " - "Payload=%(message)s"), locals()) + """Deprecated in Grizzly. Please use rpc_notifier instead.""" + + LOG.deprecated(_("The rabbit_notifier is now deprecated." + " Please use rpc_notifier instead.")) + rpc_notifier.notify(context, message) diff --git a/quantum/openstack/common/notifier/rpc_notifier.py b/quantum/openstack/common/notifier/rpc_notifier.py new file mode 100644 index 0000000000..c1650537da --- /dev/null +++ b/quantum/openstack/common/notifier/rpc_notifier.py @@ -0,0 +1,46 @@ +# Copyright 2011 OpenStack LLC. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +from quantum.openstack.common import cfg +from quantum.openstack.common import context as req_context +from quantum.openstack.common.gettextutils import _ +from quantum.openstack.common import log as logging +from quantum.openstack.common import rpc + +LOG = logging.getLogger(__name__) + +notification_topic_opt = cfg.ListOpt( + 'notification_topics', default=['notifications', ], + help='AMQP topic used for openstack notifications') + +CONF = cfg.CONF +CONF.register_opt(notification_topic_opt) + + +def notify(context, message): + """Sends a notification via RPC""" + if not context: + context = req_context.get_admin_context() + priority = message.get('priority', + CONF.default_notification_level) + priority = priority.lower() + for topic in CONF.notification_topics: + topic = '%s.%s' % (topic, priority) + try: + rpc.notify(context, topic, message) + except Exception, e: + LOG.exception(_("Could not send notification to %(topic)s. " + "Payload=%(message)s"), locals())