)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"22bd5b56c18ded1918c94c8b9bdcefc4305fe6d2","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Nadya Privalova \u003cnprivalova@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-10-29 18:18:36 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Insetion in HBase should be fixed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* All data inserted to HBase should be String or Unicode"},{"line_number":10,"context_line":"* If value is dict it should be splitted: each key-value"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F%2Fvao%3D","line":7,"updated":"2013-10-29 16:52:48.000000000","message":"insertion","commit_id":"6992b8f34fe07cd4e84d8e0c950bfd9691f8f207"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"87870bcee2de3bac96fb53eb2cb0dd35b328d687","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Nadya Privalova \u003cnprivalova@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-10-29 18:18:36 +0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Insetion in HBase should be fixed"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* All data inserted to HBase should be String or Unicode"},{"line_number":10,"context_line":"* If value is dict it should be splitted: each key-value"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F%2Fr00%3D","line":7,"in_reply_to":"AAAATn%2F%2Fvao%3D","updated":"2013-10-30 13:23:31.000000000","message":"Done","commit_id":"6992b8f34fe07cd4e84d8e0c950bfd9691f8f207"}],"ceilometer/api/controllers/v2.py":[{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"4cdfd89865974f3667fe4328ec260d03819da44a","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BQYU%3D","line":508,"updated":"2013-11-28 09:27:02.000000000","message":"I\u0027m not sure. But does this kind of change would cause the old metadata already stored in the DB be in different format from the new metadata? If so, this would make the user a tough life to use a single API to do query.","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"8bd2719d7c1f369e36852b9c8cb46bcc8812864a","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Xlo%3D","line":508,"in_reply_to":"AAAATn%2F%2BHcw%3D","updated":"2013-12-12 06:46:46.000000000","message":"I doubt that. I think the MeterController.post() takes the argument as a list of v2.Sample objects, which when created by the wsme framework, has already invoked _flatten_metadata() in v2.Sample.__init__() to make your changes affect the newly posted samples.","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"d1c6a05942e2a1e12df76679f66bc59b3f9290e7","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BHcw%3D","line":508,"in_reply_to":"AAAATn%2F%2BQBI%3D","updated":"2013-12-02 12:40:28.000000000","message":"Lianhao, during MeterController.post() the another Sample class is used. My changes affect class Sample(_Base) from v2.py but sample that are created during MeterController.post() is instance of class Sample(object) from sample.py. So my changes don\u0027t affect post meter through REST","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"87a850eaf1dd3c7c97b1d15dd678189be7afdeea","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BQBI%3D","line":508,"in_reply_to":"AAAATn%2F%2BQGI%3D","updated":"2013-11-28 10:21:58.000000000","message":"I\u0027ll take a look into POST now. But actually flatten_data creates entries with dots in keys, so such structures just cannot be put to Mongo. I tried to move this code to record_metering_data and faced with this issue. Anyway, I\u0027ll check POST","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":4491,"name":"Lianhao Lu","email":"llh_misc@outlook.com","username":"lianhao-lu"},"change_message_id":"bb31585e9a5fb898c280a3787c8c945598aa69df","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BQGI%3D","line":508,"in_reply_to":"AAAATn%2F%2BQKs%3D","updated":"2013-11-28 10:10:55.000000000","message":"I see this is used in Sample object creation. But MeterController.post() allows users to POST meter data through API. I think in that case, this function takes place in recording meter.","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"1ea6b1e5e197273dbf995dc085395f06911b848d","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BQKs%3D","line":508,"in_reply_to":"AAAATn%2F%2BQYU%3D","updated":"2013-11-28 10:01:23.000000000","message":"Lianhao, during testing I saw the following behavior: metadata for resources is stored in db as it is. So e.g. in mongo meter is just a json. All info about metadata is stored and _flatten_metadata is _NOT_ called before storing in db. So this code doesn\u0027t modify how the data is stored in db. flatten_metadata is called during fetching from db. So there will be no differences between old and new data fetching. Old data will be fetched just in a new way.","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"28cb2ca5bbd89082fe050edf6d85baf47029bdf4","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2FrAE%3D","line":508,"in_reply_to":"AAAATn%2F9Pjs%3D","updated":"2014-01-09 22:33:04.000000000","message":"The problem is that _flatten_metadata() is not just used on data coming in through the POST API, it is also used on data coming out of the database. That means a change in format will break clients using the existing format.\n\nRe-reading the 2 functions, it isn\u0027t clear that the format of the keys will change though. Can you run a test with some data to show that the key names returned by the 2 functions are the same?\n\nAnd then if they are the same, we can figure out why we have both recursive_keypairs() and dict_to_keyval() and probably remove one.","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"07cfe6461974ea429a07443e501cef534fbdcd4a","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9Pjs%3D","line":508,"in_reply_to":"AAAATn%2F9TUg%3D","updated":"2013-12-13 15:41:34.000000000","message":"Today I was trying to post metrics via MeterController.post(). Guys, firs of all, your validation will not allow smth like \"resource_metadata\": {\"dict_properties\": {\"key\": \"value\"}}  because resource_metadata \u003d {wtypes.text: wtypes.text}. Result: \"Wrong type. Expected \u0027\u003ctype \u0027unicode\u0027\u003e\u0027, got \u0027\u003ctype \u0027dict\u0027\u003e\u0027\"\"\n\nSo we just denied to publish meters with complex metadata. So nothing needs to be flatten in case of MeterController.post()","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"136725d2a282f8cd80a951eed9a9858dcde1cb45","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9TUg%3D","line":508,"in_reply_to":"AAAATn%2F9VFw%3D","updated":"2013-12-12 21:16:08.000000000","message":"here\u0027s how i understand it, the difference between original code and this patch is that the original _flatten_metadata() would return a subset of what this patch would return.\n\nas i understand it, the difference between the two functions is how they represent lists which becomes irrelevant since original code just tossed out lists anyways.\n\nnow if there\u0027s a reason we were ignoring lists then this patch is wrong.\n\nshould add a disclaimer saying i don\u0027t have hbase installed so i\u0027ve never verified if this fixes original bug.","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"40fd06d61ad20821fedc0267225a5dd344bd6a07","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9VFw%3D","line":508,"in_reply_to":"AAAATn%2F9Xlo%3D","updated":"2013-12-12 15:58:04.000000000","message":"Lianhao is right here. Changing _flatten_metadata() may change the data format for incoming data for all storage drivers, and the name syntax used by recursive_keypairs() and dict_to_keyval() are different.","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"bfaa87034cfa1ce2cb233e03bfeb40b68c48d206","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Fmxo%3D","line":508,"in_reply_to":"AAAAUH%2F%2Fm8I%3D","updated":"2014-01-10 15:12:03.000000000","message":"Nadya, yes, the difference is in how the lists in dict were handled but since _flatten_metadata() just ignores list anyways i\u0027m not sure it\u0027s relevant. are any other differences present? i know recursive_keypairs method changed recently(e9cde137b0c24ac755bbb3629b9a831391574f6c) so there might be new differences. removing my +2 for now because of that.","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"6916b66a3eee45c7f07df3f6808ce06730a5c2a9","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Fmpg%3D","line":508,"in_reply_to":"AAAAUH%2F%2Fmxo%3D","updated":"2014-01-10 15:36:12.000000000","message":"I see the differences only in list processing and in separators. _flatten_metadata() did ignored the lists before, this change changed this behaviour (just to clarify).\ndict_to_keyval({\u0027a\u0027: {\u0027b\u0027: {\u0027c\u0027: {\u0027d\u0027: [\u0027e\u0027, \u0027j\u0027]}}}}) will provide two elements (\u0027a.b.c.d[0]\u0027, \u0027e\u0027) and (\u0027a.b.c.d[1]\u0027, \u0027j\u0027)\nrecursive_keypairs({\u0027a\u0027: {\u0027b\u0027: {\u0027c\u0027: {\u0027d\u0027: [\u0027e\u0027, \u0027j\u0027]}}}}) will provide only one: (\u0027a:b:c:d\u0027, [\u0027e\u0027, \u0027j\u0027])\n\nAs for me dict_to_keyval is more relevant for flattening. I checked this behaviour on the latest master. \nGordon, what do you think about the idea to delete tests with \u0027ignored_list\u0027 https://review.openstack.org/#/c/52670/7/ceilometer/tests/api/v2/test_list_events_scenarios.py ?","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"b27017db169710a55382580df0413a0d696d42fc","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    \"\"\""},{"line_number":506,"context_line":"    if metadata:"},{"line_number":507,"context_line":"        return dict((k, unicode(v))"},{"line_number":508,"context_line":"                    for k, v in utils.dict_to_keyval(metadata))"},{"line_number":509,"context_line":"    return {}"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Fm8I%3D","line":508,"in_reply_to":"AAAAUH%2F%2FrAE%3D","updated":"2014-01-10 14:46:30.000000000","message":"They are not the same. I used the following script\na \u003d dict_to_keyval({\u0027a\u0027: {\u0027b\u0027: {\u0027c\u0027: {\u0027d\u0027: [\u0027e\u0027]}}}})\nb \u003d recursive_keypairs({\u0027a\u0027: {\u0027b\u0027: {\u0027c\u0027: {\u0027d\u0027: [\u0027e\u0027]}}}})\nfor i in a:\n    print i\nfor i in b:\n    print i\n\nAnd get the output:\n(\u0027a.b.c.d[0]\u0027, \u0027e\u0027)\n(\u0027a:b:c:d\u0027, [\u0027e\u0027])\n\nI have only one solution: remove tests that check that lists are disappeared after flattening","commit_id":"f3248a40690294fe6517986d08f7bcf2dfc9ea9a"}],"ceilometer/storage/impl_hbase.py":[{"author":{"_account_id":5313,"name":"David Peraza","email":"david_peraza@persistentsys.com","username":"dperaza"},"change_message_id":"847350ee00cb38eab580b6145ad3cd7a6bb614a4","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        # store metadata fields with prefix \"r_\""},{"line_number":174,"context_line":"        resource_metadata \u003d {}"},{"line_number":175,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":176,"context_line":"            resource_metadata \u003d dict((\u0027f:r_%s\u0027 % k, unicode(v))"},{"line_number":177,"context_line":"                                     for (k, v)"},{"line_number":178,"context_line":"                                     in data[\u0027resource_metadata\u0027].iteritems())"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2F8Ek%3D","line":176,"updated":"2013-10-24 21:45:46.000000000","message":"test that fails in jenkins suggests that some value in resource_metedata dictionary might not be string but other dictionary and lists. Not sure you can blindly set value to unicode without first checking type of v.","commit_id":"2d509fc32c023138e33c960f7cb15d329abbf14b"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"45b59ef632895b00945ab5430e7866635bea6c28","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        # store metadata fields with prefix \"r_\""},{"line_number":174,"context_line":"        resource_metadata \u003d {}"},{"line_number":175,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":176,"context_line":"            resource_metadata \u003d dict((\u0027f:r_%s\u0027 % k, unicode(v))"},{"line_number":177,"context_line":"                                     for (k, v)"},{"line_number":178,"context_line":"                                     in data[\u0027resource_metadata\u0027].iteritems())"},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2F6qU%3D","line":176,"in_reply_to":"AAAATn%2F%2F8Ek%3D","updated":"2013-10-25 09:11:20.000000000","message":"David, thanks for comment. I should mark this CR as \u0027in progress\u0027 actually :) I\u0027m trying to repair tests now. The problem appears exactly in case of list or dictionary. HBase requires that all inserted values should be String or Unicode objects. I tested this fix in devstack and didn\u0027t see any problems. Unicoded dict represented in HBase looks as follows:\n image_9223372035472084297_ff243b55a233844da9160500277 column\u003df:r_properties, timestamp\u003d1382691510726, value\u003d{u\u0027kernel_id\u0027: u\u0027ebbf88e0-109a-4f30-9cac-7fae1321a08c\u0027, u\u0027ramdisk_id\u0027: u\u00274f9ee561-053a-493d-bbda-9168ac2df\n 07de370f\u0027}\nAnyway I should make tests successfull","commit_id":"2d509fc32c023138e33c960f7cb15d329abbf14b"},{"author":{"_account_id":5313,"name":"David Peraza","email":"david_peraza@persistentsys.com","username":"dperaza"},"change_message_id":"3200c5992af9f05a1a0d3df3728adda383e00c3a","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        resource_metadata \u003d {}"},{"line_number":175,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":176,"context_line":"            for (k, v) in data[\u0027resource_metadata\u0027].iteritems():"},{"line_number":177,"context_line":"                if type(v) is dict:"},{"line_number":178,"context_line":"                    for (v_k, v_v) in v.iteritems():"},{"line_number":179,"context_line":"                        resource_metadata[\u0027f:r_%s.%s\u0027 % (k, v_k)] \u003d str(v_v)"},{"line_number":180,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Fv64%3D","line":177,"updated":"2013-10-29 15:32:17.000000000","message":"looks like v could be a list too","commit_id":"6992b8f34fe07cd4e84d8e0c950bfd9691f8f207"},{"author":{"_account_id":2860,"name":"litong01","email":"email4tong@yahoo.com","username":"litong01"},"change_message_id":"ee38a31bc70d31820d66ad53a7152c929d83c8a7","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        resource_metadata \u003d {}"},{"line_number":175,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":176,"context_line":"            for (k, v) in data[\u0027resource_metadata\u0027].iteritems():"},{"line_number":177,"context_line":"                if type(v) is dict:"},{"line_number":178,"context_line":"                    for (v_k, v_v) in v.iteritems():"},{"line_number":179,"context_line":"                        resource_metadata[\u0027f:r_%s.%s\u0027 % (k, v_k)] \u003d str(v_v)"},{"line_number":180,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2FvcI%3D","line":177,"in_reply_to":"AAAATn%2F%2Fv3o%3D","updated":"2013-10-29 16:48:45.000000000","message":"The problem with this approach is that metadata can be a tree. How many\nlevels are you willing to go down? Does not seem to be a good solution.","commit_id":"6992b8f34fe07cd4e84d8e0c950bfd9691f8f207"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"d4877b7f20a283a061d40070e1c5c29a2a2e81f7","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        resource_metadata \u003d {}"},{"line_number":175,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":176,"context_line":"            for (k, v) in data[\u0027resource_metadata\u0027].iteritems():"},{"line_number":177,"context_line":"                if type(v) is dict:"},{"line_number":178,"context_line":"                    for (v_k, v_v) in v.iteritems():"},{"line_number":179,"context_line":"                        resource_metadata[\u0027f:r_%s.%s\u0027 % (k, v_k)] \u003d str(v_v)"},{"line_number":180,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Fv3o%3D","line":177,"in_reply_to":"AAAATn%2F%2Fv64%3D","updated":"2013-10-29 15:39:27.000000000","message":"What should we do in case of list?\nE.g.:\n\u0027test\u0027 : [\u0027t1\u0027, \u0027t2\u0027]\nHow should it be in db? I think just as it is:\ncolumn\u003df:r_properties.test, value\u003d[\u0027t1\u0027, \u0027t2\u0027]","commit_id":"6992b8f34fe07cd4e84d8e0c950bfd9691f8f207"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"87870bcee2de3bac96fb53eb2cb0dd35b328d687","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        resource_metadata \u003d {}"},{"line_number":175,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":176,"context_line":"            for (k, v) in data[\u0027resource_metadata\u0027].iteritems():"},{"line_number":177,"context_line":"                if type(v) is dict:"},{"line_number":178,"context_line":"                    for (v_k, v_v) in v.iteritems():"},{"line_number":179,"context_line":"                        resource_metadata[\u0027f:r_%s.%s\u0027 % (k, v_k)] \u003d str(v_v)"},{"line_number":180,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Fr0w%3D","line":177,"in_reply_to":"AAAATn%2F%2Fvaw%3D","updated":"2013-10-30 13:23:31.000000000","message":"Thanks a lot, please take a look on a new patch-set","commit_id":"6992b8f34fe07cd4e84d8e0c950bfd9691f8f207"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"22bd5b56c18ded1918c94c8b9bdcefc4305fe6d2","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        resource_metadata \u003d {}"},{"line_number":175,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":176,"context_line":"            for (k, v) in data[\u0027resource_metadata\u0027].iteritems():"},{"line_number":177,"context_line":"                if type(v) is dict:"},{"line_number":178,"context_line":"                    for (v_k, v_v) in v.iteritems():"},{"line_number":179,"context_line":"                        resource_metadata[\u0027f:r_%s.%s\u0027 % (k, v_k)] \u003d str(v_v)"},{"line_number":180,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Fvaw%3D","line":177,"in_reply_to":"AAAATn%2F%2FvcI%3D","updated":"2013-10-29 16:52:48.000000000","message":"Nadya, take a look at recursive_keypairs func in utils (https://github.com/openstack/ceilometer/blob/master/ceilometer/utils.py#L28) \n\nalso, doing something similar in sql metaquery patch: https://review.openstack.org/#/c/49456/13/ceilometer/utils.py","commit_id":"6992b8f34fe07cd4e84d8e0c950bfd9691f8f207"},{"author":{"_account_id":5313,"name":"David Peraza","email":"david_peraza@persistentsys.com","username":"dperaza"},"change_message_id":"59499526a533b1d9c89cbb4900ee5a2caf11f2e3","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        resource_metadata \u003d {}"},{"line_number":175,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":176,"context_line":"            for (k, v) in data[\u0027resource_metadata\u0027].iteritems():"},{"line_number":177,"context_line":"                if type(v) is dict:"},{"line_number":178,"context_line":"                    for (v_k, v_v) in v.iteritems():"},{"line_number":179,"context_line":"                        resource_metadata[\u0027f:r_%s.%s\u0027 % (k, v_k)] \u003d str(v_v)"},{"line_number":180,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2FvFo%3D","line":177,"in_reply_to":"AAAATn%2F%2FvcI%3D","updated":"2013-10-29 18:17:12.000000000","message":"you can always traverse the tree until you find the leaves.","commit_id":"6992b8f34fe07cd4e84d8e0c950bfd9691f8f207"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"dc6182ac273d18c07c4579878110684cb8f179f0","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        # store metadata fields with prefix \"r_\""},{"line_number":175,"context_line":"        resource_metadata \u003d {}"},{"line_number":176,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":177,"context_line":"            for key, v in utils.dict_to_keyval(data[\u0027resource_metadata\u0027]):"},{"line_number":178,"context_line":"                resource_metadata[\u0027f:r_%s\u0027 % key] \u003d unicode(v)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # Make sure we know about the user and project"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fr0A%3D","line":177,"updated":"2013-10-30 13:27:39.000000000","message":"I suppose that type(v) cannot be composed here. So we may just unicode it. But in SQLalchemy driver there is a list of supported types. Not sure that we need the same here.\n\nAnd btw, ignored list is still processed by HBase and test will fail. I\u0027m still waiting for comments about this behavior, please advise","commit_id":"48902546120c7d13940138e26707c1024f09c582"},{"author":{"_account_id":5313,"name":"David Peraza","email":"david_peraza@persistentsys.com","username":"dperaza"},"change_message_id":"be0f2a6c06792d2f92541ac3d226411edefdf9b8","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        # store metadata fields with prefix \"r_\""},{"line_number":175,"context_line":"        resource_metadata \u003d {}"},{"line_number":176,"context_line":"        if data[\u0027resource_metadata\u0027]:"},{"line_number":177,"context_line":"            for key, v in utils.dict_to_keyval(data[\u0027resource_metadata\u0027]):"},{"line_number":178,"context_line":"                resource_metadata[\u0027f:r_%s\u0027 % key] \u003d unicode(v)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # Make sure we know about the user and project"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FfnU%3D","line":177,"in_reply_to":"AAAATn%2F%2Fr0A%3D","updated":"2013-11-04 15:44:37.000000000","message":"yeap, also curious about why List is still used in the test. Is it  a valid value? How would you flatten that out with index? Something like key.0, key.1, key.2....etc","commit_id":"48902546120c7d13940138e26707c1024f09c582"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"9a9552e6660fba69a74385b01214c85079b7e891","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        # This code will remove lists from values."},{"line_number":179,"context_line":"        if res_meta_copy:"},{"line_number":180,"context_line":"            for key, item in res_meta_copy.items():"},{"line_number":181,"context_line":"                if isinstance(item, list):"},{"line_number":182,"context_line":"                    res_meta_copy.pop(key, None)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"            for key, v in utils.dict_to_keyval(res_meta_copy):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B5vE%3D","line":181,"updated":"2013-11-18 19:30:09.000000000","message":"i don\u0027t know hbase well but are we ignoring lists because this is a limitation?","commit_id":"c2a4e060ac551382d212bfdcfd10711b87c42601"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"11cdb7b652c5cbb37ab34bfa2280ea32d0defcca","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        # This code will remove lists from values."},{"line_number":179,"context_line":"        if res_meta_copy:"},{"line_number":180,"context_line":"            for key, item in res_meta_copy.items():"},{"line_number":181,"context_line":"                if isinstance(item, list):"},{"line_number":182,"context_line":"                    res_meta_copy.pop(key, None)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"            for key, v in utils.dict_to_keyval(res_meta_copy):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B2xE%3D","line":181,"in_reply_to":"AAAATn%2F%2B5vE%3D","updated":"2013-11-19 10:13:54.000000000","message":"Gordon, I don\u0027t know why are we ignoring lists actually. I\u0027ve wrote this code to make test work. Let me describe it. There is resource_metadata:{\u0027display_name\u0027: \u0027test-server\u0027, \u0027tag\u0027: \u0027self.sample\u0027, \u0027dict_properties\u0027: {\u0027key\u0027: \u0027value\u0027}, \u0027ignored_list\u0027: [\u0027not-returned\u0027],}. After that record_metering_data works and expected result is [(u\u0027dict_properties.key\u0027, u\u0027value\u0027), (u\u0027display_name\u0027, u\u0027test-server\u0027), (u\u0027tag\u0027, u\u0027self.sample\u0027)]. So list is just thrown away. Will keep on trying to understand this","commit_id":"c2a4e060ac551382d212bfdcfd10711b87c42601"}],"ceilometer/tests/storage/test_impl_hbase.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"92e0181c5457c3f1f6262fb148a7e568c90eded2","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            u\u0027counter_type\u0027: u\u0027gauge\u0027}"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            conn.record_metering_data(data)"},{"line_number":103,"context_line":"        except TypeError:"},{"line_number":104,"context_line":"            self.fail(\"record_metering_data() raised TypeError unexpectedly!\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B7A0%3D","line":103,"updated":"2013-11-18 15:11:37.000000000","message":"You don\u0027t need that actually, if it raises the test will fail anyway.\n\nWhat you may want to do is to check that record_metering_data() did really store something.\n\nAlso considering this is a test for connection, I wonder if it wouldn\u0027t be better to add this test to the test we run for all databases?","commit_id":"c2a4e060ac551382d212bfdcfd10711b87c42601"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c987b9af98638080adfb9e2d0401c948feee258f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            u\u0027counter_type\u0027: u\u0027gauge\u0027}"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            conn.record_metering_data(data)"},{"line_number":103,"context_line":"        except TypeError:"},{"line_number":104,"context_line":"            self.fail(\"record_metering_data() raised TypeError unexpectedly!\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B65E%3D","line":103,"in_reply_to":"AAAATn%2F%2B6%2Bg%3D","updated":"2013-11-18 15:28:09.000000000","message":"Both options are definitely good indeed.\n\nYou\u0027ll need some work with the infra team if you want to add real HBase support I think.","commit_id":"c2a4e060ac551382d212bfdcfd10711b87c42601"},{"author":{"_account_id":7478,"name":"Nadya Shakhat","email":"nadmi4@gmail.com","username":"nprivalova"},"change_message_id":"446c584f96b6ca5c612a429ffefcdae7766540ef","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            u\u0027counter_type\u0027: u\u0027gauge\u0027}"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            conn.record_metering_data(data)"},{"line_number":103,"context_line":"        except TypeError:"},{"line_number":104,"context_line":"            self.fail(\"record_metering_data() raised TypeError unexpectedly!\")"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2B6%2Bg%3D","line":103,"in_reply_to":"AAAATn%2F%2B7A0%3D","updated":"2013-11-18 15:18:04.000000000","message":"Yes, agreed. This test is mostly integration. I have two options in mind:\n1. Add real HBase-support during unit-tests (as it done for Mongo)\n2. Move the test to tempest\n\nAs I undestood from design-session, 1st is ok. Please correct me if I\u0027m wrong","commit_id":"c2a4e060ac551382d212bfdcfd10711b87c42601"}]}
