Don't keep a single global TRANSPORT object
To keep the global state of messaging like the old olso-incubator library does, we have created a global TRANSPORT object. But since the test use the fake:// driver of oslo.messaging in tests, this transport is shared between tests, but some tests use 'fake://', other the default one, and someother disable the transport. This change ensures that a different transport is used for code tests. Change-Id: I22317527cc4fb44ea1fb9642586e8cdcbc97030b
This commit is contained in:
		@@ -42,8 +42,9 @@ LOG = log.getLogger(__name__)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class RPCAlarmNotifier(object):
 | 
					class RPCAlarmNotifier(object):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        transport = messaging.get_transport()
 | 
				
			||||||
        self.client = messaging.get_rpc_client(
 | 
					        self.client = messaging.get_rpc_client(
 | 
				
			||||||
            topic=cfg.CONF.alarm.notifier_rpc_topic,
 | 
					            transport, topic=cfg.CONF.alarm.notifier_rpc_topic,
 | 
				
			||||||
            version="1.0")
 | 
					            version="1.0")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def notify(self, alarm, previous, reason, reason_data):
 | 
					    def notify(self, alarm, previous, reason, reason_data):
 | 
				
			||||||
@@ -68,8 +69,9 @@ class RPCAlarmNotifier(object):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class RPCAlarmPartitionCoordination(object):
 | 
					class RPCAlarmPartitionCoordination(object):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self):
 | 
				
			||||||
 | 
					        transport = messaging.get_transport()
 | 
				
			||||||
        self.client = messaging.get_rpc_client(
 | 
					        self.client = messaging.get_rpc_client(
 | 
				
			||||||
            topic=cfg.CONF.alarm.partition_rpc_topic,
 | 
					            transport, topic=cfg.CONF.alarm.partition_rpc_topic,
 | 
				
			||||||
            version="1.0")
 | 
					            version="1.0")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def presence(self, uuid, priority):
 | 
					    def presence(self, uuid, priority):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -139,8 +139,9 @@ class PartitionedAlarmService(AlarmService, os_service.Service):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self):
 | 
				
			||||||
        super(PartitionedAlarmService, self).__init__()
 | 
					        super(PartitionedAlarmService, self).__init__()
 | 
				
			||||||
 | 
					        transport = messaging.get_transport()
 | 
				
			||||||
        self.rpc_server = messaging.get_rpc_server(
 | 
					        self.rpc_server = messaging.get_rpc_server(
 | 
				
			||||||
            cfg.CONF.alarm.partition_rpc_topic, self)
 | 
					            transport, cfg.CONF.alarm.partition_rpc_topic, self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._load_evaluators()
 | 
					        self._load_evaluators()
 | 
				
			||||||
        self.api_client = None
 | 
					        self.api_client = None
 | 
				
			||||||
@@ -193,8 +194,9 @@ class AlarmNotifierService(os_service.Service):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self):
 | 
				
			||||||
        super(AlarmNotifierService, self).__init__()
 | 
					        super(AlarmNotifierService, self).__init__()
 | 
				
			||||||
 | 
					        transport = messaging.get_transport()
 | 
				
			||||||
        self.rpc_server = messaging.get_rpc_server(
 | 
					        self.rpc_server = messaging.get_rpc_server(
 | 
				
			||||||
            cfg.CONF.alarm.notifier_rpc_topic, self)
 | 
					            transport, cfg.CONF.alarm.notifier_rpc_topic, self)
 | 
				
			||||||
        self.notifiers = extension.ExtensionManager(self.EXTENSIONS_NAMESPACE,
 | 
					        self.notifiers = extension.ExtensionManager(self.EXTENSIONS_NAMESPACE,
 | 
				
			||||||
                                                    invoke_on_load=True)
 | 
					                                                    invoke_on_load=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -604,7 +604,8 @@ def _make_link(rel_name, url, type, type_arg, query=None):
 | 
				
			|||||||
def _send_notification(event, payload):
 | 
					def _send_notification(event, payload):
 | 
				
			||||||
    notification = event.replace(" ", "_")
 | 
					    notification = event.replace(" ", "_")
 | 
				
			||||||
    notification = "alarm.%s" % notification
 | 
					    notification = "alarm.%s" % notification
 | 
				
			||||||
    notifier = messaging.get_notifier(publisher_id="ceilometer.api")
 | 
					    transport = messaging.get_transport()
 | 
				
			||||||
 | 
					    notifier = messaging.get_notifier(transport, publisher_id="ceilometer.api")
 | 
				
			||||||
    # FIXME(sileht): perhaps we need to copy some infos from the
 | 
					    # FIXME(sileht): perhaps we need to copy some infos from the
 | 
				
			||||||
    # pecan request headers like nova does
 | 
					    # pecan request headers like nova does
 | 
				
			||||||
    notifier.info(context.RequestContext(), notification, payload)
 | 
					    notifier.info(context.RequestContext(), notification, payload)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,9 +57,10 @@ class CollectorService(os_service.Service):
 | 
				
			|||||||
        if cfg.CONF.collector.udp_address:
 | 
					        if cfg.CONF.collector.udp_address:
 | 
				
			||||||
            self.tg.add_thread(self.start_udp)
 | 
					            self.tg.add_thread(self.start_udp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if messaging.TRANSPORT is not None:
 | 
					        transport = messaging.get_transport(optional=True)
 | 
				
			||||||
 | 
					        if transport:
 | 
				
			||||||
            self.rpc_server = messaging.get_rpc_server(
 | 
					            self.rpc_server = messaging.get_rpc_server(
 | 
				
			||||||
                cfg.CONF.publisher_rpc.metering_topic, self)
 | 
					                transport, cfg.CONF.publisher_rpc.metering_topic, self)
 | 
				
			||||||
            self.rpc_server.start()
 | 
					            self.rpc_server.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if not cfg.CONF.collector.udp_address:
 | 
					            if not cfg.CONF.collector.udp_address:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,16 +15,14 @@
 | 
				
			|||||||
# 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 eventlet
 | 
					 | 
				
			||||||
from oslo.config import cfg
 | 
					from oslo.config import cfg
 | 
				
			||||||
import oslo.messaging
 | 
					import oslo.messaging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometer.openstack.common import context
 | 
					from ceilometer.openstack.common import context
 | 
				
			||||||
from ceilometer.openstack.common import jsonutils
 | 
					from ceilometer.openstack.common import jsonutils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEFAULT_URL = "__default__"
 | 
				
			||||||
TRANSPORT = None
 | 
					TRANSPORTS = {}
 | 
				
			||||||
NOTIFIER = None
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
_ALIASES = {
 | 
					_ALIASES = {
 | 
				
			||||||
    'ceilometer.openstack.common.rpc.impl_kombu': 'rabbit',
 | 
					    'ceilometer.openstack.common.rpc.impl_kombu': 'rabbit',
 | 
				
			||||||
@@ -62,75 +60,69 @@ class JsonPayloadSerializer(oslo.messaging.NoOpSerializer):
 | 
				
			|||||||
        return jsonutils.to_primitive(entity, convert_instances=True)
 | 
					        return jsonutils.to_primitive(entity, convert_instances=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def setup(url=None, optional=False):
 | 
					def setup():
 | 
				
			||||||
    """Initialise the oslo.messaging layer."""
 | 
					 | 
				
			||||||
    global TRANSPORT, NOTIFIER
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if url and url.startswith("fake://"):
 | 
					 | 
				
			||||||
        # NOTE(sileht): oslo.messaging fake driver uses time.sleep
 | 
					 | 
				
			||||||
        # for task switch, so we need to monkey_patch it
 | 
					 | 
				
			||||||
        eventlet.monkey_patch(time=True)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if not TRANSPORT:
 | 
					 | 
				
			||||||
    oslo.messaging.set_transport_defaults('ceilometer')
 | 
					    oslo.messaging.set_transport_defaults('ceilometer')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_transport(url=None, optional=False, cache=True):
 | 
				
			||||||
 | 
					    """Initialise the oslo.messaging layer."""
 | 
				
			||||||
 | 
					    global TRANSPORTS, DEFAULT_URL
 | 
				
			||||||
 | 
					    transport = TRANSPORTS.get(url)
 | 
				
			||||||
 | 
					    if not transport:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            TRANSPORT = oslo.messaging.get_transport(cfg.CONF, url,
 | 
					            transport = oslo.messaging.get_transport(cfg.CONF, url,
 | 
				
			||||||
                                                     aliases=_ALIASES)
 | 
					                                                     aliases=_ALIASES)
 | 
				
			||||||
        except oslo.messaging.InvalidTransportURL as e:
 | 
					        except oslo.messaging.InvalidTransportURL as e:
 | 
				
			||||||
            TRANSPORT = None
 | 
					 | 
				
			||||||
            if not optional or e.url:
 | 
					            if not optional or e.url:
 | 
				
			||||||
                # NOTE(sileht): oslo.messaging is configured but unloadable
 | 
					                # NOTE(sileht): oslo.messaging is configured but unloadable
 | 
				
			||||||
                # so reraise the exception
 | 
					                # so reraise the exception
 | 
				
			||||||
                raise
 | 
					                raise
 | 
				
			||||||
 | 
					            return None
 | 
				
			||||||
    if not NOTIFIER and TRANSPORT:
 | 
					        else:
 | 
				
			||||||
        serializer = RequestContextSerializer(JsonPayloadSerializer())
 | 
					            if not url:
 | 
				
			||||||
        NOTIFIER = oslo.messaging.Notifier(TRANSPORT, serializer=serializer)
 | 
					                url = DEFAULT_URL
 | 
				
			||||||
 | 
					            if cache:
 | 
				
			||||||
 | 
					                TRANSPORTS[url] = transport
 | 
				
			||||||
 | 
					    return transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def cleanup():
 | 
					def cleanup():
 | 
				
			||||||
    """Cleanup the oslo.messaging layer."""
 | 
					    """Cleanup the oslo.messaging layer."""
 | 
				
			||||||
    global TRANSPORT, NOTIFIER
 | 
					    global TRANSPORTS, NOTIFIERS
 | 
				
			||||||
    if TRANSPORT:
 | 
					    NOTIFIERS = {}
 | 
				
			||||||
        TRANSPORT.cleanup()
 | 
					    for url in TRANSPORTS:
 | 
				
			||||||
        TRANSPORT = NOTIFIER = None
 | 
					        TRANSPORTS[url].cleanup()
 | 
				
			||||||
 | 
					        del TRANSPORTS[url]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_rpc_server(topic, endpoint):
 | 
					def get_rpc_server(transport, topic, endpoint):
 | 
				
			||||||
    """Return a configured oslo.messaging rpc server."""
 | 
					    """Return a configured oslo.messaging rpc server."""
 | 
				
			||||||
    global TRANSPORT
 | 
					 | 
				
			||||||
    target = oslo.messaging.Target(server=cfg.CONF.host, topic=topic)
 | 
					    target = oslo.messaging.Target(server=cfg.CONF.host, topic=topic)
 | 
				
			||||||
    serializer = RequestContextSerializer(JsonPayloadSerializer())
 | 
					    serializer = RequestContextSerializer(JsonPayloadSerializer())
 | 
				
			||||||
    return oslo.messaging.get_rpc_server(TRANSPORT, target, [endpoint],
 | 
					    return oslo.messaging.get_rpc_server(transport, target,
 | 
				
			||||||
                                         executor='eventlet',
 | 
					                                         [endpoint], executor='eventlet',
 | 
				
			||||||
                                         serializer=serializer)
 | 
					                                         serializer=serializer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_rpc_client(**kwargs):
 | 
					def get_rpc_client(transport, **kwargs):
 | 
				
			||||||
    """Return a configured oslo.messaging RPCClient."""
 | 
					    """Return a configured oslo.messaging RPCClient."""
 | 
				
			||||||
    global TRANSPORT
 | 
					 | 
				
			||||||
    target = oslo.messaging.Target(**kwargs)
 | 
					    target = oslo.messaging.Target(**kwargs)
 | 
				
			||||||
    serializer = RequestContextSerializer(JsonPayloadSerializer())
 | 
					    serializer = RequestContextSerializer(JsonPayloadSerializer())
 | 
				
			||||||
    return oslo.messaging.RPCClient(TRANSPORT, target,
 | 
					    return oslo.messaging.RPCClient(transport, target,
 | 
				
			||||||
                                    serializer=serializer)
 | 
					                                    serializer=serializer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_notification_listener(targets, endpoints, url=None):
 | 
					def get_notification_listener(transport, targets, endpoints):
 | 
				
			||||||
    """Return a configured oslo.messaging notification listener."""
 | 
					    """Return a configured oslo.messaging notification listener."""
 | 
				
			||||||
    global TRANSPORT
 | 
					 | 
				
			||||||
    if url:
 | 
					 | 
				
			||||||
        transport = oslo.messaging.get_transport(cfg.CONF, url,
 | 
					 | 
				
			||||||
                                                 _ALIASES)
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        transport = TRANSPORT
 | 
					 | 
				
			||||||
    return oslo.messaging.get_notification_listener(
 | 
					    return oslo.messaging.get_notification_listener(
 | 
				
			||||||
        transport, targets, endpoints, executor='eventlet')
 | 
					        transport, targets, endpoints, executor='eventlet')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_notifier(publisher_id):
 | 
					def get_notifier(transport, publisher_id):
 | 
				
			||||||
    """Return a configured oslo.messaging notifier."""
 | 
					    """Return a configured oslo.messaging notifier."""
 | 
				
			||||||
    global NOTIFIER
 | 
					    serializer = RequestContextSerializer(JsonPayloadSerializer())
 | 
				
			||||||
    return NOTIFIER.prepare(publisher_id=publisher_id)
 | 
					    notifier = oslo.messaging.Notifier(transport, serializer=serializer)
 | 
				
			||||||
 | 
					    return notifier.prepare(publisher_id=publisher_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def convert_to_old_notification_format(priority, ctxt, publisher_id,
 | 
					def convert_to_old_notification_format(priority, ctxt, publisher_id,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,6 +63,15 @@ class NotificationService(os_service.Service):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def start(self):
 | 
					    def start(self):
 | 
				
			||||||
        super(NotificationService, self).start()
 | 
					        super(NotificationService, self).start()
 | 
				
			||||||
 | 
					        # FIXME(sileht): endpoint use notification_topics option
 | 
				
			||||||
 | 
					        # and it should not because this is oslo.messaging option
 | 
				
			||||||
 | 
					        # not a ceilometer, until we have a something to get
 | 
				
			||||||
 | 
					        # the notification_topics in an other way
 | 
				
			||||||
 | 
					        # we must create a transport to ensure the option have
 | 
				
			||||||
 | 
					        # beeen registered by oslo.messaging
 | 
				
			||||||
 | 
					        transport = messaging.get_transport()
 | 
				
			||||||
 | 
					        messaging.get_notifier(transport, '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.pipeline_manager = pipeline.setup_pipeline()
 | 
					        self.pipeline_manager = pipeline.setup_pipeline()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.notification_manager = self._get_notifications_manager(
 | 
					        self.notification_manager = self._get_notifications_manager(
 | 
				
			||||||
@@ -91,9 +100,9 @@ class NotificationService(os_service.Service):
 | 
				
			|||||||
        urls = cfg.CONF.notification.messaging_urls or [None]
 | 
					        urls = cfg.CONF.notification.messaging_urls or [None]
 | 
				
			||||||
        self.listeners = []
 | 
					        self.listeners = []
 | 
				
			||||||
        for url in urls:
 | 
					        for url in urls:
 | 
				
			||||||
            listener = messaging.get_notification_listener(targets,
 | 
					            transport = messaging.get_transport(url)
 | 
				
			||||||
                                                           endpoints,
 | 
					            listener = messaging.get_notification_listener(
 | 
				
			||||||
                                                           url)
 | 
					                transport, targets, endpoints)
 | 
				
			||||||
            listener.start()
 | 
					            listener.start()
 | 
				
			||||||
            self.listeners.append(listener)
 | 
					            self.listeners.append(listener)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,7 +106,8 @@ class RPCPublisher(publisher.PublisherBase):
 | 
				
			|||||||
                     % self.policy)
 | 
					                     % self.policy)
 | 
				
			||||||
            self.policy = 'default'
 | 
					            self.policy = 'default'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.rpc_client = messaging.get_rpc_client(version='1.0')
 | 
					        transport = messaging.get_transport()
 | 
				
			||||||
 | 
					        self.rpc_client = messaging.get_rpc_client(transport, version='1.0')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def publish_samples(self, context, samples):
 | 
					    def publish_samples(self, context, samples):
 | 
				
			||||||
        """Publish samples on RPC.
 | 
					        """Publish samples on RPC.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,19 +25,17 @@ import mock
 | 
				
			|||||||
from six import moves
 | 
					from six import moves
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometer.alarm.partition import coordination
 | 
					from ceilometer.alarm.partition import coordination
 | 
				
			||||||
from ceilometer import messaging
 | 
					 | 
				
			||||||
from ceilometer.openstack.common.fixture import config
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.openstack.common import test
 | 
					 | 
				
			||||||
from ceilometer.openstack.common import timeutils
 | 
					from ceilometer.openstack.common import timeutils
 | 
				
			||||||
from ceilometer.storage import models
 | 
					from ceilometer.storage import models
 | 
				
			||||||
 | 
					from ceilometer.tests import base as tests_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestCoordinate(test.BaseTestCase):
 | 
					class TestCoordinate(tests_base.BaseTestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestCoordinate, self).setUp()
 | 
					        super(TestCoordinate, self).setUp()
 | 
				
			||||||
        self.CONF = self.useFixture(config.Config()).conf
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.test_interval = 120
 | 
					        self.test_interval = 120
 | 
				
			||||||
        self.CONF.set_override('evaluation_interval',
 | 
					        self.CONF.set_override('evaluation_interval',
 | 
				
			||||||
@@ -425,7 +423,7 @@ class TestCoordinate(test.BaseTestCase):
 | 
				
			|||||||
                        self.output.getvalue())
 | 
					                        self.output.getvalue())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestPartitionIdentity(test.BaseTestCase):
 | 
					class TestPartitionIdentity(tests_base.BaseTestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestPartitionIdentity, self).setUp()
 | 
					        super(TestPartitionIdentity, self).setUp()
 | 
				
			||||||
        self.id_1st = coordination.PartitionIdentity(str(uuid.uuid4()), 1)
 | 
					        self.id_1st = coordination.PartitionIdentity(str(uuid.uuid4()), 1)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,11 +20,10 @@ import mock
 | 
				
			|||||||
import requests
 | 
					import requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometer.alarm import service
 | 
					from ceilometer.alarm import service
 | 
				
			||||||
from ceilometer import messaging
 | 
					 | 
				
			||||||
from ceilometer.openstack.common import context
 | 
					from ceilometer.openstack.common import context
 | 
				
			||||||
from ceilometer.openstack.common.fixture import config
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.openstack.common.fixture import mockpatch
 | 
					from ceilometer.openstack.common.fixture import mockpatch
 | 
				
			||||||
from ceilometer.openstack.common import test
 | 
					from ceilometer.tests import base as tests_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DATA_JSON = ('{"current": "ALARM", "alarm_id": "foobar",'
 | 
					DATA_JSON = ('{"current": "ALARM", "alarm_id": "foobar",'
 | 
				
			||||||
@@ -38,14 +37,12 @@ NOTIFICATION = dict(alarm_id='foobar',
 | 
				
			|||||||
                    current='ALARM')
 | 
					                    current='ALARM')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestAlarmNotifier(test.BaseTestCase):
 | 
					class TestAlarmNotifier(tests_base.BaseTestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestAlarmNotifier, self).setUp()
 | 
					        super(TestAlarmNotifier, self).setUp()
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.CONF = self.useFixture(config.Config()).conf
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
        self.service = service.AlarmNotifierService()
 | 
					        self.service = service.AlarmNotifierService()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
 | 
					    @mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,16 +21,13 @@ import mock
 | 
				
			|||||||
from stevedore import extension
 | 
					from stevedore import extension
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometer.alarm import service
 | 
					from ceilometer.alarm import service
 | 
				
			||||||
from ceilometer import messaging
 | 
					 | 
				
			||||||
from ceilometer.openstack.common.fixture import config
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.openstack.common import test
 | 
					from ceilometer.tests import base as tests_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestPartitionedAlarmService(test.BaseTestCase):
 | 
					class TestPartitionedAlarmService(tests_base.BaseTestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestPartitionedAlarmService, self).setUp()
 | 
					        super(TestPartitionedAlarmService, self).setUp()
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.threshold_eval = mock.Mock()
 | 
					        self.threshold_eval = mock.Mock()
 | 
				
			||||||
        self.api_client = mock.MagicMock()
 | 
					        self.api_client = mock.MagicMock()
 | 
				
			||||||
@@ -41,6 +38,8 @@ class TestPartitionedAlarmService(test.BaseTestCase):
 | 
				
			|||||||
        self.CONF.set_override('partition_rpc_topic',
 | 
					        self.CONF.set_override('partition_rpc_topic',
 | 
				
			||||||
                               'fake_topic',
 | 
					                               'fake_topic',
 | 
				
			||||||
                               group='alarm')
 | 
					                               group='alarm')
 | 
				
			||||||
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.partitioned = service.PartitionedAlarmService()
 | 
					        self.partitioned = service.PartitionedAlarmService()
 | 
				
			||||||
        self.partitioned.tg = mock.Mock()
 | 
					        self.partitioned.tg = mock.Mock()
 | 
				
			||||||
        self.partitioned.partition_coordinator = mock.Mock()
 | 
					        self.partitioned.partition_coordinator = mock.Mock()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,14 +22,16 @@ import eventlet
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from ceilometer.alarm import rpc as rpc_alarm
 | 
					from ceilometer.alarm import rpc as rpc_alarm
 | 
				
			||||||
from ceilometer import messaging
 | 
					from ceilometer import messaging
 | 
				
			||||||
from ceilometer.openstack.common import test
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.openstack.common import timeutils
 | 
					from ceilometer.openstack.common import timeutils
 | 
				
			||||||
from ceilometer.storage import models
 | 
					from ceilometer.storage import models
 | 
				
			||||||
 | 
					from ceilometer.tests import base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FakeNotifier(object):
 | 
					class FakeNotifier(object):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self, transport):
 | 
				
			||||||
        self.rpc = messaging.get_rpc_server("alarm_notifier", self)
 | 
					        self.rpc = messaging.get_rpc_server(
 | 
				
			||||||
 | 
					            transport, "alarm_notifier", self)
 | 
				
			||||||
        self.notified = []
 | 
					        self.notified = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def start(self, expected_length):
 | 
					    def start(self, expected_length):
 | 
				
			||||||
@@ -42,13 +44,13 @@ class FakeNotifier(object):
 | 
				
			|||||||
            self.rpc.stop()
 | 
					            self.rpc.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestRPCAlarmNotifier(test.BaseTestCase):
 | 
					class TestRPCAlarmNotifier(base.BaseTestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestRPCAlarmNotifier, self).setUp()
 | 
					        super(TestRPCAlarmNotifier, self).setUp()
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.notifier_server = FakeNotifier()
 | 
					        self.notifier_server = FakeNotifier(self.transport)
 | 
				
			||||||
        self.notifier = rpc_alarm.RPCAlarmNotifier()
 | 
					        self.notifier = rpc_alarm.RPCAlarmNotifier()
 | 
				
			||||||
        self.alarms = [
 | 
					        self.alarms = [
 | 
				
			||||||
            alarms.Alarm(None, info={
 | 
					            alarms.Alarm(None, info={
 | 
				
			||||||
@@ -144,9 +146,9 @@ class TestRPCAlarmNotifier(test.BaseTestCase):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FakeCoordinator(object):
 | 
					class FakeCoordinator(object):
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self, transport):
 | 
				
			||||||
        self.rpc = messaging.get_rpc_server(
 | 
					        self.rpc = messaging.get_rpc_server(
 | 
				
			||||||
            "alarm_partition_coordination", self)
 | 
					            transport, "alarm_partition_coordination", self)
 | 
				
			||||||
        self.notified = []
 | 
					        self.notified = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def presence(self, context, data):
 | 
					    def presence(self, context, data):
 | 
				
			||||||
@@ -163,13 +165,13 @@ class FakeCoordinator(object):
 | 
				
			|||||||
        self.rpc.stop()
 | 
					        self.rpc.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestRPCAlarmPartitionCoordination(test.BaseTestCase):
 | 
					class TestRPCAlarmPartitionCoordination(base.BaseTestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestRPCAlarmPartitionCoordination, self).setUp()
 | 
					        super(TestRPCAlarmPartitionCoordination, self).setUp()
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.coordinator_server = FakeCoordinator()
 | 
					        self.coordinator_server = FakeCoordinator(self.transport)
 | 
				
			||||||
        self.coordinator_server.rpc.start()
 | 
					        self.coordinator_server.rpc.start()
 | 
				
			||||||
        eventlet.sleep()  # must be sure that fanout queue is created
 | 
					        eventlet.sleep()  # must be sure that fanout queue is created
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,20 +18,19 @@
 | 
				
			|||||||
"""
 | 
					"""
 | 
				
			||||||
import mock
 | 
					import mock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from oslo.config import cfg
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from stevedore import extension
 | 
					from stevedore import extension
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometer.alarm import service
 | 
					from ceilometer.alarm import service
 | 
				
			||||||
from ceilometer import messaging
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.openstack.common import test
 | 
					from ceilometer.tests import base as tests_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestSingletonAlarmService(test.BaseTestCase):
 | 
					class TestSingletonAlarmService(tests_base.BaseTestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestSingletonAlarmService, self).setUp()
 | 
					        super(TestSingletonAlarmService, self).setUp()
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.threshold_eval = mock.Mock()
 | 
					        self.threshold_eval = mock.Mock()
 | 
				
			||||||
        self.evaluators = extension.ExtensionManager.make_test_instance(
 | 
					        self.evaluators = extension.ExtensionManager.make_test_instance(
 | 
				
			||||||
@@ -51,7 +50,7 @@ class TestSingletonAlarmService(test.BaseTestCase):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def test_start(self):
 | 
					    def test_start(self):
 | 
				
			||||||
        test_interval = 120
 | 
					        test_interval = 120
 | 
				
			||||||
        cfg.CONF.set_override('evaluation_interval',
 | 
					        self.CONF.set_override('evaluation_interval',
 | 
				
			||||||
                               test_interval,
 | 
					                               test_interval,
 | 
				
			||||||
                               group='alarm')
 | 
					                               group='alarm')
 | 
				
			||||||
        with mock.patch('ceilometerclient.client.get_client',
 | 
					        with mock.patch('ceilometerclient.client.get_client',
 | 
				
			||||||
@@ -90,13 +89,13 @@ class TestSingletonAlarmService(test.BaseTestCase):
 | 
				
			|||||||
    def test_singleton_endpoint_types(self):
 | 
					    def test_singleton_endpoint_types(self):
 | 
				
			||||||
        endpoint_types = ["internalURL", "publicURL"]
 | 
					        endpoint_types = ["internalURL", "publicURL"]
 | 
				
			||||||
        for endpoint_type in endpoint_types:
 | 
					        for endpoint_type in endpoint_types:
 | 
				
			||||||
            cfg.CONF.set_override('os_endpoint_type',
 | 
					            self.CONF.set_override('os_endpoint_type',
 | 
				
			||||||
                                   endpoint_type,
 | 
					                                   endpoint_type,
 | 
				
			||||||
                                   group='service_credentials')
 | 
					                                   group='service_credentials')
 | 
				
			||||||
            with mock.patch('ceilometerclient.client.get_client') as client:
 | 
					            with mock.patch('ceilometerclient.client.get_client') as client:
 | 
				
			||||||
                self.singleton.api_client = None
 | 
					                self.singleton.api_client = None
 | 
				
			||||||
                self.singleton._evaluate_assigned_alarms()
 | 
					                self.singleton._evaluate_assigned_alarms()
 | 
				
			||||||
                conf = cfg.CONF.service_credentials
 | 
					                conf = self.CONF.service_credentials
 | 
				
			||||||
                expected = [mock.call(2,
 | 
					                expected = [mock.call(2,
 | 
				
			||||||
                                      os_auth_url=conf.os_auth_url,
 | 
					                                      os_auth_url=conf.os_auth_url,
 | 
				
			||||||
                                      os_region_name=conf.os_region_name,
 | 
					                                      os_region_name=conf.os_region_name,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,11 +18,10 @@
 | 
				
			|||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from oslo.config import cfg
 | 
					from oslo.config import cfg
 | 
				
			||||||
import oslo.messaging.conffixture
 | 
					 | 
				
			||||||
import pecan
 | 
					import pecan
 | 
				
			||||||
import pecan.testing
 | 
					import pecan.testing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometer import messaging
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.tests import db as db_test_base
 | 
					from ceilometer.tests import db as db_test_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OPT_GROUP_NAME = 'keystone_authtoken'
 | 
					OPT_GROUP_NAME = 'keystone_authtoken'
 | 
				
			||||||
@@ -39,10 +38,9 @@ class FunctionalTest(db_test_base.TestBase):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(FunctionalTest, self).setUp()
 | 
					        super(FunctionalTest, self).setUp()
 | 
				
			||||||
        self.useFixture(oslo.messaging.conffixture.ConfFixture(self.CONF))
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        self.CONF.set_override("notification_driver", "messaging")
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
        messaging.setup("fake://")
 | 
					
 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
        self.CONF.set_override("auth_version", "v2.0",
 | 
					        self.CONF.set_override("auth_version", "v2.0",
 | 
				
			||||||
                               group=OPT_GROUP_NAME)
 | 
					                               group=OPT_GROUP_NAME)
 | 
				
			||||||
        self.CONF.set_override("policy_file",
 | 
					        self.CONF.set_override("policy_file",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1933,10 +1933,9 @@ class TestAlarms(FunctionalTest,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        endpoint = mock.MagicMock()
 | 
					        endpoint = mock.MagicMock()
 | 
				
			||||||
        target = oslo.messaging.Target(topic="notifications",
 | 
					        target = oslo.messaging.Target(topic="notifications")
 | 
				
			||||||
                                       exchange="ceilometer")
 | 
					        listener = messaging.get_notification_listener(
 | 
				
			||||||
        listener = messaging.get_notification_listener([target],
 | 
					            self.transport, [target], [endpoint])
 | 
				
			||||||
                                                       [endpoint])
 | 
					 | 
				
			||||||
        listener.start()
 | 
					        listener.start()
 | 
				
			||||||
        endpoint.info.side_effect = lambda *args: listener.stop()
 | 
					        endpoint.info.side_effect = lambda *args: listener.stop()
 | 
				
			||||||
        self.post_json('/alarms', params=json, headers=self.auth_headers)
 | 
					        self.post_json('/alarms', params=json, headers=self.auth_headers)
 | 
				
			||||||
@@ -1975,7 +1974,8 @@ class TestAlarms(FunctionalTest,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            self.delete('/alarms/%s' % data[0]['alarm_id'],
 | 
					            self.delete('/alarms/%s' % data[0]['alarm_id'],
 | 
				
			||||||
                        headers=self.auth_headers, status=204)
 | 
					                        headers=self.auth_headers, status=204)
 | 
				
			||||||
            get_notifier.assert_called_once_with(publisher_id='ceilometer.api')
 | 
					            get_notifier.assert_called_once_with(mock.ANY,
 | 
				
			||||||
 | 
					                                                 publisher_id='ceilometer.api')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        calls = notifier.info.call_args_list
 | 
					        calls = notifier.info.call_args_list
 | 
				
			||||||
        self.assertEqual(1, len(calls))
 | 
					        self.assertEqual(1, len(calls))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ class TestPostSamples(FunctionalTest,
 | 
				
			|||||||
            del m['message_signature']
 | 
					            del m['message_signature']
 | 
				
			||||||
        self.published.append(data)
 | 
					        self.published.append(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def fake_get_rpc_client(self, **kwargs):
 | 
					    def fake_get_rpc_client(self, *args, **kwargs):
 | 
				
			||||||
        cast_ctxt = mock.Mock()
 | 
					        cast_ctxt = mock.Mock()
 | 
				
			||||||
        cast_ctxt.cast.side_effect = self.fake_cast
 | 
					        cast_ctxt.cast.side_effect = self.fake_cast
 | 
				
			||||||
        client = mock.Mock()
 | 
					        client = mock.Mock()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,13 +21,36 @@ import functools
 | 
				
			|||||||
import os.path
 | 
					import os.path
 | 
				
			||||||
import six
 | 
					import six
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import eventlet
 | 
				
			||||||
 | 
					import oslo.messaging
 | 
				
			||||||
from testtools import testcase
 | 
					from testtools import testcase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from ceilometer import messaging
 | 
				
			||||||
 | 
					from ceilometer.openstack.common.fixture import mockpatch
 | 
				
			||||||
from ceilometer.openstack.common import test
 | 
					from ceilometer.openstack.common import test
 | 
				
			||||||
from ceilometer.openstack.common import timeutils
 | 
					from ceilometer.openstack.common import timeutils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BaseTestCase(test.BaseTestCase):
 | 
					class BaseTestCase(test.BaseTestCase):
 | 
				
			||||||
 | 
					    def setup_messaging(self, conf, exchange=None):
 | 
				
			||||||
 | 
					        self.useFixture(oslo.messaging.conffixture.ConfFixture(conf))
 | 
				
			||||||
 | 
					        conf.set_override("notification_driver", "messaging")
 | 
				
			||||||
 | 
					        if not exchange:
 | 
				
			||||||
 | 
					            exchange = 'ceilometer'
 | 
				
			||||||
 | 
					        conf.set_override("control_exchange", exchange)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # NOTE(sileht): oslo.messaging fake driver uses time.sleep
 | 
				
			||||||
 | 
					        # for task switch, so we need to monkey_patch it
 | 
				
			||||||
 | 
					        # and also ensure the correct exchange have been set
 | 
				
			||||||
 | 
					        eventlet.monkey_patch(time=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # NOTE(sileht): Ensure a new oslo.messaging driver is loaded
 | 
				
			||||||
 | 
					        # between each tests
 | 
				
			||||||
 | 
					        self.transport = messaging.get_transport("fake://", cache=False)
 | 
				
			||||||
 | 
					        self.useFixture(mockpatch.Patch(
 | 
				
			||||||
 | 
					            'ceilometer.messaging.get_transport',
 | 
				
			||||||
 | 
					            return_value=self.transport))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def assertTimestampEqual(self, first, second, msg=None):
 | 
					    def assertTimestampEqual(self, first, second, msg=None):
 | 
				
			||||||
        """Checks that two timestamps are equals.
 | 
					        """Checks that two timestamps are equals.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,6 @@ import oslo.messaging
 | 
				
			|||||||
from stevedore import extension
 | 
					from stevedore import extension
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometer.event import endpoint as event_endpoint
 | 
					from ceilometer.event import endpoint as event_endpoint
 | 
				
			||||||
from ceilometer import messaging
 | 
					 | 
				
			||||||
from ceilometer.openstack.common.fixture import config
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.storage import models
 | 
					from ceilometer.storage import models
 | 
				
			||||||
from ceilometer.tests import base as tests_base
 | 
					from ceilometer.tests import base as tests_base
 | 
				
			||||||
@@ -90,10 +89,9 @@ class TestEventEndpoint(tests_base.BaseTestCase):
 | 
				
			|||||||
        super(TestEventEndpoint, self).setUp()
 | 
					        super(TestEventEndpoint, self).setUp()
 | 
				
			||||||
        self.CONF = self.useFixture(config.Config()).conf
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        self.CONF([])
 | 
					        self.CONF([])
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
        self.CONF.set_override("connection", "log://", group='database')
 | 
					        self.CONF.set_override("connection", "log://", group='database')
 | 
				
			||||||
        self.CONF.set_override("store_events", True, group="notification")
 | 
					        self.CONF.set_override("store_events", True, group="notification")
 | 
				
			||||||
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.mock_dispatcher = mock.MagicMock()
 | 
					        self.mock_dispatcher = mock.MagicMock()
 | 
				
			||||||
        self.endpoint = event_endpoint.EventsNotificationEndpoint()
 | 
					        self.endpoint = event_endpoint.EventsNotificationEndpoint()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,12 +27,11 @@ except ImportError:
 | 
				
			|||||||
    import webob
 | 
					    import webob
 | 
				
			||||||
    REQUEST = webob
 | 
					    REQUEST = webob
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ceilometer import messaging
 | 
					 | 
				
			||||||
from ceilometer.objectstore import swift_middleware
 | 
					from ceilometer.objectstore import swift_middleware
 | 
				
			||||||
from ceilometer.openstack.common.fixture import config
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.openstack.common.fixture.mockpatch import PatchObject
 | 
					from ceilometer.openstack.common.fixture import mockpatch
 | 
				
			||||||
from ceilometer.openstack.common import test
 | 
					 | 
				
			||||||
from ceilometer import pipeline
 | 
					from ceilometer import pipeline
 | 
				
			||||||
 | 
					from ceilometer.tests import base as tests_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FakeApp(object):
 | 
					class FakeApp(object):
 | 
				
			||||||
@@ -49,7 +48,7 @@ class FakeApp(object):
 | 
				
			|||||||
        return self.body
 | 
					        return self.body
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestSwiftMiddleware(test.BaseTestCase):
 | 
					class TestSwiftMiddleware(tests_base.BaseTestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class _faux_pipeline_manager(pipeline.PipelineManager):
 | 
					    class _faux_pipeline_manager(pipeline.PipelineManager):
 | 
				
			||||||
        class _faux_pipeline(object):
 | 
					        class _faux_pipeline(object):
 | 
				
			||||||
@@ -72,20 +71,16 @@ class TestSwiftMiddleware(test.BaseTestCase):
 | 
				
			|||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestSwiftMiddleware, self).setUp()
 | 
					        super(TestSwiftMiddleware, self).setUp()
 | 
				
			||||||
        self.pipeline_manager = self._faux_pipeline_manager()
 | 
					        self.pipeline_manager = self._faux_pipeline_manager()
 | 
				
			||||||
        self.useFixture(PatchObject(pipeline, 'setup_pipeline',
 | 
					        self.useFixture(mockpatch.PatchObject(
 | 
				
			||||||
 | 
					            pipeline, 'setup_pipeline',
 | 
				
			||||||
            side_effect=self._fake_setup_pipeline))
 | 
					            side_effect=self._fake_setup_pipeline))
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
        self.CONF = self.useFixture(config.Config()).conf
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def start_response(*args):
 | 
					    def start_response(*args):
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_rpc_setup(self):
 | 
					 | 
				
			||||||
        swift_middleware.CeilometerMiddleware(FakeApp(), {})
 | 
					 | 
				
			||||||
        self.assertEqual('ceilometer', self.CONF.control_exchange)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def test_get(self):
 | 
					    def test_get(self):
 | 
				
			||||||
        app = swift_middleware.CeilometerMiddleware(FakeApp(), {})
 | 
					        app = swift_middleware.CeilometerMiddleware(FakeApp(), {})
 | 
				
			||||||
        req = REQUEST.Request.blank('/1.0/account/container/obj',
 | 
					        req = REQUEST.Request.blank('/1.0/account/container/obj',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,12 +28,12 @@ from ceilometer import messaging
 | 
				
			|||||||
from ceilometer.openstack.common import context
 | 
					from ceilometer.openstack.common import context
 | 
				
			||||||
from ceilometer.openstack.common.fixture import config
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
from ceilometer.openstack.common import network_utils
 | 
					from ceilometer.openstack.common import network_utils
 | 
				
			||||||
from ceilometer.openstack.common import test
 | 
					 | 
				
			||||||
from ceilometer.publisher import rpc
 | 
					from ceilometer.publisher import rpc
 | 
				
			||||||
from ceilometer import sample
 | 
					from ceilometer import sample
 | 
				
			||||||
 | 
					from ceilometer.tests import base as tests_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestPublish(test.BaseTestCase):
 | 
					class TestPublish(tests_base.BaseTestCase):
 | 
				
			||||||
    test_data = [
 | 
					    test_data = [
 | 
				
			||||||
        sample.Sample(
 | 
					        sample.Sample(
 | 
				
			||||||
            name='test',
 | 
					            name='test',
 | 
				
			||||||
@@ -95,8 +95,7 @@ class TestPublish(test.BaseTestCase):
 | 
				
			|||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestPublish, self).setUp()
 | 
					        super(TestPublish, self).setUp()
 | 
				
			||||||
        self.CONF = self.useFixture(config.Config()).conf
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
        self.published = []
 | 
					        self.published = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_published_no_mock(self):
 | 
					    def test_published_no_mock(self):
 | 
				
			||||||
@@ -105,7 +104,7 @@ class TestPublish(test.BaseTestCase):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        endpoint = mock.MagicMock(['record_metering_data'])
 | 
					        endpoint = mock.MagicMock(['record_metering_data'])
 | 
				
			||||||
        collector = messaging.get_rpc_server(
 | 
					        collector = messaging.get_rpc_server(
 | 
				
			||||||
            self.CONF.publisher_rpc.metering_topic, endpoint)
 | 
					            self.transport, self.CONF.publisher_rpc.metering_topic, endpoint)
 | 
				
			||||||
        endpoint.record_metering_data.side_effect = \
 | 
					        endpoint.record_metering_data.side_effect = \
 | 
				
			||||||
            lambda *args, **kwds: collector.stop()
 | 
					            lambda *args, **kwds: collector.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,9 +46,7 @@ class TestCollector(tests_base.BaseTestCase):
 | 
				
			|||||||
        self.CONF.set_override("connection", "log://", group='database')
 | 
					        self.CONF.set_override("connection", "log://", group='database')
 | 
				
			||||||
        self.CONF.set_override('metering_secret', 'not-so-secret',
 | 
					        self.CONF.set_override('metering_secret', 'not-so-secret',
 | 
				
			||||||
                               group='publisher')
 | 
					                               group='publisher')
 | 
				
			||||||
        self.useFixture(oslo.messaging.conffixture.ConfFixture(self.CONF))
 | 
					        self._setup_messaging()
 | 
				
			||||||
        self._setup_messaging('fake://')
 | 
					 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.counter = sample.Sample(
 | 
					        self.counter = sample.Sample(
 | 
				
			||||||
            name='foobar',
 | 
					            name='foobar',
 | 
				
			||||||
@@ -87,10 +85,13 @@ class TestCollector(tests_base.BaseTestCase):
 | 
				
			|||||||
    def _dummy_thread_group_add_thread(method):
 | 
					    def _dummy_thread_group_add_thread(method):
 | 
				
			||||||
        method()
 | 
					        method()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _setup_messaging(self, url):
 | 
					    def _setup_messaging(self, enabled=True):
 | 
				
			||||||
        messaging.cleanup()
 | 
					        if enabled:
 | 
				
			||||||
        self.CONF.set_override('rpc_backend', '')
 | 
					            self.setup_messaging(self.CONF)
 | 
				
			||||||
        messaging.setup(url, optional=True)
 | 
					        else:
 | 
				
			||||||
 | 
					            self.useFixture(mockpatch.Patch(
 | 
				
			||||||
 | 
					                'ceilometer.messaging.get_transport',
 | 
				
			||||||
 | 
					                return_value=None))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _setup_fake_dispatcher(self):
 | 
					    def _setup_fake_dispatcher(self):
 | 
				
			||||||
        plugin = mock.MagicMock()
 | 
					        plugin = mock.MagicMock()
 | 
				
			||||||
@@ -127,7 +128,7 @@ class TestCollector(tests_base.BaseTestCase):
 | 
				
			|||||||
            data=self.counter)
 | 
					            data=self.counter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_udp_receive_base(self):
 | 
					    def test_udp_receive_base(self):
 | 
				
			||||||
        self._setup_messaging('')
 | 
					        self._setup_messaging(False)
 | 
				
			||||||
        mock_dispatcher = self._setup_fake_dispatcher()
 | 
					        mock_dispatcher = self._setup_fake_dispatcher()
 | 
				
			||||||
        self.counter['source'] = 'mysource'
 | 
					        self.counter['source'] = 'mysource'
 | 
				
			||||||
        self.counter['counter_name'] = self.counter['name']
 | 
					        self.counter['counter_name'] = self.counter['name']
 | 
				
			||||||
@@ -146,7 +147,7 @@ class TestCollector(tests_base.BaseTestCase):
 | 
				
			|||||||
            self.counter)
 | 
					            self.counter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_udp_receive_storage_error(self):
 | 
					    def test_udp_receive_storage_error(self):
 | 
				
			||||||
        self._setup_messaging('')
 | 
					        self._setup_messaging(False)
 | 
				
			||||||
        mock_dispatcher = self._setup_fake_dispatcher()
 | 
					        mock_dispatcher = self._setup_fake_dispatcher()
 | 
				
			||||||
        mock_dispatcher.record_metering_data.side_effect = self._raise_error
 | 
					        mock_dispatcher.record_metering_data.side_effect = self._raise_error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -170,7 +171,7 @@ class TestCollector(tests_base.BaseTestCase):
 | 
				
			|||||||
        raise Exception
 | 
					        raise Exception
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_udp_receive_bad_decoding(self):
 | 
					    def test_udp_receive_bad_decoding(self):
 | 
				
			||||||
        self._setup_messaging('')
 | 
					        self._setup_messaging(False)
 | 
				
			||||||
        udp_socket = self._make_fake_socket(self.counter)
 | 
					        udp_socket = self._make_fake_socket(self.counter)
 | 
				
			||||||
        with contextlib.nested(
 | 
					        with contextlib.nested(
 | 
				
			||||||
                mock.patch('socket.socket', return_value=udp_socket),
 | 
					                mock.patch('socket.socket', return_value=udp_socket),
 | 
				
			||||||
@@ -183,7 +184,7 @@ class TestCollector(tests_base.BaseTestCase):
 | 
				
			|||||||
    @mock.patch.object(collector.CollectorService, 'start_udp')
 | 
					    @mock.patch.object(collector.CollectorService, 'start_udp')
 | 
				
			||||||
    def test_only_udp(self, udp_start, rpc_start):
 | 
					    def test_only_udp(self, udp_start, rpc_start):
 | 
				
			||||||
        """Check that only UDP is started if messaging transport is unset."""
 | 
					        """Check that only UDP is started if messaging transport is unset."""
 | 
				
			||||||
        self._setup_messaging('')
 | 
					        self._setup_messaging(False)
 | 
				
			||||||
        udp_socket = self._make_fake_socket(self.counter)
 | 
					        udp_socket = self._make_fake_socket(self.counter)
 | 
				
			||||||
        with mock.patch('socket.socket', return_value=udp_socket):
 | 
					        with mock.patch('socket.socket', return_value=udp_socket):
 | 
				
			||||||
            self.srv.start()
 | 
					            self.srv.start()
 | 
				
			||||||
@@ -200,7 +201,7 @@ class TestCollector(tests_base.BaseTestCase):
 | 
				
			|||||||
        self.assertEqual(0, udp_start.call_count)
 | 
					        self.assertEqual(0, udp_start.call_count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_udp_receive_valid_encoding(self):
 | 
					    def test_udp_receive_valid_encoding(self):
 | 
				
			||||||
        self._setup_messaging('')
 | 
					        self._setup_messaging(False)
 | 
				
			||||||
        mock_dispatcher = self._setup_fake_dispatcher()
 | 
					        mock_dispatcher = self._setup_fake_dispatcher()
 | 
				
			||||||
        self.data_sent = []
 | 
					        self.data_sent = []
 | 
				
			||||||
        with mock.patch('socket.socket',
 | 
					        with mock.patch('socket.socket',
 | 
				
			||||||
@@ -216,7 +217,7 @@ class TestCollector(tests_base.BaseTestCase):
 | 
				
			|||||||
        self.srv.start()
 | 
					        self.srv.start()
 | 
				
			||||||
        mylog.info.side_effect = lambda *args: self.srv.stop()
 | 
					        mylog.info.side_effect = lambda *args: self.srv.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        client = messaging.get_rpc_client(version='1.0')
 | 
					        client = messaging.get_rpc_client(self.transport, version='1.0')
 | 
				
			||||||
        cclient = client.prepare(topic='metering')
 | 
					        cclient = client.prepare(topic='metering')
 | 
				
			||||||
        cclient.cast(context.RequestContext(),
 | 
					        cclient.cast(context.RequestContext(),
 | 
				
			||||||
                     'record_metering_data', data=[self.utf8_msg])
 | 
					                     'record_metering_data', data=[self.utf8_msg])
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@
 | 
				
			|||||||
# under the License.
 | 
					# under the License.
 | 
				
			||||||
"""Tests for Ceilometer notify daemon."""
 | 
					"""Tests for Ceilometer notify daemon."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import eventlet.semaphore
 | 
					import eventlet
 | 
				
			||||||
import mock
 | 
					import mock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import oslo.messaging
 | 
					import oslo.messaging
 | 
				
			||||||
@@ -30,6 +30,8 @@ from ceilometer import notification
 | 
				
			|||||||
from ceilometer.openstack.common import context
 | 
					from ceilometer.openstack.common import context
 | 
				
			||||||
from ceilometer.openstack.common import fileutils
 | 
					from ceilometer.openstack.common import fileutils
 | 
				
			||||||
from ceilometer.openstack.common.fixture import config
 | 
					from ceilometer.openstack.common.fixture import config
 | 
				
			||||||
 | 
					from ceilometer.openstack.common import timeutils
 | 
				
			||||||
 | 
					from ceilometer.publisher import test as test_publisher
 | 
				
			||||||
from ceilometer.tests import base as tests_base
 | 
					from ceilometer.tests import base as tests_base
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST_NOTICE_CTXT = {
 | 
					TEST_NOTICE_CTXT = {
 | 
				
			||||||
@@ -89,10 +91,9 @@ class TestNotification(tests_base.BaseTestCase):
 | 
				
			|||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestNotification, self).setUp()
 | 
					        super(TestNotification, self).setUp()
 | 
				
			||||||
        self.CONF = self.useFixture(config.Config()).conf
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        messaging.setup('fake://')
 | 
					 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
        self.CONF.set_override("connection", "log://", group='database')
 | 
					        self.CONF.set_override("connection", "log://", group='database')
 | 
				
			||||||
        self.CONF.set_override("store_events", False, group="notification")
 | 
					        self.CONF.set_override("store_events", False, group="notification")
 | 
				
			||||||
 | 
					        self.setup_messaging(self.CONF)
 | 
				
			||||||
        self.srv = notification.NotificationService()
 | 
					        self.srv = notification.NotificationService()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def fake_get_notifications_manager(self, pm):
 | 
					    def fake_get_notifications_manager(self, pm):
 | 
				
			||||||
@@ -168,7 +169,7 @@ class TestRealNotification(tests_base.BaseTestCase):
 | 
				
			|||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        super(TestRealNotification, self).setUp()
 | 
					        super(TestRealNotification, self).setUp()
 | 
				
			||||||
        self.CONF = self.useFixture(config.Config()).conf
 | 
					        self.CONF = self.useFixture(config.Config()).conf
 | 
				
			||||||
        self.useFixture(oslo.messaging.conffixture.ConfFixture(self.CONF))
 | 
					        self.setup_messaging(self.CONF, 'nova')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pipeline = yaml.dump([{
 | 
					        pipeline = yaml.dump([{
 | 
				
			||||||
            'name': 'test_pipeline',
 | 
					            'name': 'test_pipeline',
 | 
				
			||||||
@@ -179,44 +180,31 @@ class TestRealNotification(tests_base.BaseTestCase):
 | 
				
			|||||||
        }])
 | 
					        }])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.expected_samples = 2
 | 
					        self.expected_samples = 2
 | 
				
			||||||
        self.sem = eventlet.semaphore.Semaphore(0)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pipeline_cfg_file = fileutils.write_to_tempfile(content=pipeline,
 | 
					        pipeline_cfg_file = fileutils.write_to_tempfile(content=pipeline,
 | 
				
			||||||
                                                        prefix="pipeline",
 | 
					                                                        prefix="pipeline",
 | 
				
			||||||
                                                        suffix="yaml")
 | 
					                                                        suffix="yaml")
 | 
				
			||||||
        self.CONF.set_override("pipeline_cfg_file", pipeline_cfg_file)
 | 
					        self.CONF.set_override("pipeline_cfg_file", pipeline_cfg_file)
 | 
				
			||||||
        self.CONF.set_override("notification_driver", "messaging")
 | 
					 | 
				
			||||||
        self.CONF.set_override("control_exchange", "nova")
 | 
					 | 
				
			||||||
        messaging.setup('fake://')
 | 
					 | 
				
			||||||
        self.addCleanup(messaging.cleanup)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.srv = notification.NotificationService()
 | 
					        self.srv = notification.NotificationService()
 | 
				
			||||||
 | 
					        self.publisher = test_publisher.TestPublisher("")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch('ceilometer.publisher.test.TestPublisher')
 | 
					    @mock.patch('ceilometer.publisher.test.TestPublisher')
 | 
				
			||||||
    def test_notification_service(self, fake_publisher_cls):
 | 
					    def test_notification_service(self, fake_publisher_cls):
 | 
				
			||||||
 | 
					        fake_publisher_cls.return_value = self.publisher
 | 
				
			||||||
        self.srv.start()
 | 
					        self.srv.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        fake_publisher = fake_publisher_cls.return_value
 | 
					        notifier = messaging.get_notifier(self.transport,
 | 
				
			||||||
        fake_publisher.publish_samples.side_effect = \
 | 
					                                          "compute.vagrant-precise")
 | 
				
			||||||
            lambda *args: self.sem.release()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        notifier = messaging.get_notifier("compute.vagrant-precise")
 | 
					 | 
				
			||||||
        notifier.info(context.RequestContext(), 'compute.instance.create.end',
 | 
					        notifier.info(context.RequestContext(), 'compute.instance.create.end',
 | 
				
			||||||
                      TEST_NOTICE_PAYLOAD)
 | 
					                      TEST_NOTICE_PAYLOAD)
 | 
				
			||||||
        # we should wait all the expected notification listeners finished
 | 
					        start = timeutils.utcnow()
 | 
				
			||||||
        # processing the notification
 | 
					        while timeutils.delta_seconds(start, timeutils.utcnow()) < 600:
 | 
				
			||||||
        for i in range(self.expected_samples):
 | 
					            if len(self.publisher.samples) >= self.expected_samples:
 | 
				
			||||||
            self.sem.acquire(timeout=30)
 | 
					                break
 | 
				
			||||||
        # stop NotificationService
 | 
					            eventlet.sleep(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.srv.stop()
 | 
					        self.srv.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        class SamplesMatcher(object):
 | 
					        resources = list(set(s.resource_id for s in self.publisher.samples))
 | 
				
			||||||
            def __eq__(self, samples):
 | 
					        self.assertEqual(self.expected_samples, len(self.publisher.samples))
 | 
				
			||||||
                for s in samples:
 | 
					        self.assertEqual(["9f9d01b9-4a58-4271-9e27-398b21ab20d1"], resources)
 | 
				
			||||||
                    if s.resource_id != "9f9d01b9-4a58-4271-9e27-398b21ab20d1":
 | 
					 | 
				
			||||||
                        return False
 | 
					 | 
				
			||||||
                return True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        fake_publisher.publish_samples.assert_has_calls(
 | 
					 | 
				
			||||||
            [mock.call(mock.ANY, SamplesMatcher())] * self.expected_samples
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user