diff options
author | Wendy Xia <xialinjuan2014@hotmail.com> | 2015-09-21 17:08:51 +0800 |
---|---|---|
committer | Xia Linjuan <ljxiash@cn.ibm.com> | 2015-09-23 10:31:28 +0800 |
commit | 850ce95a2dea5cab9dd9f9bb68f68794fb5db600 (patch) | |
tree | e3090ad93a03f67ad873a48b07cb3e164274e641 | |
parent | eb538417899565861cbd18c0e3dc798c3ee6c74e (diff) | |
download | ceilometer-850ce95a2dea5cab9dd9f9bb68f68794fb5db600.tar.gz |
fix command ceilometer event-list -q error
There is a error happened in Kilo when using mongodb as the backend of
ceilometer.
When running ceilometer event-list -q
with more than two parameters, and KeyError raised.
Closes-Bug: #1488716
Change-Id: I850785fe3450eec51298e2d78ba719de4cb65c88
-rw-r--r-- | ceilometer/storage/mongo/utils.py | 22 | ||||
-rw-r--r-- | ceilometer/tests/storage/test_storage_scenarios.py | 3 |
2 files changed, 11 insertions, 14 deletions
diff --git a/ceilometer/storage/mongo/utils.py b/ceilometer/storage/mongo/utils.py index efc09064..cbd8af95 100644 --- a/ceilometer/storage/mongo/utils.py +++ b/ceilometer/storage/mongo/utils.py @@ -73,18 +73,18 @@ def make_events_query_from_filter(event_filter): :param event_filter: storage.EventFilter object. """ - q = {} + query = {} + q_list = [] ts_range = make_timestamp_range(event_filter.start_timestamp, event_filter.end_timestamp) if ts_range: - q['timestamp'] = ts_range + q_list.append({'timestamp': ts_range}) if event_filter.event_type: - q['event_type'] = event_filter.event_type + q_list.append({'event_type': event_filter.event_type}) if event_filter.message_id: - q['_id'] = event_filter.message_id + q_list.append({'_id': event_filter.message_id}) if event_filter.traits_filter: - q.setdefault('traits') for trait_filter in event_filter.traits_filter: op = trait_filter.pop('op', 'eq') dict_query = {} @@ -101,14 +101,10 @@ def make_events_query_from_filter(event_filter): v if op == 'eq' else {OP_SIGN[op]: v}) dict_query = {'$elemMatch': dict_query} - if q['traits'] is None: - q['traits'] = dict_query - elif q.get('$and') is None: - q.setdefault('$and', [{'traits': q.pop('traits')}, - {'traits': dict_query}]) - else: - q['$and'].append({'traits': dict_query}) - return q + q_list.append({'traits': dict_query}) + if q_list: + query = {'$and': q_list} + return query def make_query_from_filter(sample_filter, require_meter=True): diff --git a/ceilometer/tests/storage/test_storage_scenarios.py b/ceilometer/tests/storage/test_storage_scenarios.py index b7cae213..0ce75770 100644 --- a/ceilometer/tests/storage/test_storage_scenarios.py +++ b/ceilometer/tests/storage/test_storage_scenarios.py @@ -3522,7 +3522,8 @@ class GetEventTest(EventTestBase): def test_get_event_multiple_trait_filter(self): trait_filters = [{'key': 'trait_B', 'integer': 1}, - {'key': 'trait_A', 'string': 'my_Foo_text'}] + {'key': 'trait_A', 'string': 'my_Foo_text'}, + {'key': 'trait_C', 'float': 0.123456}] event_filter = storage.EventFilter(self.start, self.end, traits_filter=trait_filters) events = [event for event in self.event_conn.get_events(event_filter)] |