Support extended declaring exchanges
Allow users add metrics into meters.yaml themselves. Reusing http_control_exchanges makes it available to extend addtional exchanges. Closes-Bug: #1656873 Change-Id: I196f8fb0e2aee8498309bb0cb1b3ec2b2e21e211
This commit is contained in:
parent
b01c33f78b
commit
fed5795d35
@ -16,41 +16,67 @@ from oslo_config import cfg
|
|||||||
EXCHANGE_OPTS = [
|
EXCHANGE_OPTS = [
|
||||||
cfg.StrOpt('nova_control_exchange',
|
cfg.StrOpt('nova_control_exchange',
|
||||||
default='nova',
|
default='nova',
|
||||||
help="Exchange name for Nova notifications."),
|
help="Exchange name for Nova notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('neutron_control_exchange',
|
cfg.StrOpt('neutron_control_exchange',
|
||||||
default='neutron',
|
default='neutron',
|
||||||
help="Exchange name for Neutron notifications."),
|
help="Exchange name for Neutron notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('heat_control_exchange',
|
cfg.StrOpt('heat_control_exchange',
|
||||||
default='heat',
|
default='heat',
|
||||||
help="Exchange name for Heat notifications"),
|
help="Exchange name for Heat notifications",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('glance_control_exchange',
|
cfg.StrOpt('glance_control_exchange',
|
||||||
default='glance',
|
default='glance',
|
||||||
help="Exchange name for Glance notifications."),
|
help="Exchange name for Glance notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('keystone_control_exchange',
|
cfg.StrOpt('keystone_control_exchange',
|
||||||
default='keystone',
|
default='keystone',
|
||||||
help="Exchange name for Keystone notifications."),
|
help="Exchange name for Keystone notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('cinder_control_exchange',
|
cfg.StrOpt('cinder_control_exchange',
|
||||||
default='cinder',
|
default='cinder',
|
||||||
help="Exchange name for Cinder notifications."),
|
help="Exchange name for Cinder notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('sahara_control_exchange',
|
cfg.StrOpt('sahara_control_exchange',
|
||||||
default='sahara',
|
default='sahara',
|
||||||
help="Exchange name for Data Processing notifications."),
|
help="Exchange name for Data Processing notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('swift_control_exchange',
|
cfg.StrOpt('swift_control_exchange',
|
||||||
default='swift',
|
default='swift',
|
||||||
help="Exchange name for Swift notifications."),
|
help="Exchange name for Swift notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('magnum_control_exchange',
|
cfg.StrOpt('magnum_control_exchange',
|
||||||
default='magnum',
|
default='magnum',
|
||||||
help="Exchange name for Magnum notifications."),
|
help="Exchange name for Magnum notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('trove_control_exchange',
|
cfg.StrOpt('trove_control_exchange',
|
||||||
default='trove',
|
default='trove',
|
||||||
help="Exchange name for DBaaS notifications."),
|
help="Exchange name for DBaaS notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('zaqar_control_exchange',
|
cfg.StrOpt('zaqar_control_exchange',
|
||||||
default='zaqar',
|
default='zaqar',
|
||||||
help="Exchange name for Messaging service notifications."),
|
help="Exchange name for Messaging service notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('dns_control_exchange',
|
cfg.StrOpt('dns_control_exchange',
|
||||||
default='central',
|
default='central',
|
||||||
help="Exchange name for DNS service notifications."),
|
help="Exchange name for DNS service notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
cfg.StrOpt('ceilometer_control_exchange',
|
cfg.StrOpt('ceilometer_control_exchange',
|
||||||
default='ceilometer',
|
default='ceilometer',
|
||||||
help="Exchange name for ceilometer notifications."),
|
help="Exchange name for ceilometer notifications.",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_reason="Use notification_control_exchanges instead"),
|
||||||
]
|
]
|
||||||
|
@ -17,12 +17,11 @@ import six
|
|||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_log import log
|
from oslo_log import log
|
||||||
import oslo_messaging
|
|
||||||
from oslo_utils import fnmatch
|
from oslo_utils import fnmatch
|
||||||
from stevedore import extension
|
from stevedore import extension
|
||||||
|
|
||||||
from ceilometer.agent import plugin_base
|
|
||||||
from ceilometer import declarative
|
from ceilometer import declarative
|
||||||
|
from ceilometer import notification
|
||||||
from ceilometer.i18n import _LE, _LW
|
from ceilometer.i18n import _LE, _LW
|
||||||
from ceilometer import sample as sample_util
|
from ceilometer import sample as sample_util
|
||||||
|
|
||||||
@ -166,7 +165,7 @@ class MeterDefinition(object):
|
|||||||
yield sample
|
yield sample
|
||||||
|
|
||||||
|
|
||||||
class ProcessMeterNotifications(plugin_base.NotificationBase):
|
class ProcessMeterNotifications(notification.NotificationProcessBase):
|
||||||
|
|
||||||
event_types = []
|
event_types = []
|
||||||
|
|
||||||
@ -199,37 +198,6 @@ class ProcessMeterNotifications(plugin_base.NotificationBase):
|
|||||||
definitions[meter_cfg['name']] = md
|
definitions[meter_cfg['name']] = md
|
||||||
return definitions.values()
|
return definitions.values()
|
||||||
|
|
||||||
def get_targets(self, conf):
|
|
||||||
"""Return a sequence of oslo_messaging.Target
|
|
||||||
|
|
||||||
It is defining the exchange and topics to be connected for this plugin.
|
|
||||||
:param conf: Configuration.
|
|
||||||
#TODO(prad): This should be defined in the notification agent
|
|
||||||
"""
|
|
||||||
targets = []
|
|
||||||
exchanges = [
|
|
||||||
conf.nova_control_exchange,
|
|
||||||
conf.cinder_control_exchange,
|
|
||||||
conf.glance_control_exchange,
|
|
||||||
conf.neutron_control_exchange,
|
|
||||||
conf.heat_control_exchange,
|
|
||||||
conf.keystone_control_exchange,
|
|
||||||
conf.sahara_control_exchange,
|
|
||||||
conf.trove_control_exchange,
|
|
||||||
conf.zaqar_control_exchange,
|
|
||||||
conf.swift_control_exchange,
|
|
||||||
conf.ceilometer_control_exchange,
|
|
||||||
conf.magnum_control_exchange,
|
|
||||||
conf.dns_control_exchange,
|
|
||||||
]
|
|
||||||
|
|
||||||
for exchange in exchanges:
|
|
||||||
targets.extend(oslo_messaging.Target(topic=topic,
|
|
||||||
exchange=exchange)
|
|
||||||
for topic in
|
|
||||||
self.get_notification_topics(conf))
|
|
||||||
return targets
|
|
||||||
|
|
||||||
def process_notification(self, notification_body):
|
def process_notification(self, notification_body):
|
||||||
for d in self.definitions:
|
for d in self.definitions:
|
||||||
if d.match_type(notification_body['event_type']):
|
if d.match_type(notification_body['event_type']):
|
||||||
|
@ -13,39 +13,13 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from oslo_config import cfg
|
from ceilometer import notification
|
||||||
import oslo_messaging
|
|
||||||
|
|
||||||
from ceilometer.agent import plugin_base
|
|
||||||
from ceilometer import sample
|
from ceilometer import sample
|
||||||
|
|
||||||
|
|
||||||
# NOTE(sileht): reading config values at loadtime won't works
|
class HTTPRequest(notification.NotificationProcessBase):
|
||||||
# we should use set_defaults at runtime to set http_control_exchanges to
|
|
||||||
# [cfg.CONF.nova_control_exchange,
|
|
||||||
# cfg.CONF.glance_control_exchange,
|
|
||||||
# cfg.CONF.neutron_control_exchange,
|
|
||||||
# cfg.CONF.cinder_control_exchange],
|
|
||||||
OPTS = [
|
|
||||||
cfg.MultiStrOpt('http_control_exchanges',
|
|
||||||
default=['nova', 'glance', 'neutron', 'cinder'],
|
|
||||||
help="Exchanges name to listen for notifications."),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class HTTPRequest(plugin_base.NotificationBase):
|
|
||||||
event_types = ['http.request']
|
event_types = ['http.request']
|
||||||
|
|
||||||
def get_targets(self, conf):
|
|
||||||
"""Return a sequence of oslo_messaging.Target
|
|
||||||
|
|
||||||
This sequence is defining the exchange and topics to be connected for
|
|
||||||
this plugin.
|
|
||||||
"""
|
|
||||||
return [oslo_messaging.Target(topic=topic, exchange=exchange)
|
|
||||||
for topic in self.get_notification_topics(conf)
|
|
||||||
for exchange in conf.http_control_exchanges]
|
|
||||||
|
|
||||||
def process_notification(self, message):
|
def process_notification(self, message):
|
||||||
yield sample.Sample.from_notification(
|
yield sample.Sample.from_notification(
|
||||||
name=message['event_type'],
|
name=message['event_type'],
|
||||||
|
@ -12,9 +12,11 @@
|
|||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import itertools
|
import itertools
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
from ceilometer.agent import plugin_base
|
||||||
from concurrent import futures
|
from concurrent import futures
|
||||||
from futurist import periodics
|
from futurist import periodics
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
@ -80,6 +82,17 @@ OPTS = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
EXCHANGES_OPTS = [
|
||||||
|
cfg.MultiStrOpt('notification_control_exchanges',
|
||||||
|
default=['nova', 'glance', 'neutron', 'cinder', 'heat',
|
||||||
|
'keystone', 'sahara', 'trove', 'zaqar', 'swift',
|
||||||
|
'ceilometer', 'magnum', 'dns'],
|
||||||
|
deprecated_group='DEFAULT',
|
||||||
|
deprecated_name="http_control_exchanges",
|
||||||
|
help="Exchanges name to listen for notifications."),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class NotificationService(service_base.PipelineBasedService):
|
class NotificationService(service_base.PipelineBasedService):
|
||||||
"""Notification service.
|
"""Notification service.
|
||||||
|
|
||||||
@ -334,3 +347,17 @@ class NotificationService(service_base.PipelineBasedService):
|
|||||||
# is enabled.
|
# is enabled.
|
||||||
if self.conf.notification.workload_partitioning:
|
if self.conf.notification.workload_partitioning:
|
||||||
self._configure_pipeline_listener()
|
self._configure_pipeline_listener()
|
||||||
|
|
||||||
|
|
||||||
|
class NotificationProcessBase(plugin_base.NotificationBase):
|
||||||
|
|
||||||
|
def get_targets(self, conf):
|
||||||
|
"""Return a sequence of oslo_messaging.Target
|
||||||
|
|
||||||
|
This sequence is defining the exchange and topics to be connected for
|
||||||
|
this plugin.
|
||||||
|
"""
|
||||||
|
return [oslo_messaging.Target(topic=topic, exchange=exchange)
|
||||||
|
for topic in self.get_notification_topics(conf)
|
||||||
|
for exchange in
|
||||||
|
conf.notification.notification_control_exchanges]
|
||||||
|
@ -81,7 +81,6 @@ def list_opts():
|
|||||||
ceilometer.compute.virt.libvirt.utils.OPTS,
|
ceilometer.compute.virt.libvirt.utils.OPTS,
|
||||||
ceilometer.dispatcher.OPTS,
|
ceilometer.dispatcher.OPTS,
|
||||||
ceilometer.ipmi.notifications.ironic.OPTS,
|
ceilometer.ipmi.notifications.ironic.OPTS,
|
||||||
ceilometer.middleware.OPTS,
|
|
||||||
ceilometer.nova_client.OPTS,
|
ceilometer.nova_client.OPTS,
|
||||||
ceilometer.objectstore.swift.OPTS,
|
ceilometer.objectstore.swift.OPTS,
|
||||||
ceilometer.pipeline.OPTS,
|
ceilometer.pipeline.OPTS,
|
||||||
@ -107,7 +106,9 @@ def list_opts():
|
|||||||
itertools.chain(ceilometer.ipmi.platform.intel_node_manager.OPTS,
|
itertools.chain(ceilometer.ipmi.platform.intel_node_manager.OPTS,
|
||||||
ceilometer.ipmi.pollsters.OPTS)),
|
ceilometer.ipmi.pollsters.OPTS)),
|
||||||
('meter', ceilometer.meter.notifications.OPTS),
|
('meter', ceilometer.meter.notifications.OPTS),
|
||||||
('notification', ceilometer.notification.OPTS),
|
('notification',
|
||||||
|
itertools.chain(ceilometer.notification.OPTS,
|
||||||
|
ceilometer.notification.EXCHANGES_OPTS)),
|
||||||
('polling', ceilometer.agent.manager.POLLING_OPTS),
|
('polling', ceilometer.agent.manager.POLLING_OPTS),
|
||||||
('publisher', ceilometer.publisher.utils.OPTS),
|
('publisher', ceilometer.publisher.utils.OPTS),
|
||||||
('publisher_notifier', ceilometer.publisher.messaging.NOTIFIER_OPTS),
|
('publisher_notifier', ceilometer.publisher.messaging.NOTIFIER_OPTS),
|
||||||
|
@ -97,4 +97,4 @@ class TestNotifications(base.BaseTestCase):
|
|||||||
|
|
||||||
def test_targets(self):
|
def test_targets(self):
|
||||||
targets = middleware.HTTPRequest(mock.Mock()).get_targets(self.CONF)
|
targets = middleware.HTTPRequest(mock.Mock()).get_targets(self.CONF)
|
||||||
self.assertEqual(4, len(targets))
|
self.assertEqual(13, len(targets))
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
deprecations:
|
||||||
|
- |
|
||||||
|
Allow users to add additional exchanges in ceilometer.conf instead of
|
||||||
|
hardcoding exchanges. Now original http_control_exchanges is being deprecated
|
||||||
|
and renamed notification_control_exchanges. Besides, the new option is integrated
|
||||||
|
with other exchanges in default EXCHANGE_OPTS to make it available to extend
|
||||||
|
addtional exchanges.
|
Loading…
x
Reference in New Issue
Block a user