)]}'
{"etc/nova/policy.json":[{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"57c657de58574508d0a91ffcfc76905b86c938db","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"context_is_admin\":  \"role:admin\","},{"line_number":3,"context_line":"    \"admin_or_owner\":  \"is_admin:True or project_id:%(project_id)s\","},{"line_number":4,"context_line":"    \"default\": \"rule:admin_or_owner\","},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"cells_scheduler_filter:TargetCellFilter\": \"is_admin:True\","}],"source_content_type":"application/json","patch_set":6,"id":"7aa08908_0f345ef9","side":"PARENT","line":3,"range":{"start_line":2,"start_character":4,"end_line":3,"end_character":68},"updated":"2016-06-15 20:37:41.000000000","message":"shouldn\u0027t these be removed either?","commit_id":"6e2e1dc912199e057e5c3a5e07d39f26cbbbdd5b"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ec1cebda31c344e44cc33bb2f9cb8d08309f3adb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"context_is_admin\":  \"role:admin\","},{"line_number":3,"context_line":"    \"admin_or_owner\":  \"is_admin:True or project_id:%(project_id)s\","},{"line_number":4,"context_line":"    \"default\": \"rule:admin_or_owner\","},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"cells_scheduler_filter:TargetCellFilter\": \"is_admin:True\","}],"source_content_type":"application/json","patch_set":6,"id":"7aa08908_529c4d5d","side":"PARENT","line":3,"range":{"start_line":2,"start_character":4,"end_line":3,"end_character":68},"in_reply_to":"7aa08908_0f345ef9","updated":"2016-06-15 20:46:05.000000000","message":"They could be, I\u0027m open to doing it. I left them because these rules are referenced by rules below and I didn\u0027t want that to be confusing.","commit_id":"6e2e1dc912199e057e5c3a5e07d39f26cbbbdd5b"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"57c657de58574508d0a91ffcfc76905b86c938db","unresolved":false,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"cells_scheduler_filter:TargetCellFilter\": \"is_admin:True\","},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    \"admin_api\": \"is_admin:True\","},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"network:attach_external_network\": \"is_admin:True\","},{"line_number":11,"context_line":"    \"os_compute_api:servers:detail:get_all_tenants\": \"is_admin:True\","}],"source_content_type":"application/json","patch_set":6,"id":"7aa08908_af238abd","side":"PARENT","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":33},"updated":"2016-06-15 20:37:41.000000000","message":"ditto","commit_id":"6e2e1dc912199e057e5c3a5e07d39f26cbbbdd5b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"80beeeeb7d616fa48ee7243f1838a082b2450e0c","unresolved":false,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"cells_scheduler_filter:TargetCellFilter\": \"is_admin:True\","},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    \"admin_api\": \"is_admin:True\","},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"network:attach_external_network\": \"is_admin:True\","},{"line_number":11,"context_line":"    \"os_compute_api:servers:show:host_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":7,"id":"7aa08908_5bdc2518","line":8,"updated":"2016-06-17 01:11:34.000000000","message":"since you added nova.policies.base, where you register context_is_admin, admin_or_owner, admin_api, should those be removed from here as well?","commit_id":"19f9a4bbd4ba9910f73a293bd3a13eedc32fa877"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"3bef768ed930703f68c27fdfb48dd716763ebe7a","unresolved":false,"context_lines":[{"line_number":5,"context_line":""},{"line_number":6,"context_line":"    \"cells_scheduler_filter:TargetCellFilter\": \"is_admin:True\","},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    \"admin_api\": \"is_admin:True\","},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"    \"network:attach_external_network\": \"is_admin:True\","},{"line_number":11,"context_line":"    \"os_compute_api:servers:show:host_status\": \"rule:admin_api\","}],"source_content_type":"application/json","patch_set":7,"id":"7aa08908_d9100451","line":8,"in_reply_to":"7aa08908_5bdc2518","updated":"2016-06-17 12:56:30.000000000","message":"I really wish I could comment in this file to explain why I left these. Since these rules are still referenced in this file I left them around on purpose. While they\u0027re not really needed I thought it might be confusing for people looking at the file to not have these defined here. After everything else has been removed I would expect these to be removed.\n\nI can go either way on this though, I just thought this was the less confusing way for readers of this file.","commit_id":"19f9a4bbd4ba9910f73a293bd3a13eedc32fa877"}],"nova/context.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"24e5a3dfe53d098256b072206cd944b64e0a54f9","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        if target is None:"},{"line_number":223,"context_line":"            target \u003d {\u0027project_id\u0027: self.project_id,"},{"line_number":224,"context_line":"                      \u0027user_id\u0027: self.user_id}"},{"line_number":225,"context_line":"        policy.authorize(self, rule, target)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def __str__(self):"},{"line_number":228,"context_line":"        return \"\u003cContext %s\u003e\" % self.to_dict()"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_a8726e0f","line":225,"updated":"2016-06-15 16:28:22.000000000","message":"it probably should be:\n\n    return policy.authorize(self, rule, target)\n\nsome APIs checks for authorization, and then do something if it\u0027s true.\n\none example would be access_ips extension. If the authorization passes, then \u0027accessIPv4\u0027 and \u0027accessIPv6\u0027 are added to the resulting server dicts.\n\nwith this change, this commit should pass Jenkins.","commit_id":"745c3660aa35ea75a21d3e961b183d2b835dd6a1"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"77090c97f2c3caa5ef61bc78211d046a9716b366","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def can(self, rule, target\u003dNone):"},{"line_number":222,"context_line":"        if target is None:"},{"line_number":223,"context_line":"            target \u003d {\u0027project_id\u0027: self.project_id,"},{"line_number":224,"context_line":"                      \u0027user_id\u0027: self.user_id}"},{"line_number":225,"context_line":"        return policy.authorize(self, rule, target)"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_c005ea14","line":223,"updated":"2016-06-16 10:51:54.000000000","message":"this seems correct:\nhttps://git.openstack.org/cgit/openstack/nova/tree/nova/api/openstack/extensions.py#n341","commit_id":"19f9a4bbd4ba9910f73a293bd3a13eedc32fa877"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"581830b4194fafa585d0bd07c3d877e62b8b02b4","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        if target is None:"},{"line_number":223,"context_line":"            target \u003d {\u0027project_id\u0027: self.project_id,"},{"line_number":224,"context_line":"                      \u0027user_id\u0027: self.user_id}"},{"line_number":225,"context_line":"        return policy.authorize(self, rule, target)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def __str__(self):"},{"line_number":228,"context_line":"        return \"\u003cContext %s\u003e\" % self.to_dict()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_e6ef5b84","line":225,"updated":"2016-06-16 12:28:35.000000000","message":"I see we don\u0027t treat soft_authorize yet.","commit_id":"19f9a4bbd4ba9910f73a293bd3a13eedc32fa877"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"146060e16716055c4b0521ff988b746264f7cdb7","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        if target is None:"},{"line_number":223,"context_line":"            target \u003d {\u0027project_id\u0027: self.project_id,"},{"line_number":224,"context_line":"                      \u0027user_id\u0027: self.user_id}"},{"line_number":225,"context_line":"        return policy.authorize(self, rule, target)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def __str__(self):"},{"line_number":228,"context_line":"        return \"\u003cContext %s\u003e\" % self.to_dict()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_071525e4","line":225,"in_reply_to":"7aa08908_e6ef5b84","updated":"2016-06-16 21:06:49.000000000","message":"Yeah. I was originally thinking we might have another method on context for this, but it might be cleaner to just add a soft\u003dFalse parameter here and let soft authorization just override that.\n\nThat can be added in a followup or when the first patch that needs a soft authorizer is added.","commit_id":"19f9a4bbd4ba9910f73a293bd3a13eedc32fa877"}],"nova/policies/servers.py":[{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"ee8b94bee99eab7a3c4701142a446600b3479068","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    policy.RuleDefault(get_name(\u0027start\u0027), RULE_AOO),"},{"line_number":47,"context_line":"    policy.RuleDefault(get_name(\u0027stop\u0027), RULE_AOO),"},{"line_number":48,"context_line":"    policy.RuleDefault(get_name(\u0027trigger_crash_dump\u0027), RULE_AOO),"},{"line_number":49,"context_line":"]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def list_rules():"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_580a0721","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":1},"updated":"2016-06-14 12:59:45.000000000","message":"seems some duplicate effort to https://review.openstack.org/#/c/328850/3/nova/policies/__init__.py ?","commit_id":"ee6fe2664d17cb5218356af98fbee4f313e47c13"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"c665cfab4da6a457dfc505f8dfeea03479b5754d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    policy.RuleDefault(get_name(\u0027start\u0027), RULE_AOO),"},{"line_number":47,"context_line":"    policy.RuleDefault(get_name(\u0027stop\u0027), RULE_AOO),"},{"line_number":48,"context_line":"    policy.RuleDefault(get_name(\u0027trigger_crash_dump\u0027), RULE_AOO),"},{"line_number":49,"context_line":"]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def list_rules():"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_93ac50ee","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":1},"in_reply_to":"7aa08908_580a0721","updated":"2016-06-14 13:18:43.000000000","message":"we are working on the same thing. :)","commit_id":"ee6fe2664d17cb5218356af98fbee4f313e47c13"}],"nova/policy.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"ed93400892a528a44111aca516764f50826ba9a3","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    return result"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"def authorize(context, action, target, do_raise\u003dTrue, exc\u003dNone):"},{"line_number":115,"context_line":"    \"\"\"Verifies that the action is valid on the target in this context."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"       :param context: nova context"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_ee9ddb66","line":114,"updated":"2016-06-14 16:53:55.000000000","message":"it seems this is exactly the same as the enforce function. I don\u0027t think this is necessary.","commit_id":"ee6fe2664d17cb5218356af98fbee4f313e47c13"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"f664e0dfef3bf4bd1cf13345d8b998836af101f5","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    if not exc:"},{"line_number":139,"context_line":"        exc \u003d exception.PolicyNotAuthorized"},{"line_number":140,"context_line":"    try:"},{"line_number":141,"context_line":"        result \u003d _ENFORCER.authorize(action, target, credentials,"},{"line_number":142,"context_line":"                                     do_raise\u003ddo_raise, exc\u003dexc, action\u003daction)"},{"line_number":143,"context_line":"    except policy.PolicyNotRegistered:"},{"line_number":144,"context_line":"        with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_f783eb53","line":141,"updated":"2016-06-14 18:45:35.000000000","message":"Claudiu: The difference is that this calls the authorize method here. This will raise the PolicyNotRegistered exception if used when a policy is not registered first. So by switching to this we enforce that policies are not used unless they\u0027re registered.","commit_id":"ee6fe2664d17cb5218356af98fbee4f313e47c13"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"5a40585f295e95825b896d6904d2e996f27e01ad","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    if not exc:"},{"line_number":139,"context_line":"        exc \u003d exception.PolicyNotAuthorized"},{"line_number":140,"context_line":"    try:"},{"line_number":141,"context_line":"        result \u003d _ENFORCER.authorize(action, target, credentials,"},{"line_number":142,"context_line":"                                     do_raise\u003ddo_raise, exc\u003dexc, action\u003daction)"},{"line_number":143,"context_line":"    except policy.PolicyNotRegistered:"},{"line_number":144,"context_line":"        with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_2b27ca63","line":141,"in_reply_to":"7aa08908_506c85cf","updated":"2016-06-14 20:09:32.000000000","message":"I mostly agree. Normally I wouldn\u0027t copy the whole method like this, but I want to be able to easily grep for uses of the old enforce method to track the movement to authorize. And since the ultimate goal is to get rid of the enforce method above I didn\u0027t worry about factoring out the common parts.","commit_id":"ee6fe2664d17cb5218356af98fbee4f313e47c13"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"c96ff4c00101924cc09f8e1f2a5fc967c1f68fa7","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    if not exc:"},{"line_number":139,"context_line":"        exc \u003d exception.PolicyNotAuthorized"},{"line_number":140,"context_line":"    try:"},{"line_number":141,"context_line":"        result \u003d _ENFORCER.authorize(action, target, credentials,"},{"line_number":142,"context_line":"                                     do_raise\u003ddo_raise, exc\u003dexc, action\u003daction)"},{"line_number":143,"context_line":"    except policy.PolicyNotRegistered:"},{"line_number":144,"context_line":"        with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":3,"id":"7aa08908_506c85cf","line":141,"in_reply_to":"7aa08908_f783eb53","updated":"2016-06-14 19:42:43.000000000","message":"Oh, I didn\u0027t see this. Although, it is a bit too much to add a new method for such a small difference. :)","commit_id":"ee6fe2664d17cb5218356af98fbee4f313e47c13"},{"author":{"_account_id":14819,"name":"Timofey Durakov","email":"timofei.nd@gmail.com","username":"tdurakov"},"change_message_id":"57c657de58574508d0a91ffcfc76905b86c938db","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    return result"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"def authorize(context, action, target, do_raise\u003dTrue, exc\u003dNone):"},{"line_number":117,"context_line":"    \"\"\"Verifies that the action is valid on the target in this context."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"       :param context: nova context"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_0f157e9a","line":116,"range":{"start_line":116,"start_character":54,"end_line":116,"end_character":62},"updated":"2016-06-15 20:37:41.000000000","message":"looks like you forgot to describe this param in doc","commit_id":"6f0d0cb205e25e48c859784042e30b18f914df56"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"ec1cebda31c344e44cc33bb2f9cb8d08309f3adb","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    return result"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"def authorize(context, action, target, do_raise\u003dTrue, exc\u003dNone):"},{"line_number":117,"context_line":"    \"\"\"Verifies that the action is valid on the target in this context."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"       :param context: nova context"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_12b925cc","line":116,"range":{"start_line":116,"start_character":54,"end_line":116,"end_character":62},"in_reply_to":"7aa08908_0f157e9a","updated":"2016-06-15 20:46:05.000000000","message":"I just copied this from the enforce() method above. I can add a doc for it.","commit_id":"6f0d0cb205e25e48c859784042e30b18f914df56"}],"nova/tests/unit/fake_policy.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"edf058502661de686b443afd32223f793f8f1453","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"os_compute_api:servers:resize\": \"\","},{"line_number":37,"context_line":"    \"os_compute_api:servers:revert_resize\": \"\","},{"line_number":38,"context_line":"    \"os_compute_api:servers:show\": \"\","},{"line_number":39,"context_line":"    \"os_compute_api:servers:show:host_status\": \"\","},{"line_number":40,"context_line":"    \"os_compute_api:servers:create_image\": \"\","},{"line_number":41,"context_line":"    \"os_compute_api:servers:create_image:allow_volume_backed\": \"\","},{"line_number":42,"context_line":"    \"os_compute_api:servers:update\": \"\","}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_6111955d","side":"PARENT","line":39,"updated":"2016-06-16 12:50:30.000000000","message":"I guess you didn\u0027t add a policy rule default for this.","commit_id":"6e2e1dc912199e057e5c3a5e07d39f26cbbbdd5b"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"9b4e0cafc9f69f4d593616d5f9404f749d2e4267","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    \"os_compute_api:servers:resize\": \"\","},{"line_number":37,"context_line":"    \"os_compute_api:servers:revert_resize\": \"\","},{"line_number":38,"context_line":"    \"os_compute_api:servers:show\": \"\","},{"line_number":39,"context_line":"    \"os_compute_api:servers:show:host_status\": \"\","},{"line_number":40,"context_line":"    \"os_compute_api:servers:create_image\": \"\","},{"line_number":41,"context_line":"    \"os_compute_api:servers:create_image:allow_volume_backed\": \"\","},{"line_number":42,"context_line":"    \"os_compute_api:servers:update\": \"\","}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_6787c912","side":"PARENT","line":39,"in_reply_to":"7aa08908_6111955d","updated":"2016-06-16 21:08:32.000000000","message":"I did not, because it wasn\u0027t in the servers module I was updating. It looks like it\u0027s in extended attributes.","commit_id":"6e2e1dc912199e057e5c3a5e07d39f26cbbbdd5b"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"edf058502661de686b443afd32223f793f8f1453","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \"os_compute_api:servers:update\": \"\","},{"line_number":43,"context_line":"    \"os_compute_api:servers:start\": \"\","},{"line_number":44,"context_line":"    \"os_compute_api:servers:stop\": \"\","},{"line_number":45,"context_line":"    \"os_compute_api:servers:trigger_crash_dump\": \"\","},{"line_number":46,"context_line":"    \"os_compute_api:servers:migrations:delete\": \"rule:admin_api\","},{"line_number":47,"context_line":"    \"os_compute_api:servers:migrations:force_complete\": \"\","},{"line_number":48,"context_line":"    \"os_compute_api:servers:migrations:index\": \"rule:admin_api\","}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_7c765e40","side":"PARENT","line":45,"updated":"2016-06-16 12:50:30.000000000","message":"question: do we want to end up having an empty / almost empty fake_policy file? I am asking because what this fake_policy file is doing, is making some of the APIs looser in terms of authorization, for testing purposes. If we will remove all these rules, we\u0027d have to have an admin context for almost all tests.","commit_id":"6e2e1dc912199e057e5c3a5e07d39f26cbbbdd5b"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"9b4e0cafc9f69f4d593616d5f9404f749d2e4267","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \"os_compute_api:servers:update\": \"\","},{"line_number":43,"context_line":"    \"os_compute_api:servers:start\": \"\","},{"line_number":44,"context_line":"    \"os_compute_api:servers:stop\": \"\","},{"line_number":45,"context_line":"    \"os_compute_api:servers:trigger_crash_dump\": \"\","},{"line_number":46,"context_line":"    \"os_compute_api:servers:migrations:delete\": \"rule:admin_api\","},{"line_number":47,"context_line":"    \"os_compute_api:servers:migrations:force_complete\": \"\","},{"line_number":48,"context_line":"    \"os_compute_api:servers:migrations:index\": \"rule:admin_api\","}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_c7c4bd42","side":"PARENT","line":45,"in_reply_to":"7aa08908_7c765e40","updated":"2016-06-16 21:08:32.000000000","message":"I would like to end up with an empty file, and then use the policy fixtures for loosening the policies for testing. If that\u0027s going to be too complicated then I\u0027m open to leaving this around.","commit_id":"6e2e1dc912199e057e5c3a5e07d39f26cbbbdd5b"}]}
