diff --git a/ceilometer/api/controllers/v2.py b/ceilometer/api/controllers/v2.py index dae14b8d8..e2fc4137d 100644 --- a/ceilometer/api/controllers/v2.py +++ b/ceilometer/api/controllers/v2.py @@ -972,8 +972,10 @@ class Meter(_Base): "The unique identifier for the meter" def __init__(self, **kwargs): - meter_id = base64.encodestring('%s+%s' % (kwargs['resource_id'], - kwargs['name'])) + meter_id = '%s+%s' % (kwargs['resource_id'], kwargs['name']) + # meter_id is of type Unicode but base64.encodestring() only accepts + # strings. See bug #1333177 + meter_id = base64.encodestring(meter_id.encode('utf-8')) kwargs['meter_id'] = meter_id super(Meter, self).__init__(**kwargs) diff --git a/ceilometer/tests/api/v2/test_list_meters_scenarios.py b/ceilometer/tests/api/v2/test_list_meters_scenarios.py index c7a8bc419..68735c90e 100644 --- a/ceilometer/tests/api/v2/test_list_meters_scenarios.py +++ b/ceilometer/tests/api/v2/test_list_meters_scenarios.py @@ -163,6 +163,17 @@ class TestListMeters(v2.FunctionalTest, 'size': 0, 'util': 0.58, 'is_public': True}, + source='test_source1'), + sample.Sample( + u'meter.accent\xe9\u0437', + 'gauge', + '', + 1, + 'user-id4', + 'project-id2', + 'resource-id4', + timestamp=datetime.datetime(2014, 7, 2, 10, 43), + resource_metadata={}, source='test_source1')]: msg = utils.meter_message_from_counter( cnt, @@ -172,13 +183,14 @@ class TestListMeters(v2.FunctionalTest, def test_list_meters(self): data = self.get_json('/meters') - self.assertEqual(5, len(data)) + self.assertEqual(6, len(data)) self.assertEqual(set(['resource-id', 'resource-id2', 'resource-id3', 'resource-id4']), set(r['resource_id'] for r in data)) - self.assertEqual(set(['meter.test', 'meter.mine', 'meter.test.new']), + self.assertEqual(set(['meter.test', 'meter.mine', 'meter.test.new', + u'meter.accent\xe9\u0437']), set(r['name'] for r in data)) self.assertEqual(set(['test_source', 'test_source1']), set(r['source'] for r in data)) @@ -199,7 +211,7 @@ class TestListMeters(v2.FunctionalTest, def test_list_samples(self): data = self.get_json('/samples') - self.assertEqual(6, len(data)) + self.assertEqual(7, len(data)) def test_query_samples_with_invalid_field_name_and_non_eq_operator(self): resp = self.get_json('/samples', @@ -484,7 +496,7 @@ class TestListMeters(v2.FunctionalTest, 'value': 'test_source1', }]) nids = set(r['name'] for r in data) - self.assertEqual(set(['meter.mine']), nids) + self.assertEqual(set(['meter.mine', u'meter.accent\xe9\u0437']), nids) sids = set(r['source'] for r in data) self.assertEqual(set(['test_source1']), sids) @@ -654,6 +666,6 @@ class TestListMeters(v2.FunctionalTest, def test_list_meters_meter_id(self): data = self.get_json('/meters') for i in data: - expected = base64.encodestring('%s+%s' % (i['resource_id'], - i['name'])) + meter_id = '%s+%s' % (i['resource_id'], i['name']) + expected = base64.encodestring(meter_id.encode('utf-8')) self.assertEqual(expected, i['meter_id'])