)]}'
{"karbor/resource.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"13ac7b219e2d1b32fc6d9711754673315286ccd6","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from collections import namedtuple"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Resource \u003d namedtuple(\"Resource\", (\u0027type\u0027, \u0027id\u0027, \u0027name\u0027, \u0027extra_info\u0027))"}],"source_content_type":"text/x-python","patch_set":21,"id":"ffe62b97_a5019db1","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":71},"updated":"2017-03-29 08:40:59.000000000","message":"I notice you had add a default value for \u0027extra_info\u0027 in all the protectable plugins. If it has to modify \u0027Resource\u0027 later, then same work has to be done again. Maybe it can be done more perfectly. Think about the following codes.\n\n_Resource \u003d namedtuple(\"Resource\", (\u0027type\u0027, \u0027id\u0027, \u0027name\u0027, \u0027extra_info\u0027))\n\ndef Resource(type, id, name, extra_info\u003d{}):\n    return _Resource(type, id, name, extra_info)","commit_id":"946a9a58b46bd1079b5b031a8c02bd663b22f798"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"86868ab28fdd43b8de17358f5f4f3a4b269660c5","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from collections import namedtuple"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Resource \u003d namedtuple(\"Resource\", (\u0027type\u0027, \u0027id\u0027, \u0027name\u0027, \u0027extra_info\u0027))"}],"source_content_type":"text/x-python","patch_set":21,"id":"ffe62b97_02db6a7d","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":71},"in_reply_to":"ffe62b97_a075d933","updated":"2017-03-30 08:20:44.000000000","message":"If the field of value of resource can not been changed, chenzeng\u0027s suggestion is better.","commit_id":"946a9a58b46bd1079b5b031a8c02bd663b22f798"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b195ca9f68c76ce7939c8f8e32087888cb348d10","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from collections import namedtuple"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Resource \u003d namedtuple(\"Resource\", (\u0027type\u0027, \u0027id\u0027, \u0027name\u0027, \u0027extra_info\u0027))"}],"source_content_type":"text/x-python","patch_set":21,"id":"ffe62b97_a075d933","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":71},"in_reply_to":"ffe62b97_a5019db1","updated":"2017-03-30 08:02:06.000000000","message":"Or define the class like this:\nclass Resource:\n    def __init__(self, type, id, name, extra_info\u003d{}):\n        self.type\u003d type\n        self.id\u003d id\n        self.name\u003d name\n        self.extra_info\u003d extra_info","commit_id":"946a9a58b46bd1079b5b031a8c02bd663b22f798"}],"karbor/services/protection/flows/create_protection.py":[{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"770bc98f971fc1689bf32aa0e81d41d8b21511be","unresolved":false,"context_lines":[{"line_number":49,"context_line":"             checkpoint):"},{"line_number":50,"context_line":"    protectable_registry \u003d ProtectableRegistry()"},{"line_number":51,"context_line":"    # The \u0027extra-info\u0027 field of resources in plan is optional"},{"line_number":52,"context_line":"    resources \u003d []"},{"line_number":53,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":54,"context_line":"        if item.get(\"extra_info\", None) is None:"},{"line_number":55,"context_line":"            item[\"extra_info\"] \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_5f6f2e92","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":18},"updated":"2016-12-22 03:42:43.000000000","message":"If you don\u0027t want to traverse \u0027plan.get(\"resources\")\u0027 two times. you can define resources\u003dset() directly to avoid changing it to set again at line 57 which may traverse again.","commit_id":"54dd0cb0d305b822643a25c8aa9330d16facc40c"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"9adc769b43e0e4c8ce69fecd7d372705ec1d2e40","unresolved":false,"context_lines":[{"line_number":48,"context_line":"def get_flow(context, workflow_engine, operation_type, plan, provider,"},{"line_number":49,"context_line":"             checkpoint):"},{"line_number":50,"context_line":"    protectable_registry \u003d ProtectableRegistry()"},{"line_number":51,"context_line":"    # The \u0027extra-info\u0027 field of resources in plan is optional"},{"line_number":52,"context_line":"    resources \u003d []"},{"line_number":53,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":54,"context_line":"        if item.get(\"extra_info\", None) is None:"},{"line_number":55,"context_line":"            item[\"extra_info\"] \u003d None"},{"line_number":56,"context_line":"        resources.append(Resource(**item))"},{"line_number":57,"context_line":"    resources \u003d set(resources)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    resource_graph \u003d protectable_registry.build_graph(context,"},{"line_number":60,"context_line":"                                                      resources)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_64a0e791","line":57,"range":{"start_line":51,"start_character":0,"end_line":57,"end_character":30},"updated":"2016-12-22 03:19:15.000000000","message":"for item in plan.get(\"resources\"):\n    item.setdefault(\"extra_info\", None)\n\nresources \u003d set(Resource(**item) for item in plan.get(\"resources\"))\n\nMaybe the codes above looks simpler.","commit_id":"54dd0cb0d305b822643a25c8aa9330d16facc40c"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"0d1655123a47b596d7821ec8d04ef4879c8dcb99","unresolved":false,"context_lines":[{"line_number":48,"context_line":"def get_flow(context, workflow_engine, operation_type, plan, provider,"},{"line_number":49,"context_line":"             checkpoint):"},{"line_number":50,"context_line":"    protectable_registry \u003d ProtectableRegistry()"},{"line_number":51,"context_line":"    # The \u0027extra-info\u0027 field of resources in plan is optional"},{"line_number":52,"context_line":"    resources \u003d []"},{"line_number":53,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":54,"context_line":"        if item.get(\"extra_info\", None) is None:"},{"line_number":55,"context_line":"            item[\"extra_info\"] \u003d None"},{"line_number":56,"context_line":"        resources.append(Resource(**item))"},{"line_number":57,"context_line":"    resources \u003d set(resources)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    resource_graph \u003d protectable_registry.build_graph(context,"},{"line_number":60,"context_line":"                                                      resources)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_24725fe6","line":57,"range":{"start_line":51,"start_character":0,"end_line":57,"end_character":30},"in_reply_to":"da4df55a_64a0e791","updated":"2016-12-22 03:25:59.000000000","message":"item.setdefault(\"extra_info\", None) This statement is good. \nAs you suggestion, two iteration about the resources will be introduced.","commit_id":"54dd0cb0d305b822643a25c8aa9330d16facc40c"}],"karbor/services/protection/flows/protect.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65e003fa661e3d46aa7cebfd7e1817d9cbf36d83","unresolved":false,"context_lines":[{"line_number":47,"context_line":"def get_flow(context, protectable_registry, workflow_engine, plan, provider,"},{"line_number":48,"context_line":"             checkpoint):"},{"line_number":49,"context_line":"    # The \u0027extra-info\u0027 field of resources in plan is optional"},{"line_number":50,"context_line":"    # This dict filed of resources can not be handled by build_graph"},{"line_number":51,"context_line":"    resources \u003d set()"},{"line_number":52,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":53,"context_line":"        if \u0027extra_info\u0027 in item.keys():"}],"source_content_type":"text/x-python","patch_set":20,"id":"ffe62b97_49f22772","line":50,"range":{"start_line":50,"start_character":6,"end_line":50,"end_character":68},"updated":"2017-03-28 07:41:11.000000000","message":"1. filed -\u003e filled\n2. Why can\u0027t it be handled?","commit_id":"34e7c53db0072a82a09612696d778d64a9f0fc06"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"14555ab295907fab90970c7a4cfdd86fe25cc8f5","unresolved":false,"context_lines":[{"line_number":47,"context_line":"def get_flow(context, protectable_registry, workflow_engine, plan, provider,"},{"line_number":48,"context_line":"             checkpoint):"},{"line_number":49,"context_line":"    # The \u0027extra-info\u0027 field of resources in plan is optional"},{"line_number":50,"context_line":"    # This dict filed of resources can not be handled by build_graph"},{"line_number":51,"context_line":"    resources \u003d set()"},{"line_number":52,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":53,"context_line":"        if \u0027extra_info\u0027 in item.keys():"}],"source_content_type":"text/x-python","patch_set":20,"id":"ffe62b97_fd2ad229","line":50,"range":{"start_line":50,"start_character":6,"end_line":50,"end_character":68},"in_reply_to":"ffe62b97_49f22772","updated":"2017-03-28 09:49:21.000000000","message":"The reason is that the type of Resource is namedtuple, if the value of resouce\u0027s extra_info field is dict, build_graph method will throw a exception.\n\nfiled -\u003e field","commit_id":"34e7c53db0072a82a09612696d778d64a9f0fc06"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"da83bcc620a093745e5a73dd4bd252bd1b536e5d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"def get_flow(context, protectable_registry, workflow_engine, plan, provider,"},{"line_number":48,"context_line":"             checkpoint):"},{"line_number":49,"context_line":"    # The \u0027extra-info\u0027 field of resources in plan is optional"},{"line_number":50,"context_line":"    # This dict filed of resources can not be handled by build_graph"},{"line_number":51,"context_line":"    resources \u003d set()"},{"line_number":52,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":53,"context_line":"        if \u0027extra_info\u0027 in item.keys():"}],"source_content_type":"text/x-python","patch_set":20,"id":"ffe62b97_936ea0c7","line":50,"range":{"start_line":50,"start_character":6,"end_line":50,"end_character":68},"in_reply_to":"ffe62b97_fd2ad229","updated":"2017-03-30 14:23:39.000000000","message":"TypeError: unhashable type: \u0027dict\u0027 This exception will be raised in the build_graph  module.","commit_id":"34e7c53db0072a82a09612696d778d64a9f0fc06"},{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65e003fa661e3d46aa7cebfd7e1817d9cbf36d83","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    # This dict filed of resources can not be handled by build_graph"},{"line_number":51,"context_line":"    resources \u003d set()"},{"line_number":52,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":53,"context_line":"        if \u0027extra_info\u0027 in item.keys():"},{"line_number":54,"context_line":"            item[\"extra_info\"] \u003d None"},{"line_number":55,"context_line":"        else:"},{"line_number":56,"context_line":"            item.setdefault(\"extra_info\", None)"},{"line_number":57,"context_line":"        resources.add(Resource(**item))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    resource_graph \u003d protectable_registry.build_graph(context,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ffe62b97_291b63d0","line":56,"range":{"start_line":53,"start_character":0,"end_line":56,"end_character":47},"updated":"2017-03-28 07:41:11.000000000","message":"1. Why not:\n    item[\"extra_info\"] \u003d None\n  in both cases?\n2. When would \"extra_info\" not be part of the plan resources?","commit_id":"34e7c53db0072a82a09612696d778d64a9f0fc06"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"14555ab295907fab90970c7a4cfdd86fe25cc8f5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    # This dict filed of resources can not be handled by build_graph"},{"line_number":51,"context_line":"    resources \u003d set()"},{"line_number":52,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":53,"context_line":"        if \u0027extra_info\u0027 in item.keys():"},{"line_number":54,"context_line":"            item[\"extra_info\"] \u003d None"},{"line_number":55,"context_line":"        else:"},{"line_number":56,"context_line":"            item.setdefault(\"extra_info\", None)"},{"line_number":57,"context_line":"        resources.add(Resource(**item))"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    resource_graph \u003d protectable_registry.build_graph(context,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ffe62b97_d5f5a8ee","line":56,"range":{"start_line":53,"start_character":0,"end_line":56,"end_character":47},"in_reply_to":"ffe62b97_291b63d0","updated":"2017-03-28 09:49:21.000000000","message":"The extra_info field of the resource is optional. So there is situation that the resouces in plan don\u0027t have a field extra_info, the resource only have fields id, name, type.","commit_id":"34e7c53db0072a82a09612696d778d64a9f0fc06"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"13ac7b219e2d1b32fc6d9711754673315286ccd6","unresolved":false,"context_lines":[{"line_number":47,"context_line":"def get_flow(context, protectable_registry, workflow_engine, plan, provider,"},{"line_number":48,"context_line":"             checkpoint):"},{"line_number":49,"context_line":"    # The \u0027extra-info\u0027 field of resources in plan is optional"},{"line_number":50,"context_line":"    # This dict field of the resource can not be handled by build_graph"},{"line_number":51,"context_line":"    resources \u003d set()"},{"line_number":52,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":53,"context_line":"        item[\"extra_info\"] \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"ffe62b97_aacdec85","line":50,"range":{"start_line":50,"start_character":6,"end_line":50,"end_character":71},"updated":"2017-03-29 08:40:59.000000000","message":"If I understand correctly, you want to say the resources which do not have the field of \u0027extra_info\u0027 can not be handled by method of \u0027build_graph\u0027. It is better to explain more clearly.","commit_id":"946a9a58b46bd1079b5b031a8c02bd663b22f798"},{"author":{"_account_id":18266,"name":"zengchen","email":"chenzeng2@huawei.com","username":"zengchen"},"change_message_id":"13ac7b219e2d1b32fc6d9711754673315286ccd6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    # This dict field of the resource can not be handled by build_graph"},{"line_number":51,"context_line":"    resources \u003d set()"},{"line_number":52,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":53,"context_line":"        item[\"extra_info\"] \u003d None"},{"line_number":54,"context_line":"        resources.add(Resource(**item))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    resource_graph \u003d protectable_registry.build_graph(context,"}],"source_content_type":"text/x-python","patch_set":21,"id":"ffe62b97_0aaa9883","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":33},"updated":"2017-03-29 08:40:59.000000000","message":"IMO, it is not a good way to set \u0027extra_info\u0027 to None constrainedly. Think about following codes.\n\nfor item in plan.get(\"resources\"):\n    item.setdefault(\u0027extra_info\u0027, None)\n\nresources \u003d set(Resource(**item) for item in plan.get(\"resources\"))","commit_id":"946a9a58b46bd1079b5b031a8c02bd663b22f798"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"b9fec9303b6e4e2150b7a49d4102bd5bdc686fd4","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    # This dict field of the resource can not be handled by build_graph"},{"line_number":51,"context_line":"    resources \u003d set()"},{"line_number":52,"context_line":"    for item in plan.get(\"resources\"):"},{"line_number":53,"context_line":"        item[\"extra_info\"] \u003d None"},{"line_number":54,"context_line":"        resources.add(Resource(**item))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    resource_graph \u003d protectable_registry.build_graph(context,"}],"source_content_type":"text/x-python","patch_set":21,"id":"ffe62b97_6287d663","line":53,"range":{"start_line":53,"start_character":7,"end_line":53,"end_character":33},"in_reply_to":"ffe62b97_0aaa9883","updated":"2017-03-30 08:19:33.000000000","message":"setdefault:This method returns the key value available in the dictionary and if given key is not available then it will return provided default value.\nHere I want to overwrite the value of extra_info filed to None.","commit_id":"946a9a58b46bd1079b5b031a8c02bd663b22f798"}],"karbor/services/protection/protectable_registry.py":[{"author":{"_account_id":20883,"name":"Yuval Brik","email":"yuval@brik.org.il","username":"yuvalbr"},"change_message_id":"65e003fa661e3d46aa7cebfd7e1817d9cbf36d83","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        def fetch_dependent_resources_context(resource):"},{"line_number":111,"context_line":"            dependent_resources \u003d self.fetch_dependent_resources("},{"line_number":112,"context_line":"                context, resource)"},{"line_number":113,"context_line":"            # The dict filed of resources can not be handled by build_graph"},{"line_number":114,"context_line":"            return [Resource(type\u003ddependent_resource.type,"},{"line_number":115,"context_line":"                             id\u003ddependent_resource.id,"},{"line_number":116,"context_line":"                             name\u003ddependent_resource.name, extra_info\u003dNone)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ffe62b97_09441f73","line":113,"range":{"start_line":113,"start_character":0,"end_line":113,"end_character":75},"updated":"2017-03-28 07:41:11.000000000","message":"1. filed -\u003e filled\n2. Can\u0027t it be handled?","commit_id":"34e7c53db0072a82a09612696d778d64a9f0fc06"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"14555ab295907fab90970c7a4cfdd86fe25cc8f5","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        def fetch_dependent_resources_context(resource):"},{"line_number":111,"context_line":"            dependent_resources \u003d self.fetch_dependent_resources("},{"line_number":112,"context_line":"                context, resource)"},{"line_number":113,"context_line":"            # The dict filed of resources can not be handled by build_graph"},{"line_number":114,"context_line":"            return [Resource(type\u003ddependent_resource.type,"},{"line_number":115,"context_line":"                             id\u003ddependent_resource.id,"},{"line_number":116,"context_line":"                             name\u003ddependent_resource.name, extra_info\u003dNone)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ffe62b97_7da7e2a8","line":113,"range":{"start_line":113,"start_character":0,"end_line":113,"end_character":75},"in_reply_to":"ffe62b97_09441f73","updated":"2017-03-28 09:49:21.000000000","message":"filed -\u003e field\n\nThe dict field of the resource can not be handled by build_graph","commit_id":"34e7c53db0072a82a09612696d778d64a9f0fc06"},{"author":{"_account_id":17151,"name":"chenying","email":"chenyingko@gmail.com","username":"chenying"},"change_message_id":"652b217e996f4df8906ec85f00b2df97ce512000","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        def fetch_dependent_resources_context(resource):"},{"line_number":111,"context_line":"            dependent_resources \u003d self.fetch_dependent_resources("},{"line_number":112,"context_line":"                context, resource)"},{"line_number":113,"context_line":"            # The dict filed of resources can not be handled by build_graph"},{"line_number":114,"context_line":"            return [Resource(type\u003ddependent_resource.type,"},{"line_number":115,"context_line":"                             id\u003ddependent_resource.id,"},{"line_number":116,"context_line":"                             name\u003ddependent_resource.name, extra_info\u003dNone)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ffe62b97_405431ff","line":113,"range":{"start_line":113,"start_character":0,"end_line":113,"end_character":75},"in_reply_to":"ffe62b97_7da7e2a8","updated":"2017-03-28 09:59:54.000000000","message":"Another reason is that in the spec we have limited the use case of the extra_info field of the resource.\nThe extra_info field in resource database table is only for presentation to a user/tenant.\nThe values in extra_info field can not be used and modified in karbor protection service.","commit_id":"34e7c53db0072a82a09612696d778d64a9f0fc06"}],"karbor/tests/fullstack/karbor_objects.py":[{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"90dacf2337655a7a7fe1f56d32b3f5e9745601df","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            if isinstance(resource, dict):"},{"line_number":78,"context_line":"                return resource"},{"line_number":79,"context_line":"            if hasattr(resource, \u0027to_dict\u0027) and callable(resource.to_dict):"},{"line_number":80,"context_line":"                resource[\"extra_info\"] \u003d {}"},{"line_number":81,"context_line":"                return resource.to_dict()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        if name is None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6eadb0_cec5d03d","line":80,"range":{"start_line":80,"start_character":15,"end_line":80,"end_character":43},"updated":"2016-12-21 01:14:09.000000000","message":"IMO, it is better to change xxx.to_dict function than to add \"extra_info\" key-value.","commit_id":"4b16e531abdff4d547c49cb6b5ade57a1b1e2552"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"90dacf2337655a7a7fe1f56d32b3f5e9745601df","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        return {"},{"line_number":211,"context_line":"            \"id\": self.id,"},{"line_number":212,"context_line":"            \"type\": constants.SERVER_RESOURCE_TYPE,"},{"line_number":213,"context_line":"            \"name\": self._name,"},{"line_number":214,"context_line":"        }"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def create(self, name\u003dNone, image\u003dDEFAULT_IMAGE, flavor\u003dDEFAULT_FLAVOR,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6eadb0_8ea2f849","line":213,"range":{"start_line":213,"start_character":30,"end_line":213,"end_character":31},"updated":"2016-12-21 01:14:09.000000000","message":"add \"extra_info\": self.extra_info","commit_id":"4b16e531abdff4d547c49cb6b5ade57a1b1e2552"},{"author":{"_account_id":21648,"name":"zhangshuai","email":"446077695@qq.com","username":"zhangshuai"},"change_message_id":"90dacf2337655a7a7fe1f56d32b3f5e9745601df","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        return {"},{"line_number":291,"context_line":"            \"id\": self.id,"},{"line_number":292,"context_line":"            \"type\": constants.VOLUME_RESOURCE_TYPE,"},{"line_number":293,"context_line":"            \"name\": self._name,"},{"line_number":294,"context_line":"        }"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def create(self, size, name\u003dNone, timeout\u003dMEDIUM_TIMEOUT):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a6eadb0_2ebc846b","line":293,"range":{"start_line":293,"start_character":30,"end_line":293,"end_character":31},"updated":"2016-12-21 01:14:09.000000000","message":"add \"extra_info\": self.extra_info","commit_id":"4b16e531abdff4d547c49cb6b5ade57a1b1e2552"}]}
