)]}'
{"keystone/assignment/routers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f8417cc3c304774d35263a039d0fa3f763321038","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            path\u003d\u0027/OS-INHERIT/domains/{domain_id}/groups/{group_id}/roles/\u0027"},{"line_number":231,"context_line":"            \u0027inherited_to_projects\u0027,"},{"line_number":232,"context_line":"            # TODO(samueldmq): Change the below to get_head_action for"},{"line_number":233,"context_line":"            # consistency with all the rest of APIs"},{"line_number":234,"context_line":"            get_action\u003d\u0027list_grants\u0027,"},{"line_number":235,"context_line":"            rel\u003dbuild_os_inherit_relation("},{"line_number":236,"context_line":"                resource_name\u003d\u0027domain_group_roles_inherited_to_projects\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_fecff954","line":233,"updated":"2017-06-07 20:37:51.000000000","message":"Is the HEAD equivalent API for this listed somewhere? Or are we proposing that HEAD should also be added to the API but it currently isn\u0027t?","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"357262b0cc36dff9572c32e2f5748dfb766d2881","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            path\u003d\u0027/OS-INHERIT/domains/{domain_id}/groups/{group_id}/roles/\u0027"},{"line_number":231,"context_line":"            \u0027inherited_to_projects\u0027,"},{"line_number":232,"context_line":"            # TODO(samueldmq): Change the below to get_head_action for"},{"line_number":233,"context_line":"            # consistency with all the rest of APIs"},{"line_number":234,"context_line":"            get_action\u003d\u0027list_grants\u0027,"},{"line_number":235,"context_line":"            rel\u003dbuild_os_inherit_relation("},{"line_number":236,"context_line":"                resource_name\u003d\u0027domain_group_roles_inherited_to_projects\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_0fbdab64","line":233,"in_reply_to":"bf091321_fe87f9b5","updated":"2017-06-09 00:54:25.000000000","message":"Done 1696574","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f963b8d74e40ce2b03f711ae9ef9bce82edf065d","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            path\u003d\u0027/OS-INHERIT/domains/{domain_id}/groups/{group_id}/roles/\u0027"},{"line_number":231,"context_line":"            \u0027inherited_to_projects\u0027,"},{"line_number":232,"context_line":"            # TODO(samueldmq): Change the below to get_head_action for"},{"line_number":233,"context_line":"            # consistency with all the rest of APIs"},{"line_number":234,"context_line":"            get_action\u003d\u0027list_grants\u0027,"},{"line_number":235,"context_line":"            rel\u003dbuild_os_inherit_relation("},{"line_number":236,"context_line":"                resource_name\u003d\u0027domain_group_roles_inherited_to_projects\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_fe87f9b5","line":233,"in_reply_to":"bf091321_fecff954","updated":"2017-06-07 20:50:26.000000000","message":"If there is a bug report detailing this inconsistency, we should reference it here.","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7c94f62640365ff8298fe20bd1f1b22fe45d728e","unresolved":false,"context_lines":[{"line_number":230,"context_line":"            path\u003d\u0027/OS-INHERIT/domains/{domain_id}/groups/{group_id}/roles/\u0027"},{"line_number":231,"context_line":"            \u0027inherited_to_projects\u0027,"},{"line_number":232,"context_line":"            # TODO(samueldmq): Change the below to get_head_action for"},{"line_number":233,"context_line":"            # consistency with all the rest of APIs"},{"line_number":234,"context_line":"            get_action\u003d\u0027list_grants\u0027,"},{"line_number":235,"context_line":"            rel\u003dbuild_os_inherit_relation("},{"line_number":236,"context_line":"                resource_name\u003d\u0027domain_group_roles_inherited_to_projects\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_de5b1552","line":233,"in_reply_to":"bf091321_fecff954","updated":"2017-06-07 20:46:03.000000000","message":"The latter, we should add because it currently isn\u0027t present.","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b1c568129b62c7b01e9389a0f43db4e969c684c2","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            path\u003d\u0027/OS-INHERIT/domains/{domain_id}/users/{user_id}/roles/\u0027"},{"line_number":244,"context_line":"            \u0027inherited_to_projects\u0027,"},{"line_number":245,"context_line":"            # TODO(samueldmq): Change the below to get_head_action for"},{"line_number":246,"context_line":"            # consistency with all the rest of APIs. See bug 1696574"},{"line_number":247,"context_line":"            get_action\u003d\u0027list_grants\u0027,"},{"line_number":248,"context_line":"            rel\u003dbuild_os_inherit_relation("},{"line_number":249,"context_line":"                resource_name\u003d\u0027domain_user_roles_inherited_to_projects\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_a3c03852","line":246,"updated":"2017-06-20 21:53:04.000000000","message":"Cool - I\u0027ll remove this when my patches merge.","commit_id":"4994c8b88d99a257c979f515826004291cc97206"}],"keystone/common/policies/grant.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"bc6bb2efb9a3844bf28c3adca8064f5852249a90","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def get_operations(path_dic, method):"},{"line_number":57,"context_line":"    operation \u003d []"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    for p in path_dic:"},{"line_number":60,"context_line":"        p[\u0027method\u0027] \u003d method"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfeb2761_640a448b","line":57,"range":{"start_line":57,"start_character":4,"end_line":57,"end_character":13},"updated":"2017-03-30 17:40:03.000000000","message":"(nit) operations (plural)","commit_id":"be8cd62bbc8dfbe930d3f7317078e75ab7c52f2a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"bc6bb2efb9a3844bf28c3adca8064f5852249a90","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    return operation"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"grant_policies \u003d ["},{"line_number":67,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":68,"context_line":"        name\u003dbase.IDENTITY % \u0027check_grant\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfeb2761_04d018f7","line":65,"updated":"2017-03-30 17:40:03.000000000","message":"what the difference between grant_collections and grant_resources? this is not obvious and it\u0027s a bit tricky to understand as it is.\n\n\nis this really better than just specifying everything in operations\u003d below, just as all the other patches ?\n\nat least add some comments to grant_resources and grant_collections as it is not obvious the differecent, neither get_operations.","commit_id":"be8cd62bbc8dfbe930d3f7317078e75ab7c52f2a"},{"author":{"_account_id":22219,"name":"Anthony Washington","email":"anthony.washington@intel.com","username":"antwash"},"change_message_id":"d9754cffacbd0771770a144279919e4339443b99","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    return operation"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"grant_policies \u003d ["},{"line_number":67,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":68,"context_line":"        name\u003dbase.IDENTITY % \u0027check_grant\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ffa3b31_3f952341","line":65,"in_reply_to":"dfeb2761_04d018f7","updated":"2017-04-17 22:12:34.000000000","message":"The naming between \u0027grant_collections\u0027 and \u0027grant_resources\u0027 doesn\u0027t indicate a difference. However the both contain different sets of \u0027paths\u0027.\n\nI went about doing it this way to cut down the duplication of code when doing \u0027operations\u003d\u0027blahblahblah\u0027\u0027","commit_id":"be8cd62bbc8dfbe930d3f7317078e75ab7c52f2a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d31fffb3143f84f068844e8db66c66daa90a584f","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystone.common.policies import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"grant_resources \u003d ["},{"line_number":18,"context_line":"    {\u0027path\u0027: \u0027/v3/projects/{project_id}/users/{user_id}/roles/{role_id}\u0027},"},{"line_number":19,"context_line":"    {\u0027path\u0027: \u0027/v3/projects/{project_id}/groups/{group_id}/roles/{role_id}\u0027},"},{"line_number":20,"context_line":"    {\u0027path\u0027: \u0027/v3/domains/{domain_id}/users/{user_id}/roles/{role_id}\u0027},"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ff73747_fe77bd39","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":15},"updated":"2017-04-25 12:45:23.000000000","message":"what about resource_paths?","commit_id":"7ddac66945eff53a606b15ab984138e6c5e6f381"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d31fffb3143f84f068844e8db66c66daa90a584f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    }"},{"line_number":38,"context_line":"]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"grant_collections \u003d ["},{"line_number":41,"context_line":"    {\u0027path\u0027: \u0027/v3/projects/{project_id}/users/{user_id}/roles\u0027},"},{"line_number":42,"context_line":"    {\u0027path\u0027: \u0027/v3/projects/{project_id}/groups/{group_id}/roles\u0027},"},{"line_number":43,"context_line":"    {\u0027path\u0027: \u0027/v3/domains/{domain_id}/users/{user_id}/roles\u0027},"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ff73747_de72c149","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":17},"updated":"2017-04-25 12:45:23.000000000","message":"and collection_paths?","commit_id":"7ddac66945eff53a606b15ab984138e6c5e6f381"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"af8a692a43acd95ff4b4abb7ad09a327985aeaed","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def get_operations(path_dic, method):"},{"line_number":57,"context_line":"    operation \u003d []"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    for p in path_dic:"},{"line_number":60,"context_line":"        p[\u0027method\u0027] \u003d method"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ff73747_b2c1a631","line":57,"range":{"start_line":57,"start_character":4,"end_line":57,"end_character":13},"updated":"2017-04-22 14:02:53.000000000","message":"nit - this is a list so the name should be plural","commit_id":"7ddac66945eff53a606b15ab984138e6c5e6f381"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d31fffb3143f84f068844e8db66c66daa90a584f","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def get_operations(path_dic, method):"},{"line_number":57,"context_line":"    operation \u003d []"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    for p in path_dic:"},{"line_number":60,"context_line":"        p[\u0027method\u0027] \u003d method"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ff73747_be8ff521","line":57,"range":{"start_line":57,"start_character":4,"end_line":57,"end_character":13},"in_reply_to":"5ff73747_b2c1a631","updated":"2017-04-25 12:45:23.000000000","message":"++","commit_id":"7ddac66945eff53a606b15ab984138e6c5e6f381"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d31fffb3143f84f068844e8db66c66daa90a584f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        name\u003dbase.IDENTITY % \u0027check_grant\u0027,"},{"line_number":69,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":70,"context_line":"        description\u003d\u0027Check grant.\u0027,"},{"line_number":71,"context_line":"        operations\u003dget_operations(grant_resources, \u0027HEAD\u0027)),"},{"line_number":72,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":73,"context_line":"        name\u003dbase.IDENTITY % \u0027list_grants\u0027,"},{"line_number":74,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ff73747_dea761a7","line":71,"updated":"2017-04-25 12:45:23.000000000","message":"this also has GET","commit_id":"7ddac66945eff53a606b15ab984138e6c5e6f381"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d31fffb3143f84f068844e8db66c66daa90a584f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        name\u003dbase.IDENTITY % \u0027list_grants\u0027,"},{"line_number":74,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":75,"context_line":"        description\u003d\u0027List grants.\u0027,"},{"line_number":76,"context_line":"        operations\u003dget_operations(grant_collections, \u0027GET\u0027)),"},{"line_number":77,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":78,"context_line":"        name\u003dbase.IDENTITY % \u0027create_grant\u0027,"},{"line_number":79,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ff73747_7eb28de8","line":76,"updated":"2017-04-25 12:45:23.000000000","message":"This also has HEAD","commit_id":"7ddac66945eff53a606b15ab984138e6c5e6f381"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"79debec57ffddb8899aaf4b01d7b725fb5cb320e","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":48,"context_line":"        name\u003dbase.IDENTITY % \u0027check_grant\u0027,"},{"line_number":49,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":50,"context_line":"        description\u003d\u0027Check grant.\u0027,"},{"line_number":51,"context_line":"        operations\u003dget_operations(resource_paths, \u0027HEAD\u0027)),"},{"line_number":52,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":53,"context_line":"        name\u003dbase.IDENTITY % \u0027list_grants\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df140735_21ec0df2","line":50,"updated":"2017-06-07 15:57:21.000000000","message":"This is how the documentation renders [0].\n\nAfter looking at it, we should probably improve the description here. It looks a bit lop-sided when you see all the URLs and a super short description. Maybe something like:\n\n  description\u003d\u0027Check a grant between a target and an actor. A target \u0027\n  \u0027can be either a domain or a project. An actor can be either a user \u0027\n  \u0027or a group. These terms also apply to the OS-INHERIT API which \u0027\n  \u0027allows assignments on the target to be inherited to targets below it \u0027\n  \u0027if applicable.\u0027\n\nFeel free to elaborate on that as needed, just figured we could provide a bit more information.\n\n[0] http://paste.openstack.org/show/611734/","commit_id":"39606a3dc9e651f359687faf151ef35cc213d828"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"79debec57ffddb8899aaf4b01d7b725fb5cb320e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":53,"context_line":"        name\u003dbase.IDENTITY % \u0027list_grants\u0027,"},{"line_number":54,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":55,"context_line":"        description\u003d\u0027List grants.\u0027,"},{"line_number":56,"context_line":"        operations\u003dget_operations(collection_paths, \u0027GET\u0027)),"},{"line_number":57,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":58,"context_line":"        name\u003dbase.IDENTITY % \u0027create_grant\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df140735_21c52d5c","line":55,"updated":"2017-06-07 15:57:21.000000000","message":"Same comment here.","commit_id":"39606a3dc9e651f359687faf151ef35cc213d828"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"79debec57ffddb8899aaf4b01d7b725fb5cb320e","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":58,"context_line":"        name\u003dbase.IDENTITY % \u0027create_grant\u0027,"},{"line_number":59,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":60,"context_line":"        description\u003d\u0027Create grant.\u0027,"},{"line_number":61,"context_line":"        operations\u003dget_operations(resource_paths, \u0027PUT\u0027)),"},{"line_number":62,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":63,"context_line":"        name\u003dbase.IDENTITY % \u0027revoke_grant\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df140735_c1a9d190","line":60,"updated":"2017-06-07 15:57:21.000000000","message":"Same comment here.","commit_id":"39606a3dc9e651f359687faf151ef35cc213d828"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"79debec57ffddb8899aaf4b01d7b725fb5cb320e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":63,"context_line":"        name\u003dbase.IDENTITY % \u0027revoke_grant\u0027,"},{"line_number":64,"context_line":"        check_str\u003dbase.RULE_ADMIN_REQUIRED,"},{"line_number":65,"context_line":"        description\u003d\u0027Revoke grant.\u0027,"},{"line_number":66,"context_line":"        operations\u003dget_operations(resource_paths, \u0027DELETE\u0027))"},{"line_number":67,"context_line":"]"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df140735_a1aedd95","line":65,"updated":"2017-06-07 15:57:21.000000000","message":"Same comment here.","commit_id":"39606a3dc9e651f359687faf151ef35cc213d828"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3c6bb1b6115493e22c1dd06e7300d9ba12cab029","unresolved":false,"context_lines":[{"line_number":40,"context_line":"     \u0027inherited_to_projects\u0027),"},{"line_number":41,"context_line":"    (\u0027/OS-INHERIT/domains/{domain_id}/users/{user_id}/roles/\u0027"},{"line_number":42,"context_line":"     \u0027inherited_to_projects\u0027)"},{"line_number":43,"context_line":"]"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def list_operations(paths, methods):"}],"source_content_type":"text/x-python","patch_set":7,"id":"df140735_e32e15f9","line":43,"updated":"2017-06-07 18:38:44.000000000","message":"Should we add the possibility of listing grants for the inherited project role assignments too? I guess the list_role_assignments API is much more used for this purpose (and for domains and list role assignments in general).","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f963b8d74e40ce2b03f711ae9ef9bce82edf065d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                     \u0027target can be either a domain or a project. An actor \u0027"},{"line_number":64,"context_line":"                     \u0027can be either a user or a group. These terms also apply \u0027"},{"line_number":65,"context_line":"                     \u0027to the OS-INHERIT APIs, where grants on the target \u0027"},{"line_number":66,"context_line":"                     \u0027inherit to its projects subtree, if applicable.\u0027),"},{"line_number":67,"context_line":"        operations\u003dlist_operations(resource_paths, [\u0027HEAD\u0027, \u0027GET\u0027])),"},{"line_number":68,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":69,"context_line":"        name\u003dbase.IDENTITY % \u0027list_grants\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_61510c0f","line":66,"updated":"2017-06-07 20:50:26.000000000","message":"nit: where grants on the target are inherited to all projects in the subtree, if applicable.","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"357262b0cc36dff9572c32e2f5748dfb766d2881","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                     \u0027target can be either a domain or a project. An actor \u0027"},{"line_number":64,"context_line":"                     \u0027can be either a user or a group. These terms also apply \u0027"},{"line_number":65,"context_line":"                     \u0027to the OS-INHERIT APIs, where grants on the target \u0027"},{"line_number":66,"context_line":"                     \u0027inherit to its projects subtree, if applicable.\u0027),"},{"line_number":67,"context_line":"        operations\u003dlist_operations(resource_paths, [\u0027HEAD\u0027, \u0027GET\u0027])),"},{"line_number":68,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":69,"context_line":"        name\u003dbase.IDENTITY % \u0027list_grants\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_cf521368","line":66,"in_reply_to":"bf091321_61510c0f","updated":"2017-06-09 00:54:25.000000000","message":"Done","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f963b8d74e40ce2b03f711ae9ef9bce82edf065d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                     \u0027can be either a domain or a project. An actor can be \u0027"},{"line_number":73,"context_line":"                     \u0027either a user or a group. For the OS-INHERIT APIs, it \u0027"},{"line_number":74,"context_line":"                     \u0027is possible to list inherited role grants for actors on \u0027"},{"line_number":75,"context_line":"                     \u0027domains, where grants inherit to all its projects.\u0027),"},{"line_number":76,"context_line":"        operations\u003dlist_grants_operations),"},{"line_number":77,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":78,"context_line":"        name\u003dbase.IDENTITY % \u0027create_grant\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_5e1ee570","line":75,"updated":"2017-06-07 20:50:26.000000000","message":"Is this only true for domains?","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"357262b0cc36dff9572c32e2f5748dfb766d2881","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                     \u0027can be either a domain or a project. An actor can be \u0027"},{"line_number":73,"context_line":"                     \u0027either a user or a group. For the OS-INHERIT APIs, it \u0027"},{"line_number":74,"context_line":"                     \u0027is possible to list inherited role grants for actors on \u0027"},{"line_number":75,"context_line":"                     \u0027domains, where grants inherit to all its projects.\u0027),"},{"line_number":76,"context_line":"        operations\u003dlist_grants_operations),"},{"line_number":77,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":78,"context_line":"        name\u003dbase.IDENTITY % \u0027create_grant\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_ef55d751","line":75,"in_reply_to":"bf091321_5e1ee570","updated":"2017-06-09 00:54:25.000000000","message":"In this case yes, there are not APIs for listing project inherited assignments :(\n\nThat\u0027s why I left that comment in L43","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f963b8d74e40ce2b03f711ae9ef9bce82edf065d","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                     \u0027target can be either a domain or a project. An actor \u0027"},{"line_number":82,"context_line":"                     \u0027can be either a user or a group. These terms also apply \u0027"},{"line_number":83,"context_line":"                     \u0027to the OS-INHERIT APIs, where grants on the target \u0027"},{"line_number":84,"context_line":"                     \u0027inherit to its projects subtree, if applicable.\u0027),"},{"line_number":85,"context_line":"        operations\u003dlist_operations(resource_paths, [\u0027PUT\u0027])),"},{"line_number":86,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":87,"context_line":"        name\u003dbase.IDENTITY % \u0027revoke_grant\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_4121689f","line":84,"updated":"2017-06-07 20:50:26.000000000","message":"nit: where grants on the target are inherited to all projects in the subtree, if applicable.","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"357262b0cc36dff9572c32e2f5748dfb766d2881","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                     \u0027target can be either a domain or a project. An actor \u0027"},{"line_number":82,"context_line":"                     \u0027can be either a user or a group. These terms also apply \u0027"},{"line_number":83,"context_line":"                     \u0027to the OS-INHERIT APIs, where grants on the target \u0027"},{"line_number":84,"context_line":"                     \u0027inherit to its projects subtree, if applicable.\u0027),"},{"line_number":85,"context_line":"        operations\u003dlist_operations(resource_paths, [\u0027PUT\u0027])),"},{"line_number":86,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":87,"context_line":"        name\u003dbase.IDENTITY % \u0027revoke_grant\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_af4fdfbb","line":84,"in_reply_to":"bf091321_4121689f","updated":"2017-06-09 00:54:25.000000000","message":"Done","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f963b8d74e40ce2b03f711ae9ef9bce82edf065d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                     \u0027target can be either a domain or a project. An actor \u0027"},{"line_number":91,"context_line":"                     \u0027can be either a user or a group. These terms also apply \u0027"},{"line_number":92,"context_line":"                     \u0027to the OS-INHERIT APIs, where grants on the target \u0027"},{"line_number":93,"context_line":"                     \u0027inherit to its projects subtree, if applicable. In that \u0027"},{"line_number":94,"context_line":"                     \u0027case, revoking the role grant in the target would \u0027"},{"line_number":95,"context_line":"                     \u0027remove the logical effect of inheriting it to the \u0027"},{"line_number":96,"context_line":"                     \u0027target\\\u0027s projects subtree.\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_e1651ce3","line":93,"updated":"2017-06-07 20:50:26.000000000","message":"nit: where grants on the target are inherited to all project in the subtree, if applicable.","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"357262b0cc36dff9572c32e2f5748dfb766d2881","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                     \u0027target can be either a domain or a project. An actor \u0027"},{"line_number":91,"context_line":"                     \u0027can be either a user or a group. These terms also apply \u0027"},{"line_number":92,"context_line":"                     \u0027to the OS-INHERIT APIs, where grants on the target \u0027"},{"line_number":93,"context_line":"                     \u0027inherit to its projects subtree, if applicable. In that \u0027"},{"line_number":94,"context_line":"                     \u0027case, revoking the role grant in the target would \u0027"},{"line_number":95,"context_line":"                     \u0027remove the logical effect of inheriting it to the \u0027"},{"line_number":96,"context_line":"                     \u0027target\\\u0027s projects subtree.\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf091321_8f4c1bc8","line":93,"in_reply_to":"bf091321_e1651ce3","updated":"2017-06-09 00:54:25.000000000","message":"Done","commit_id":"c779d258a624b991bc6fd05d4ee8ca7e0f7793f0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b1c568129b62c7b01e9389a0f43db4e969c684c2","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# NOTE(samueldmq): Unlike individual resource paths, collection"},{"line_number":52,"context_line":"# paths for the inherited grants do not contain a HEAD API"},{"line_number":53,"context_line":"list_grants_operations \u003d ("},{"line_number":54,"context_line":"    list_operations(collection_paths, [\u0027GET\u0027, \u0027HEAD\u0027]) +"},{"line_number":55,"context_line":"    list_operations(inherited_collection_paths, [\u0027GET\u0027]))"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_63afc094","line":52,"updated":"2017-06-20 21:53:04.000000000","message":"I\u0027ll have to update this when https://review.openstack.org/#/c/473912/2/keystone/assignment/routers.py merges","commit_id":"4994c8b88d99a257c979f515826004291cc97206"}]}
