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.partition import coordination
from ceilometer.alarm import rpc as rpc_alarm from ceilometer.alarm import rpc as rpc_alarm
from ceilometer.openstack.common.gettextutils import _ # noqa from ceilometer.openstack.common.gettextutils import _ # noqa
from ceilometer.openstack.common import importutils
from ceilometer.openstack.common import log from ceilometer.openstack.common import log
from ceilometer.openstack.common import network_utils from ceilometer.openstack.common import network_utils
from ceilometer.openstack.common.rpc import dispatcher as rpc_dispatcher from ceilometer.openstack.common.rpc import dispatcher as rpc_dispatcher
from ceilometer.openstack.common.rpc import service as rpc_service from ceilometer.openstack.common.rpc import service as rpc_service
from ceilometer.openstack.common import service as os_service from ceilometer.openstack.common import service as os_service
from ceilometer import service
OPTS = [ OPTS = [
@ -45,9 +43,6 @@ OPTS = [
' collection of underlying metrics.', ' collection of underlying metrics.',
deprecated_opts=[cfg.DeprecatedOpt( deprecated_opts=[cfg.DeprecatedOpt(
'threshold_evaluation_interval', group='alarm')]), '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') cfg.CONF.register_opts(OPTS, group='alarm')
@ -139,12 +134,6 @@ class SingletonAlarmService(AlarmService, os_service.Service):
'value': True}]) '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') cfg.CONF.import_opt('host', 'ceilometer.service')
@ -282,9 +271,3 @@ class AlarmNotifierService(rpc_service.Service):
data.get('current'), data.get('current'),
data.get('reason'), data.get('reason'),
data.get('reason_data')) 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 hooks
from ceilometer.api import middleware from ceilometer.api import middleware
from ceilometer.openstack.common import log from ceilometer.openstack.common import log
from ceilometer import service
from ceilometer import storage from ceilometer import storage
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
@ -122,9 +121,7 @@ def get_server_cls(host):
return server_cls return server_cls
def start(): def build_server():
service.prepare_service()
# Build the WSGI app # Build the WSGI app
root = VersionSelectorApplication() root = VersionSelectorApplication()
@ -144,5 +141,4 @@ def start():
else: else:
LOG.info(_("serving on http://%(host)s:%(port)s") % ( LOG.info(_("serving on http://%(host)s:%(port)s") % (
{'host': host, 'port': port})) {'host': host, 'port': port}))
return srv
srv.serve_forever()

View File

