From 229f9f98b73b73918cd6f768520fdbce7121444f Mon Sep 17 00:00:00 2001 From: gordon chung Date: Wed, 29 Apr 2015 15:25:12 -0400 Subject: [PATCH] empty non-string values are returned as string traits when an integer or float trait are 0 or 0.0, sql backend incorrect returns them as string traits. Change-Id: I70b311e24bfab264bc2623a5089cd7971041896e Closes-Bug: #1450042 --- ceilometer/event/storage/impl_sqlalchemy.py | 6 +++--- .../tests/storage/test_storage_scenarios.py | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ceilometer/event/storage/impl_sqlalchemy.py b/ceilometer/event/storage/impl_sqlalchemy.py index 70bf3a533..478578d2e 100644 --- a/ceilometer/event/storage/impl_sqlalchemy.py +++ b/ceilometer/event/storage/impl_sqlalchemy.py @@ -320,13 +320,13 @@ class Connection(base.Connection): for id_, key, t_date, t_int, t_float, t_text in ( trait_q.order_by('2')).all(): - if t_int: + if t_int is not None: dtype = api_models.Trait.INT_TYPE val = t_int - elif t_float: + elif t_float is not None: dtype = api_models.Trait.FLOAT_TYPE val = t_float - elif t_date: + elif t_date is not None: dtype = api_models.Trait.DATETIME_TYPE val = t_date else: diff --git a/ceilometer/tests/storage/test_storage_scenarios.py b/ceilometer/tests/storage/test_storage_scenarios.py index de093985d..b0862f924 100644 --- a/ceilometer/tests/storage/test_storage_scenarios.py +++ b/ceilometer/tests/storage/test_storage_scenarios.py @@ -3668,6 +3668,22 @@ class GetEventTest(EventTestBase): self.assertTrue(events) self.assertEqual({'status': {'nested': 'started'}}, events[0].raw) + def test_trait_type_enforced_on_none(self): + new_events = [event_models.Event( + "id_testid", "MessageIDTest", self.start, + [event_models.Trait('text', event_models.Trait.TEXT_TYPE, ''), + event_models.Trait('int', event_models.Trait.INT_TYPE, 0), + event_models.Trait('float', event_models.Trait.FLOAT_TYPE, 0.0)], + {})] + self.event_conn.record_events(new_events) + event_filter = storage.EventFilter(message_id="id_testid") + events = [event for event in self.event_conn.get_events(event_filter)] + options = [(event_models.Trait.TEXT_TYPE, ''), + (event_models.Trait.INT_TYPE, 0.0), + (event_models.Trait.FLOAT_TYPE, 0.0)] + for trait in events[0].traits: + options.remove((trait.dtype, trait.value)) + class BigIntegerTest(tests_db.TestBase, tests_db.MixinTestsWithBackendScenarios):