)]}'
{"doc/source/getting-started/policy_mapping.rst":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d51de064fd027ebea30e704a3559bc00e5ec9905","unresolved":false,"context_lines":[{"line_number":43,"context_line":"identity:create_project_tag                                PUT /v3/projects/{project_id}/tags/{tag_name}"},{"line_number":44,"context_line":"identity:update_project_tags                               PUT /v3/projects/{project_id}/tags"},{"line_number":45,"context_line":"identity:delete_project_tag                                DELETE /v3/projects/{project_id}/tags/{tag_name}"},{"line_number":46,"context_line":"identity:remove_all_project_tags                           DELETE /v3/projects/{project_id}/tags"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"identity:get_user                                          GET /v3/users/{user_id}"},{"line_number":49,"context_line":"identity:list_users                                        GET /v3/users"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ff346bd7_9c962d4c","line":46,"range":{"start_line":46,"start_character":9,"end_line":46,"end_character":15},"updated":"2017-07-26 16:02:11.000000000","message":"What about renaming this to delete for consistency wit what we have for other delete operations and also what nova has?","commit_id":"a219008444ff0b147eb0c90e8b820f455975dd72"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"28d2ef842254f59705fe396197d61f662a2795e1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"identity:create_project_tag                                PUT /v3/projects/{project_id}/tags/{tag_name}"},{"line_number":44,"context_line":"identity:update_project_tags                               PUT /v3/projects/{project_id}/tags"},{"line_number":45,"context_line":"identity:delete_project_tag                                DELETE /v3/projects/{project_id}/tags/{tag_name}"},{"line_number":46,"context_line":"identity:remove_all_project_tags                           DELETE /v3/projects/{project_id}/tags"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"identity:get_user                                          GET /v3/users/{user_id}"},{"line_number":49,"context_line":"identity:list_users                                        GET /v3/users"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ff346bd7_1c1c7d76","line":46,"range":{"start_line":46,"start_character":9,"end_line":46,"end_character":15},"in_reply_to":"ff346bd7_9c962d4c","updated":"2017-07-26 17:17:42.000000000","message":"Done","commit_id":"a219008444ff0b147eb0c90e8b820f455975dd72"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d237ff86bac470b5d942ef8e3b63e049d1ba62e3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"identity:update_project                                    PATCH /v3/projects/{project_id}"},{"line_number":39,"context_line":"identity:delete_project                                    DELETE /v3/projects/{project_id}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"identity:get_project_tag                                   GET /v3/projects/{project_id}/tags/{tag_name}"},{"line_number":42,"context_line":"identity:list_project_tags                                 GET /v3/projects/{project_id}/tags"},{"line_number":43,"context_line":"identity:create_project_tag                                PUT /v3/projects/{project_id}/tags/{tag_name}"},{"line_number":44,"context_line":"identity:update_project_tags                               PUT /v3/projects/{project_id}/tags"}],"source_content_type":"text/x-rst","patch_set":21,"id":"7f515b1d_03462fc1","line":41,"range":{"start_line":41,"start_character":59,"end_line":41,"end_character":104},"updated":"2017-09-28 20:12:04.000000000","message":"The specification doesn\u0027t say anything about implementing HEAD for these calls, but this falls into a weird case where we have GET methods without corresponding HEAD APIs.\n\nActually - this is already implemented according to the proposed controller patches: \n\nhttps://review.openstack.org/#/c/499728/4/keystone/resource/routers.py@111\n\nWe should make sure to include them here and in the specification (which should be an easy approval).","commit_id":"221a3cfbc385d88f5765915580fe71dfbd4cd654"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"58a4d1a3a9b67077cb9f767f68ce76dafc3fc5ff","unresolved":false,"context_lines":[{"line_number":38,"context_line":"identity:update_project                                    PATCH /v3/projects/{project_id}"},{"line_number":39,"context_line":"identity:delete_project                                    DELETE /v3/projects/{project_id}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"identity:get_project_tag                                   GET /v3/projects/{project_id}/tags/{tag_name}"},{"line_number":42,"context_line":"identity:list_project_tags                                 GET /v3/projects/{project_id}/tags"},{"line_number":43,"context_line":"identity:create_project_tag                                PUT /v3/projects/{project_id}/tags/{tag_name}"},{"line_number":44,"context_line":"identity:update_project_tags                               PUT /v3/projects/{project_id}/tags"}],"source_content_type":"text/x-rst","patch_set":21,"id":"7f515b1d_d4532f38","line":41,"range":{"start_line":41,"start_character":59,"end_line":41,"end_character":104},"in_reply_to":"7f515b1d_03462fc1","updated":"2017-09-28 22:42:18.000000000","message":"Done","commit_id":"221a3cfbc385d88f5765915580fe71dfbd4cd654"}],"keystone/common/policies/base.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b500c330a717c2dafc903d19e664f28f5094c00c","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \u0027rule:admin_required or \u0027"},{"line_number":26,"context_line":"    \u0027project_id:%(target.project.id)s\u0027)"},{"line_number":27,"context_line":"RULE_ADMIN_OR_TOKEN_SUBJECT \u003d \u0027rule:admin_or_token_subject\u0027"},{"line_number":28,"context_line":"RULE_PROJECT_ADMIN_REQUIRED \u003d \u0027rule:admin_required\u0027"},{"line_number":29,"context_line":"RULE_REVOKE_EVENT_OR_ADMIN \u003d \u0027rule:revoke_event_or_admin\u0027"},{"line_number":30,"context_line":"RULE_SERVICE_ADMIN_OR_TOKEN_SUBJECT \u003d \u0027rule:service_admin_or_token_subject\u0027"},{"line_number":31,"context_line":"RULE_SERVICE_OR_ADMIN \u003d \u0027rule:service_or_admin\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_df2e16a4","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":27},"updated":"2017-07-25 14:36:15.000000000","message":"this is not enforcing PROJECT in the rule, so this is a bad name. just use RULE_ADMIN_REQUIRED instead of doing the same thing and calling it something else here","commit_id":"acefabe1b1e2d4478e93352e6f9d3aeb43ec4155"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"227b10531fffd7b11edfea831e4938b8cfaadf9b","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \u0027rule:admin_required or \u0027"},{"line_number":26,"context_line":"    \u0027project_id:%(target.project.id)s\u0027)"},{"line_number":27,"context_line":"RULE_ADMIN_OR_TOKEN_SUBJECT \u003d \u0027rule:admin_or_token_subject\u0027"},{"line_number":28,"context_line":"RULE_PROJECT_ADMIN_REQUIRED \u003d \u0027rule:admin_required\u0027"},{"line_number":29,"context_line":"RULE_REVOKE_EVENT_OR_ADMIN \u003d \u0027rule:revoke_event_or_admin\u0027"},{"line_number":30,"context_line":"RULE_SERVICE_ADMIN_OR_TOKEN_SUBJECT \u003d \u0027rule:service_admin_or_token_subject\u0027"},{"line_number":31,"context_line":"RULE_SERVICE_OR_ADMIN \u003d \u0027rule:service_or_admin\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_462ff63e","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":27},"in_reply_to":"ff346bd7_2664f2b8","updated":"2017-07-25 17:36:32.000000000","message":"++ for changing it to just RULE_ADMIN_REQUIRED.","commit_id":"acefabe1b1e2d4478e93352e6f9d3aeb43ec4155"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b889ce39334e582ee9810652849ea79331a997c0","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \u0027rule:admin_required or \u0027"},{"line_number":26,"context_line":"    \u0027project_id:%(target.project.id)s\u0027)"},{"line_number":27,"context_line":"RULE_ADMIN_OR_TOKEN_SUBJECT \u003d \u0027rule:admin_or_token_subject\u0027"},{"line_number":28,"context_line":"RULE_PROJECT_ADMIN_REQUIRED \u003d \u0027rule:admin_required\u0027"},{"line_number":29,"context_line":"RULE_REVOKE_EVENT_OR_ADMIN \u003d \u0027rule:revoke_event_or_admin\u0027"},{"line_number":30,"context_line":"RULE_SERVICE_ADMIN_OR_TOKEN_SUBJECT \u003d \u0027rule:service_admin_or_token_subject\u0027"},{"line_number":31,"context_line":"RULE_SERVICE_OR_ADMIN \u003d \u0027rule:service_or_admin\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_2664f2b8","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":27},"in_reply_to":"ff346bd7_df2e16a4","updated":"2017-07-25 17:35:40.000000000","message":"Yeah, this was to make project update use the same as project and the name isn\u0027t that great. We could change this back to admin_required","commit_id":"acefabe1b1e2d4478e93352e6f9d3aeb43ec4155"}],"keystone/common/policies/project.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fb66ae75b67979cac83db53d182ca30227850cc4","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":67,"context_line":"        name\u003dbase.IDENTITY % \u0027update_project_tags\u0027,"},{"line_number":68,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":69,"context_line":"        description\u003d\u0027Update project tags.\u0027,"},{"line_number":70,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":71,"context_line":"                     \u0027method\u0027: \u0027PUT\u0027}]),"},{"line_number":72,"context_line":"    policy.DocumentedRuleDefault("}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_763f28b4","line":69,"updated":"2017-07-26 15:05:40.000000000","message":"This is for updating multiple tags.","commit_id":"a219008444ff0b147eb0c90e8b820f455975dd72"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fb66ae75b67979cac83db53d182ca30227850cc4","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":73,"context_line":"        name\u003dbase.IDENTITY % \u0027create_project_tag\u0027,"},{"line_number":74,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":75,"context_line":"        description\u003d\u0027Update project tags.\u0027,"},{"line_number":76,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":77,"context_line":"                     \u0027method\u0027: \u0027PUT\u0027}]),"},{"line_number":78,"context_line":"    policy.DocumentedRuleDefault("}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_5648a45a","line":75,"updated":"2017-07-26 15:05:40.000000000","message":"This is for updating a single tag.","commit_id":"a219008444ff0b147eb0c90e8b820f455975dd72"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d51de064fd027ebea30e704a3559bc00e5ec9905","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":73,"context_line":"        name\u003dbase.IDENTITY % \u0027create_project_tag\u0027,"},{"line_number":74,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":75,"context_line":"        description\u003d\u0027Update project tags.\u0027,"},{"line_number":76,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":77,"context_line":"                     \u0027method\u0027: \u0027PUT\u0027}]),"},{"line_number":78,"context_line":"    policy.DocumentedRuleDefault("}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_9c7f4d14","line":75,"in_reply_to":"ff346bd7_5648a45a","updated":"2017-07-26 16:02:11.000000000","message":"++","commit_id":"a219008444ff0b147eb0c90e8b820f455975dd72"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"28d2ef842254f59705fe396197d61f662a2795e1","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":73,"context_line":"        name\u003dbase.IDENTITY % \u0027create_project_tag\u0027,"},{"line_number":74,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":75,"context_line":"        description\u003d\u0027Update project tags.\u0027,"},{"line_number":76,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":77,"context_line":"                     \u0027method\u0027: \u0027PUT\u0027}]),"},{"line_number":78,"context_line":"    policy.DocumentedRuleDefault("}],"source_content_type":"text/x-python","patch_set":4,"id":"ff346bd7_cc3d20de","line":75,"in_reply_to":"ff346bd7_9c7f4d14","updated":"2017-07-26 17:17:42.000000000","message":"Done","commit_id":"a219008444ff0b147eb0c90e8b820f455975dd72"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0071d69ea2b888195f9180a85c95389149f03066","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":73,"context_line":"        name\u003dbase.IDENTITY % \u0027create_project_tag\u0027,"},{"line_number":74,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":75,"context_line":"        description\u003d\u0027Update project tags.\u0027,"},{"line_number":76,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":77,"context_line":"                     \u0027method\u0027: \u0027PUT\u0027}]),"},{"line_number":78,"context_line":"    policy.DocumentedRuleDefault("}],"source_content_type":"text/x-python","patch_set":7,"id":"ff346bd7_4ff7bbd4","line":75,"updated":"2017-07-27 15:16:41.000000000","message":"Looks like this was reverted?","commit_id":"ef0287f665cc7a108835f2479418eedb741aec9f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"50f747a6b9bda600a758414ff11a8a912210e766","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":57,"context_line":"        description\u003d\u0027List tags for a project.\u0027,"},{"line_number":58,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":59,"context_line":"                     \u0027method\u0027: \u0027GET\u0027}]),"},{"line_number":60,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":61,"context_line":"        name\u003dbase.IDENTITY % \u0027get_project_tag\u0027,"},{"line_number":62,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff346bd7_bbc429f6","line":59,"updated":"2017-07-27 17:22:38.000000000","message":"this has HEAD too","commit_id":"888d2eaa8c8db76d6b5fb0d6a71c993f6951c170"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"da450ec17f53518137b401839570782778c76378","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":57,"context_line":"        description\u003d\u0027List tags for a project.\u0027,"},{"line_number":58,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":59,"context_line":"                     \u0027method\u0027: \u0027GET\u0027}]),"},{"line_number":60,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":61,"context_line":"        name\u003dbase.IDENTITY % \u0027get_project_tag\u0027,"},{"line_number":62,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff346bd7_c67cb084","line":59,"in_reply_to":"ff346bd7_bbc429f6","updated":"2017-07-27 17:25:15.000000000","message":"ahh - good catch","commit_id":"888d2eaa8c8db76d6b5fb0d6a71c993f6951c170"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"bd33ba8f91ef48aa4dcd268cebdb097bf6ce137f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":57,"context_line":"        description\u003d\u0027List tags for a project.\u0027,"},{"line_number":58,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":59,"context_line":"                     \u0027method\u0027: \u0027GET\u0027}]),"},{"line_number":60,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":61,"context_line":"        name\u003dbase.IDENTITY % \u0027get_project_tag\u0027,"},{"line_number":62,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff346bd7_b6e31bd9","line":59,"in_reply_to":"ff346bd7_c67cb084","updated":"2017-07-27 18:58:07.000000000","message":"Done","commit_id":"888d2eaa8c8db76d6b5fb0d6a71c993f6951c170"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"50f747a6b9bda600a758414ff11a8a912210e766","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":63,"context_line":"        description\u003d\u0027Check if project contains a tag.\u0027,"},{"line_number":64,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":65,"context_line":"                     \u0027method\u0027: \u0027GET\u0027}]),"},{"line_number":66,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":67,"context_line":"        name\u003dbase.IDENTITY % \u0027update_project_tags\u0027,"},{"line_number":68,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff346bd7_5bb3fd98","line":65,"updated":"2017-07-27 17:22:38.000000000","message":"same here","commit_id":"888d2eaa8c8db76d6b5fb0d6a71c993f6951c170"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"bd33ba8f91ef48aa4dcd268cebdb097bf6ce137f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":63,"context_line":"        description\u003d\u0027Check if project contains a tag.\u0027,"},{"line_number":64,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":65,"context_line":"                     \u0027method\u0027: \u0027GET\u0027}]),"},{"line_number":66,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":67,"context_line":"        name\u003dbase.IDENTITY % \u0027update_project_tags\u0027,"},{"line_number":68,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff346bd7_96e497e1","line":65,"in_reply_to":"ff346bd7_5bb3fd98","updated":"2017-07-27 18:58:07.000000000","message":"Done","commit_id":"888d2eaa8c8db76d6b5fb0d6a71c993f6951c170"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4c507d50cb0051b218bb16c9ec668c35ae12238d","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":63,"context_line":"        description\u003d\u0027Check if a project contains tags\u0027,"},{"line_number":64,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":65,"context_line":"                     \u0027method\u0027: \u0027HEAD\u0027}]),"},{"line_number":66,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":67,"context_line":"        name\u003dbase.IDENTITY % \u0027get_project_tag\u0027,"},{"line_number":68,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff346bd7_cc85ee5b","line":65,"updated":"2017-07-27 19:25:23.000000000","message":"We typically just combine this with the GET request, like this [0]. Then you don\u0027t need a separate policy target in the controller.\n\n[0] https://github.com/openstack/keystone/blob/c3b5d2d77b029880521912e43ad963f9b0c5bf99/keystone/common/policies/role_assignment.py#L22-L25","commit_id":"ed6608355cf4c897b2dc3f79951bfb32a441fbb7"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"fa43cf9ff2e77873b9d9bfa5fcf3127225f1d161","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                     \u0027method\u0027: \u0027GET\u0027},"},{"line_number":60,"context_line":"                    {\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":61,"context_line":"                     \u0027method\u0027: \u0027HEAD\u0027}]),"},{"line_number":62,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":63,"context_line":"        name\u003dbase.IDENTITY % \u0027head_project_tags\u0027,"},{"line_number":64,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":65,"context_line":"        description\u003d\u0027Check if a project contains tags\u0027,"},{"line_number":66,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":67,"context_line":"                     \u0027method\u0027: \u0027HEAD\u0027}]),"},{"line_number":68,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":69,"context_line":"        name\u003dbase.IDENTITY % \u0027get_project_tag\u0027,"},{"line_number":70,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_5d11aa03","line":67,"range":{"start_line":62,"start_character":0,"end_line":67,"end_character":41},"updated":"2017-07-27 20:33:10.000000000","message":"This is wrong. Since the list_project_tags policy above has the same path and head method.","commit_id":"a6deaedd4e8facb94641cd8acd421242783ca426"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"5d80b1228a4e38611c04f7fd27ac7bd14f160e2a","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                     \u0027method\u0027: \u0027GET\u0027},"},{"line_number":60,"context_line":"                    {\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":61,"context_line":"                     \u0027method\u0027: \u0027HEAD\u0027}]),"},{"line_number":62,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":63,"context_line":"        name\u003dbase.IDENTITY % \u0027head_project_tags\u0027,"},{"line_number":64,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":65,"context_line":"        description\u003d\u0027Check if a project contains tags\u0027,"},{"line_number":66,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":67,"context_line":"                     \u0027method\u0027: \u0027HEAD\u0027}]),"},{"line_number":68,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":69,"context_line":"        name\u003dbase.IDENTITY % \u0027get_project_tag\u0027,"},{"line_number":70,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_9dc27258","line":67,"range":{"start_line":62,"start_character":0,"end_line":67,"end_character":41},"in_reply_to":"ff346bd7_5d11aa03","updated":"2017-07-27 20:34:05.000000000","message":"missed this in the rebase, will fix","commit_id":"a6deaedd4e8facb94641cd8acd421242783ca426"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"98ae5f5daa20463a4cf58b295a2ca2e077d8f421","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                     \u0027method\u0027: \u0027GET\u0027},"},{"line_number":60,"context_line":"                    {\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":61,"context_line":"                     \u0027method\u0027: \u0027HEAD\u0027}]),"},{"line_number":62,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":63,"context_line":"        name\u003dbase.IDENTITY % \u0027head_project_tags\u0027,"},{"line_number":64,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"},{"line_number":65,"context_line":"        description\u003d\u0027Check if a project contains tags\u0027,"},{"line_number":66,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"},{"line_number":67,"context_line":"                     \u0027method\u0027: \u0027HEAD\u0027}]),"},{"line_number":68,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":69,"context_line":"        name\u003dbase.IDENTITY % \u0027get_project_tag\u0027,"},{"line_number":70,"context_line":"        check_str\u003dbase.RULE_ADMIN_OR_TARGET_PROJECT,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_3dd26601","line":67,"range":{"start_line":62,"start_character":0,"end_line":67,"end_character":41},"in_reply_to":"ff346bd7_9dc27258","updated":"2017-07-27 20:36:24.000000000","message":"Done","commit_id":"a6deaedd4e8facb94641cd8acd421242783ca426"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0a2b49b27754b39e37f1074bd5db4e40460c3961","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":87,"context_line":"                     \u0027method\u0027: \u0027PUT\u0027}]),"},{"line_number":88,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":89,"context_line":"        name\u003dbase.IDENTITY % \u0027delete_all_project_tags\u0027,"},{"line_number":90,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":91,"context_line":"        description\u003d\u0027Remove all tags from a project.\u0027,"},{"line_number":92,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_a73763ff","line":89,"updated":"2017-07-27 20:09:50.000000000","message":"This could be shortened to just:\n\n  delete_project_tags","commit_id":"a6deaedd4e8facb94641cd8acd421242783ca426"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"98ae5f5daa20463a4cf58b295a2ca2e077d8f421","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":87,"context_line":"                     \u0027method\u0027: \u0027PUT\u0027}]),"},{"line_number":88,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":89,"context_line":"        name\u003dbase.IDENTITY % \u0027delete_all_project_tags\u0027,"},{"line_number":90,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":91,"context_line":"        description\u003d\u0027Remove all tags from a project.\u0027,"},{"line_number":92,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_5de9aab4","line":89,"in_reply_to":"ff346bd7_3dd14624","updated":"2017-07-27 20:36:24.000000000","message":"Done","commit_id":"a6deaedd4e8facb94641cd8acd421242783ca426"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"5d80b1228a4e38611c04f7fd27ac7bd14f160e2a","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":87,"context_line":"                     \u0027method\u0027: \u0027PUT\u0027}]),"},{"line_number":88,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":89,"context_line":"        name\u003dbase.IDENTITY % \u0027delete_all_project_tags\u0027,"},{"line_number":90,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":91,"context_line":"        description\u003d\u0027Remove all tags from a project.\u0027,"},{"line_number":92,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_3dd14624","line":89,"in_reply_to":"ff346bd7_a73763ff","updated":"2017-07-27 20:34:05.000000000","message":"will do","commit_id":"a6deaedd4e8facb94641cd8acd421242783ca426"}],"keystone/common/policies/project_tags.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b500c330a717c2dafc903d19e664f28f5094c00c","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        description\u003d\u0027Delete specified tag from project.\u0027,"},{"line_number":52,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":53,"context_line":"                     \u0027method\u0027: \u0027DELETE\u0027}])"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def list_rules():"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_6209cd2a","line":54,"updated":"2017-07-25 14:36:15.000000000","message":"I am wondering if we need a complete set of different rules for protecting these VS just protecting with the regular project update API. at the end this is just an attribute of projects anyways. you may even create a project with some tags already","commit_id":"acefabe1b1e2d4478e93352e6f9d3aeb43ec4155"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b889ce39334e582ee9810652849ea79331a997c0","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        description\u003d\u0027Delete specified tag from project.\u0027,"},{"line_number":52,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":53,"context_line":"                     \u0027method\u0027: \u0027DELETE\u0027}])"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def list_rules():"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_66bb1a0e","line":54,"in_reply_to":"ff346bd7_6209cd2a","updated":"2017-07-25 17:35:40.000000000","message":"We would need to tweak the protected decorator to do this wouldn\u0027t we? If we have rules (which by default should match project update), then they can also be tweaked for a deployment if someone wanted.","commit_id":"acefabe1b1e2d4478e93352e6f9d3aeb43ec4155"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"60874286556fcbd127d5cb8d9120f9c12d6c8cae","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        description\u003d\u0027Delete specified tag from project.\u0027,"},{"line_number":52,"context_line":"        operations\u003d[{\u0027path\u0027: \u0027/v3/projects/{project_id}/tags/{value}\u0027,"},{"line_number":53,"context_line":"                     \u0027method\u0027: \u0027DELETE\u0027}])"},{"line_number":54,"context_line":"]"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def list_rules():"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_26f4f25a","line":54,"in_reply_to":"ff346bd7_66bb1a0e","updated":"2017-07-25 17:49:51.000000000","message":"Yes. Or just use the normal project workflow and treat tags as any other project attribute?","commit_id":"acefabe1b1e2d4478e93352e6f9d3aeb43ec4155"}]}
