From 78331c079bd69b51fb3dddd690c280434f533bd7 Mon Sep 17 00:00:00 2001 From: Mehdi Abaakouk Date: Tue, 11 Mar 2014 10:36:01 +0100 Subject: [PATCH] Eventlet monkeypatch must be done before anything This patch ensure eventlet have patched modules before they are loaded and used. Closes-bug: #1288878 Change-Id: Ieb1fc252bde94a19fdba14a87c9f97848208bdc5 --- ceilometer/alarm/service.py | 17 ------ ceilometer/api/app.py | 8 +-- ceilometer/central/manager.py | 7 --- ceilometer/cli.py | 85 ++++++++++++++++++++++++++- ceilometer/collector.py | 7 --- ceilometer/compute/manager.py | 7 --- ceilometer/notification.py | 8 --- ceilometer/service.py | 5 -- ceilometer/storage/__init__.py | 17 ------ etc/ceilometer/ceilometer.conf.sample | 11 +++- setup.cfg | 18 +++--- 11 files changed, 103 insertions(+), 87 deletions(-) diff --git a/ceilometer/alarm/service.py b/ceilometer/alarm/service.py index 69ab62535c..b73eb9e8be 100644 --- a/ceilometer/alarm/service.py +++ b/ceilometer/alarm/service.py @@ -28,13 +28,11 @@ from stevedore import extension from ceilometer.alarm.partition import coordination from ceilometer.alarm import rpc as rpc_alarm from ceilometer.openstack.common.gettextutils import _ # noqa -from ceilometer.openstack.common import importutils from ceilometer.openstack.common import log from ceilometer.openstack.common import network_utils from ceilometer.openstack.common.rpc import dispatcher as rpc_dispatcher from ceilometer.openstack.common.rpc import service as rpc_service from ceilometer.openstack.common import service as os_service -from ceilometer import service OPTS = [ @@ -45,9 +43,6 @@ OPTS = [ ' collection of underlying metrics.', deprecated_opts=[cfg.DeprecatedOpt( 'threshold_evaluation_interval', group='alarm')]), - cfg.StrOpt('evaluation_service', - default='ceilometer.alarm.service.SingletonAlarmService', - help='Class to launch as alarm evaluation service.'), ] cfg.CONF.register_opts(OPTS, group='alarm') @@ -139,12 +134,6 @@ class SingletonAlarmService(AlarmService, os_service.Service): 'value': True}]) -def alarm_evaluator(): - service.prepare_service() - eval_service = importutils.import_object(cfg.CONF.alarm.evaluation_service) - os_service.launch(eval_service).wait() - - cfg.CONF.import_opt('host', 'ceilometer.service') @@ -282,9 +271,3 @@ class AlarmNotifierService(rpc_service.Service): data.get('current'), data.get('reason'), data.get('reason_data')) - - -def alarm_notifier(): - service.prepare_service() - os_service.launch(AlarmNotifierService( - cfg.CONF.host, 'ceilometer.alarm')).wait() diff --git a/ceilometer/api/app.py b/ceilometer/api/app.py index 9dedac5453..529dd2bdbc 100644 --- a/ceilometer/api/app.py +++ b/ceilometer/api/app.py @@ -30,7 +30,6 @@ from ceilometer.api import config as api_config from ceilometer.api import hooks from ceilometer.api import middleware from ceilometer.openstack.common import log -from ceilometer import service from ceilometer import storage LOG = log.getLogger(__name__) @@ -122,9 +121,7 @@ def get_server_cls(host): return server_cls -def start(): - service.prepare_service() - +def build_server(): # Build the WSGI app root = VersionSelectorApplication() @@ -144,5 +141,4 @@ def start(): else: LOG.info(_("serving on http://%(host)s:%(port)s") % ( {'host': host, 'port': port})) - - srv.serve_forever() + return srv diff --git a/ceilometer/central/manager.py b/ceilometer/central/manager.py index e2b1542cab..5b6bb449d2 100644 --- a/ceilometer/central/manager.py +++ b/ceilometer/central/manager.py @@ -21,8 +21,6 @@ from oslo.config import cfg from ceilometer import agent from ceilometer.openstack.common import log -from ceilometer.openstack.common import service as os_service -from ceilometer import service cfg.CONF.import_group('service_credentials', 'ceilometer.service') @@ -46,8 +44,3 @@ class AgentManager(agent.AgentManager): insecure=cfg.CONF.service_credentials.insecure) super(AgentManager, self).interval_task(task) - - -def agent_central(): - service.prepare_service() - os_service.launch(AgentManager()).wait() diff --git a/ceilometer/cli.py b/ceilometer/cli.py index 2580ac9e44..26c011afd7 100644 --- a/ceilometer/cli.py +++ b/ceilometer/cli.py @@ -19,19 +19,102 @@ """Command line tool for creating meter for Ceilometer. """ - import logging import sys +import eventlet +# NOTE(jd) We need to monkey patch the socket and select module for, +# at least, oslo.rpc, otherwise everything's blocked on its first read() +# or select() +eventlet.monkey_patch(socket=True, select=True) + + from oslo.config import cfg +from ceilometer.alarm import service as alarm_service +from ceilometer.api import app +from ceilometer.central import manager as central_manager +from ceilometer import collector +from ceilometer.compute import manager as compute_manager +from ceilometer import notification from ceilometer.openstack.common import context +from ceilometer.openstack.common import importutils +from ceilometer.openstack.common import service as os_service from ceilometer.openstack.common import timeutils from ceilometer import pipeline from ceilometer import sample from ceilometer import service +from ceilometer import storage from ceilometer import transformer +OPTS = [ + cfg.StrOpt('evaluation_service', + default='ceilometer.alarm.service.SingletonAlarmService', + help='Class to launch as alarm evaluation service.'), +] + +cfg.CONF.register_opts(OPTS, group='alarm') +cfg.CONF.import_opt('time_to_live', 'ceilometer.storage', + group='database') + +LOG = logging.getLogger(__name__) + + +def alarm_notifier(): + service.prepare_service() + os_service.launch(alarm_service.AlarmNotifierService( + cfg.CONF.host, 'ceilometer.alarm')).wait() + + +def alarm_evaluator(): + service.prepare_service() + eval_service = importutils.import_object(cfg.CONF.alarm.evaluation_service) + os_service.launch(eval_service).wait() + + +def agent_central(): + service.prepare_service() + os_service.launch(central_manager.AgentManager()).wait() + + +def agent_compute(): + service.prepare_service() + os_service.launch(compute_manager.AgentManager()).wait() + + +def agent_notification(): + service.prepare_service() + os_service.launch(notification.NotificationService( + cfg.CONF.host, 'ceilometer.agent.notification')).wait() + + +def api(): + service.prepare_service() + srv = app.build_server() + srv.serve_forever() + + +def collector_service(): + service.prepare_service() + os_service.launch(collector.CollectorService( + cfg.CONF.host, 'ceilometer.collector')).wait() + + +def storage_dbsync(): + service.prepare_service() + storage.get_connection(cfg.CONF).upgrade() + + +def storage_expirer(): + service.prepare_service() + if cfg.CONF.database.time_to_live > 0: + LOG.debug(_("Clearing expired metering data")) + storage_conn = storage.get_connection(cfg.CONF) + storage_conn.clear_expired_metering_data( + cfg.CONF.database.time_to_live) + else: + LOG.info(_("Nothing to clean, database time to live is disabled")) + def send_sample(): cfg.CONF.register_cli_opts([ diff --git a/ceilometer/collector.py b/ceilometer/collector.py index 1624a757e9..d475b2adb7 100644 --- a/ceilometer/collector.py +++ b/ceilometer/collector.py @@ -25,7 +25,6 @@ from ceilometer.openstack.common.gettextutils import _ # noqa from ceilometer.openstack.common import log from ceilometer.openstack.common.rpc import dispatcher as rpc_dispatcher from ceilometer.openstack.common.rpc import service as rpc_service -from ceilometer.openstack.common import service as os_service from ceilometer.openstack.common import units from ceilometer import service @@ -106,9 +105,3 @@ class CollectorService(service.DispatchedService, rpc_service.Service): """ self.dispatcher_manager.map_method('record_metering_data', data=data) - - -def collector(): - service.prepare_service() - os_service.launch(CollectorService(cfg.CONF.host, - 'ceilometer.collector')).wait() diff --git a/ceilometer/compute/manager.py b/ceilometer/compute/manager.py index 5d3019386e..e7b510e848 100644 --- a/ceilometer/compute/manager.py +++ b/ceilometer/compute/manager.py @@ -19,8 +19,6 @@ from ceilometer import agent from ceilometer.compute.virt import inspector as virt_inspector from ceilometer.openstack.common import log -from ceilometer.openstack.common import service as os_service -from ceilometer import service LOG = log.getLogger(__name__) @@ -34,8 +32,3 @@ class AgentManager(agent.AgentManager): @property def inspector(self): return self._inspector - - -def agent_compute(): - service.prepare_service() - os_service.launch(AgentManager()).wait() diff --git a/ceilometer/notification.py b/ceilometer/notification.py index cf031f3503..bde5d6df67 100644 --- a/ceilometer/notification.py +++ b/ceilometer/notification.py @@ -24,7 +24,6 @@ from ceilometer.openstack.common import context from ceilometer.openstack.common.gettextutils import _ # noqa from ceilometer.openstack.common import log from ceilometer.openstack.common.rpc import service as rpc_service -from ceilometer.openstack.common import service as os_service from ceilometer import pipeline from ceilometer import service from ceilometer.storage import models @@ -163,10 +162,3 @@ class NotificationService(service.DispatchedService, rpc_service.Service): with self.pipeline_manager.publisher(context.get_admin_context()) as p: # FIXME(dhellmann): Spawn green thread? p(list(ext.obj.to_samples(notification))) - - -def agent(): - service.prepare_service() - os_service.launch(NotificationService( - cfg.CONF.host, - 'ceilometer.agent.notification')).wait() diff --git a/ceilometer/service.py b/ceilometer/service.py index d3e06f7fbd..f69ee3db5c 100644 --- a/ceilometer/service.py +++ b/ceilometer/service.py @@ -21,7 +21,6 @@ import os import socket import sys -import eventlet from oslo.config import cfg from stevedore import named @@ -108,10 +107,6 @@ class DispatchedService(object): def prepare_service(argv=None): - # NOTE(jd) We need to monkey patch the socket and select module for, - # at least, oslo.rpc, otherwise everything's blocked on its first read() - # or select() - eventlet.monkey_patch(socket=True, select=True) gettextutils.install('ceilometer', lazy=True) rpc.set_defaults(control_exchange='ceilometer') cfg.set_defaults(log.log_opts, diff --git a/ceilometer/storage/__init__.py b/ceilometer/storage/__init__.py index 8465893ea4..3a49c45384 100644 --- a/ceilometer/storage/__init__.py +++ b/ceilometer/storage/__init__.py @@ -26,7 +26,6 @@ from stevedore import driver from ceilometer.openstack.common.gettextutils import _ # noqa from ceilometer.openstack.common import log -from ceilometer import service from ceilometer import utils @@ -157,19 +156,3 @@ class EventFilter(object): self.end_time, self.event_type, six.text_type(self.traits_filter))) - - -def dbsync(): - service.prepare_service() - get_connection(cfg.CONF).upgrade() - - -def expirer(): - service.prepare_service() - if cfg.CONF.database.time_to_live > 0: - LOG.debug(_("Clearing expired metering data")) - storage_conn = get_connection(cfg.CONF) - storage_conn.clear_expired_metering_data( - cfg.CONF.database.time_to_live) - else: - LOG.info(_("Nothing to clean, database time to live is disabled")) diff --git a/etc/ceilometer/ceilometer.conf.sample b/etc/ceilometer/ceilometer.conf.sample index 0d3a285e9a..846ed08332 100644 --- a/etc/ceilometer/ceilometer.conf.sample +++ b/etc/ceilometer/ceilometer.conf.sample @@ -520,6 +520,14 @@ [alarm] +# +# Options defined in ceilometer.cli +# + +# Class to launch as alarm evaluation service. (string value) +#evaluation_service=ceilometer.alarm.service.SingletonAlarmService + + # # Options defined in ceilometer.alarm.notifier.rest # @@ -558,9 +566,6 @@ # Deprecated group/name - [alarm]/threshold_evaluation_interval #evaluation_interval=60 -# Class to launch as alarm evaluation service. (string value) -#evaluation_service=ceilometer.alarm.service.SingletonAlarmService - # # Options defined in ceilometer.api.controllers.v2 diff --git a/setup.cfg b/setup.cfg index 11a5d582ab..6acd5c1d24 100644 --- a/setup.cfg +++ b/setup.cfg @@ -183,16 +183,16 @@ paste.filter_factory = swift = ceilometer.objectstore.swift_middleware:filter_factory console_scripts = - ceilometer-api = ceilometer.api.app:start - ceilometer-agent-central = ceilometer.central.manager:agent_central - ceilometer-agent-compute = ceilometer.compute.manager:agent_compute - ceilometer-agent-notification = ceilometer.notification:agent + ceilometer-api = ceilometer.cli:api + ceilometer-agent-central = ceilometer.cli:agent_central + ceilometer-agent-compute = ceilometer.cli:agent_compute + ceilometer-agent-notification = ceilometer.cli:agent_notification ceilometer-send-sample = ceilometer.cli:send_sample - ceilometer-dbsync = ceilometer.storage:dbsync - ceilometer-expirer = ceilometer.storage:expirer - ceilometer-collector = ceilometer.collector:collector - ceilometer-alarm-evaluator = ceilometer.alarm.service:alarm_evaluator - ceilometer-alarm-notifier = ceilometer.alarm.service:alarm_notifier + ceilometer-dbsync = ceilometer.cli:storage_dbsync + ceilometer-expirer = ceilometer.cli:storage_expirer + ceilometer-collector = ceilometer.cli:collector_service + ceilometer-alarm-evaluator = ceilometer.cli:alarm_evaluator + ceilometer-alarm-notifier = ceilometer.cli:alarm_notifier ceilometer.dispatcher = database = ceilometer.dispatcher.database:DatabaseDispatcher