Beispiel #1
0
 def process_notifications(self, priority, notifications):
     events = chain.from_iterable(m["payload"] for m in notifications)
     events = [
         models.Event(message_id=ev['message_id'],
                      event_type=ev['event_type'],
                      generated=timeutils.normalize_time(
                          timeutils.parse_isotime(ev['generated'])),
                      traits=[
                          models.Trait(
                              name, dtype,
                              models.Trait.convert_value(dtype, value))
                          for name, dtype, value in ev['traits']
                      ],
                      raw=ev.get('raw', {})) for ev in events
         if publisher_utils.verify_signature(
             ev, self.conf.publisher.telemetry_secret)
     ]
     try:
         with self.publisher as p:
             p(events)
     except Exception:
         if not self.conf.notification.ack_on_event_error:
             return oslo_messaging.NotificationResult.REQUEUE
         raise
     return oslo_messaging.NotificationResult.HANDLED
def publish_data(metering_connection, events_connection):
    '''Connects to given QDR passed by argument (default '127.0.0.1:5672')
    and sends sample metric and event data to the bus.
    '''
    conf = cfg.ConfigOpts()
    for opts in [oslo_opts, ceilo_opts]:
        for group, options in opts.list_opts():
            conf.register_opts(list(options),
                               group=None if group == "DEFAULT" else group)
    # override default configuration according to overcloud
    conf.set_override('notify_address_prefix', '', group='oslo_messaging_amqp')
    conf.set_override('control_exchange', 'ceilometer')

    try:
        metric_publisher = messaging.SampleNotifierPublisher(
            conf, netutils.urlsplit(metering_connection))
        event_publisher = messaging.EventNotifierPublisher(
            conf, netutils.urlsplit(events_connection))
    except Exception as ex:
        print(f'Failed to connect to QDR ({url}) due to {ex}')
        sys.exit(1)

    for evt in EVENTS:
        itm = event.Event(message_id=evt['message_id'],
                          event_type=evt['event_type'],
                          generated=evt['generated'],
                          traits=[event.Trait(*tr) for tr in evt['traits']],
                          raw=evt['raw'])
        topic = conf.publisher_notifier.event_topic
        print(
            f'Sending event to {topic}: '
            f'{utils.message_from_event(itm, conf.publisher.telemetry_secret)}'
        )
        try:
            event_publisher.publish_events([itm])
        except Exception as ex:
            print(f'Failed to send event due to {ex}')
            sys.exit(1)

    for metr in METRICS:
        itm = sample.Sample(name=metr['counter_name'],
                            type=metr['counter_type'],
                            unit=metr['counter_unit'],
                            volume=metr['counter_volume'],
                            user_id=metr['user_id'],
                            project_id=metr['project_id'],
                            resource_id=metr['resource_id'],
                            timestamp=metr['timestamp'],
                            resource_metadata=metr['resource_metadata'])
        topic = conf.publisher_notifier.metering_topic
        print(
            f'Sending metric to {topic}: '
            f'{utils.meter_message_from_counter(itm, conf.publisher.telemetry_secret)}'
        )
        try:
            metric_publisher.publish_samples([itm])
        except Exception as ex:
            print(f'Failed to send metric due to {ex}')
            sys.exit(1)
    def setUp(self):
        super(EventPipelineTestCase, self).setUp()
        self.CONF = service.prepare_service([], [])

        self.p_type = pipeline.EVENT_TYPE
        self.transformer_manager = None

        self.test_event = models.Event(
            message_id=uuid.uuid4(),
            event_type='a',
            generated=datetime.datetime.utcnow(),
            traits=[
                models.Trait('t_text', 1, 'text_trait'),
                models.Trait('t_int', 2, 'int_trait'),
                models.Trait('t_float', 3, 'float_trait'),
                models.Trait('t_datetime', 4, 'datetime_trait')
            ],
            raw={'status': 'started'})

        self.test_event2 = models.Event(
            message_id=uuid.uuid4(),
            event_type='b',
            generated=datetime.datetime.utcnow(),
            traits=[
                models.Trait('t_text', 1, 'text_trait'),
                models.Trait('t_int', 2, 'int_trait'),
                models.Trait('t_float', 3, 'float_trait'),
                models.Trait('t_datetime', 4, 'datetime_trait')
            ],
            raw={'status': 'stopped'})

        self.useFixture(
            fixtures.MockPatchObject(publisher,
                                     'get_publisher',
                                     side_effect=self.get_publisher))

        self._setup_pipeline_cfg()

        self._reraise_exception = True
        self.useFixture(
            fixtures.MockPatch('ceilometer.pipeline.LOG.exception',
                               side_effect=self._handle_reraise_exception))
