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.")
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())))
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'))
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)
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)
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)