Esempio n. 1
0
    def test_process_sample_metadata_with_jsonpath(self):
        """Test meter sample in a format produced by cinder."""
        s = sample.Sample(
            name='volume.create.end',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id='test_run_tasks',
            source='',
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={
                'event_type':
                'volume.create.end',
                'status':
                'available',
                'volume_type':
                None,
                # 'created_at': '2017-03-21T21:05:44+00:00',
                'host':
                'testhost',
                # this "value: , key: " format is
                # how cinder reports metadata
                'metadata': [{
                    'value': 'aaa0001',
                    'key': 'metering.prn_name'
                }, {
                    'value': 'Cust001',
                    'key': 'metering.prn_type'
                }],
                'size':
                0
            },
        )

        to_patch = ("ceilometer.publisher.monasca_data_filter."
                    "MonascaDataFilter._get_mapping")
        # use the cinder specific mapping
        with mock.patch(to_patch, side_effect=[self._field_mappings_cinder]):
            data_filter = mdf.MonascaDataFilter(self.CONF)
            r = data_filter.process_sample_for_monasca(s)

            self.assertEqual(s.name, r['name'])
            self.assertIsNotNone(r.get('value_meta'))
            # Using convert_dict_to_list is too simplistic for this
            self.assertEqual(
                r.get('value_meta')['event_type'],
                s.resource_metadata.get('event_type'),
                "Failed to match common element.")
            self.assertEqual(
                r.get('value_meta')['host'], s.resource_metadata.get('host'),
                "Failed to match meter specific element.")
            self.assertEqual(
                r.get('value_meta')['size'], s.resource_metadata.get('size'),
                "Unable to handle an int.")
            self.assertEqual(
                r.get('value_meta')['metering.prn_name'], 'aaa0001',
                "Failed to extract a value "
                "using specified jsonpath.")
Esempio n. 2
0
    def test_process_sample_metadata(self):
        s = sample.Sample(
            name='image',
            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={
                'event_type': 'notification',
                'status': 'active',
                'image_meta': {
                    'base_url': 'http://image.url',
                    'base_url2': '',
                    'base_url3': None
                },
                'size': 1500
            },
        )

        to_patch = ("ceilometer.publisher.monasca_data_filter."
                    "MonascaDataFilter._get_mapping")
        with mock.patch(to_patch, side_effect=[self._field_mappings]):
            data_filter = mdf.MonascaDataFilter(self.CONF)
            r = data_filter.process_sample_for_monasca(s)
            self.assertEqual(s.name, r['name'])
            self.assertIsNotNone(r.get('value_meta'))
            self.assertTrue(
                set(self.convert_dict_to_list(
                    s.resource_metadata).items()).issubset(
                        set(r['value_meta'].items())))
Esempio n. 3
0
    def test_process_sample_field_mappings(self):
        s = 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'},
        )

        field_map = self._field_mappings
        field_map['dimensions'].remove('project_id')
        field_map['dimensions'].remove('user_id')

        to_patch = ("ceilometer.publisher.monasca_data_filter."
                    "MonascaDataFilter._get_mapping")
        with mock.patch(to_patch, side_effect=[field_map]):
            data_filter = mdf.MonascaDataFilter(self.CONF)
            r = data_filter.process_sample_for_monasca(s)

            self.assertIsNone(r['dimensions'].get('project_id'))
            self.assertIsNone(r['dimensions'].get('user_id'))
Esempio n. 4
0
    def test_process_sample(self):
        s = 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'},
        )

        to_patch = ("ceilometer.publisher.monasca_data_filter."
                    "MonascaDataFilter._get_mapping")
        with mock.patch(to_patch, side_effect=[self._field_mappings]):
            data_filter = mdf.MonascaDataFilter(self.CONF)
            r = data_filter.process_sample_for_monasca(s)

            self.assertEqual(s.name, r['name'])
            self.assertIsNotNone(r.get('dimensions'))
            self.assertIsNotNone(r.get('value_meta'))
            self.assertIsNotNone(r.get('value'))
            self.assertEqual(s.user_id, r['dimensions'].get('user_id'))
            self.assertEqual(s.project_id, r['dimensions'].get('project_id'))
            self.assertEqual(s.resource_id, r['dimensions'].get('resource_id'))
            # 2015-04-07T20:07:06.156986 compare upto millisec
            monasca_ts = \
                timeutils.iso8601_from_timestamp(r['timestamp'] / 1000.0,
                                                 microsecond=True)[:23]
            self.assertEqual(s.timestamp[:23], monasca_ts)
Esempio n. 5
0
    def test_process_sample_metadata_with_jsonpath_bad_format(self):
        """Test handling of definition that is not written correctly"""

        s = sample.Sample(
            name='volume.create.end',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id='test_run_tasks',
            source='',
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={
                'event_type': 'volume.create.end',
                'status': 'available',
                'volume_type': None,
                # 'created_at': '2017-03-21T21:05:44+00:00',
                'host': 'testhost',
                'metadata': [{
                    'value': 13,
                    'key': 'metering.prn_name'
                }],
                'size': 0
            },
        )

        to_patch = ("ceilometer.publisher.monasca_data_filter."
                    "MonascaDataFilter._get_mapping")
        # use the bad mapping
        with mock.patch(to_patch,
                        side_effect=[self._field_mappings_bad_format]):
            data_filter = mdf.MonascaDataFilter(self.CONF)
            try:
                # Don't assign to a variable as this should raise
                data_filter.process_sample_for_monasca(s)
            except mdf.CeiloscaMappingDefinitionException as e:
                # Make sure we got the right kind of error
                # Cannot check the whole message text, as python
                # may reorder a dict when producing a string version
                self.assertIn(
                    'Field definition format mismatch, should '
                    'have only one key:value pair.', e.message,
                    "Did raise exception but wrong message - %s" % e.message)
Esempio n. 6
0
    def test_process_sample_metadata_with_jsonpath_value_not_str(self):
        """Test where jsonpath is used but result is not a simple string"""

        s = sample.Sample(
            name='volume.create.end',
            type=sample.TYPE_CUMULATIVE,
            unit='',
            volume=1,
            user_id='test',
            project_id='test',
            resource_id='test_run_tasks',
            source='',
            timestamp=datetime.datetime.utcnow().isoformat(),
            resource_metadata={
                'event_type':
                'volume.create.end',
                'status':
                'available',
                'volume_type':
                None,
                # 'created_at': '2017-03-21T21:05:44+00:00',
                'host':
                'testhost',
                'metadata': [{
                    'value': ['aaa0001', 'bbbb002'],
                    'key': 'metering.prn_name'
                }],
                'size':
                0
            },
        )

        to_patch = ("ceilometer.publisher.monasca_data_filter."
                    "MonascaDataFilter._get_mapping")
        # use the cinder specific mapping
        with mock.patch(to_patch, side_effect=[self._field_mappings_cinder]):
            data_filter = mdf.MonascaDataFilter(self.CONF)
            try:
                # Don't assign to a variable, this should raise
                data_filter.process_sample_for_monasca(s)
            except mdf.CeiloscaMappingDefinitionException as e:
                self.assertEqual(
                    'Metadata format mismatch, value should be '
                    'a simple string. [\'aaa0001\', \'bbbb002\']', e.message)