@ -21,8 +21,6 @@ from oslo.config import cfg
from ceilometer import agent from ceilometer import agent
from ceilometer.openstack.common import log 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') cfg.CONF.import_group('service_credentials', 'ceilometer.service')
@ -46,8 +44,3 @@ class AgentManager(agent.AgentManager):
insecure=cfg.CONF.service_credentials.insecure) insecure=cfg.CONF.service_credentials.insecure)
super(AgentManager, self).interval_task(task) 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. """Command line tool for creating meter for Ceilometer.
""" """
import logging import logging
import sys 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 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 context
from ceilometer.openstack.common import importutils
from ceilometer.openstack.common import service as os_service
from ceilometer.openstack.common import timeutils from ceilometer.openstack.common import timeutils
from ceilometer import pipeline from ceilometer import pipeline
from ceilometer import sample from ceilometer import sample
from ceilometer import service from ceilometer import service
from ceilometer import storage
from ceilometer import transformer 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(): def send_sample():
cfg.CONF.register_cli_opts([ 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 import log
from ceilometer.openstack.common.rpc import dispatcher as rpc_dispatcher from ceilometer.openstack.common.rpc import dispatcher as rpc_dispatcher
from ceilometer.openstack.common.rpc import service as rpc_service 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.openstack.common import units
from ceilometer import service from ceilometer import service
@ -106,9 +105,3 @@ class CollectorService(service.DispatchedService, rpc_service.Service):
""" """
self.dispatcher_manager.map_method('record_metering_data', self.dispatcher_manager.map_method('record_metering_data',
data=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 import agent
from ceilometer.compute.virt import inspector as virt_inspector from ceilometer.compute.virt import inspector as virt_inspector
from ceilometer.openstack.common import log from ceilometer.openstack.common import log
from ceilometer.openstack.common import service as os_service
from ceilometer import service
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
@ -34,8 +32,3 @@ class AgentManager(agent.AgentManager):
@property @property
def inspector(self): def inspector(self):
return self._inspector 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.gettextutils import _ # noqa
from ceilometer.openstack.common import log from ceilometer.openstack.common import log
from ceilometer.openstack.common.rpc import service as rpc_service 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 pipeline
from ceilometer import service from ceilometer import service
from ceilometer.storage import models 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: with self.pipeline_manager.publisher(context.get_admin_context()) as p:
# FIXME(dhellmann): Spawn green thread? # FIXME(dhellmann): Spawn green thread?
p(list(ext.obj.to_samples(notification))) 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 socket
import sys import sys
import eventlet
from oslo.config import cfg from oslo.config import cfg
from stevedore import named from stevedore import named
@ -108,10 +107,6 @@ class DispatchedService(object):
def prepare_service(argv=None): 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) gettextutils.install('ceilometer', lazy=True)
rpc.set_defaults(control_exchange='ceilometer') rpc.set_defaults(control_exchange='ceilometer')
cfg.set_defaults(log.log_opts, 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.gettextutils import _ # noqa
from ceilometer.openstack.common import log from ceilometer.openstack.common import log
from ceilometer import service
from ceilometer import utils from ceilometer import utils
@ -157,19 +156,3 @@ class EventFilter(object):
self.end_time, self.end_time,
self.event_type, self.event_type,
six.text_type(self.traits_filter))) 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] [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 # Options defined in ceilometer.alarm.notifier.rest
# #
@ -558,9 +566,6 @@
# Deprecated group/name - [alarm]/threshold_evaluation_interval # Deprecated group/name - [alarm]/threshold_evaluation_interval
#evaluation_interval=60 #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 # Options defined in ceilometer.api.controllers.v2

View File

@ -183,16 +183,16 @@ paste.filter_factory =
swift = ceilometer.objectstore.swift_middleware:filter_factory swift = ceilometer.objectstore.swift_middleware:filter_factory
console_scripts = console_scripts =
ceilometer-api = ceilometer.api.app:start ceilometer-api = ceilometer.cli:api
ceilometer-agent-central = ceilometer.central.manager:agent_central ceilometer-agent-central = ceilometer.cli:agent_central
ceilometer-agent-compute = ceilometer.compute.manager:agent_compute ceilometer-agent-compute = ceilometer.cli:agent_compute
ceilometer-agent-notification = ceilometer.notification:agent ceilometer-agent-notification = ceilometer.cli:agent_notification
ceilometer-send-sample = ceilometer.cli:send_sample ceilometer-send-sample = ceilometer.cli:send_sample
ceilometer-dbsync = ceilometer.storage:dbsync ceilometer-dbsync = ceilometer.cli:storage_dbsync
ceilometer-expirer = ceilometer.storage:expirer ceilometer-expirer = ceilometer.cli:storage_expirer
ceilometer-collector = ceilometer.collector:collector ceilometer-collector = ceilometer.cli:collector_service
ceilometer-alarm-evaluator = ceilometer.alarm.service:alarm_evaluator ceilometer-alarm-evaluator = ceilometer.cli:alarm_evaluator
ceilometer-alarm-notifier = ceilometer.alarm.service:alarm_notifier ceilometer-alarm-notifier = ceilometer.cli:alarm_notifier
ceilometer.dispatcher = ceilometer.dispatcher =
database = ceilometer.dispatcher.database:DatabaseDispatcher database = ceilometer.dispatcher.database:DatabaseDispatcher