Beispiel #4
0
    def to_event(self, priority, notification_body):
        event_type = notification_body['event_type']
        message_id = notification_body['metadata']['message_id']
        when = timeutils.normalize_time(timeutils.parse_isotime(
            notification_body['metadata']['timestamp']))

        traits = (self.traits[t].to_trait(notification_body)
                  for t in self.traits)
        # Only accept non-None value traits ...
        traits = [trait for trait in traits if trait is not None]
        raw = notification_body if priority in self.raw_levels else {}
        event = models.Event(message_id, event_type, when, traits, raw)
        return event
Beispiel #5
0
class TestHttpPublisher(base.BaseTestCase):

    resource_id = str(uuid.uuid4())

    sample_data = [
        sample.Sample(
            name='alpha',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id=resource_id,
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
        sample.Sample(
            name='beta',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id=resource_id,
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
        sample.Sample(
            name='gamma',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id=resource_id,
            timestamp=datetime.datetime.now().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
    ]

    event_data = [
        event.Event(message_id=str(uuid.uuid4()),
                    event_type='event_%d' % i,
                    generated=datetime.datetime.utcnow().isoformat(),
                    traits=[],
                    raw={'payload': {
                        'some': 'aa'
                    }}) for i in range(3)
    ]

    def setUp(self):
        super(TestHttpPublisher, self).setUp()
        self.CONF = service.prepare_service([], [])

    def test_http_publisher_config(self):
        """Test publisher config parameters."""
        # invalid hostname, the given url, results in an empty hostname
        parsed_url = urlparse.urlparse('http:/aaa.bb/path')
        self.assertRaises(ValueError, http.HttpPublisher, self.CONF,
                          parsed_url)

        # invalid port
        parsed_url = urlparse.urlparse('http://*****:*****@mock.patch('ceilometer.publisher.http.LOG')
    def test_http_post_samples(self, thelog):
        """Test publisher post."""
        parsed_url = urlparse.urlparse('http://*****:*****@mock.patch('ceilometer.publisher.http.LOG')
    def test_http_post_events(self, thelog):
        """Test publisher post."""
        parsed_url = urlparse.urlparse('http://*****:*****@mock.patch('ceilometer.publisher.http.LOG')
    def test_http_post_empty_data(self, thelog):
        parsed_url = urlparse.urlparse('http://*****:*****@localhost:90/path1?')
        publisher = http.HttpPublisher(self.CONF, parsed_url)

        with mock.patch.object(requests.Session, 'post') as post:
            publisher.publish_samples(self.sample_data)
            self.assertEqual(('alice', 'l00kingGla$$'),
                             post.call_args[1]['auth'])

    def test_post_client_cert_auth(self):
        parsed_url = urlparse.urlparse('http://localhost:90/path1?'
                                       'clientcert=/path/to/cert.crt&'
                                       'clientkey=/path/to/cert.key')
        publisher = http.HttpPublisher(self.CONF, parsed_url)

        with mock.patch.object(requests.Session, 'post') as post:
            publisher.publish_samples(self.sample_data)
            self.assertEqual(('/path/to/cert.crt', '/path/to/cert.key'),
                             post.call_args[1]['cert'])

    def test_post_raw_only(self):
        parsed_url = urlparse.urlparse('http://localhost:90/path1?raw_only=1')
        publisher = http.HttpPublisher(self.CONF, parsed_url)

        with mock.patch.object(requests.Session, 'post') as post:
            publisher.publish_events(self.event_data)
            self.assertEqual(
                '[{"some": "aa"}, {"some": "aa"}, {"some": "aa"}]',
                post.call_args[1]['data'])
Beispiel #6
0
class BasePublisherTestCase(tests_base.BaseTestCase):
    test_event_data = [
        event.Event(message_id=uuid.uuid4(),
                    event_type='event_%d' % i,
                    generated=datetime.datetime.utcnow(),
                    traits=[], raw={})
        for i in range(0, 5)
    ]

    test_sample_data = [
        sample.Sample(
            name='test',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id='test_run_tasks',
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
        sample.Sample(
            name='test',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id='test_run_tasks',
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
        sample.Sample(
            name='test2',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id='test_run_tasks',
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
        sample.Sample(
            name='test2',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id='test_run_tasks',
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
        sample.Sample(
            name='test3',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id='test_run_tasks',
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
    ]

    def setUp(self):
        super(BasePublisherTestCase, self).setUp()
        self.CONF = service.prepare_service([], [])
        self.setup_messaging(self.CONF)
Beispiel #7
0
load_tests = testscenarios.load_tests_apply_scenarios

INSTANCE_DELETE_START = models.Event(
    event_type=u'compute.instance.delete.start',
    traits=[
        models.Trait('state', 1, u'active'),
        models.Trait('user_id', 1, u'1e3ce043029547f1a61c1996d1a531a2'),
        models.Trait('service', 1, u'compute'),
        models.Trait('disk_gb', 2, 0),
        models.Trait('instance_type', 1, u'm1.tiny'),
        models.Trait('tenant_id', 1, u'7c150a59fe714e6f9263774af9688f0e'),
        models.Trait('root_gb', 2, 0),
        models.Trait('ephemeral_gb', 2, 0),
        models.Trait('instance_type_id', 2, 2),
        models.Trait('vcpus', 2, 1),
        models.Trait('memory_mb', 2, 512),
        models.Trait('instance_id', 1,
                     u'9f9d01b9-4a58-4271-9e27-398b21ab20d1'),
        models.Trait('host', 1, u'vagrant-precise'),
        models.Trait('request_id', 1,
                     u'req-fb3c4546-a2e5-49b7-9fd2-a63bd658bc39'),
        models.Trait('project_id', 1, u'7c150a59fe714e6f9263774af9688f0e'),
        models.Trait('launched_at', 4, '2012-05-08T20:23:47')
    ],
    raw={},
    generated='2012-05-08T20:24:14.824743',
    message_id=u'a15b94ee-cb8e-4c71-9abe-14aa80055fb4',
)

IMAGE_DELETE_START = models.Event(
    event_type=u'image.delete',
Beispiel #8
0
class TestZaqarPublisher(base.BaseTestCase):

    resource_id = str(uuid.uuid4())

    sample_data = [
        sample.Sample(
            name='alpha',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id=resource_id,
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
        sample.Sample(
            name='beta',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id=resource_id,
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
        sample.Sample(
            name='gamma',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id=resource_id,
            timestamp=datetime.datetime.now().isoformat(),
            resource_metadata={'name': 'TestPublish'},
        ),
    ]

    event_data = [event.Event(
        message_id=str(uuid.uuid4()), event_type='event_%d' % i,
        generated=datetime.datetime.utcnow().isoformat(),
        traits=[], raw={'payload': {'some': 'aa'}}) for i in range(3)]

    def setUp(self):
        super(TestZaqarPublisher, self).setUp()
        self.CONF = service.prepare_service([], [])

    def test_zaqar_publisher_config(self):
        """Test publisher config parameters."""
        parsed_url = urlparse.urlparse('zaqar://')
        self.assertRaises(ValueError, zaqar.ZaqarPublisher,
                          self.CONF, parsed_url)

        parsed_url = urlparse.urlparse('zaqar://?queue=foo&ttl=bar')
        self.assertRaises(ValueError, zaqar.ZaqarPublisher,
                          self.CONF, parsed_url)

        parsed_url = urlparse.urlparse('zaqar://?queue=foo&ttl=60')
        publisher = zaqar.ZaqarPublisher(self.CONF, parsed_url)
        self.assertEqual(60, publisher.ttl)

        parsed_url = urlparse.urlparse('zaqar://?queue=foo')
        publisher = zaqar.ZaqarPublisher(self.CONF, parsed_url)
        self.assertEqual(3600, publisher.ttl)
        self.assertEqual('foo', publisher.queue_name)

    @mock.patch('zaqarclient.queues.v2.queues.Queue')
    def test_zaqar_post_samples(self, mock_queue):
        """Test publisher post."""
        parsed_url = urlparse.urlparse('zaqar://?queue=foo')
        publisher = zaqar.ZaqarPublisher(self.CONF, parsed_url)
        mock_post = mock.Mock()
        mock_queue.return_value = mock_post

        publisher.publish_samples(self.sample_data)

        mock_queue.assert_called_once_with(mock.ANY, 'foo')
        self.assertEqual(
            3, len(mock_post.post.call_args_list[0][0][0]))
        self.assertEqual(
            mock_post.post.call_args_list[0][0][0][0]['body'],
            self.sample_data[0].as_dict())

    @mock.patch('zaqarclient.queues.v2.queues.Queue')
    def test_zaqar_post_events(self, mock_queue):
        """Test publisher post."""
        parsed_url = urlparse.urlparse('zaqar://?queue=foo')
        publisher = zaqar.ZaqarPublisher(self.CONF, parsed_url)
        mock_post = mock.Mock()
        mock_queue.return_value = mock_post

        publisher.publish_events(self.event_data)

        mock_queue.assert_called_once_with(mock.ANY, 'foo')
        self.assertEqual(
            3, len(mock_post.post.call_args_list[0][0][0]))
        self.assertEqual(
            mock_post.post.call_args_list[0][0][0][0]['body'],
            self.event_data[0].serialize())
Beispiel #9
0
load_tests = testscenarios.load_tests_apply_scenarios

INSTANCE_DELETE_START = models.Event(
    event_type=u'compute.instance.delete.start',
    traits=[models.Trait('state', 1, u'active'),
            models.Trait(
                'user_id', 1, u'1e3ce043029547f1a61c1996d1a531a2'),
            models.Trait('service', 1, u'compute'),
            models.Trait('availability_zone', 1, u'zone1'),
            models.Trait('disk_gb', 2, 0),
            models.Trait('instance_type', 1, u'm1.tiny'),
            models.Trait('tenant_id', 1, u'7c150a59fe714e6f9263774af9688f0e'),
            models.Trait('root_gb', 2, 0),
            models.Trait('ephemeral_gb', 2, 0),
            models.Trait('instance_type_id', 2, u'2'),
            models.Trait('vcpus', 2, 1),
            models.Trait('memory_mb', 2, 512),
            models.Trait(
                'instance_id', 1, u'9f9d01b9-4a58-4271-9e27-398b21ab20d1'),
            models.Trait('host', 1, u'vagrant-precise'),
            models.Trait(
                'request_id', 1, u'req-fb3c4546-a2e5-49b7-9fd2-a63bd658bc39'),
            models.Trait('project_id', 1, u'7c150a59fe714e6f9263774af9688f0e'),
            models.Trait('launched_at', 4, '2012-05-08T20:23:47')],
    raw={},
    generated='2012-05-08T20:24:14.824743',
    message_id=u'a15b94ee-cb8e-4c71-9abe-14aa80055fb4',
)

INSTANCE_CREATE_END = models.Event(
    event_type=u'compute.instance.create.end',