)]}'
{"nova/api/openstack/compute/lock_server.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"42d5b80ca15252f4a1bc4f54a50981fcfab19268","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \"\"\"Lock a server instance.\"\"\""},{"line_number":35,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":36,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":37,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027, target\u003dinstance)"},{"line_number":38,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_c5f93fca","line":37,"range":{"start_line":37,"start_character":54,"end_line":37,"end_character":69},"updated":"2016-08-04 10:15:33.000000000","message":"I think we should be more specific here, and just pass the fields we are OK people using, maybe tenant and user_id in this case.\n\nI wonder if we should add the logic to extract that from the instance in the context.can() helper. That could take something like: (..., instance\u003dinstance, allow_per_user\u003dTrue)","commit_id":"314aaa26ddd6016b71d983092e49274505a22d9a"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"af41637447d75cbbd8e736b33618ec1b801361ce","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \"\"\"Lock a server instance.\"\"\""},{"line_number":35,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":36,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":37,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027, target\u003dinstance)"},{"line_number":38,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_2eb1ef01","line":37,"range":{"start_line":37,"start_character":54,"end_line":37,"end_character":69},"in_reply_to":"bacf61ea_417a58f2","updated":"2016-08-05 03:56:56.000000000","message":"Yea, nice to have helper in policy. Done","commit_id":"314aaa26ddd6016b71d983092e49274505a22d9a"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f225efe80afb8b31f8cc4df18021a751c46c8def","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \"\"\"Lock a server instance.\"\"\""},{"line_number":35,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":36,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":37,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027, target\u003dinstance)"},{"line_number":38,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_c196484b","line":37,"range":{"start_line":37,"start_character":54,"end_line":37,"end_character":69},"in_reply_to":"bacf61ea_a577eb39","updated":"2016-08-04 13:38:58.000000000","message":"I like the specificity of just passing in user_id, and I agree that we should be passing in tenant/project_id as well.\n\nI do think we should not have context.can be responsible for parsing a passed in instance, or other resource like keypair, into a target. I would rather see helper methods used like context.can(..., policy.target_from_instance(instance))","commit_id":"314aaa26ddd6016b71d983092e49274505a22d9a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"079efce746f90c6607c5a127fd5bda12e9af6d28","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \"\"\"Lock a server instance.\"\"\""},{"line_number":35,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":36,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":37,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027, target\u003dinstance)"},{"line_number":38,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_417a58f2","line":37,"range":{"start_line":37,"start_character":54,"end_line":37,"end_character":69},"in_reply_to":"bacf61ea_c196484b","updated":"2016-08-04 13:42:33.000000000","message":"good idea, the helper method is way more explicit, I like it.","commit_id":"314aaa26ddd6016b71d983092e49274505a22d9a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"020d987430836fad6367e7e8fd6b5c100b3f0541","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \"\"\"Lock a server instance.\"\"\""},{"line_number":35,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":36,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":37,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027, target\u003dinstance)"},{"line_number":38,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_a577eb39","line":37,"range":{"start_line":37,"start_character":54,"end_line":37,"end_character":69},"in_reply_to":"bacf61ea_c5f93fca","updated":"2016-08-04 10:18:33.000000000","message":"Actually, like you said on IRC might be better:\n\n  context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027, target\u003d{\u0027user_id\u0027: instance.user_id})\n\nI feel like we should also pass the tenant_id everywhere, but thats a different story/patch series.","commit_id":"314aaa26ddd6016b71d983092e49274505a22d9a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"e59ad75e968204c9d5ec4f70455bcbd986963e29","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":36,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":37,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027,"},{"line_number":38,"context_line":"                    target\u003d{\u0027user_id\u0027: instance.user_id})"},{"line_number":39,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_2c059b10","line":38,"updated":"2016-08-04 13:46:57.000000000","message":"ah, so we only pass in the project id from the context when no target is specified, so I think you will need to add in project_id so we don\u0027t break the existing rules. Doh!","commit_id":"03324c288d260f4566d15f15413629c4e4810e77"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"18f990be7b47c6c5dcc3cbceea7d197924332384","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":36,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":37,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027,"},{"line_number":38,"context_line":"                    target\u003d{\u0027user_id\u0027: instance.user_id})"},{"line_number":39,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_6ee807e3","line":38,"in_reply_to":"bacf61ea_2c059b10","updated":"2016-08-05 03:56:48.000000000","message":"Done.","commit_id":"03324c288d260f4566d15f15413629c4e4810e77"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8b98d255b8aa2731cd3f9a9e3018e410dfccdb60","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":37,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":38,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027,"},{"line_number":39,"context_line":"                    target\u003dpolicy.prepare_target_from_resource(instance))"},{"line_number":40,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_344839cc","line":39,"updated":"2016-08-10 13:22:21.000000000","message":"Hmm, the idea is we add user_id to a few minimal places, then we remove it later.\n\nIt doesn\u0027t feel obvious that what is happening here.\n\nWhat about include_user_id\u003dTrue as an argument here?","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"db92ceba6096567ea225a66416422db75cdb5be0","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":37,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":38,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027,"},{"line_number":39,"context_line":"                    target\u003dpolicy.prepare_target_from_resource(instance))"},{"line_number":40,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_720c7ced","line":39,"in_reply_to":"9ad45d7e_344839cc","updated":"2016-08-10 15:48:54.000000000","message":"I feel like we should either just blow this out and do:\n\ntarget\u003d{\u0027user_id\u0027: instance.user_id, \u0027project_id\u0027: instance.project_id}\n\nThe extra method and the indirection seems a bit too much for something like this.","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"522acfe8c402717db4e417f1b65df2e5befd3d49","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":37,"context_line":"        instance \u003d common.get_instance(self.compute_api, context, id)"},{"line_number":38,"context_line":"        context.can(ls_policies.POLICY_ROOT % \u0027lock\u0027,"},{"line_number":39,"context_line":"                    target\u003dpolicy.prepare_target_from_resource(instance))"},{"line_number":40,"context_line":"        self.compute_api.lock(context, instance)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_55303de8","line":39,"in_reply_to":"9ad45d7e_720c7ced","updated":"2016-08-10 16:27:25.000000000","message":"Yeah, that is probably simpler. Just do it long hand.","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"}],"nova/policy.py":[{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"6f422ee11363c35196d19cf9ba9584f203f7be48","unresolved":false,"context_lines":[{"line_number":78,"context_line":"       This will fetch the user_id and project_id from provided resource"},{"line_number":79,"context_line":"       object and prepare the policy target."},{"line_number":80,"context_line":"       :param resource_obj: resource object used to prepare policy target."},{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    target \u003d {\u0027project_id\u0027: resource_obj.project_id,"},{"line_number":84,"context_line":"              \u0027user_id\u0027: resource_obj.user_id}"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_c11d6fbf","line":81,"updated":"2016-08-05 12:47:14.000000000","message":"This docstring should probably mention that the resource must have a project_id and user_id field to be used with this method. The reason I used target_from_instance in my example was because I wasn\u0027t sure if all resources that might use a helper, like keypairs, would have these fields set.\n\nBut this can be modified later if a target needs to be pulled from a resource without these fields specified this way.","commit_id":"d0620526877513651ae033fac1b8e321ce0fd061"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ca75da51beb6092e0bc9b21f5c0fc82a6cbdd90f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"       This will fetch the user_id and project_id from provided resource"},{"line_number":79,"context_line":"       object and prepare the policy target."},{"line_number":80,"context_line":"       :param resource_obj: resource object used to prepare policy target."},{"line_number":81,"context_line":"    \"\"\""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    target \u003d {\u0027project_id\u0027: resource_obj.project_id,"},{"line_number":84,"context_line":"              \u0027user_id\u0027: resource_obj.user_id}"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_1484aed0","line":81,"in_reply_to":"bacf61ea_c11d6fbf","updated":"2016-08-08 00:16:41.000000000","message":"yea, ll add that.\n\nI made this generic to use it for other resource too if needed, even with variation of fetching user_id/project_id etc can be  handled here.","commit_id":"d0620526877513651ae033fac1b8e321ce0fd061"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"803672e53ac55af9fc5446f2ec2ec51964df5a2b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    _ENFORCER.set_rules(rules, overwrite, use_conf)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def prepare_target_from_resource(resource_obj):"},{"line_number":76,"context_line":"    \"\"\"Prepare policy target from provided resource object."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"       This will fetch the user_id and project_id from provided resource"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_24a52b04","line":75,"range":{"start_line":75,"start_character":24,"end_line":75,"end_character":32},"updated":"2016-08-08 12:31:22.000000000","message":"It is not all the resource have attribute project_id and user_id, I think you can call this function as prepare_target_from_instance.","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2c8e702f7ba6f500e1e2a05c170f0b0b5e7c4d19","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    _ENFORCER.set_rules(rules, overwrite, use_conf)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def prepare_target_from_resource(resource_obj):"},{"line_number":76,"context_line":"    \"\"\"Prepare policy target from provided resource object."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"       This will fetch the user_id and project_id from provided resource"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_49abef1d","line":75,"range":{"start_line":75,"start_character":24,"end_line":75,"end_character":32},"in_reply_to":"9ad45d7e_24a52b04","updated":"2016-08-09 05:04:42.000000000","message":"Yea we can do actually not much strong opinion on this. But i was thinking a generic function to prepare the policy target out of any resource.\n\nLike in future we add for other resource too than instance, we can call this method only.\n\nAnd if we end up with using this with resource does not have user_id etc then we can handle the variation here than having all scattered logic of target in all place.","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a7fd0734be5b498c93b8df83c767ea8f5ec3f3a8","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    _ENFORCER.set_rules(rules, overwrite, use_conf)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def prepare_target_from_resource(resource_obj):"},{"line_number":76,"context_line":"    \"\"\"Prepare policy target from provided resource object."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"       This will fetch the user_id and project_id from provided resource"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_e4c12a82","line":75,"range":{"start_line":75,"start_character":24,"end_line":75,"end_character":32},"in_reply_to":"9ad45d7e_49abef1d","updated":"2016-08-09 05:18:22.000000000","message":"yea, i\u0027m ok do that in the future.","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"a34bd94ac9c2491a6b3fbcdb1699e0775e900fc9","unresolved":false,"context_lines":[{"line_number":79,"context_line":"       object and prepare the policy target."},{"line_number":80,"context_line":"       :param resource_obj: resource object used to prepare policy target."},{"line_number":81,"context_line":"                            The resource object must have a \u0027project_id\u0027"},{"line_number":82,"context_line":"                            and \u0027user_id\u0027 field to be used with this method."},{"line_number":83,"context_line":"    \"\"\""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    target \u003d {\u0027project_id\u0027: resource_obj.project_id,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_286e95c9","line":82,"range":{"start_line":82,"start_character":33,"end_line":82,"end_character":40},"updated":"2016-08-08 14:52:44.000000000","message":"@Alex, which resource don\u0027t have user_id or project_id?\n\nhere need to be changed as well?","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a7fd0734be5b498c93b8df83c767ea8f5ec3f3a8","unresolved":false,"context_lines":[{"line_number":79,"context_line":"       object and prepare the policy target."},{"line_number":80,"context_line":"       :param resource_obj: resource object used to prepare policy target."},{"line_number":81,"context_line":"                            The resource object must have a \u0027project_id\u0027"},{"line_number":82,"context_line":"                            and \u0027user_id\u0027 field to be used with this method."},{"line_number":83,"context_line":"    \"\"\""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    target \u003d {\u0027project_id\u0027: resource_obj.project_id,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_c4ca26a1","line":82,"range":{"start_line":82,"start_character":33,"end_line":82,"end_character":40},"in_reply_to":"9ad45d7e_286e95c9","updated":"2016-08-09 05:18:22.000000000","message":"like aggregate, keypair","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8b98d255b8aa2731cd3f9a9e3018e410dfccdb60","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                            and \u0027user_id\u0027 field to be used with this method."},{"line_number":83,"context_line":"    \"\"\""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    target \u003d {\u0027project_id\u0027: resource_obj.project_id,"},{"line_number":86,"context_line":"              \u0027user_id\u0027: resource_obj.user_id}"},{"line_number":87,"context_line":"    return target"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_141c15c0","line":85,"range":{"start_line":85,"start_character":28,"end_line":85,"end_character":40},"updated":"2016-08-10 13:22:21.000000000","message":"I don\u0027t see what this isn\u0027t instance specific I guess?","commit_id":"4f6fce94ba9b7e6c05a4ad98441bffd8a29ad256"}],"nova/tests/unit/api/openstack/compute/test_lock_server.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"37fcef8600a4c3626c6a5451ecebb25c665f9679","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":129,"context_line":"    def test_lock_overridden_policy_pass_with_same_user(self,"},{"line_number":130,"context_line":"                                                        get_instance_mock,"},{"line_number":131,"context_line":"                                                        lock_mock):"},{"line_number":132,"context_line":"        get_instance_mock.return_value \u003d ("},{"line_number":133,"context_line":"            fake_instance.fake_instance_obj("},{"line_number":134,"context_line":"                self.req.environ[\u0027nova.context\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_fd45cf6e","line":131,"range":{"start_line":131,"start_character":56,"end_line":131,"end_character":65},"updated":"2016-08-05 02:30:36.000000000","message":"Maybe worth to assert this is called once.","commit_id":"03324c288d260f4566d15f15413629c4e4810e77"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"18f990be7b47c6c5dcc3cbceea7d197924332384","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    @mock.patch(\u0027nova.api.openstack.common.get_instance\u0027)"},{"line_number":129,"context_line":"    def test_lock_overridden_policy_pass_with_same_user(self,"},{"line_number":130,"context_line":"                                                        get_instance_mock,"},{"line_number":131,"context_line":"                                                        lock_mock):"},{"line_number":132,"context_line":"        get_instance_mock.return_value \u003d ("},{"line_number":133,"context_line":"            fake_instance.fake_instance_obj("},{"line_number":134,"context_line":"                self.req.environ[\u0027nova.context\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_0edfcb3a","line":131,"range":{"start_line":131,"start_character":56,"end_line":131,"end_character":65},"in_reply_to":"bacf61ea_fd45cf6e","updated":"2016-08-05 03:56:48.000000000","message":"nice. Done","commit_id":"03324c288d260f4566d15f15413629c4e4810e77"}]}
