Merge "Fix the dict type metadata missing issue"
This commit is contained in:
commit
db3b645905
@ -45,6 +45,7 @@ from ceilometer.openstack.common import log
|
||||
from ceilometer.openstack.common import timeutils
|
||||
from ceilometer import sample
|
||||
from ceilometer import storage
|
||||
from ceilometer import utils
|
||||
from ceilometer.api import acl
|
||||
|
||||
|
||||
@ -270,8 +271,9 @@ def _flatten_metadata(metadata):
|
||||
"""
|
||||
if metadata:
|
||||
return dict((k, unicode(v))
|
||||
for k, v in metadata.iteritems()
|
||||
if type(v) not in set([list, dict, set]))
|
||||
for k, v in utils.recursive_keypairs(metadata,
|
||||
separator='.')
|
||||
if type(v) not in set([list, set]))
|
||||
return {}
|
||||
|
||||
|
||||
|
@ -27,13 +27,13 @@ import decimal
|
||||
from ceilometer.openstack.common import timeutils
|
||||
|
||||
|
||||
def recursive_keypairs(d):
|
||||
def recursive_keypairs(d, separator=':'):
|
||||
"""Generator that produces sequence of keypairs for nested dictionaries.
|
||||
"""
|
||||
for name, value in sorted(d.iteritems()):
|
||||
if isinstance(value, dict):
|
||||
for subname, subvalue in recursive_keypairs(value):
|
||||
yield ('%s:%s' % (name, subname), subvalue)
|
||||
yield ('%s%s%s' % (name, separator, subname), subvalue)
|
||||
elif isinstance(value, (tuple, list)):
|
||||
# When doing a pair of JSON encode/decode operations to the tuple,
|
||||
# the tuple would become list. So we have to generate the value as
|
||||
|
@ -52,7 +52,7 @@ class TestListEvents(FunctionalTest,
|
||||
timestamp=datetime.datetime(2012, 7, 2, 10, 40),
|
||||
resource_metadata={'display_name': 'test-server',
|
||||
'tag': 'self.counter',
|
||||
'ignored_dict': {'key': 'value'},
|
||||
'dict_properties': {'key': 'value'},
|
||||
'ignored_list': ['not-returned'],
|
||||
},
|
||||
source='test_source',
|
||||
@ -169,6 +169,7 @@ class TestListEvents(FunctionalTest,
|
||||
self.assert_('resource_metadata' in sample)
|
||||
self.assertEqual(
|
||||
list(sorted(sample['resource_metadata'].iteritems())),
|
||||
[('display_name', 'test-server'),
|
||||
[('dict_properties.key', 'value'),
|
||||
('display_name', 'test-server'),
|
||||
('tag', 'self.counter'),
|
||||
])
|
||||
|
@ -142,10 +142,8 @@ class TestListMeters(FunctionalTest,
|
||||
self.assertEqual('resource-id4', data[0]['resource_id'])
|
||||
metadata = data[0]['resource_metadata']
|
||||
self.assertIsNotNone(metadata)
|
||||
# FIXME (flwang): Based on current implement, the metadata of
|
||||
# dictionary type can't be shown in the output. See bug 1203699.
|
||||
# Will add more asserts in the fix of 1203699.
|
||||
self.assertEqual('self.counter4', metadata['tag'])
|
||||
self.assertEqual('prop_value', metadata['properties.prop_1'])
|
||||
|
||||
def test_list_meters_metadata_query(self):
|
||||
data = self.get_json('/meters/meter.test',
|
||||
|
@ -411,7 +411,7 @@ class TestListResources(FunctionalTest,
|
||||
timestamp=datetime.datetime(2012, 7, 2, 10, 40),
|
||||
resource_metadata={'display_name': 'test-server',
|
||||
'tag': 'self.counter',
|
||||
'ignored_dict': {'key': 'value'},
|
||||
'dict_properties': {'key': 'value'},
|
||||
'ignored_list': ['not-returned'],
|
||||
},
|
||||
source='test',
|
||||
@ -425,10 +425,11 @@ class TestListResources(FunctionalTest,
|
||||
data = self.get_json('/resources')
|
||||
metadata = data[0]['metadata']
|
||||
self.assertEqual(
|
||||
list(sorted(metadata.iteritems())),
|
||||
[('display_name', 'test-server'),
|
||||
('tag', 'self.counter'),
|
||||
])
|
||||
[(u'dict_properties.key', u'value'),
|
||||
(u'display_name', u'test-server'),
|
||||
(u'tag', u'self.counter')
|
||||
],
|
||||
list(sorted(metadata.iteritems())))
|
||||
|
||||
def test_resource_meter_links(self):
|
||||
counter1 = sample.Sample(
|
||||
|
@ -53,3 +53,17 @@ class TestUtils(tests_base.TestCase):
|
||||
('b', 'B'),
|
||||
('nested:a', 'A'),
|
||||
('nested:b', 'B')])
|
||||
|
||||
def test_recursive_keypairs_with_separator(self):
|
||||
data = {'a': 'A',
|
||||
'b': 'B',
|
||||
'nested': {'a': 'A',
|
||||
'b': 'B',
|
||||
},
|
||||
}
|
||||
separator = '.'
|
||||
pairs = list(utils.recursive_keypairs(data, separator))
|
||||
self.assertEqual(pairs, [('a', 'A'),
|
||||
('b', 'B'),
|
||||
('nested.a', 'A'),
|
||||
('nested.b', 'B')])
|
||||
|
Loading…
x
Reference in New Issue
Block a user