summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-11-04 14:14:33 +0000
committerGerrit Code Review <review@openstack.org>2015-11-04 14:14:33 +0000
commitb88c1c7438655200ce69051c989653f232618f89 (patch)
tree48df9262db9b021ba4240d0e23b00fe24879b47b
parent72a57fab8112eda4331fb7d624c82e0e1e5f8df8 (diff)
parent5d3622a484c103c8d16d1880646df64a6a40f3c1 (diff)
downloadceilometer-b88c1c7438655200ce69051c989653f232618f89.tar.gz
Merge "SQL: Fix event-list with multiple trait query filters" into stable/kilo
-rw-r--r--ceilometer/event/storage/impl_sqlalchemy.py16
-rw-r--r--ceilometer/tests/api/v2/test_event_scenarios.py10
2 files changed, 18 insertions, 8 deletions
diff --git a/ceilometer/event/storage/impl_sqlalchemy.py b/ceilometer/event/storage/impl_sqlalchemy.py
index 4c680681..95877f00 100644
--- a/ceilometer/event/storage/impl_sqlalchemy.py
+++ b/ceilometer/event/storage/impl_sqlalchemy.py
@@ -70,7 +70,7 @@ def _build_trait_query(session, trait_type, key, value, op='eq'):
'ne': (trait_model.value != value)}
conditions = [trait_model.key == key, op_dict[op]]
return (session.query(trait_model.event_id.label('ev_id'))
- .filter(*conditions), trait_model)
+ .filter(*conditions))
class Connection(base.Connection):
@@ -258,17 +258,17 @@ class Connection(base.Connection):
trait_filter = filters.pop()
key = trait_filter.pop('key')
op = trait_filter.pop('op', 'eq')
- trait_subq, t_model = _build_trait_query(
- session, trait_filter.keys()[0], key,
- trait_filter.values()[0], op)
+ trait_type, value = list(trait_filter.items())[0]
+ trait_subq = _build_trait_query(session, trait_type,
+ key, value, op)
for trait_filter in filters:
key = trait_filter.pop('key')
op = trait_filter.pop('op', 'eq')
- q, model = _build_trait_query(
- session, trait_filter.keys()[0], key,
- trait_filter.values()[0], op)
+ trait_type, value = list(trait_filter.items())[0]
+ q = _build_trait_query(session, trait_type,
+ key, value, op)
trait_subq = trait_subq.filter(
- q.filter(model.event_id == t_model.event_id).exists())
+ trait_subq.subquery().c.ev_id == q.subquery().c.ev_id)
trait_subq = trait_subq.subquery()
query = (session.query(models.Event.id)
diff --git a/ceilometer/tests/api/v2/test_event_scenarios.py b/ceilometer/tests/api/v2/test_event_scenarios.py
index b6bc50c0..ba94c59e 100644
--- a/ceilometer/tests/api/v2/test_event_scenarios.py
+++ b/ceilometer/tests/api/v2/test_event_scenarios.py
@@ -274,6 +274,16 @@ class TestEventAPI(EventTestBase):
self.assertEqual(0, len(data))
+ def test_get_events_multiple_filters_same_field_different_values(self):
+ data = self.get_json(self.PATH, headers=headers,
+ q=[{'field': 'trait_A',
+ 'value': 'my_Foo_text',
+ 'type': 'string'},
+ {'field': 'trait_A',
+ 'value': 'my_Bar_text',
+ 'type': 'string'}])
+ self.assertEqual(0, len(data))
+
def test_get_events_not_filters(self):
data = self.get_json(self.PATH, headers=headers,
q=[])