alarm creation fails with string vs. int mismatch

Bug #1380168 reported by Mike Spreitzer
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
OpenStack Heat
Fix Released
Undecided
Peter Razumovsky

Bug Description

If your template has an OS::Ceilometer::Alarm with a matching_metadata dict that maps some name to a value of type 'int', an attempt to make a stack from that template will fail with no useful error message. When I tried that, I got this in my heat engine log:

2014-10-11 19:24:51.397 21530 DEBUG urllib3.connectionpool [-] "POST /v2/alarms HTTP/1.1" 400 193 _make_request /usr/lib/python2.7/dist-packages/urllib3/connectionpool.py:415
2014-10-11 19:24:51.397 21530 DEBUG ceilometerclient.openstack.common.apiclient.client [-] Request returned failure status: 400 request /opt/stack/python-ceilometerclient/ceilometerclient/openstack/common/apiclient/client.py:183
2014-10-11 19:24:51.398 21530 INFO heat.engine.resource [-] CREATE: CeilometerAlarm "gone_alarm" Stack "NRS2" [fcee9bf4-5424-4904-81ac-5f67c93904ec]
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource Traceback (most recent call last):
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/heat/heat/engine/resource.py", line 435, in _action_recorder
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource yield
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/heat/heat/engine/resource.py", line 505, in _do_action
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource yield self.action_handler_task(action, args=handler_args)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/heat/heat/engine/scheduler.py", line 286, in wrapper
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource step = next(subtask)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/heat/heat/engine/resource.py", line 476, in action_handler_task
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource handler_data = handler(*args)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/heat/heat/engine/resources/ceilometer/alarm.py", line 203, in handle_create
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource alarm = self.ceilometer().alarms.create(**props)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/python-ceilometerclient/ceilometerclient/v2/alarms.py", line 156, in create
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource return self._create(self._path(), new)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/python-ceilometerclient/ceilometerclient/common/base.py", line 53, in _create
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource body = self.api.post(url, json=body).json()
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/python-ceilometerclient/ceilometerclient/openstack/common/apiclient/client.py", line 337, in post
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource return self.client_request("POST", url, **kwargs)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/python-ceilometerclient/ceilometerclient/openstack/common/apiclient/client.py", line 328, in client_request
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource self, method, url, **kwargs)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/python-ceilometerclient/ceilometerclient/openstack/common/apiclient/client.py", line 244, in client_request
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource method, self.concat_url(endpoint, url), **kwargs)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource File "/opt/stack/python-ceilometerclient/ceilometerclient/openstack/common/apiclient/client.py", line 184, in request
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource raise exceptions.from_response(resp, method, url)
2014-10-11 19:24:51.398 21530 TRACE heat.engine.resource BadRequest: Bad Request (HTTP 400)

Over in the Ceilometer API log, I found this:

2014-10-11 19:24:51.395 15822 WARNING wsme.api [-] Client-side error: Invalid input for field/attribute value. Value: '80'. Wrong type. Expected '<type 'unicode'>', got '<type 'int'>'
172.18.76.6 - - [11/Oct/2014 19:24:51] "POST /v2/alarms HTTP/1.1" 400 193

Here is the relevant resource snippet:

  gone_alarm:
    type: OS::Ceilometer::Alarm
    properties:
      description: Detect server being unresponsive
      meter_name: network.services.lb.member
      statistic: avg
      period: 70
      evaluation_periods: 2
      threshold: 1
      alarm_actions: [ {get_attr: [restarter, AlarmUrl]} ]
      matching_metadata:
        address: {get_attr: [server, first_address]}
        protocol_port: {get_param: protocol_port}
      comparison_operator: lt
    depends_on: server

.. and yes, the protocol_port parameter is declared to be a number:

  protocol_port:
    type: number
    description: port number where server listens
    default: 80

Changed in heat:
assignee: nobody → Sergey Kraynev (skraynev)
Changed in heat:
assignee: Sergey Kraynev (skraynev) → Razumovsky Peter (prazumovsky)
Revision history for this message
Mike Spreitzer (mike-spreitzer) wrote :

Note also the work on https://review.openstack.org/#/c/127821/ --- which will probably be touching some of the same code.

Changed in heat:
status: New → In Progress
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to heat (master)

Reviewed: https://review.openstack.org/128861
Committed: https://git.openstack.org/cgit/openstack/heat/commit/?id=a0ffafdf8eaa751b792c5f9628eac20a8800c8b5
Submitter: Jenkins
Branch: master

commit a0ffafdf8eaa751b792c5f9628eac20a8800c8b5
Author: Peter Razumovsky <email address hidden>
Date: Thu Oct 16 13:32:18 2014 +0400

    Convert value type in alarm matching_metadata

    Commit I0667db868c6f827867a5a20e4a3fa22fcad1a6a1 added query
    property in OS::Ceilometer::Alarm resource and add
    matching_metadata elements to query list. Value type in
    query elements need to be a string, but value type in
    matching_metadata elements can not be a string. So we need to
    convert value type to string, when we add element to query list.

    Change-Id: Ie6af0bfca4f3e089e0ee3e226804a2d365f6d6ae
    Closes-bug: #1380168

Changed in heat:
status: In Progress → Fix Committed
Thierry Carrez (ttx)
Changed in heat:
milestone: none → kilo-1
status: Fix Committed → Fix Released
Thierry Carrez (ttx)
Changed in heat:
milestone: kilo-1 → 2015.1.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.