The command 'ceilometer event-list -q "outcome=string::success;eventType=string::activity;action=string::authenticate" ' fails

Bug #1488716 reported by Zi Lian Ji
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Ceilometer
Fix Released
Low
gordon chung
Kilo
Fix Released
Medium
Xia Linjuan

Bug Description

If the number of select conditions is larger than 2, the command 'ceilometer event-list -q "outcome=string::success;eventType=string::activity;action=string::authenticate" ' fails.

ERROR wsme.api [-] Server-side error: "'traits'". Detail: Traceback (most recent call last):

  File "/usr/lib/python2.7/site-packages/wsmeext/pecan.py", line 77, in callfunction
    result = f(self, *args, **kwargs)

  File "/usr/lib/python2.7/site-packages/ceilometer/api/controllers/v2/events.py", line 253, in get_all
    pecan.request.event_storage_conn.get_events(event_filter)]

  File "/usr/lib/python2.7/site-packages/ceilometer/event/storage/pymongo_base.py", line 87, in get_events
    q = pymongo_utils.make_events_query_from_filter(event_filter)

  File "/usr/lib/python2.7/site-packages/ceilometer/storage/mongo/utils.py", line 104, in make_events_query_from_filter
    if q['traits'] is None:

KeyError: 'traits'

From the following ceilometer code:

    if event_filter.traits_filter:
        q.setdefault('traits')
        for trait_filter in event_filter.traits_filter:
            op = trait_filter.pop('op', 'eq')
            dict_query = {}
            for k, v in six.iteritems(trait_filter):
                if v is not None:
                    # All parameters in EventFilter['traits'] are optional, so
                    # we need to check if they are in the query or no.
                    if k == 'key':
                        dict_query.setdefault('trait_name', v)
                    elif k in ['string', 'integer', 'datetime', 'float']:
                        dict_query.setdefault('trait_type',
                                              EVENT_TRAIT_TYPES[k])
                        dict_query.setdefault('trait_value',
                                              v if op == 'eq'
                                              else {OP_SIGN[op]: v})
            dict_query = {'$elemMatch': dict_query}
104 if q['traits'] is None:
105 q['traits'] = dict_query
106 elif q.get('$and') is None:
107 q.setdefault('$and', [{'traits': q.pop('traits')},
                                      {'traits': dict_query}])
            else:
                q['$and'].append({'traits': dict_query})

It seems like a ceilometer bug, if the for loop over than 3 times:

1. Go to 104, and q['traits'] has value dict_query
2. Go to 107, and q got poped 'traits'
3. Error! This is because in 2, 'traits' has been popped, KeyError raise on 104.

Zi Lian Ji (jizilian)
Changed in ceilometer:
assignee: nobody → Zi Lian Ji (jizilian)
gordon chung (chungg)
Changed in ceilometer:
status: New → Triaged
importance: Undecided → Medium
Zi Lian Ji (jizilian)
Changed in ceilometer:
assignee: Zi Lian Ji (jizilian) → nobody
Xia Linjuan (ljxiash)
Changed in ceilometer:
assignee: nobody → Xia Linjuan (ljxiash)
Revision history for this message
Zi Lian Ji (jizilian) wrote :

Hi Lin Juan

We found this issue in the Kilo release. Please fix it in that release and check whether it exists in the L release.

Thanks

Revision history for this message
gordon chung (chungg) wrote :

does not exist in liberty

Changed in ceilometer:
assignee: Xia Linjuan (ljxiash) → nobody
importance: Medium → Undecided
status: Triaged → Invalid
Revision history for this message
gordon chung (chungg) wrote :

just for reference, we can do something similar to what exists in master

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to ceilometer (stable/kilo)

Fix proposed to branch: stable/kilo
Review: https://review.openstack.org/226130

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to ceilometer (master)

Fix proposed to branch: master
Review: https://review.openstack.org/226283

Changed in ceilometer:
assignee: nobody → gordon chung (chungg)
status: Invalid → In Progress
gordon chung (chungg)
Changed in ceilometer:
milestone: none → liberty-rc1
importance: Undecided → Low
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to ceilometer (master)

Reviewed: https://review.openstack.org/226283
Committed: https://git.openstack.org/cgit/openstack/ceilometer/commit/?id=a4c5388aab9f5008dc0d4645896c08792eab0185
Submitter: Jenkins
Branch: master

commit a4c5388aab9f5008dc0d4645896c08792eab0185
Author: gordon chung <email address hidden>
Date: Tue Sep 22 08:06:48 2015 -0400

    update event filter test to validate multiple trait args

    in mongodb, we use to fail when more than 2 trait filters are given.
    this test is to validate there is no regression. also, so it
    can be backported.

    Change-Id: I145d5393ddc193bcc1f346f5a0a2a09eaab16b0c
    Closes-Bug: #1488716

Changed in ceilometer:
status: In Progress → Fix Committed
Thierry Carrez (ttx)
Changed in ceilometer:
status: Fix Committed → Fix Released
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to ceilometer (stable/kilo)

Reviewed: https://review.openstack.org/226130
Committed: https://git.openstack.org/cgit/openstack/ceilometer/commit/?id=850ce95a2dea5cab9dd9f9bb68f68794fb5db600
Submitter: Jenkins
Branch: stable/kilo

commit 850ce95a2dea5cab9dd9f9bb68f68794fb5db600
Author: Wendy Xia <email address hidden>
Date: Mon Sep 21 17:08:51 2015 +0800

    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

Thierry Carrez (ttx)
Changed in ceilometer:
milestone: liberty-rc1 → 5.0.0
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.