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
This commit is contained in:
Mehdi Abaakouk 2014-03-11 10:36:01 +01:00
parent 79bb83f340
commit 78331c079b
11 changed files with 103 additions and 87 deletions

View File

@ -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()

View File

@ -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

View File

@ -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()

View File

@ -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([

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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,

View File

@ -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"))

View File

@ -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

View File

@ -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