diff --git a/ceilometer/tests/pipeline_base.py b/ceilometer/tests/pipeline_base.py index 831c1838e..f01bf6c2e 100644 --- a/ceilometer/tests/pipeline_base.py +++ b/ceilometer/tests/pipeline_base.py @@ -1441,3 +1441,55 @@ class BasePipelineTestCase(test.BaseTestCase): pipe.flush(None) publisher = pipeline_manager.pipelines[0].publishers[0] self.assertEqual(1, len(publisher.samples)) + + def test_aggregator_without_authentication(self): + transformer_cfg = [ + { + 'name': 'aggregator', + 'parameters': {'size': 2}, + }, + ] + self._set_pipeline_cfg('transformers', transformer_cfg) + self._set_pipeline_cfg('counters', ['storage.objects.outgoing.bytes']) + counters = [ + sample.Sample( + name='storage.objects.outgoing.bytes', + type=sample.TYPE_DELTA, + volume=26, + unit='B', + user_id=None, + project_id=None, + resource_id='test_resource', + timestamp=timeutils.utcnow().isoformat(), + resource_metadata={'version': '1.0'} + ), + sample.Sample( + name='storage.objects.outgoing.bytes', + type=sample.TYPE_DELTA, + volume=16, + unit='B', + user_id=None, + project_id=None, + resource_id='test_resource', + timestamp=timeutils.utcnow().isoformat(), + resource_metadata={'version': '2.0'} + ) + ] + + pipeline_manager = pipeline.PipelineManager(self.pipeline_cfg, + self.transformer_manager) + pipe = pipeline_manager.pipelines[0] + + pipe.publish_samples(None, [counters[0]]) + pipe.flush(None) + publisher = pipe.publishers[0] + self.assertEqual(0, len(publisher.samples)) + + pipe.publish_samples(None, [counters[1]]) + pipe.flush(None) + publisher = pipe.publishers[0] + + self.assertEqual(1, len(publisher.samples)) + self.assertEqual(42, getattr(publisher.samples[0], 'volume')) + self.assertEqual("test_resource", getattr(publisher.samples[0], + 'resource_id')) diff --git a/ceilometer/transformer/conversions.py b/ceilometer/transformer/conversions.py index 6c4fc58e4..38cf929ea 100644 --- a/ceilometer/transformer/conversions.py +++ b/ceilometer/transformer/conversions.py @@ -214,8 +214,13 @@ class AggregatorTransformer(ScalingTransformer): self.key_attributes.append(name) def _get_unique_key(self, s): - non_aggregated_keys = "-".join([getattr(s, field) - for field in self.key_attributes]) + # NOTE(arezmerita): in samples generated by ceilometer middleware, + # when accessing without authentication publicly readable/writable + # swift containers, the project_id and the user_id are missing. + # They will be replaced by for unique key construction. + keys = ['' if getattr(s, f) is None else getattr(s, f) + for f in self.key_attributes] + non_aggregated_keys = "-".join(keys) # NOTE(sileht): it assumes, a meter always have the same unit/type return "%s-%s-%s" % (s.name, s.resource_id, non_aggregated_keys)