diff --git a/ceilometer/api/controllers/v2.py b/ceilometer/api/controllers/v2.py index beee8b8af..803d9428c 100644 --- a/ceilometer/api/controllers/v2.py +++ b/ceilometer/api/controllers/v2.py @@ -189,7 +189,8 @@ class Query(_Base): # Functions to convert the data field to the correct type. _type_converters = {'integer': int, 'float': float, - 'boolean': strutils.bool_from_string, + 'boolean': functools.partial( + strutils.bool_from_string, strict=True), 'string': six.text_type, 'datetime': timeutils.parse_isotime} diff --git a/ceilometer/tests/api/v2/test_list_meters_scenarios.py b/ceilometer/tests/api/v2/test_list_meters_scenarios.py index 7aeb51b87..5e1140018 100644 --- a/ceilometer/tests/api/v2/test_list_meters_scenarios.py +++ b/ceilometer/tests/api/v2/test_list_meters_scenarios.py @@ -24,6 +24,7 @@ import datetime import json as jsonutils import logging import testscenarios +import webtest.app from ceilometer.publisher import utils from ceilometer import sample @@ -43,6 +44,30 @@ class TestListEmptyMeters(FunctionalTest, self.assertEqual([], data) +class TestValidateUserInput(FunctionalTest, + tests_db.MixinTestsWithBackendScenarios): + + def test_list_meters_query_float_metadata(self): + self.assertRaises(webtest.app.AppError, self.get_json, + '/meters/meter.test', + q=[{'field': 'metadata.util', + 'op': 'eq', + 'value': '0.7.5', + 'type': 'float'}]) + self.assertRaises(webtest.app.AppError, self.get_json, + '/meters/meter.test', + q=[{'field': 'metadata.util', + 'op': 'eq', + 'value': 'abacaba', + 'type': 'boolean'}]) + self.assertRaises(webtest.app.AppError, self.get_json, + '/meters/meter.test', + q=[{'field': 'metadata.util', + 'op': 'eq', + 'value': '45.765', + 'type': 'integer'}]) + + class TestListMeters(FunctionalTest, tests_db.MixinTestsWithBackendScenarios): @@ -309,7 +334,6 @@ class TestListMeters(FunctionalTest, set(['meter.mine'])) self.assertEqual(set(r['resource_metadata']['is_public'] for r in data), set(['False'])) - # FIXME(gordc): verify no false positive (Bug#1236496) def test_list_meters_query_string_metadata(self): data = self.get_json('/meters/meter.test',