)]}'
{"etc/policy.json":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":2,"context_line":"    \"context_is_admin\":  \"role:admin\","},{"line_number":3,"context_line":"    \"admin_or_owner\": \"role:admin or tenant_id:%(tenant_id)s\","},{"line_number":4,"context_line":"    \"admin_or_network_owner\": \"role:admin or tenant_id:%(network_tenant_id)s\","},{"line_number":5,"context_line":"    \"admin_only\": \"rule:context_is_admin\","},{"line_number":6,"context_line":"    \"regular_user\": \"\","},{"line_number":7,"context_line":"    \"shared\": \"field:networks:shared\u003dTrue\","},{"line_number":8,"context_line":"    \"external\": \"field:networks:router:external\u003dTrue\","}],"source_content_type":"application/json","patch_set":5,"id":"AAAAOX%2F%2F%2Fsc%3D","line":5,"updated":"2013-04-03 07:16:20.000000000","message":"is this backward compatible?","commit_id":"bc73c89a516b725752f0bc59388334359c12e280"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":2,"context_line":"    \"context_is_admin\":  \"role:admin\","},{"line_number":3,"context_line":"    \"admin_or_owner\": \"role:admin or tenant_id:%(tenant_id)s\","},{"line_number":4,"context_line":"    \"admin_or_network_owner\": \"role:admin or tenant_id:%(network_tenant_id)s\","},{"line_number":5,"context_line":"    \"admin_only\": \"rule:context_is_admin\","},{"line_number":6,"context_line":"    \"regular_user\": \"\","},{"line_number":7,"context_line":"    \"shared\": \"field:networks:shared\u003dTrue\","},{"line_number":8,"context_line":"    \"external\": \"field:networks:router:external\u003dTrue\","}],"source_content_type":"application/json","patch_set":5,"id":"AAAAOX%2F%2F9zg%3D","line":5,"in_reply_to":"AAAAOX%2F%2F%2Fsc%3D","updated":"2013-04-04 08:45:42.000000000","message":"Good point. I have not tested backward compatibility as \nI was assuming something would upgrade policy.json too when upgrading quantum, but this might not be the case.\n\nEnsuring backward compatibility goes beyond policy.json, as if context_is_admin is missing we need to fallback to the previous behaviour (literal \u0027admin\u0027 in role list)","commit_id":"bc73c89a516b725752f0bc59388334359c12e280"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"12090e787134a230a3dd628e884a33fa06ab6e9b","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\": \"role:admin or tenant_id:%(tenant_id)s\","},{"line_number":4,"context_line":"    \"admin_or_network_owner\": \"role:admin or tenant_id:%(network_tenant_id)s\","},{"line_number":5,"context_line":"    \"admin_only\": \"rule:context_is_admin\","},{"line_number":6,"context_line":"    \"regular_user\": \"\","},{"line_number":7,"context_line":"    \"shared\": \"field:networks:shared\u003dTrue\","}],"source_content_type":"application/json","patch_set":7,"id":"AAAAOn%2F%2F%2B60%3D","line":4,"updated":"2013-04-09 06:23:33.000000000","message":"Should we use \u0027rule:context_is_admin\u0027 at line 3 and 4?","commit_id":"5fefcda6f64b3ea370e5815caaa13d25982b81b9"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"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\": \"role:admin or tenant_id:%(tenant_id)s\","},{"line_number":4,"context_line":"    \"admin_or_network_owner\": \"role:admin or tenant_id:%(network_tenant_id)s\","},{"line_number":5,"context_line":"    \"admin_only\": \"rule:context_is_admin\","},{"line_number":6,"context_line":"    \"regular_user\": \"\","},{"line_number":7,"context_line":"    \"shared\": \"field:networks:shared\u003dTrue\","}],"source_content_type":"application/json","patch_set":7,"id":"AAAAOn%2F%2F3Os%3D","line":4,"in_reply_to":"AAAAOn%2F%2F%2B60%3D","updated":"2013-04-16 21:09:44.000000000","message":"This is possible, but not necessary.\nI\u0027ve been kind of following the same approach as nova, where admin_or_owner is not performed using context_is_admin.\n\nBut I guess that a very minor point, so I can do as you suggest as well.","commit_id":"5fefcda6f64b3ea370e5815caaa13d25982b81b9"}],"quantum/common/config.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"e7a73f91bb5ce886b2fda311402758a25598f6bb","unresolved":false,"context_lines":[{"line_number":89,"context_line":"]"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"context_opts \u003d ["},{"line_number":92,"context_line":"    cfg.StrOpt(\u0027admin_role\u0027, default\u003d\u0027admin\u0027),"},{"line_number":93,"context_line":"]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Register the configuration options"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOH%2F%2F5dQ%3D","line":92,"updated":"2013-03-21 19:12:37.000000000","message":"What if there is more than one role that is considered admin?  Consider using a ListOpt here.","commit_id":"58037e88a5800a687c4917ccd8acb62657d1208c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":89,"context_line":"]"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"context_opts \u003d ["},{"line_number":92,"context_line":"    cfg.StrOpt(\u0027admin_role\u0027, default\u003d\u0027admin\u0027),"},{"line_number":93,"context_line":"]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Register the configuration options"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOH%2F%2F2K8%3D","line":92,"in_reply_to":"AAAAOH%2F%2F5VY%3D","updated":"2013-03-25 09:21:46.000000000","message":"Yes, that was the reason for which I did a single role.","commit_id":"58037e88a5800a687c4917ccd8acb62657d1208c"},{"author":{"_account_id":447,"name":"dan wendlandt","email":"dan@nicira.com","username":"danwent"},"unresolved":false,"context_lines":[{"line_number":89,"context_line":"]"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"context_opts \u003d ["},{"line_number":92,"context_line":"    cfg.StrOpt(\u0027admin_role\u0027, default\u003d\u0027admin\u0027),"},{"line_number":93,"context_line":"]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"# Register the configuration options"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOH%2F%2F5VY%3D","line":92,"in_reply_to":"AAAAOH%2F%2F5dQ%3D","updated":"2013-03-21 20:07:20.000000000","message":"hehe, that was my thought as well.  \n\nI\u0027m guessing salvatore did it this way to be consistent in naming and type to what other services do.","commit_id":"58037e88a5800a687c4917ccd8acb62657d1208c"}],"quantum/context.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"e7a73f91bb5ce886b2fda311402758a25598f6bb","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            self.is_admin \u003d cfg.CONF.admin_role in [x.lower()"},{"line_number":55,"context_line":"                                                    for x in self.roles]"},{"line_number":56,"context_line":"        elif (self.is_admin and"},{"line_number":57,"context_line":"              cfg.CONF.admin_role not in [x.lower()for x in self.roles]):"},{"line_number":58,"context_line":"            self.roles.append(cfg.CONF.admin_role)"},{"line_number":59,"context_line":"        self.read_deleted \u003d read_deleted"},{"line_number":60,"context_line":"        if not timestamp:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOH%2F%2F5dA%3D","line":57,"updated":"2013-03-21 19:12:37.000000000","message":"space needed after .lower()","commit_id":"58037e88a5800a687c4917ccd8acb62657d1208c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":54,"context_line":"            self.is_admin \u003d cfg.CONF.admin_role in [x.lower()"},{"line_number":55,"context_line":"                                                    for x in self.roles]"},{"line_number":56,"context_line":"        elif (self.is_admin and"},{"line_number":57,"context_line":"              cfg.CONF.admin_role not in [x.lower()for x in self.roles]):"},{"line_number":58,"context_line":"            self.roles.append(cfg.CONF.admin_role)"},{"line_number":59,"context_line":"        self.read_deleted \u003d read_deleted"},{"line_number":60,"context_line":"        if not timestamp:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAOH%2F%2F2K4%3D","line":57,"in_reply_to":"AAAAOH%2F%2F5dA%3D","updated":"2013-03-25 09:21:46.000000000","message":"ops","commit_id":"58037e88a5800a687c4917ccd8acb62657d1208c"}],"quantum/policy.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"unresolved":false,"context_lines":[{"line_number":242,"context_line":"    # they correctly pass policy checks, and will become superseded"},{"line_number":243,"context_line":"    # once all explicit policy checks are removed from db logic and"},{"line_number":244,"context_line":"    # plugin modules. For backward compatibility it returns the literal"},{"line_number":245,"context_line":"    # admin is ADMIN_CTX_POLICY is not defined"},{"line_number":246,"context_line":"    if not policy._rules or ADMIN_CTX_POLICY not in policy._rules:"},{"line_number":247,"context_line":"        return [\u0027admin\u0027]"},{"line_number":248,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2F70s%3D","line":245,"updated":"2013-04-10 22:37:54.000000000","message":"teeny typo.","commit_id":"5fefcda6f64b3ea370e5815caaa13d25982b81b9"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":242,"context_line":"    # they correctly pass policy checks, and will become superseded"},{"line_number":243,"context_line":"    # once all explicit policy checks are removed from db logic and"},{"line_number":244,"context_line":"    # plugin modules. For backward compatibility it returns the literal"},{"line_number":245,"context_line":"    # admin is ADMIN_CTX_POLICY is not defined"},{"line_number":246,"context_line":"    if not policy._rules or ADMIN_CTX_POLICY not in policy._rules:"},{"line_number":247,"context_line":"        return [\u0027admin\u0027]"},{"line_number":248,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2F3Og%3D","line":245,"in_reply_to":"AAAAOn%2F%2F70s%3D","updated":"2013-04-16 21:09:44.000000000","message":"Done","commit_id":"5fefcda6f64b3ea370e5815caaa13d25982b81b9"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"12090e787134a230a3dd628e884a33fa06ab6e9b","unresolved":false,"context_lines":[{"line_number":243,"context_line":"    # once all explicit policy checks are removed from db logic and"},{"line_number":244,"context_line":"    # plugin modules. For backward compatibility it returns the literal"},{"line_number":245,"context_line":"    # admin is ADMIN_CTX_POLICY is not defined"},{"line_number":246,"context_line":"    if not policy._rules or ADMIN_CTX_POLICY not in policy._rules:"},{"line_number":247,"context_line":"        return [\u0027admin\u0027]"},{"line_number":248,"context_line":"    try:"},{"line_number":249,"context_line":"        admin_ctx_rule \u003d policy._rules[ADMIN_CTX_POLICY]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2F%2B7E%3D","line":246,"updated":"2013-04-09 06:23:33.000000000","message":"Should we invoke \u0027init()\u0027 first at here?","commit_id":"5fefcda6f64b3ea370e5815caaa13d25982b81b9"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":243,"context_line":"    # once all explicit policy checks are removed from db logic and"},{"line_number":244,"context_line":"    # plugin modules. For backward compatibility it returns the literal"},{"line_number":245,"context_line":"    # admin is ADMIN_CTX_POLICY is not defined"},{"line_number":246,"context_line":"    if not policy._rules or ADMIN_CTX_POLICY not in policy._rules:"},{"line_number":247,"context_line":"        return [\u0027admin\u0027]"},{"line_number":248,"context_line":"    try:"},{"line_number":249,"context_line":"        admin_ctx_rule \u003d policy._rules[ADMIN_CTX_POLICY]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2F3Oc%3D","line":246,"in_reply_to":"AAAAOn%2F%2F%2B7E%3D","updated":"2013-04-16 21:09:44.000000000","message":"Done","commit_id":"5fefcda6f64b3ea370e5815caaa13d25982b81b9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"    try:"},{"line_number":249,"context_line":"        admin_ctx_rule \u003d policy._rules[ADMIN_CTX_POLICY]"},{"line_number":250,"context_line":"    except (KeyError, TypeError):"},{"line_number":251,"context_line":"        # ADMIN_CTX_POLICY was not found or _rules is None"},{"line_number":252,"context_line":"        return"},{"line_number":253,"context_line":"    roles \u003d []"},{"line_number":254,"context_line":"    _extract_roles(admin_ctx_rule, roles)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2F70c%3D","line":251,"updated":"2013-04-10 22:37:54.000000000","message":"IMO this comment is redundant.","commit_id":"5fefcda6f64b3ea370e5815caaa13d25982b81b9"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":248,"context_line":"    try:"},{"line_number":249,"context_line":"        admin_ctx_rule \u003d policy._rules[ADMIN_CTX_POLICY]"},{"line_number":250,"context_line":"    except (KeyError, TypeError):"},{"line_number":251,"context_line":"        # ADMIN_CTX_POLICY was not found or _rules is None"},{"line_number":252,"context_line":"        return"},{"line_number":253,"context_line":"    roles \u003d []"},{"line_number":254,"context_line":"    _extract_roles(admin_ctx_rule, roles)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2F3OY%3D","line":251,"in_reply_to":"AAAAOn%2F%2F70c%3D","updated":"2013-04-16 21:09:44.000000000","message":"Done","commit_id":"5fefcda6f64b3ea370e5815caaa13d25982b81b9"}],"quantum/tests/unit/test_policy.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"691f292a04f856146433798751babecabf52ab75","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        self.addCleanup(policy.reset)"},{"line_number":203,"context_line":"        self.rules \u003d dict((k, common_policy.parse_rule(v)) for k, v in {"},{"line_number":204,"context_line":"            \"context_is_admin\": \"role:admin\","},{"line_number":205,"context_line":"            \"admin_or_network_owner\": \"role:admin or \""},{"line_number":206,"context_line":"                                      \"tenant_id:%(network_tenant_id)s\","},{"line_number":207,"context_line":"            \"admin_or_owner\": \"role:admin or tenant_id:%(tenant_id)s\","},{"line_number":208,"context_line":"            \"admin_only\": \"rule:context_is_admin\","}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAOn%2F%2F0KA%3D","line":205,"updated":"2013-04-22 13:26:55.000000000","message":"Do you want to make this match the new policy.json?","commit_id":"97f78905c39c0dba0c984037e4f8ce34b09bd928"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":202,"context_line":"        self.addCleanup(policy.reset)"},{"line_number":203,"context_line":"        self.rules \u003d dict((k, common_policy.parse_rule(v)) for k, v in {"},{"line_number":204,"context_line":"            \"context_is_admin\": \"role:admin\","},{"line_number":205,"context_line":"            \"admin_or_network_owner\": \"role:admin or \""},{"line_number":206,"context_line":"                                      \"tenant_id:%(network_tenant_id)s\","},{"line_number":207,"context_line":"            \"admin_or_owner\": \"role:admin or tenant_id:%(tenant_id)s\","},{"line_number":208,"context_line":"            \"admin_only\": \"rule:context_is_admin\","}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAOn%2F%2Fzt8%3D","line":205,"in_reply_to":"AAAAOn%2F%2F0KA%3D","updated":"2013-04-22 18:12:43.000000000","message":"Well, we can - but it\u0027s not really important...","commit_id":"97f78905c39c0dba0c984037e4f8ce34b09bd928"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"691f292a04f856146433798751babecabf52ab75","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            \"context_is_admin\": \"role:admin\","},{"line_number":205,"context_line":"            \"admin_or_network_owner\": \"role:admin or \""},{"line_number":206,"context_line":"                                      \"tenant_id:%(network_tenant_id)s\","},{"line_number":207,"context_line":"            \"admin_or_owner\": \"role:admin or tenant_id:%(tenant_id)s\","},{"line_number":208,"context_line":"            \"admin_only\": \"rule:context_is_admin\","},{"line_number":209,"context_line":"            \"regular_user\": \"role:user\","},{"line_number":210,"context_line":"            \"shared\": \"field:networks:shared\u003dTrue\","}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAOn%2F%2F0J4%3D","line":207,"updated":"2013-04-22 13:26:55.000000000","message":"Ditto","commit_id":"97f78905c39c0dba0c984037e4f8ce34b09bd928"}]}
