)]}'
{"ceilometer/compute/instance.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"33c133805f09883a72ae68d559ac730f551a90a9","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    limit \u003d cfg.CONF.reserved_metadata_length"},{"line_number":54,"context_line":"    for prefix in cfg.CONF.reserved_metadata_namespace:"},{"line_number":55,"context_line":"        user_metadata \u003d dict("},{"line_number":56,"context_line":"            (k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027)[:limit], v)"},{"line_number":57,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":58,"context_line":"            if k.startswith(prefix)"},{"line_number":59,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2F9Z0%3D","line":56,"updated":"2013-06-17 12:06:22.000000000","message":"IIUC, a user can trick us by setting this user-metadata on his instance:\n\n{\"metering.vm_state\": \"SUSPENDED\"}\n\nSince that will overwrite the vm_state we get from Nova.\n\nAlso, I somehow though the metadata length limit would be applied on v, not on the key?","commit_id":"2c6e34b0deaa38e22b58f8c4e545812165eb7e39"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"903750ab4ff1a85e5a01133ee32ccd0f021274cd","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    limit \u003d cfg.CONF.reserved_metadata_length"},{"line_number":54,"context_line":"    for prefix in cfg.CONF.reserved_metadata_namespace:"},{"line_number":55,"context_line":"        user_metadata \u003d dict("},{"line_number":56,"context_line":"            (k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027)[:limit], v)"},{"line_number":57,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":58,"context_line":"            if k.startswith(prefix)"},{"line_number":59,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2F9Eg%3D","line":56,"in_reply_to":"AAAAPn%2F%2F9Z0%3D","updated":"2013-06-17 14:34:06.000000000","message":"Good spot, fixed and tested in the latest patchset.","commit_id":"2c6e34b0deaa38e22b58f8c4e545812165eb7e39"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"54e43a5bac4c18d87a20e7cd057d118272eb9a84","unresolved":false,"context_lines":[{"line_number":57,"context_line":"             v[:limit] if isinstance(v, basestring) else v)"},{"line_number":58,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":59,"context_line":"            if (k.startswith(prefix) and"},{"line_number":60,"context_line":"                k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027) not in metadata)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":"        metadata.update(user_metadata)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F6ZI%3D","line":60,"updated":"2013-06-18 13:23:29.000000000","message":"Ahah, thats\u0027s a smart move, but I wasn\u0027t thinking about this. What about prefixing with something like userdata. or the like?","commit_id":"8400e98fe8fea930868405e20baeee4d9c73e446"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"0fcba11d1b9791217fa4d24b849f804941d3c2c3","unresolved":false,"context_lines":[{"line_number":57,"context_line":"             v[:limit] if isinstance(v, basestring) else v)"},{"line_number":58,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":59,"context_line":"            if (k.startswith(prefix) and"},{"line_number":60,"context_line":"                k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027) not in metadata)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":"        metadata.update(user_metadata)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F3So%3D","line":60,"in_reply_to":"AAAAPn%2F%2F384%3D","updated":"2013-06-19 15:07:38.000000000","message":"@jd_:\n\nThinking about this some more ...\n\nSo I think I understand now the key goal in your mind is to clearly distinguish user metadata from system metadata in the instance representation reported via the ceilometer API (as opposed to preventing system/user metadata key clashes). Am I right?\n\nI\u0027m a bit leery though of replacing one prefix with another, just feels kinda wrong.\n\nHow about instead we make the distinction absolutely clear by using a sub-dict for the user metadata? e.g.\n\n  resource_metadata \u003d {\u0027display_name\u0027: u\u0027my_server\u0027,\n                       \u0027name\u0027: u\u0027instance-00000005\u0027, \n                       \u0027instance_type\u0027: u\u00271\u0027,\n                       \u0027user_metadata\u0027: {u\u0027autoscaling_group\u0027: u\u0027foobar\u0027},\n                       #...\n                       }\n\nThen to query across the group, it be something like:\n\n  GET v2/meters/cpu/statistics?q.op\u003deq\u0026q.value\u003dfoobar\u0026q.field\u003dmetadata.user_metadata.autoscaling_group\n\nHow does that sound?","commit_id":"8400e98fe8fea930868405e20baeee4d9c73e446"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"e8604229e9817281a5f5d47bc472332cdac50675","unresolved":false,"context_lines":[{"line_number":57,"context_line":"             v[:limit] if isinstance(v, basestring) else v)"},{"line_number":58,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":59,"context_line":"            if (k.startswith(prefix) and"},{"line_number":60,"context_line":"                k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027) not in metadata)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":"        metadata.update(user_metadata)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F384%3D","line":60,"in_reply_to":"AAAAPn%2F%2F39I%3D","updated":"2013-06-19 09:58:40.000000000","message":"Well, having a \"metering\" named metadata in a metering software doesn\u0027t really help. :-)\nKnowing that it\u0027s a metadata coming from the user its more likely to help our API users, no?","commit_id":"8400e98fe8fea930868405e20baeee4d9c73e446"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"b26f0003140535fe8e363d2fe531d3af1b4c50bd","unresolved":false,"context_lines":[{"line_number":57,"context_line":"             v[:limit] if isinstance(v, basestring) else v)"},{"line_number":58,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":59,"context_line":"            if (k.startswith(prefix) and"},{"line_number":60,"context_line":"                k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027) not in metadata)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":"        metadata.update(user_metadata)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F3Fo%3D","line":60,"in_reply_to":"AAAAPn%2F%2F3PU%3D","updated":"2013-06-19 15:58:37.000000000","message":"\u003e having a dict inside your metadata prevents any storage driver to be able to filter them\n\nWell the \"dotted syntax\" for a sub-dict worked fine for me with the mongo driver, e.g. filtering with:\n\n  q.op\u003deq\u0026q.value\u003dfoobar\u0026q.field\u003dmetadata.user_metadata.autoscaling_group  \n\nDid you have another storage driver in mind?","commit_id":"8400e98fe8fea930868405e20baeee4d9c73e446"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"3ea282afdb630235aca7cd85480b4e91f2c3b70b","unresolved":false,"context_lines":[{"line_number":57,"context_line":"             v[:limit] if isinstance(v, basestring) else v)"},{"line_number":58,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":59,"context_line":"            if (k.startswith(prefix) and"},{"line_number":60,"context_line":"                k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027) not in metadata)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":"        metadata.update(user_metadata)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F3PU%3D","line":60,"in_reply_to":"AAAAPn%2F%2F3So%3D","updated":"2013-06-19 15:15:15.000000000","message":"That looks good indeed. But correct me if I\u0027m wrong, having a dict inside your metadata prevents any storage driver to be able to filter them. That\u0027s why we are flattening them everywhere and why I wrote https://review.openstack.org/#/c/33057/ the way I did, flattening everything in the course.","commit_id":"8400e98fe8fea930868405e20baeee4d9c73e446"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"32664805fe6db6929575a704b7906d468291cfd8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"             v[:limit] if isinstance(v, basestring) else v)"},{"line_number":58,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":59,"context_line":"            if (k.startswith(prefix) and"},{"line_number":60,"context_line":"                k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027) not in metadata)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":"        metadata.update(user_metadata)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F39I%3D","line":60,"in_reply_to":"AAAAPn%2F%2F4fc%3D","updated":"2013-06-19 09:53:46.000000000","message":"@jd_: well rather than inventing a new \"userdata.\" prefix, how about I just keep the \"metering.\" around instead of discarding that part of the metadata key?","commit_id":"8400e98fe8fea930868405e20baeee4d9c73e446"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"a4e0f582ec04056b19db128b29b4d9dfde5585fa","unresolved":false,"context_lines":[{"line_number":57,"context_line":"             v[:limit] if isinstance(v, basestring) else v)"},{"line_number":58,"context_line":"            for k, v in instance.metadata.items()"},{"line_number":59,"context_line":"            if (k.startswith(prefix) and"},{"line_number":60,"context_line":"                k[len(prefix):].replace(\u0027.\u0027, \u0027_\u0027) not in metadata)"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":"        metadata.update(user_metadata)"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2F4fc%3D","line":60,"in_reply_to":"AAAAPn%2F%2F6ZI%3D","updated":"2013-06-19 02:31:00.000000000","message":"urg: looks like a hair ball to me:(","commit_id":"8400e98fe8fea930868405e20baeee4d9c73e446"}],"tests/compute/test_instance.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"2ca9b39e25dc7f4129117d29eba6a953ed1ea230","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                assert actual \u003d\u003d iprops[\u0027image\u0027][\u0027links\u0027][0][\u0027href\u0027]"},{"line_number":99,"context_line":"            elif name \u003d\u003d \u0027user_metadata\u0027:"},{"line_number":100,"context_line":"                expected \u003d iprops[\u0027metadata\u0027][\u0027metering.autoscale.group\u0027][:256]"},{"line_number":101,"context_line":"                assert actual[\u0027autoscale_group\u0027] \u003d\u003d expected"},{"line_number":102,"context_line":"                assert len(actual) \u003d\u003d 1"},{"line_number":103,"context_line":"            else:"},{"line_number":104,"context_line":"                assert actual \u003d\u003d iprops[name]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2F07Q%3D","line":101,"updated":"2013-06-20 09:49:32.000000000","message":"can I have self.assertEqual here, I promised I will never allow future usage of assert itself, it\u0027s just too useful for debugging.","commit_id":"41899d2e9c90969362405df0254ecab61416c4c8"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"c4574b51d513436dbf6965a516a78100f8d90bbc","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                assert actual \u003d\u003d iprops[\u0027image\u0027][\u0027links\u0027][0][\u0027href\u0027]"},{"line_number":99,"context_line":"            elif name \u003d\u003d \u0027user_metadata\u0027:"},{"line_number":100,"context_line":"                expected \u003d iprops[\u0027metadata\u0027][\u0027metering.autoscale.group\u0027][:256]"},{"line_number":101,"context_line":"                assert actual[\u0027autoscale_group\u0027] \u003d\u003d expected"},{"line_number":102,"context_line":"                assert len(actual) \u003d\u003d 1"},{"line_number":103,"context_line":"            else:"},{"line_number":104,"context_line":"                assert actual \u003d\u003d iprops[name]"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2F06Q%3D","line":101,"in_reply_to":"AAAAPn%2F%2F07Q%3D","updated":"2013-06-20 09:58:05.000000000","message":"Fair enough, done.","commit_id":"41899d2e9c90969362405df0254ecab61416c4c8"}]}
