)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6deb02c88b5e6c905b0aed5428aef9789ebf5b61","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Test Implied roles for groups"},{"line_number":15,"context_line":"add implied_roles entries to json home test"},{"line_number":16,"context_line":"Skip role inference when methods are unimplemented in the driver"},{"line_number":17,"context_line":"enable/disable via config (and tests)"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"implements: blueprint implied-roles"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"ba8a016a_eb478a75","line":17,"updated":"2015-11-20 14:16:43.000000000","message":"This looks to be big in a single change. From the list of things above, looks like it may easily be broken into smaller pieces.","commit_id":"f41aba5082bf3f44258dbabe582d8e04bcee9485"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implied Roles"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Includes:"},{"line_number":10,"context_line":"Migration for  roles"},{"line_number":11,"context_line":"driver and core changed for implied roles"},{"line_number":12,"context_line":"Add implied roles to project and domain tokens."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"3a7e1126_bab68a3b","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":8},"updated":"2015-12-17 09:43:52.000000000","message":"you can remove all of this, just describe what you\u0027re implementing for folks who don\u0027t know what the heck implied roles are","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a4dbc48359478c2fd0369526e859e985f6a63664","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implied Roles"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Includes:"},{"line_number":10,"context_line":"Migration for  roles"},{"line_number":11,"context_line":"driver and core changed for implied roles"},{"line_number":12,"context_line":"Add implied roles to project and domain tokens."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"3a7e1126_39c04be0","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":8},"in_reply_to":"3a7e1126_bab68a3b","updated":"2015-12-17 15:07:03.000000000","message":"These were origianlly separate commits, and people have asked for them to be split.  I listed the litany here to orient reviewers what to expect in this commit.  I\u0027d like to leave it.","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"5a7659936bfc3ec8a6f3281b23904e20b77c5d1b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implied Roles API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CRD for implied roles."},{"line_number":10,"context_line":"Iplied roles are expanded in token issue and validation responses."},{"line_number":11,"context_line":"Explicitly forbids creating a rule with admin as the implied role to"},{"line_number":12,"context_line":"  avoid escalation of privileges."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":61,"id":"7a5de9d1_c4db761a","line":9,"updated":"2016-01-27 22:33:09.000000000","message":"You should explicitly mention that Update is not supported. Otherwise folks will look and think CRD was just a typo.","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"5a7659936bfc3ec8a6f3281b23904e20b77c5d1b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implied Roles API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CRD for implied roles."},{"line_number":10,"context_line":"Iplied roles are expanded in token issue and validation responses."},{"line_number":11,"context_line":"Explicitly forbids creating a rule with admin as the implied role to"},{"line_number":12,"context_line":"  avoid escalation of privileges."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":61,"id":"7a5de9d1_84049e7e","line":10,"updated":"2016-01-27 22:33:09.000000000","message":"Typo Iplied should be Implied","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"aa988722003e4e03f236cea1e50d1278f3e13559","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implied Roles API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CRD for implied roles."},{"line_number":10,"context_line":"Iplied roles are expanded in token issue and validation responses."},{"line_number":11,"context_line":"Explicitly forbids creating a rule with admin as the implied role to"},{"line_number":12,"context_line":"  avoid escalation of privileges."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":69,"id":"7a5de9d1_4c8befc3","line":10,"updated":"2016-01-28 23:22:31.000000000","message":"s/Iplied/Implied/","commit_id":"bfc1c73640df92bed9bb9a4de11d891db75d0dd0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"eb11fdc7338c4d736dfb98f300410249ef9664c5","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implied Roles API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"CRD for implied roles."},{"line_number":10,"context_line":"Iplied roles are expanded in token issue and validation responses."},{"line_number":11,"context_line":"Explicitly forbids creating a rule with admin as the implied role to"},{"line_number":12,"context_line":"  avoid escalation of privileges."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"5a5ae5dd_c4bab36e","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":6},"updated":"2016-02-03 05:40:29.000000000","message":"Implied","commit_id":"e1b5751a4cd8e5cdbca8bf21f2a0263812d60cd0"}],"doc/source/policy_mapping.rst":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":80,"context_line":"identity:list_role_inference_rules                         GET /v3/role_inferences"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"identity:check_grant                                       GET `grant_resources`_"},{"line_number":84,"context_line":"identity:list_grants                                       GET `grant_collections`_"}],"source_content_type":"text/x-rst","patch_set":52,"id":"da6ed579_5c742fce","line":81,"updated":"2016-01-18 07:50:11.000000000","message":"miss `identity:check_implied_role` here.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9d259654f70924a6c22a8a8e5750d63484ec65b6","unresolved":false,"context_lines":[{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":80,"context_line":"identity:list_role_inference_rules                         GET /v3/role_inferences"},{"line_number":81,"context_line":"identity:check_implied_role                                  HEAD /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"identity:check_grant                                       GET `grant_resources`_"},{"line_number":84,"context_line":"identity:list_grants                                       GET `grant_collections`_"}],"source_content_type":"text/x-rst","patch_set":55,"id":"ba63e191_88f48587","line":81,"range":{"start_line":81,"start_character":59,"end_line":81,"end_character":61},"updated":"2016-01-19 21:46:35.000000000","message":"(nit) additional spaces ...","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6e9d4ac0370195b8ddddd4978e5f7c70277c52ab","unresolved":false,"context_lines":[{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":80,"context_line":"identity:list_role_inference_rules                         GET /v3/role_inferences"},{"line_number":81,"context_line":"identity:check_implied_role                                  HEAD /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"identity:check_grant                                       GET `grant_resources`_"},{"line_number":84,"context_line":"identity:list_grants                                       GET `grant_collections`_"}],"source_content_type":"text/x-rst","patch_set":55,"id":"9a68dd71_cee721ab","line":81,"range":{"start_line":81,"start_character":0,"end_line":81,"end_character":27},"updated":"2016-01-20 18:10:25.000000000","message":"don\u0027t think this one\u0027s in the API spec\n\nhttps://github.com/openstack/keystone-specs/blob/master/api/v3/identity-api-v3.rst\n\nWe\u0027ll need to amend the API spec or remove it here.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b88b73a05c7f864b68a07da4b38af16f81f82fb7","unresolved":false,"context_lines":[{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":80,"context_line":"identity:list_role_inference_rules                         GET /v3/role_inferences"},{"line_number":81,"context_line":"identity:check_implied_role                                  HEAD /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"identity:check_grant                                       GET `grant_resources`_"},{"line_number":84,"context_line":"identity:list_grants                                       GET `grant_collections`_"}],"source_content_type":"text/x-rst","patch_set":55,"id":"9a68dd71_5bcf5556","line":81,"range":{"start_line":81,"start_character":0,"end_line":81,"end_character":27},"in_reply_to":"9a68dd71_cee721ab","updated":"2016-01-22 03:05:17.000000000","message":"Better to add to the API spec./","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b88b73a05c7f864b68a07da4b38af16f81f82fb7","unresolved":false,"context_lines":[{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":80,"context_line":"identity:list_role_inference_rules                         GET /v3/role_inferences"},{"line_number":81,"context_line":"identity:check_implied_role                                  HEAD /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"identity:check_grant                                       GET `grant_resources`_"},{"line_number":84,"context_line":"identity:list_grants                                       GET `grant_collections`_"}],"source_content_type":"text/x-rst","patch_set":55,"id":"9a68dd71_9becedc8","line":81,"range":{"start_line":81,"start_character":59,"end_line":81,"end_character":61},"in_reply_to":"ba63e191_88f48587","updated":"2016-01-22 03:05:17.000000000","message":"Done","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9fefd2747be990116d920459a9036009d76ffa95","unresolved":false,"context_lines":[{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":80,"context_line":"identity:list_role_inference_rules                         GET /v3/role_inferences"},{"line_number":81,"context_line":"identity:check_implied_role                                HEAD /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"identity:check_grant                                       GET `grant_resources`_"},{"line_number":84,"context_line":"identity:list_grants                                       GET `grant_collections`_"}],"source_content_type":"text/x-rst","patch_set":61,"id":"7a5de9d1_df55831d","line":81,"range":{"start_line":81,"start_character":9,"end_line":81,"end_character":27},"updated":"2016-01-27 22:53:05.000000000","message":"is there a patch to amend the API spec for this new API?","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"4c788c02891329ebf13a76157a3ff4cc74414d1f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"identity:update_role                                       PATCH /v3/roles/{role_id}"},{"line_number":74,"context_line":"identity:delete_role                                       DELETE /v3/roles/{role_id}"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"identity:get_implied_role                                  GET /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":77,"context_line":"identity:list_implied_roles                                GET /v3/prior_role/{prior_role_id}/implies"},{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"}],"source_content_type":"text/x-rst","patch_set":68,"id":"7a5de9d1_52f5d080","line":76,"range":{"start_line":76,"start_character":67,"end_line":76,"end_character":77},"updated":"2016-01-28 20:12:16.000000000","message":"s/\\/piror_role\\/\\/role\\//g","commit_id":"0a94c2966b152cb8912357fc9ca4311730dbdcf2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c516ede03d6ed55662ecd07d78ea27e39bfe7c7d","unresolved":false,"context_lines":[{"line_number":73,"context_line":"identity:update_role                                       PATCH /v3/roles/{role_id}"},{"line_number":74,"context_line":"identity:delete_role                                       DELETE /v3/roles/{role_id}"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"identity:get_implied_role                                  GET /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":77,"context_line":"identity:list_implied_roles                                GET /v3/prior_role/{prior_role_id}/implies"},{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/prior_role/{prior_role_id}/implies/{implied_role_id}"}],"source_content_type":"text/x-rst","patch_set":68,"id":"7a5de9d1_e6351af7","line":76,"range":{"start_line":76,"start_character":67,"end_line":76,"end_character":77},"in_reply_to":"7a5de9d1_52f5d080","updated":"2016-01-28 21:44:27.000000000","message":"Done","commit_id":"0a94c2966b152cb8912357fc9ca4311730dbdcf2"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d9babcfd6ff56a740a86133ef88564ea8b21c1ac","unresolved":false,"context_lines":[{"line_number":73,"context_line":"identity:update_role                                       PATCH /v3/roles/{role_id}"},{"line_number":74,"context_line":"identity:delete_role                                       DELETE /v3/roles/{role_id}"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"identity:get_implied_role                                  GET /v3/role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":77,"context_line":"identity:list_implied_roles                                GET /v3/role/{prior_role_id}/implies"},{"line_number":78,"context_line":"identity:create_implied_role                               PUT /v3/role/{prior_role_id}/implies/{implied_role_id}"},{"line_number":79,"context_line":"identity:delete_implied_role                               DELETE /v3/role/{prior_role_id}/implies/{implied_role_id}"}],"source_content_type":"text/x-rst","patch_set":69,"id":"7a5de9d1_e71c3479","line":76,"range":{"start_line":76,"start_character":67,"end_line":76,"end_character":71},"updated":"2016-01-28 22:45:50.000000000","message":"These need to be updated to /roles/ too","commit_id":"bfc1c73640df92bed9bb9a4de11d891db75d0dd0"}],"etc/keystone.conf.sample":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6deb02c88b5e6c905b0aed5428aef9789ebf5b61","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"ba8a016a_4b57b626","updated":"2015-11-20 14:16:43.000000000","message":"No need to update this file manually anymore.","commit_id":"f41aba5082bf3f44258dbabe582d8e04bcee9485"}],"etc/policy.json":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    \"identity:create_implied_role\": \"rule:admin_required\","},{"line_number":82,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_required\","},{"line_number":83,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_required\","},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"identity:check_grant\": \"rule:admin_required\","},{"line_number":86,"context_line":"    \"identity:list_grants\": \"rule:admin_required\","},{"line_number":87,"context_line":"    \"identity:create_grant\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":52,"id":"da6ed579_bc49ab90","line":84,"updated":"2016-01-18 07:50:11.000000000","message":"miss `identity:check_implied_role` here.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"51d2530d4d761f033fb831ae9f66ca4afc52924c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    \"identity:create_implied_role\": \"rule:admin_required\","},{"line_number":82,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_required\","},{"line_number":83,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_required\","},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"identity:check_grant\": \"rule:admin_required\","},{"line_number":86,"context_line":"    \"identity:list_grants\": \"rule:admin_required\","},{"line_number":87,"context_line":"    \"identity:create_grant\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":52,"id":"da6ed579_9fc91daf","line":84,"in_reply_to":"da6ed579_bc49ab90","updated":"2016-01-18 20:38:12.000000000","message":"Done","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6e9d4ac0370195b8ddddd4978e5f7c70277c52ab","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    \"identity:create_implied_role\": \"rule:admin_required\","},{"line_number":82,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_required\","},{"line_number":83,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_required\","},{"line_number":84,"context_line":"    \"identity:check_implied_role\": \"rule:admin_required\","},{"line_number":85,"context_line":"    "},{"line_number":86,"context_line":"    \"identity:check_grant\": \"rule:admin_required\","},{"line_number":87,"context_line":"    \"identity:list_grants\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":55,"id":"9a68dd71_6ef9554d","line":84,"range":{"start_line":84,"start_character":5,"end_line":84,"end_character":56},"updated":"2016-01-20 18:10:25.000000000","message":"Not in the API spec\n\nhttps://github.com/openstack/keystone-specs/blob/master/api/v3/identity-api-v3.rst","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9d259654f70924a6c22a8a8e5750d63484ec65b6","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_required\","},{"line_number":83,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_required\","},{"line_number":84,"context_line":"    \"identity:check_implied_role\": \"rule:admin_required\","},{"line_number":85,"context_line":"    "},{"line_number":86,"context_line":"    \"identity:check_grant\": \"rule:admin_required\","},{"line_number":87,"context_line":"    \"identity:list_grants\": \"rule:admin_required\","},{"line_number":88,"context_line":"    \"identity:create_grant\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":55,"id":"ba63e191_883b2538","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":4},"updated":"2016-01-19 21:46:35.000000000","message":"Leading spaces","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b88b73a05c7f864b68a07da4b38af16f81f82fb7","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_required\","},{"line_number":83,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_required\","},{"line_number":84,"context_line":"    \"identity:check_implied_role\": \"rule:admin_required\","},{"line_number":85,"context_line":"    "},{"line_number":86,"context_line":"    \"identity:check_grant\": \"rule:admin_required\","},{"line_number":87,"context_line":"    \"identity:list_grants\": \"rule:admin_required\","},{"line_number":88,"context_line":"    \"identity:create_grant\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":55,"id":"9a68dd71_bb04517e","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":4},"in_reply_to":"ba63e191_883b2538","updated":"2016-01-22 03:05:17.000000000","message":"Done","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2289277e8c016f1865eab765144a5bf1c1713c61","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    \"identity:update_role\": \"rule:admin_required\","},{"line_number":77,"context_line":"    \"identity:delete_role\": \"rule:admin_required\","},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    \"identity:get_implied_role\": \"rule:admin_required\","},{"line_number":80,"context_line":"    \"identity:list_implied_roles\": \"rule:admin_required\","},{"line_number":81,"context_line":"    \"identity:create_implied_role\": \"rule:admin_required\","},{"line_number":82,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_required\","},{"line_number":83,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_required\","},{"line_number":84,"context_line":"    \"identity:check_implied_role\": \"rule:admin_required\","},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    \"identity:check_grant\": \"rule:admin_required\","},{"line_number":87,"context_line":"    \"identity:list_grants\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":60,"id":"9a68dd71_7ba12c93","line":84,"range":{"start_line":79,"start_character":0,"end_line":84,"end_character":57},"updated":"2016-01-26 05:04:13.000000000","message":"This is likely ok since the \"bad\" admin role check is no different than other priv. calls.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"}],"etc/policy.v3cloudsample.json":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":90,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_or_cloud_admin\","},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    \"domain_admin_for_grants\": \"rule:admin_required and (domain_id:%(domain_id)s or domain_id:%(target.project.domain_id)s)\","},{"line_number":93,"context_line":"    \"project_admin_for_grants\": \"rule:admin_required and project_id:%(project_id)s\","},{"line_number":94,"context_line":"    \"identity:check_grant\": \"rule:cloud_admin or rule:domain_admin_for_grants or rule:project_admin_for_grants\","}],"source_content_type":"application/json","patch_set":52,"id":"da6ed579_1c7eb7ae","line":91,"updated":"2016-01-18 07:50:11.000000000","message":"miss `identity:check_implied_role` here.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"51d2530d4d761f033fb831ae9f66ca4afc52924c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":90,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_or_cloud_admin\","},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    \"domain_admin_for_grants\": \"rule:admin_required and (domain_id:%(domain_id)s or domain_id:%(target.project.domain_id)s)\","},{"line_number":93,"context_line":"    \"project_admin_for_grants\": \"rule:admin_required and project_id:%(project_id)s\","},{"line_number":94,"context_line":"    \"identity:check_grant\": \"rule:cloud_admin or rule:domain_admin_for_grants or rule:project_admin_for_grants\","}],"source_content_type":"application/json","patch_set":52,"id":"da6ed579_9f259d5d","line":91,"in_reply_to":"da6ed579_1c7eb7ae","updated":"2016-01-18 20:38:12.000000000","message":"Done","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6e9d4ac0370195b8ddddd4978e5f7c70277c52ab","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":90,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_or_cloud_admin\","},{"line_number":91,"context_line":"    \"identity:check_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    \"domain_admin_for_grants\": \"rule:admin_required and (domain_id:%(domain_id)s or domain_id:%(target.project.domain_id)s)\","},{"line_number":94,"context_line":"    \"project_admin_for_grants\": \"rule:admin_required and project_id:%(project_id)s\","}],"source_content_type":"application/json","patch_set":55,"id":"9a68dd71_8e8929cd","line":91,"range":{"start_line":91,"start_character":4,"end_line":91,"end_character":63},"updated":"2016-01-20 18:10:25.000000000","message":"Not in the API spec\n\nhttps://github.com/openstack/keystone-specs/blob/master/api/v3/identity-api-v3.rst","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"6adbda55153466b9210e44405743cc4750a24609","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    \"identity:get_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":87,"context_line":"    \"identity:list_implied_roles\": \"rule:admin_or_cloud_admin\","},{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_or_cloud_admin\","}],"source_content_type":"application/json","patch_set":60,"id":"9a68dd71_bbac849f","line":86,"updated":"2016-01-26 20:58:41.000000000","message":"make all these admin only to start","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2289277e8c016f1865eab765144a5bf1c1713c61","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    \"identity:get_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":87,"context_line":"    \"identity:list_implied_roles\": \"rule:admin_or_cloud_admin\","},{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":90,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_or_cloud_admin\","},{"line_number":91,"context_line":"    \"identity:check_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    \"domain_admin_for_grants\": \"rule:admin_required and (domain_id:%(domain_id)s or domain_id:%(target.project.domain_id)s)\","},{"line_number":94,"context_line":"    \"project_admin_for_grants\": \"rule:admin_required and project_id:%(project_id)s\","}],"source_content_type":"application/json","patch_set":60,"id":"9a68dd71_7b7a8c25","line":91,"range":{"start_line":86,"start_character":0,"end_line":91,"end_character":63},"updated":"2016-01-26 05:04:13.000000000","message":"This is too trusting and can cause security escalations. There is no protection that prevents an admin (non-cloud admin but generic admin) from creating an implied role that would get her the cloud_admin role.\n\nUsers should not be able to create implied/modified implied roles one does not have unless is cloud_admin? Not sure how to make that happen.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"fe4639926162987b23823d2a5b01ed40f3fbf391","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    \"identity:get_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":87,"context_line":"    \"identity:list_implied_roles\": \"rule:admin_or_cloud_admin\","},{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":90,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_or_cloud_admin\","},{"line_number":91,"context_line":"    \"identity:check_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    \"domain_admin_for_grants\": \"rule:admin_required and (domain_id:%(domain_id)s or domain_id:%(target.project.domain_id)s)\","},{"line_number":94,"context_line":"    \"project_admin_for_grants\": \"rule:admin_required and project_id:%(project_id)s\","}],"source_content_type":"application/json","patch_set":60,"id":"9a68dd71_36f8a649","line":91,"range":{"start_line":86,"start_character":0,"end_line":91,"end_character":63},"in_reply_to":"9a68dd71_7b7a8c25","updated":"2016-01-26 11:51:02.000000000","message":"++ this is indeed a security issue.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"6adbda55153466b9210e44405743cc4750a24609","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    \"identity:get_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":87,"context_line":"    \"identity:list_implied_roles\": \"rule:admin_or_cloud_admin\","},{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":90,"context_line":"    \"identity:list_role_inference_rules\": \"rule:admin_or_cloud_admin\","},{"line_number":91,"context_line":"    \"identity:check_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    \"domain_admin_for_grants\": \"rule:admin_required and (domain_id:%(domain_id)s or domain_id:%(target.project.domain_id)s)\","},{"line_number":94,"context_line":"    \"project_admin_for_grants\": \"rule:admin_required and project_id:%(project_id)s\","}],"source_content_type":"application/json","patch_set":60,"id":"9a68dd71_bbba1609","line":91,"range":{"start_line":86,"start_character":0,"end_line":91,"end_character":63},"in_reply_to":"9a68dd71_7b7a8c25","updated":"2016-01-26 20:58:41.000000000","message":"Done.  Techincally, only the","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"145eaab44b49e82b82214560a7afccb1501e4cc2","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    \"identity:get_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":87,"context_line":"    \"identity:list_implied_roles\": \"rule:admin_or_cloud_admin\","},{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_required\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":61,"id":"7a5de9d1_116eafc9","line":86,"updated":"2016-01-27 22:24:23.000000000","message":"admin_or_cloud_admin is being removed via https://review.openstack.org/#/c/273193","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f8981422b6eeb7b9138c36227e1276b2c8ce3299","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    \"identity:get_implied_role\": \"rule:admin_or_cloud_admin\","},{"line_number":87,"context_line":"    \"identity:list_implied_roles\": \"rule:admin_or_cloud_admin\","},{"line_number":88,"context_line":"    \"identity:create_implied_role\": \"rule:admin_required\","},{"line_number":89,"context_line":"    \"identity:delete_implied_role\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":61,"id":"7a5de9d1_6aee0824","line":86,"in_reply_to":"7a5de9d1_116eafc9","updated":"2016-01-28 03:06:13.000000000","message":"I\u0027ll rebase once that merges","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c13547d7994e25435044cfaa569491efb1ffbbd4","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    \"identity:ec2_create_credential\": \"rule:admin_or_cloud_admin or rule:owner\","},{"line_number":78,"context_line":"    \"identity:ec2_delete_credential\": \"rule:admin_or_cloud_admin or (rule:owner and user_id:%(target.credential.user_id)s)\","},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    \"identity:get_role\": \"rule:admin_or_cloud_admin\","},{"line_number":81,"context_line":"    \"identity:list_roles\": \"rule:admin_or_cloud_admin\","},{"line_number":82,"context_line":"    \"identity:create_role\": \"rule:cloud_admin\","},{"line_number":83,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","}],"source_content_type":"application/json","patch_set":66,"id":"7a5de9d1_f7607137","line":81,"range":{"start_line":80,"start_character":4,"end_line":81,"end_character":53},"updated":"2016-01-28 18:45:48.000000000","message":"this doesn\u0027t match current master - I think you need to rebase...","commit_id":"8f6100798c5dfa7aedc63099a617e0fa293245b5"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"08fcabe29b4673d66fbb4a7992f480836d675543","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    \"identity:ec2_create_credential\": \"rule:admin_or_cloud_admin or rule:owner\","},{"line_number":78,"context_line":"    \"identity:ec2_delete_credential\": \"rule:admin_or_cloud_admin or (rule:owner and user_id:%(target.credential.user_id)s)\","},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    \"identity:get_role\": \"rule:admin_or_cloud_admin\","},{"line_number":81,"context_line":"    \"identity:list_roles\": \"rule:admin_or_cloud_admin\","},{"line_number":82,"context_line":"    \"identity:create_role\": \"rule:cloud_admin\","},{"line_number":83,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","}],"source_content_type":"application/json","patch_set":66,"id":"7a5de9d1_adf38809","line":81,"range":{"start_line":80,"start_character":4,"end_line":81,"end_character":53},"in_reply_to":"7a5de9d1_f7607137","updated":"2016-01-28 19:11:16.000000000","message":"It is what is there now, and, since it is not changed by this patch, should rebase cleanly if master does change.","commit_id":"8f6100798c5dfa7aedc63099a617e0fa293245b5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"4c788c02891329ebf13a76157a3ff4cc74414d1f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":83,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"identity:get_implied_role\": \"\","},{"line_number":86,"context_line":"    \"identity:list_implied_roles\": \"\","},{"line_number":87,"context_line":"    \"identity:create_implied_role\": \"rule:cloud_admin\","},{"line_number":88,"context_line":"    \"identity:delete_implied_role\": \"rule:cloud_admin\","}],"source_content_type":"application/json","patch_set":68,"id":"7a5de9d1_d216a0a6","line":85,"range":{"start_line":85,"start_character":33,"end_line":85,"end_character":36},"updated":"2016-01-28 20:12:16.000000000","message":"why are these unprotected?","commit_id":"0a94c2966b152cb8912357fc9ca4311730dbdcf2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b80540d8d67dddd3942abc7a08c854a7f7ea28b4","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":83,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"identity:get_implied_role\": \"\","},{"line_number":86,"context_line":"    \"identity:list_implied_roles\": \"\","},{"line_number":87,"context_line":"    \"identity:create_implied_role\": \"rule:cloud_admin\","},{"line_number":88,"context_line":"    \"identity:delete_implied_role\": \"rule:cloud_admin\","}],"source_content_type":"application/json","patch_set":68,"id":"7a5de9d1_e7baf4bf","line":85,"range":{"start_line":85,"start_character":33,"end_line":85,"end_character":36},"in_reply_to":"7a5de9d1_a6d5e2b9","updated":"2016-01-28 22:40:53.000000000","message":"I think the point is that if get_role is admin_required, then it seems odd that this is not the same....","commit_id":"0a94c2966b152cb8912357fc9ca4311730dbdcf2"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c516ede03d6ed55662ecd07d78ea27e39bfe7c7d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":83,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"identity:get_implied_role\": \"\","},{"line_number":86,"context_line":"    \"identity:list_implied_roles\": \"\","},{"line_number":87,"context_line":"    \"identity:create_implied_role\": \"rule:cloud_admin\","},{"line_number":88,"context_line":"    \"identity:delete_implied_role\": \"rule:cloud_admin\","}],"source_content_type":"application/json","patch_set":68,"id":"7a5de9d1_a6d5e2b9","line":85,"range":{"start_line":85,"start_character":33,"end_line":85,"end_character":36},"in_reply_to":"7a5de9d1_d216a0a6","updated":"2016-01-28 21:44:27.000000000","message":"The infomration they provide is avaialble to any user:  Only making changes of state to the rules needs to be protected.  If user gets a token, and there is an imlied role in there, they will see the rules anyway, so there is no reason to treat them as secrets.","commit_id":"0a94c2966b152cb8912357fc9ca4311730dbdcf2"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"aa988722003e4e03f236cea1e50d1278f3e13559","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":83,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"identity:get_implied_role\": \"\","},{"line_number":86,"context_line":"    \"identity:list_implied_roles\": \"\","},{"line_number":87,"context_line":"    \"identity:create_implied_role\": \"rule:cloud_admin\","},{"line_number":88,"context_line":"    \"identity:delete_implied_role\": \"rule:cloud_admin\","}],"source_content_type":"application/json","patch_set":69,"id":"7a5de9d1_0c7977f6","line":85,"updated":"2016-01-28 23:22:31.000000000","message":"get_role and list_roles (above) are restricted to admins. If you don\u0027t restrict get_implied_role, list_implied_roles,  list_role_inference_rules, and check_implied_role to admins as well, then you\u0027ve given non-admins a way to bypass the get_role and list_roles checks to get role information.\n\nIt\u0027s also inconsistent with the other policy.json file in this patch.\n\nIf we\u0027re sure we want to let anyone query role information, then we should open that up for get_role and list_roles as well. One way or the other, these need to be consistent.","commit_id":"bfc1c73640df92bed9bb9a4de11d891db75d0dd0"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5d6a859e6dba53d9649f123eb2267469e9c45dd0","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    \"identity:update_role\": \"rule:cloud_admin\","},{"line_number":83,"context_line":"    \"identity:delete_role\": \"rule:cloud_admin\","},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    \"identity:get_implied_role\": \"\","},{"line_number":86,"context_line":"    \"identity:list_implied_roles\": \"\","},{"line_number":87,"context_line":"    \"identity:create_implied_role\": \"rule:cloud_admin\","},{"line_number":88,"context_line":"    \"identity:delete_implied_role\": \"rule:cloud_admin\","}],"source_content_type":"application/json","patch_set":72,"id":"7a5de9d1_0a736d16","line":85,"updated":"2016-01-29 16:46:40.000000000","message":"changing due to consistency complaint","commit_id":"09b78428e8d9b7292812c78b9501688455a3a6b6"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"863b6b3d36888575be8b80d027d9f1516e4e39e2","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 Role CRUD APIs.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"},{"line_number":336,"context_line":"    member_name \u003d \u0027implied_role\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_daa934e1","line":333,"updated":"2015-11-07 03:13:03.000000000","message":"update this docstring, it\u0027s copy pasta","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c478206530570082fe3837b6056e23aa1447161d","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 Role CRUD APIs.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"},{"line_number":336,"context_line":"    member_name \u003d \u0027implied_role\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_c2ff0233","line":333,"in_reply_to":"da85f559_daa934e1","updated":"2015-11-18 03:00:52.000000000","message":"Done","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"863b6b3d36888575be8b80d027d9f1516e4e39e2","unresolved":false,"context_lines":[{"line_number":347,"context_line":"    def list_implied_roles(self, context, prior_role_id):"},{"line_number":348,"context_line":"        ref \u003d self.role_api.list_implied_roles(prior_role_id)"},{"line_number":349,"context_line":"        implied_roles \u003d [r[\u0027implied_role_id\u0027] for r in ref]"},{"line_number":350,"context_line":"        results \u003d {\u0027prior_role_id\u0027: prior_role_id,"},{"line_number":351,"context_line":"                   \u0027implied_roles\u0027: implied_roles}"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        return results"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_1aa01cf4","line":350,"updated":"2015-11-07 03:13:03.000000000","message":"list returning a dict? that seems wrong","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c478206530570082fe3837b6056e23aa1447161d","unresolved":false,"context_lines":[{"line_number":347,"context_line":"    def list_implied_roles(self, context, prior_role_id):"},{"line_number":348,"context_line":"        ref \u003d self.role_api.list_implied_roles(prior_role_id)"},{"line_number":349,"context_line":"        implied_roles \u003d [r[\u0027implied_role_id\u0027] for r in ref]"},{"line_number":350,"context_line":"        results \u003d {\u0027prior_role_id\u0027: prior_role_id,"},{"line_number":351,"context_line":"                   \u0027implied_roles\u0027: implied_roles}"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        return results"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_82f9fa4f","line":350,"in_reply_to":"da85f559_1aa01cf4","updated":"2015-11-18 03:00:52.000000000","message":"Not really.  It is a list, just the list is not the top object in the dictionary.","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6deb02c88b5e6c905b0aed5428aef9789ebf5b61","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_a60f772d","line":332,"updated":"2015-11-20 14:16:43.000000000","message":"Aren\u0027t driver versions independent from API version ?\n\ne.g we have role and assingment drivers v8, while we have v3 API.\n\nIn this case, why don\u0027t we start with v1 ?","commit_id":"f41aba5082bf3f44258dbabe582d8e04bcee9485"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"9b87b00d100c81580e4848bbab4ad25ba114da7b","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_42622918","line":332,"in_reply_to":"ba8a016a_a60f772d","updated":"2015-11-20 18:36:27.000000000","message":"V3 of the Keystone API.  Not of the controller.","commit_id":"f41aba5082bf3f44258dbabe582d8e04bcee9485"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"},{"line_number":336,"context_line":"    member_name \u003d \u0027implied_role\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_6aa4d756","line":333,"range":{"start_line":333,"start_character":14,"end_line":333,"end_character":26},"updated":"2015-12-17 09:43:52.000000000","message":"missing GET, to retrieve a single implied role?\n\nhttp://specs.openstack.org/openstack/keystone-specs/api/v3/identity-api-v3.html#get-role-inference-rule","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a4dbc48359478c2fd0369526e859e985f6a63664","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"},{"line_number":336,"context_line":"    member_name \u003d \u0027implied_role\u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_6b1efa64","line":333,"range":{"start_line":333,"start_character":14,"end_line":333,"end_character":26},"in_reply_to":"3a7e1126_6aa4d756","updated":"2015-12-17 15:07:03.000000000","message":"I was origianlly going to skip it, as there does not seem to be a way to get a single inference rule, as the rules are identified by a composite key.  In other  words, to get a single rule, you need to know all the data about that rule anyway.\n\nUpon reflection, I think we do need it. The GET can be used to confirm a single inference rule.","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e8e69c8aab217c0e3101126ced30631901cc02f1","unresolved":false,"context_lines":[{"line_number":329,"context_line":""},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"@dependency.requires(\u0027role_api\u0027)"},{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a7b0d38_443f2f87","line":332,"range":{"start_line":332,"start_character":6,"end_line":332,"end_character":20},"updated":"2015-12-27 19:00:21.000000000","message":"In general we tend to make these class names singular (e.g. RoleV3), so maybe this should be: ImpliedRoleV3 ?","commit_id":"3fe3ea8c4764508fda261e87bb312b69ae063878"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"400e9c2ea6318966f67ce76c44965a446699d0b8","unresolved":false,"context_lines":[{"line_number":336,"context_line":"    member_name \u003d \u0027implied_role\u0027"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _add_self_referential_link(self, context, ref):"},{"line_number":339,"context_line":"        ref.setdefault(\u0027links\u0027, {})"},{"line_number":340,"context_line":"        ref[\u0027links\u0027][\u0027self\u0027] \u003d ("},{"line_number":341,"context_line":"            self.base_url(context) + \u0027/\u0027 + ref[\u0027prior_role_id\u0027])"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-python","patch_set":43,"id":"da6ed579_e67465fe","line":339,"updated":"2016-01-12 21:20:41.000000000","message":"(nit) you could say \"links \u003d ref.setdefault(\u0027links\u0027, {})\" to make the next line shorter.","commit_id":"3d8069a01d533f27ebc3b5b01887f90adf74f06f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"400e9c2ea6318966f67ce76c44965a446699d0b8","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        template \u003d \"http://identity:35357/v3/roles/%s\""},{"line_number":379,"context_line":"        for ref in refs:"},{"line_number":380,"context_line":"            implied_role_id \u003d ref[\u0027implied_role_id\u0027]"},{"line_number":381,"context_line":"            implied \u003d rules.get(ref[\u0027prior_role_id\u0027], [])"},{"line_number":382,"context_line":"            implied.append("},{"line_number":383,"context_line":"                {"},{"line_number":384,"context_line":"                    \"id\": implied_role_id,"}],"source_content_type":"text/x-python","patch_set":43,"id":"da6ed579_c62041fa","line":381,"updated":"2016-01-12 21:20:41.000000000","message":"(nit) you could use setdefault here like you did in _add_self_referential_link to avoid line 391 entirely.","commit_id":"3d8069a01d533f27ebc3b5b01887f90adf74f06f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"400e9c2ea6318966f67ce76c44965a446699d0b8","unresolved":false,"context_lines":[{"line_number":391,"context_line":"            rules[ref[\u0027prior_role_id\u0027]] \u003d implied"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        inferences \u003d []"},{"line_number":394,"context_line":"        for prior_id, implied in rules.iteritems():"},{"line_number":395,"context_line":"            inferences.append({"},{"line_number":396,"context_line":"                \"prior_role\": {"},{"line_number":397,"context_line":"                    \"id\": prior_id,"}],"source_content_type":"text/x-python","patch_set":43,"id":"da6ed579_0655f94e","line":394,"updated":"2016-01-12 21:20:41.000000000","message":"Instead of iteritems use items unless you really have a lots of keys (hundreds?)","commit_id":"3d8069a01d533f27ebc3b5b01887f90adf74f06f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":343,"context_line":"    def get_implied_role(self, context, prior_role_id, implied_role_id):"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        ref \u003d self.role_api.get_implied_role(prior_role_id, implied_role_id)"},{"line_number":346,"context_line":"        self._add_self_referential_link(context, ref)"},{"line_number":347,"context_line":"        return ref"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    @controller.protected()"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_796d85cb","line":346,"range":{"start_line":346,"start_character":8,"end_line":346,"end_character":53},"updated":"2016-01-18 07:50:11.000000000","message":"change this to:\n          return ImpliedRolesV3.wrap_member(\n            context, ref)\n\nfor consistency, and help to avoid the calling of the private method from V3Controller.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6e9d4ac0370195b8ddddd4978e5f7c70277c52ab","unresolved":false,"context_lines":[{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"},{"line_number":336,"context_line":"    member_name \u003d \u0027implied_role\u0027"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _add_self_referential_link(self, context, ref):"},{"line_number":339,"context_line":"        links \u003d ref.setdefault(\u0027links\u0027, {})"}],"source_content_type":"text/x-python","patch_set":55,"id":"9a68dd71_c241353b","line":336,"range":{"start_line":335,"start_character":4,"end_line":336,"end_character":32},"updated":"2016-01-20 18:10:25.000000000","message":"These are used to build the \u0027links\u0027. I suspect you\u0027ll have to manipulate them individually as your links various. i.e. your collection_name would be just \u0027role_inference\u0027.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b88b73a05c7f864b68a07da4b38af16f81f82fb7","unresolved":false,"context_lines":[{"line_number":332,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":333,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    collection_name \u003d \u0027implied_roles\u0027"},{"line_number":336,"context_line":"    member_name \u003d \u0027implied_role\u0027"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _add_self_referential_link(self, context, ref):"},{"line_number":339,"context_line":"        links \u003d ref.setdefault(\u0027links\u0027, {})"}],"source_content_type":"text/x-python","patch_set":55,"id":"9a68dd71_4b92f958","line":336,"range":{"start_line":335,"start_character":4,"end_line":336,"end_character":32},"in_reply_to":"9a68dd71_c241353b","updated":"2016-01-22 03:05:17.000000000","message":"Done","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9d259654f70924a6c22a8a8e5750d63484ec65b6","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _add_self_referential_link(self, context, ref):"},{"line_number":339,"context_line":"        links \u003d ref.setdefault(\u0027links\u0027, {})"},{"line_number":340,"context_line":"        links[\u0027self\u0027] \u003d self.base_url(context) + \u0027/\u0027 + ref[\u0027prior_role_id\u0027]"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    @controller.protected()"},{"line_number":343,"context_line":"    def get_implied_role(self, context, prior_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_88224500","line":340,"updated":"2016-01-19 21:46:35.000000000","message":"Looking at base_url method [1], this is going to be:\n\n    endpoint + \"/v3/implied_roles/\" + ref[\u0027prior_role_id\u0027]\n\nWhich doesn\u0027t point to a valid implied role. Theses links are intended to be valid so that a client may use it.\n\n[1] https://github.com/openstack/keystone/blob/bc483fd/keystone/common/controller.py#L417-L423","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6e9d4ac0370195b8ddddd4978e5f7c70277c52ab","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _add_self_referential_link(self, context, ref):"},{"line_number":339,"context_line":"        links \u003d ref.setdefault(\u0027links\u0027, {})"},{"line_number":340,"context_line":"        links[\u0027self\u0027] \u003d self.base_url(context) + \u0027/\u0027 + ref[\u0027prior_role_id\u0027]"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    @controller.protected()"},{"line_number":343,"context_line":"    def get_implied_role(self, context, prior_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":55,"id":"9a68dd71_a25f610d","line":340,"in_reply_to":"ba63e191_7fa45ea5","updated":"2016-01-20 18:10:25.000000000","message":"++","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _add_self_referential_link(self, context, ref):"},{"line_number":339,"context_line":"        links \u003d ref.setdefault(\u0027links\u0027, {})"},{"line_number":340,"context_line":"        links[\u0027self\u0027] \u003d self.base_url(context) + \u0027/\u0027 + ref[\u0027prior_role_id\u0027]"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    @controller.protected()"},{"line_number":343,"context_line":"    def get_implied_role(self, context, prior_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_7fa45ea5","line":340,"in_reply_to":"ba63e191_88224500","updated":"2016-01-20 01:22:02.000000000","message":"++ \n\nThis is not being called because of the get_head_action problem I mention in routers. If you fix that you notice that this is supposed to be a classmethod and you get unbound method _add_self_referential_link() must be called with ImpliedRolesV3 instance as first argument\n\nfixing both of these samuel is correct the link points to a self with only one url, not the two expected from get_implied_roles \n\nAlso it returns only the ids NOT the full body as per the spec: https://github.com/openstack/keystone-specs/blob/master/api/v3/identity-api-v3.rst#get-role-inference-rule","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":343,"context_line":"    def get_implied_role(self, context, prior_role_id, implied_role_id):"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        ref \u003d self.role_api.get_implied_role(prior_role_id, implied_role_id)"},{"line_number":346,"context_line":"        return ImpliedRolesV3.wrap_member(context, ref)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    @controller.protected()"},{"line_number":349,"context_line":"    def check_implied_role(self, context, prior_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_cce84a7f","line":346,"updated":"2016-01-20 01:22:02.000000000","message":"self?","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    @controller.protected()"},{"line_number":353,"context_line":"    def create_implied_role(self, context, prior_role_id, implied_role_id):"},{"line_number":354,"context_line":"        self.role_api.create_implied_role(prior_role_id, implied_role_id)"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    @controller.protected()"},{"line_number":357,"context_line":"    def delete_implied_role(self, context, prior_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_9f1cb214","line":354,"range":{"start_line":354,"start_character":22,"end_line":354,"end_character":41},"updated":"2016-01-20 01:22:02.000000000","message":"the spec says this returns data: https://github.com/openstack/keystone-specs/blob/master/api/v3/identity-api-v3.rst#create-role-inference-rule","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":362,"context_line":"        ref \u003d self.role_api.list_implied_roles(prior_role_id)"},{"line_number":363,"context_line":"        implied_roles \u003d [r[\u0027implied_role_id\u0027] for r in ref]"},{"line_number":364,"context_line":"        results \u003d {\u0027prior_role_id\u0027: prior_role_id,"},{"line_number":365,"context_line":"                   \u0027implied_roles\u0027: implied_roles}"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"        return results"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_bf41760d","line":365,"range":{"start_line":365,"start_character":20,"end_line":365,"end_character":33},"updated":"2016-01-20 01:22:02.000000000","message":"this does not wrap the response as specified at https://github.com/openstack/keystone-specs/blob/master/api/v3/identity-api-v3.rst#list-implied-roles-for-role nor does it include the role information as per spec and per list_role_inference_rules","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9d259654f70924a6c22a8a8e5750d63484ec65b6","unresolved":false,"context_lines":[{"line_number":373,"context_line":"                     for role_ref in self.role_api.list_roles()}"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        rules \u003d dict()"},{"line_number":376,"context_line":"        template \u003d \u0027http://identity:35357/v3/roles/%s\u0027"},{"line_number":377,"context_line":"        for ref in refs:"},{"line_number":378,"context_line":"            implied_role_id \u003d ref[\u0027implied_role_id\u0027]"},{"line_number":379,"context_line":"            implied \u003d rules.get(ref[\u0027prior_role_id\u0027], [])"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_68035143","line":376,"range":{"start_line":376,"start_character":8,"end_line":376,"end_character":16},"updated":"2016-01-19 21:46:35.000000000","message":"See base_url to see how endpoint url is defined ... I don\u0027t believe we want this hardcoded this way\n\nhttps://github.com/openstack/keystone/blob/bc483fd/keystone/common/controller.py#L417-L423","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":373,"context_line":"                     for role_ref in self.role_api.list_roles()}"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        rules \u003d dict()"},{"line_number":376,"context_line":"        template \u003d \u0027http://identity:35357/v3/roles/%s\u0027"},{"line_number":377,"context_line":"        for ref in refs:"},{"line_number":378,"context_line":"            implied_role_id \u003d ref[\u0027implied_role_id\u0027]"},{"line_number":379,"context_line":"            implied \u003d rules.get(ref[\u0027prior_role_id\u0027], [])"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_eca2ee4a","line":376,"range":{"start_line":376,"start_character":8,"end_line":376,"end_character":16},"in_reply_to":"ba63e191_68035143","updated":"2016-01-20 01:22:02.000000000","message":"agreed, why did you do it this way when you use base_url above?","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"806edd49ec858970d68584a10ff9da9d48c1c48a","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        response \u003d {"},{"line_number":346,"context_line":"            \"role_inference\": {"},{"line_number":347,"context_line":"                \"prior_role\": {"},{"line_number":348,"context_line":"                    \"id\": prior_id,"},{"line_number":349,"context_line":"                    \"links\": {"},{"line_number":350,"context_line":"                        \"self\": endpoint + \"/v3/roles/\" + prior_id"},{"line_number":351,"context_line":"                    },"},{"line_number":352,"context_line":"                    \"name\": prior_role[\u0027name\u0027]"},{"line_number":353,"context_line":"                },"},{"line_number":354,"context_line":"            }"},{"line_number":355,"context_line":"        }"},{"line_number":356,"context_line":"        return response"}],"source_content_type":"text/x-python","patch_set":58,"id":"9a68dd71_7360d401","line":353,"range":{"start_line":348,"start_character":0,"end_line":353,"end_character":18},"updated":"2016-01-22 22:14:38.000000000","message":"Although I\u0027m Ok with it as it as, you might consider this block of code (which is repeated twice more below) as something to break out into maybe _populate_role_info(role)....","commit_id":"b5439dd16a60d9f12dfcaa88494037fd4bd07994"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"fe4639926162987b23823d2a5b01ed40f3fbf391","unresolved":false,"context_lines":[{"line_number":333,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":334,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    @classmethod"},{"line_number":337,"context_line":"    def _add_role_link(cls, context, ref):"},{"line_number":338,"context_line":"        links \u003d ref.setdefault(\u0027links\u0027, {})"},{"line_number":339,"context_line":"        endpoint \u003d super(controller.V3Controller, cls).base_url("},{"line_number":340,"context_line":"            context, \u0027public\u0027)"},{"line_number":341,"context_line":"        links[\u0027role\u0027] \u003d endpoint + \u0027/roles/\u0027 + ref[\u0027prior_role_id\u0027]"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _populate_prior_role_response(self, endpoint, prior_id):"},{"line_number":344,"context_line":"        prior_role \u003d self.role_api.get_role(prior_id)"}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_211ce269","line":341,"range":{"start_line":336,"start_character":0,"end_line":341,"end_character":67},"updated":"2016-01-26 11:51:02.000000000","message":"this method doesn\u0027t look like is used anywhere, this is the only place I can grep out this method.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"6adbda55153466b9210e44405743cc4750a24609","unresolved":false,"context_lines":[{"line_number":333,"context_line":"class ImpliedRolesV3(controller.V3Controller):"},{"line_number":334,"context_line":"    \"\"\"The V3 ImpliedRoles CRD APIs.  There is no Update.\"\"\""},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    @classmethod"},{"line_number":337,"context_line":"    def _add_role_link(cls, context, ref):"},{"line_number":338,"context_line":"        links \u003d ref.setdefault(\u0027links\u0027, {})"},{"line_number":339,"context_line":"        endpoint \u003d super(controller.V3Controller, cls).base_url("},{"line_number":340,"context_line":"            context, \u0027public\u0027)"},{"line_number":341,"context_line":"        links[\u0027role\u0027] \u003d endpoint + \u0027/roles/\u0027 + ref[\u0027prior_role_id\u0027]"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def _populate_prior_role_response(self, endpoint, prior_id):"},{"line_number":344,"context_line":"        prior_role \u003d self.role_api.get_role(prior_id)"}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_76783590","line":341,"range":{"start_line":336,"start_character":0,"end_line":341,"end_character":67},"in_reply_to":"9a68dd71_211ce269","updated":"2016-01-26 20:58:41.000000000","message":"yep, vestige. gone","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"fe4639926162987b23823d2a5b01ed40f3fbf391","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        response \u003d self._populate_prior_role_response(endpoint, prior_id)"},{"line_number":361,"context_line":"        response[\"role_inference\"][\u0027implies\u0027] \u003d []"},{"line_number":362,"context_line":"        for implied_id in implied_ids:"},{"line_number":363,"context_line":"            implied_role \u003d self.role_api.get_role(implied_id)"},{"line_number":364,"context_line":"            implied_response \u003d {"},{"line_number":365,"context_line":"                \"id\": implied_id,"},{"line_number":366,"context_line":"                \"links\": {"},{"line_number":367,"context_line":"                    \"self\": endpoint + \"/v3/roles/\" + implied_id"},{"line_number":368,"context_line":"                },"},{"line_number":369,"context_line":"                \"name\": implied_role[\u0027name\u0027]"},{"line_number":370,"context_line":"            }"},{"line_number":371,"context_line":"            response[\"role_inference\"][\u0027implies\u0027].append(implied_response)"},{"line_number":372,"context_line":"        return response"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def _populate_implied_role_response(self, endpoint, prior_id, implied_id):"}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_01f2fe6f","line":371,"range":{"start_line":363,"start_character":0,"end_line":371,"end_character":74},"updated":"2016-01-26 11:51:02.000000000","message":"maybe call _populate_implied_role_response(self, endpoint, prior_id, implied_id) instead? good as it is.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2289277e8c016f1865eab765144a5bf1c1713c61","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        return results"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    @controller.protected()"},{"line_number":427,"context_line":"    def list_role_inference_rules(self, context):"},{"line_number":428,"context_line":"        refs \u003d self.role_api.list_role_inference_rules()"},{"line_number":429,"context_line":"        role_dict \u003d {role_ref[\u0027id\u0027]: role_ref"}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_e0b80dca","line":426,"updated":"2016-01-26 05:04:13.000000000","message":"Do we support filtering here? Does this need @filterprotected() ?","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"6adbda55153466b9210e44405743cc4750a24609","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        return results"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    @controller.protected()"},{"line_number":427,"context_line":"    def list_role_inference_rules(self, context):"},{"line_number":428,"context_line":"        refs \u003d self.role_api.list_role_inference_rules()"},{"line_number":429,"context_line":"        role_dict \u003d {role_ref[\u0027id\u0027]: role_ref"}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_f66425e6","line":426,"in_reply_to":"9a68dd71_e0b80dca","updated":"2016-01-26 20:58:41.000000000","message":"not yet.  don\u0027t expect so many that we will need to filter.  If we get there, it will be a different review","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"fe4639926162987b23823d2a5b01ed40f3fbf391","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        for ref in refs:"},{"line_number":438,"context_line":"            implied_role_id \u003d ref[\u0027implied_role_id\u0027]"},{"line_number":439,"context_line":"            implied \u003d rules.get(ref[\u0027prior_role_id\u0027], [])"},{"line_number":440,"context_line":"            implied.append("},{"line_number":441,"context_line":"                {"},{"line_number":442,"context_line":"                    \u0027id\u0027: implied_role_id,"},{"line_number":443,"context_line":"                    \u0027link\u0027: {"},{"line_number":444,"context_line":"                        \u0027self\u0027: template % ref[\u0027implied_role_id\u0027]"},{"line_number":445,"context_line":"                    },"},{"line_number":446,"context_line":"                    \u0027name\u0027: role_dict[implied_role_id][\u0027name\u0027]"},{"line_number":447,"context_line":"                }"},{"line_number":448,"context_line":"            )"},{"line_number":449,"context_line":"            rules[ref[\u0027prior_role_id\u0027]] \u003d implied"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_f02451b3","line":447,"range":{"start_line":440,"start_character":27,"end_line":447,"end_character":17},"updated":"2016-01-26 11:51:02.000000000","message":"those code could be extracted into a common method so that no duplication here and there.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"6adbda55153466b9210e44405743cc4750a24609","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        for ref in refs:"},{"line_number":438,"context_line":"            implied_role_id \u003d ref[\u0027implied_role_id\u0027]"},{"line_number":439,"context_line":"            implied \u003d rules.get(ref[\u0027prior_role_id\u0027], [])"},{"line_number":440,"context_line":"            implied.append("},{"line_number":441,"context_line":"                {"},{"line_number":442,"context_line":"                    \u0027id\u0027: implied_role_id,"},{"line_number":443,"context_line":"                    \u0027link\u0027: {"},{"line_number":444,"context_line":"                        \u0027self\u0027: template % ref[\u0027implied_role_id\u0027]"},{"line_number":445,"context_line":"                    },"},{"line_number":446,"context_line":"                    \u0027name\u0027: role_dict[implied_role_id][\u0027name\u0027]"},{"line_number":447,"context_line":"                }"},{"line_number":448,"context_line":"            )"},{"line_number":449,"context_line":"            rules[ref[\u0027prior_role_id\u0027]] \u003d implied"},{"line_number":450,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_96b8492c","line":447,"range":{"start_line":440,"start_character":27,"end_line":447,"end_character":17},"in_reply_to":"9a68dd71_f02451b3","updated":"2016-01-26 20:58:41.000000000","message":"they are really close, but different.  There is certainly some refactoring that could be done here, though.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9fefd2747be990116d920459a9036009d76ffa95","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            \"name\": prior_role_name"},{"line_number":343,"context_line":"        }"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def _implied_role_stanza(self, endpoint, prior_id, implied_role):"},{"line_number":346,"context_line":"        implied_id \u003d implied_role[\u0027id\u0027]"},{"line_number":347,"context_line":"        implied_response \u003d {"},{"line_number":348,"context_line":"            \"id\": implied_id,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_117c6f71","line":345,"range":{"start_line":345,"start_character":45,"end_line":345,"end_character":53},"updated":"2016-01-27 22:53:05.000000000","message":"prior_role_id? just to be consistent with the others. Also, is prior_id even be used here?","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ddea235fcd983d9764ed3686ccb6dad7b0c57554","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            \"name\": prior_role_name"},{"line_number":343,"context_line":"        }"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def _implied_role_stanza(self, endpoint, prior_id, implied_role):"},{"line_number":346,"context_line":"        implied_id \u003d implied_role[\u0027id\u0027]"},{"line_number":347,"context_line":"        implied_response \u003d {"},{"line_number":348,"context_line":"            \"id\": implied_id,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_9677ed01","line":345,"range":{"start_line":345,"start_character":45,"end_line":345,"end_character":53},"in_reply_to":"7a5de9d1_117c6f71","updated":"2016-01-28 03:35:00.000000000","message":"its prior_id everywhere, but...funny here it is not needed.  Removing.","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9fefd2747be990116d920459a9036009d76ffa95","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        response \u003d {"},{"line_number":359,"context_line":"            \"role_inference\": {"},{"line_number":360,"context_line":"                \"prior_role\": self._prior_role_stanza("},{"line_number":361,"context_line":"                    endpoint, prior_id, prior_role[\u0027name\u0027])"},{"line_number":362,"context_line":"            }"},{"line_number":363,"context_line":"        }"},{"line_number":364,"context_line":"        return response"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_1141cf0b","line":361,"range":{"start_line":361,"start_character":30,"end_line":361,"end_character":58},"updated":"2016-01-27 22:53:05.000000000","message":"why can\u0027t we just pass prior_role in there instead of passing bit and pieces?","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ddea235fcd983d9764ed3686ccb6dad7b0c57554","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        response \u003d {"},{"line_number":359,"context_line":"            \"role_inference\": {"},{"line_number":360,"context_line":"                \"prior_role\": self._prior_role_stanza("},{"line_number":361,"context_line":"                    endpoint, prior_id, prior_role[\u0027name\u0027])"},{"line_number":362,"context_line":"            }"},{"line_number":363,"context_line":"        }"},{"line_number":364,"context_line":"        return response"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_76659143","line":361,"range":{"start_line":361,"start_character":30,"end_line":361,"end_character":58},"in_reply_to":"7a5de9d1_1141cf0b","updated":"2016-01-28 03:35:00.000000000","message":"tried to favor not querying more times than needed, but then to fall back to encapsulating the query closest to where it was used,.","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"}],"keystone/assignment/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"863b6b3d36888575be8b80d027d9f1516e4e39e2","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return []"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def get_implied_roles(self, prior_role_id):"},{"line_number":87,"context_line":"        return self.role_api.list_implied_roles(prior_role_id)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _add_implied_roles(self, roles):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_5a8d447a","line":86,"updated":"2015-11-07 03:13:03.000000000","message":"make this private","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c478206530570082fe3837b6056e23aa1447161d","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            return []"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def get_implied_roles(self, prior_role_id):"},{"line_number":87,"context_line":"        return self.role_api.list_implied_roles(prior_role_id)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def _add_implied_roles(self, roles):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_82e25a9e","line":86,"in_reply_to":"da85f559_5a8d447a","updated":"2015-11-18 03:00:52.000000000","message":"inlined","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"863b6b3d36888575be8b80d027d9f1516e4e39e2","unresolved":false,"context_lines":[{"line_number":955,"context_line":"        role_list \u003d []"},{"line_number":956,"context_line":"        for d in dict_list:"},{"line_number":957,"context_line":"            if ((not d.get(\u0027inherited_to\u0027) and not inherited) or"},{"line_number":958,"context_line":"                    (d.get(\u0027inherited_to\u0027) \u003d\u003d \u0027projects\u0027 and inherited)):"},{"line_number":959,"context_line":"                role_list.append(d[\u0027id\u0027])"},{"line_number":960,"context_line":"        return role_list"},{"line_number":961,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_1a87bc62","line":958,"updated":"2015-11-07 03:13:03.000000000","message":"undo this unrelated change","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c478206530570082fe3837b6056e23aa1447161d","unresolved":false,"context_lines":[{"line_number":955,"context_line":"        role_list \u003d []"},{"line_number":956,"context_line":"        for d in dict_list:"},{"line_number":957,"context_line":"            if ((not d.get(\u0027inherited_to\u0027) and not inherited) or"},{"line_number":958,"context_line":"                    (d.get(\u0027inherited_to\u0027) \u003d\u003d \u0027projects\u0027 and inherited)):"},{"line_number":959,"context_line":"                role_list.append(d[\u0027id\u0027])"},{"line_number":960,"context_line":"        return role_list"},{"line_number":961,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_62e5f6a6","line":958,"in_reply_to":"da85f559_1a87bc62","updated":"2015-11-18 03:00:52.000000000","message":"Done","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2dc0cc5df085efb5d26bd81d2e2f41a989b7ecc1","unresolved":false,"context_lines":[{"line_number":870,"context_line":"            if ((not d.get(\u0027inherited_to\u0027) and not inherited) or"},{"line_number":871,"context_line":"               (d.get(\u0027inherited_to\u0027) \u003d\u003d \u0027projects\u0027 and inherited)):"},{"line_number":872,"context_line":"                role_list.append(d[\u0027id\u0027])"},{"line_number":873,"context_line":"        return role_list"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    def _get_list_limit(self):"},{"line_number":876,"context_line":"        return CONF.assignment.list_limit or CONF.list_limit"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba8a016a_4dde5cde","line":873,"updated":"2015-11-18 17:59:47.000000000","message":"you need to rebase on master, these have been removed","commit_id":"30d9073509affbe2347c98d54aba0d9e2f02ca41"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2dc0cc5df085efb5d26bd81d2e2f41a989b7ecc1","unresolved":false,"context_lines":[{"line_number":1150,"context_line":"        self.assignment_api.delete_role_assignments(role_id)"},{"line_number":1151,"context_line":"        self.driver.delete_role(role_id)"},{"line_number":1152,"context_line":"        notifications.Audit.deleted(self._ROLE, role_id, initiator)"},{"line_number":1153,"context_line":"        self.get_role.invalidate(self, role_id)"},{"line_number":1154,"context_line":""},{"line_number":1155,"context_line":"    @abc.abstractmethod"},{"line_number":1156,"context_line":"    def list_implied_roles(self, prior_id):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba8a016a_8db44482","line":1153,"updated":"2015-11-18 17:59:47.000000000","message":"is this meant to delete the role inferences as well?","commit_id":"30d9073509affbe2347c98d54aba0d9e2f02ca41"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2dc0cc5df085efb5d26bd81d2e2f41a989b7ecc1","unresolved":false,"context_lines":[{"line_number":1152,"context_line":"        notifications.Audit.deleted(self._ROLE, role_id, initiator)"},{"line_number":1153,"context_line":"        self.get_role.invalidate(self, role_id)"},{"line_number":1154,"context_line":""},{"line_number":1155,"context_line":"    @abc.abstractmethod"},{"line_number":1156,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1157,"context_line":"        return self.driver.list_implied_roles(prior_id)"},{"line_number":1158,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba8a016a_0d4854cb","line":1155,"updated":"2015-11-18 17:59:47.000000000","message":"abstract method?\n\nshould this be in the role driver?","commit_id":"30d9073509affbe2347c98d54aba0d9e2f02ca41"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2dc0cc5df085efb5d26bd81d2e2f41a989b7ecc1","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        \"\"\""},{"line_number":1228,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1229,"context_line":""},{"line_number":1230,"context_line":"    @abc.abstractmethod"},{"line_number":1231,"context_line":"    def create_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1232,"context_line":"        \"\"\"Creates a role inference rule"},{"line_number":1233,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba8a016a_0d761406","line":1230,"updated":"2015-11-18 17:59:47.000000000","message":"you need to create a new V9 driver -see my patch that creates one for assignment on how to do it: https://review.openstack.org/#/c/242853/","commit_id":"30d9073509affbe2347c98d54aba0d9e2f02ca41"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"69bcdf1e28babafaf913f7a43b67db6a8e625ebb","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"        self.get_role.invalidate(self, role_id)"},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"    @abc.abstractmethod"},{"line_number":1169,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1170,"context_line":"        return self.driver.list_implied_roles(prior_id)"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_c501586c","line":1169,"updated":"2015-11-20 12:43:46.000000000","message":"do we need this method?","commit_id":"f41aba5082bf3f44258dbabe582d8e04bcee9485"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6deb02c88b5e6c905b0aed5428aef9789ebf5b61","unresolved":false,"context_lines":[{"line_number":1166,"context_line":"        self.get_role.invalidate(self, role_id)"},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"    @abc.abstractmethod"},{"line_number":1169,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1170,"context_line":"        return self.driver.list_implied_roles(prior_id)"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_665e6f14","line":1169,"in_reply_to":"ba8a016a_c501586c","updated":"2015-11-20 14:16:43.000000000","message":"No, we don\u0027t, and it also didn\u0027t need to contain the @abc.abstractmethod annotation","commit_id":"f41aba5082bf3f44258dbabe582d8e04bcee9485"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"69bcdf1e28babafaf913f7a43b67db6a8e625ebb","unresolved":false,"context_lines":[{"line_number":1262,"context_line":""},{"line_number":1263,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1264,"context_line":"class RoleDriverV9(RoleDriverBase):"},{"line_number":1265,"context_line":"    \"\"\"Methods removed or augmented in later classes.\"\"\""},{"line_number":1266,"context_line":""},{"line_number":1267,"context_line":"    @abc.abstractmethod"},{"line_number":1268,"context_line":"    def create_implied_role(self, proir_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_e5025c72","line":1265,"updated":"2015-11-20 12:43:46.000000000","message":"oops sorry, this comment was wrong - have now corrected it in the patch you are dependant on...","commit_id":"f41aba5082bf3f44258dbabe582d8e04bcee9485"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a0733f6d3ffcd10ff6a7fce1b1ea1980c43b23b3","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        continue"},{"line_number":103,"context_line":"                    roles.append(implied_id)"},{"line_number":104,"context_line":"                    roles_to_check.append(implied_id)"},{"line_number":105,"context_line":"        except exception.NotImplemented:"},{"line_number":106,"context_line":"            pass"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        return roles"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_4c87bbd7","line":105,"updated":"2015-11-20 22:00:26.000000000","message":"you should at least emit a warning here, saying that it failed. It will also make bandit happy.","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8483aaaec1192feab1f6754010a5f81aac2bf4bf","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        continue"},{"line_number":103,"context_line":"                    roles.append(implied_id)"},{"line_number":104,"context_line":"                    roles_to_check.append(implied_id)"},{"line_number":105,"context_line":"        except exception.NotImplemented:"},{"line_number":106,"context_line":"            pass"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        return roles"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_e6a9e67c","line":105,"in_reply_to":"ba8a016a_4c87bbd7","updated":"2015-11-21 02:42:56.000000000","message":"Done, but I think that is wrong:  if the driver does not support implied roles, we are going to fill the log with warnings.  Going to see if just DEBUG will work.","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":1486,"context_line":"    def create_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1487,"context_line":"        \"\"\"Creates a role inference rule"},{"line_number":1488,"context_line":""},{"line_number":1489,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1490,"context_line":""},{"line_number":1491,"context_line":"        \"\"\""},{"line_number":1492,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_c3e9061c","line":1489,"updated":"2015-12-04 23:44:24.000000000","message":"remove this `raises` or better to check role\u0027s existence in IMPL. since role\u0027s existence is not checked anywhere.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":1486,"context_line":"    def create_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1487,"context_line":"        \"\"\"Creates a role inference rule"},{"line_number":1488,"context_line":""},{"line_number":1489,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1490,"context_line":""},{"line_number":1491,"context_line":"        \"\"\""},{"line_number":1492,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_896d5f06","line":1489,"in_reply_to":"7a740942_c3e9061c","updated":"2015-12-10 01:55:28.000000000","message":"DOne. Check is  based on the SQL based integrity constraints.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"    def delete_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1496,"context_line":"        \"\"\"Deletes a role inference rule"},{"line_number":1497,"context_line":""},{"line_number":1498,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"        \"\"\""},{"line_number":1501,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_83f3fe09","line":1498,"updated":"2015-12-04 23:44:24.000000000","message":"remove this too, or better to check role\u0027s existence in IMPL.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":1495,"context_line":"    def delete_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1496,"context_line":"        \"\"\"Deletes a role inference rule"},{"line_number":1497,"context_line":""},{"line_number":1498,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1499,"context_line":""},{"line_number":1500,"context_line":"        \"\"\""},{"line_number":1501,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_a9705bdd","line":1498,"in_reply_to":"7a740942_83f3fe09","updated":"2015-12-10 01:55:28.000000000","message":"These are all triggered by SQL exceptions.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1505,"context_line":"        \"\"\"Lists roles implied from the prior id"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1508,"context_line":""},{"line_number":1509,"context_line":"        \"\"\""},{"line_number":1510,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_a3f63af7","line":1507,"updated":"2015-12-04 23:44:24.000000000","message":"ditto.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":1545,"context_line":"        self.driver.delete_role(role_id)"},{"line_number":1546,"context_line":""},{"line_number":1547,"context_line":"    def create_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1548,"context_line":"        \"\"\"Creates a role inference rule"},{"line_number":1549,"context_line":""},{"line_number":1550,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1551,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_a0865411","line":1548,"updated":"2015-12-10 05:03:36.000000000","message":"why not just say \"Creates an implied role\"?","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        else:"},{"line_number":92,"context_line":"            return []"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _add_implied_roles(self, roles):"},{"line_number":95,"context_line":"        # roles are passed in as IDs."},{"line_number":96,"context_line":"        if not CONF.token.infer_roles:"},{"line_number":97,"context_line":"            return roles"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_77527b15","line":94,"range":{"start_line":94,"start_character":33,"end_line":94,"end_character":38},"updated":"2015-12-17 09:43:52.000000000","message":"using \"role_ids\" instead of \"roles\" would be more obvious, and save you the trouble of making the comment one line lower","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fbd6a63d051fe72c403150ebde4eee113d7ca9eb","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        else:"},{"line_number":92,"context_line":"            return []"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _add_implied_roles(self, roles):"},{"line_number":95,"context_line":"        # roles are passed in as IDs."},{"line_number":96,"context_line":"        if not CONF.token.infer_roles:"},{"line_number":97,"context_line":"            return roles"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_63caafa3","line":94,"range":{"start_line":94,"start_character":33,"end_line":94,"end_character":38},"in_reply_to":"3a7e1126_77527b15","updated":"2015-12-23 21:36:08.000000000","message":"Done","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            return roles"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            checked_roles \u003d set()"},{"line_number":100,"context_line":"            roles_to_check \u003d list(roles)"},{"line_number":101,"context_line":"            while(roles_to_check):"},{"line_number":102,"context_line":"                next_role \u003d roles_to_check.pop()"},{"line_number":103,"context_line":"                if (next_role in checked_roles):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_77eefb23","line":100,"range":{"start_line":100,"start_character":29,"end_line":100,"end_character":33},"updated":"2015-12-17 09:43:52.000000000","message":"make a copy instead and just iterate over the copy:\n\nIf you need to modify the sequence you are iterating over while inside the loop (for example to duplicate selected items), it is recommended that you first make a copy. Iterating over a sequence does not implicitly make a copy.\n\nhttps://docs.python.org/2/tutorial/controlflow.html","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a4dbc48359478c2fd0369526e859e985f6a63664","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            return roles"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            checked_roles \u003d set()"},{"line_number":100,"context_line":"            roles_to_check \u003d list(roles)"},{"line_number":101,"context_line":"            while(roles_to_check):"},{"line_number":102,"context_line":"                next_role \u003d roles_to_check.pop()"},{"line_number":103,"context_line":"                if (next_role in checked_roles):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_8bc0062c","line":100,"range":{"start_line":100,"start_character":29,"end_line":100,"end_character":33},"in_reply_to":"3a7e1126_77eefb23","updated":"2015-12-17 15:07:03.000000000","message":"This is more than just a copy.  We start with the initial set of roles in the role_to_check list.  As each is checked, it is removed.  However, Since one role implies another, those new roles have to be checked and they are added to this list, if they have never ben seen before.\n\nI have not heard that copy is more or less efficient than creating a new list, but this manner ensures that what we have is a list, regardless of the collection that was passed in.","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            roles_to_check \u003d list(roles)"},{"line_number":101,"context_line":"            while(roles_to_check):"},{"line_number":102,"context_line":"                next_role \u003d roles_to_check.pop()"},{"line_number":103,"context_line":"                if (next_role in checked_roles):"},{"line_number":104,"context_line":"                    continue"},{"line_number":105,"context_line":"                implied_roles \u003d self.role_api.list_implied_roles(next_role)"},{"line_number":106,"context_line":"                for implied_role in implied_roles:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_57317f0a","line":103,"range":{"start_line":103,"start_character":20,"end_line":103,"end_character":29},"updated":"2015-12-17 09:43:52.000000000","message":"the () here are redundant","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fbd6a63d051fe72c403150ebde4eee113d7ca9eb","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            roles_to_check \u003d list(roles)"},{"line_number":101,"context_line":"            while(roles_to_check):"},{"line_number":102,"context_line":"                next_role \u003d roles_to_check.pop()"},{"line_number":103,"context_line":"                if (next_role in checked_roles):"},{"line_number":104,"context_line":"                    continue"},{"line_number":105,"context_line":"                implied_roles \u003d self.role_api.list_implied_roles(next_role)"},{"line_number":106,"context_line":"                for implied_role in implied_roles:"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_b409ab97","line":103,"range":{"start_line":103,"start_character":20,"end_line":103,"end_character":29},"in_reply_to":"3a7e1126_57317f0a","updated":"2015-12-23 21:36:08.000000000","message":"Done","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4b4f2d4cd778163f7c72864d09703c870fedac7e","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.resource_api.get_project(tenant_id)"},{"line_number":130,"context_line":"        assignment_list \u003d self.list_role_assignments("},{"line_number":131,"context_line":"            user_id\u003duser_id, project_id\u003dtenant_id, effective\u003dTrue)"},{"line_number":132,"context_line":"        # Use set() to process the list to remove any duplicates"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        roles \u003d self._add_implied_roles("},{"line_number":135,"context_line":"            [x[\u0027role_id\u0027] for x in assignment_list])"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_b1ba586d","line":132,"range":{"start_line":132,"start_character":10,"end_line":132,"end_character":64},"updated":"2015-12-22 15:48:13.000000000","message":"This comment should be moved so that it is still just before the return statement","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            user_id\u003duser_id, project_id\u003dtenant_id, effective\u003dTrue)"},{"line_number":132,"context_line":"        # Use set() to process the list to remove any duplicates"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        roles \u003d self._add_implied_roles("},{"line_number":135,"context_line":"            [x[\u0027role_id\u0027] for x in assignment_list])"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        return list(set(roles))"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_9a206ef9","line":134,"range":{"start_line":134,"start_character":21,"end_line":134,"end_character":39},"updated":"2015-12-17 09:43:52.000000000","message":"so i originally envisioned this logic going into the token bits.\n\nthe functions you are modifying here may be used by other things aside from just populating roles for the token. so, my question is, will other keystone functionality benefit from having implied roles in their role list? or is it strictly for tokens?\n\nI had thought we would create a function like _get_implied_roles right after the _get_roles_for_user in the token provider:\n\nhttps://github.com/openstack/keystone/blob/4f4bd6f7a2dd2d676d6e1ee3420eb6a25ad2d95f/keystone/token/providers/common.py#L395-L397\n\nwhich i thought was a more clean and less intrusive way","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a4dbc48359478c2fd0369526e859e985f6a63664","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            user_id\u003duser_id, project_id\u003dtenant_id, effective\u003dTrue)"},{"line_number":132,"context_line":"        # Use set() to process the list to remove any duplicates"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        roles \u003d self._add_implied_roles("},{"line_number":135,"context_line":"            [x[\u0027role_id\u0027] for x in assignment_list])"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        return list(set(roles))"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_abcb8252","line":134,"range":{"start_line":134,"start_character":21,"end_line":134,"end_character":39},"in_reply_to":"3a7e1126_9a206ef9","updated":"2015-12-17 15:07:03.000000000","message":"Now, we needd the list of implied roles for determining what roles a user has, whether explicitly assigned or implicitly inferred.  If we do it in the token provider we cannot use them for delegations like oauth and trusts.","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"11427718a6f0ffcfdebaabd2a6abb7caf5a5a9e5","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            user_id\u003duser_id, project_id\u003dtenant_id, effective\u003dTrue)"},{"line_number":132,"context_line":"        # Use set() to process the list to remove any duplicates"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        roles \u003d self._add_implied_roles("},{"line_number":135,"context_line":"            [x[\u0027role_id\u0027] for x in assignment_list])"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        return list(set(roles))"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_fcf1476b","line":134,"range":{"start_line":134,"start_character":21,"end_line":134,"end_character":39},"in_reply_to":"3a7e1126_abcb8252","updated":"2015-12-17 17:18:32.000000000","message":"OK, that\u0027s cool. i thought this was something that was going into the token only, not for other stuff. but if that\u0027s the case, then it\u0027s fine.\n\nI guess it\u0027s just how explicit you want to be about it. i\u0027d rather see something like\n\n  def find_roles_i_can_delegate / find_roles_for_token\n    roles \u003d get_roles_for_user_and_project(user, project)\n    all_roles \u003d get_implied_roles(roles)\n\nthis way it\u0027s only inserted when necessary. I don\u0027t have a strong opinion about this, it just feels like the right way.","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4b4f2d4cd778163f7c72864d09703c870fedac7e","unresolved":false,"context_lines":[{"line_number":861,"context_line":"        if effective:"},{"line_number":862,"context_line":"            return self._list_effective_role_assignments("},{"line_number":863,"context_line":"                role_id, user_id, group_id, domain_id, project_id,"},{"line_number":864,"context_line":"                subtree_ids, inherited)"},{"line_number":865,"context_line":"        else:"},{"line_number":866,"context_line":"            return self._list_direct_role_assignments("},{"line_number":867,"context_line":"                role_id, user_id, group_id, domain_id, project_id,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_341ad66f","line":864,"updated":"2015-12-22 15:48:13.000000000","message":"Don\u0027t we need to add in the implied roles here? IF so, we also need to add tests for that as well, showing how in effective mode the implied roles are added, but in regular mode they are not","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6329c422eaa772c12342a51214eec4c695fd4523","unresolved":false,"context_lines":[{"line_number":834,"context_line":"        if effective:"},{"line_number":835,"context_line":"            return self._list_effective_role_assignments("},{"line_number":836,"context_line":"                role_id, user_id, group_id, domain_id, project_id,"},{"line_number":837,"context_line":"                subtree_ids, inherited)"},{"line_number":838,"context_line":"        else:"},{"line_number":839,"context_line":"            return self._list_direct_role_assignments("},{"line_number":840,"context_line":"                role_id, user_id, group_id, domain_id, project_id,"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a7b0d38_a692e09d","line":837,"updated":"2015-12-23 22:33:55.000000000","message":"Don\u0027t we need to add in the implied roles here? If so, we also need to add tests for that as well, showing how in effective mode the implied roles are added, but in regular mode they are not","commit_id":"0ac80685b9f3bd2c6131e0279cba2c6068f45de6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e0cb18572e4e535e7c44a1b755cb1a8a134ab8de","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            user_id\u003duser_id, project_id\u003dtenant_id, effective\u003dTrue)"},{"line_number":136,"context_line":"        # Use set() to process the list to remove any duplicates"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        roles \u003d self._add_implied_roles("},{"line_number":139,"context_line":"            [x[\u0027role_id\u0027] for x in assignment_list])"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        return list(set(roles))"}],"source_content_type":"text/x-python","patch_set":28,"id":"1a7b0d38_ba04ba49","line":138,"range":{"start_line":138,"start_character":8,"end_line":138,"end_character":40},"updated":"2015-12-29 15:40:41.000000000","message":"We shouldn\u0027t do this here - we should do it once inside list_role_assignments() - since we need that to expand implied roles anyway (when listing in effective mode).  However, doing it there is a little more complex (since you must create the indirect block dicts etc.). I\u0027d be happy to do that for you if you would like, since I know that code very well.","commit_id":"94e20cc8201d5f880f91f3a3386d04ac729eef0a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e0cb18572e4e535e7c44a1b755cb1a8a134ab8de","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        assignment_list \u003d self.list_role_assignments("},{"line_number":152,"context_line":"            user_id\u003duser_id, domain_id\u003ddomain_id, effective\u003dTrue)"},{"line_number":153,"context_line":"        # Use set() to process the list to remove any duplicates"},{"line_number":154,"context_line":"        roles \u003d self._add_implied_roles("},{"line_number":155,"context_line":"            [x[\u0027role_id\u0027] for x in assignment_list])"},{"line_number":156,"context_line":"        return roles"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"1a7b0d38_3a976aed","line":154,"range":{"start_line":154,"start_character":8,"end_line":154,"end_character":40},"updated":"2015-12-29 15:40:41.000000000","message":"same as above - we shouldn\u0027t be doing this here.","commit_id":"94e20cc8201d5f880f91f3a3386d04ac729eef0a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e0cb18572e4e535e7c44a1b755cb1a8a134ab8de","unresolved":false,"context_lines":[{"line_number":1502,"context_line":"    def delete_role(self, role_id):"},{"line_number":1503,"context_line":"        self.driver.delete_role(role_id)"},{"line_number":1504,"context_line":""},{"line_number":1505,"context_line":"    def get_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1506,"context_line":"        \"\"\"Fetches a role inference rule"},{"line_number":1507,"context_line":""},{"line_number":1508,"context_line":"        :raises: keystone.exception.RoleNotFound"}],"source_content_type":"text/x-python","patch_set":28,"id":"1a7b0d38_5a67d64c","line":1505,"range":{"start_line":1505,"start_character":4,"end_line":1505,"end_character":63},"updated":"2015-12-29 15:40:41.000000000","message":"These don\u0027t go here..they go in the V9 driver class.\n\nInstead, here (I would suggest) we would raise not implemented for get/create/delete...and just return a list containing the prior_id for list_implied_roles (since that would mean that all code except CRUD of implied roles would function with a V8 driver)","commit_id":"94e20cc8201d5f880f91f3a3386d04ac729eef0a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4a5e99e625ef539e967522f7592bf59efa1581d9","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if not CONF.token.infer_roles:"},{"line_number":100,"context_line":"            return role_ids"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            checked_roles \u003d set()"},{"line_number":103,"context_line":"            roles_to_check \u003d list(role_ids)"},{"line_number":104,"context_line":"            role_ids \u003d list(role_ids)"},{"line_number":105,"context_line":"            while(roles_to_check):"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa69d971_f238a03f","line":102,"range":{"start_line":102,"start_character":12,"end_line":102,"end_character":25},"updated":"2015-12-31 16:20:52.000000000","message":"do we ever update checked_roles?","commit_id":"f3c597b7d5ab12f5d6e196f02e268a81fe1bc9c4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"27cb4335f0db1c88efcd37458b40db35c1d15ec2","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            user_id\u003duser_id, project_id\u003dtenant_id, effective\u003dTrue)"},{"line_number":136,"context_line":"        # Use set() to process the list to remove any duplicates"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        roles \u003d self._add_implied_roles("},{"line_number":139,"context_line":"            [x[\u0027role_id\u0027] for x in assignment_list])"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        return list(set(roles))"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa69d971_2abb5f10","line":138,"range":{"start_line":138,"start_character":8,"end_line":138,"end_character":40},"updated":"2015-12-29 16:01:12.000000000","message":"We shouldn\u0027t do this here - we should do it once inside list_role_assignments() - since we need that to expand implied roles anyway (when listing in effective mode).  However, doing it there is a little more complex (since you must create the indirect block dicts etc.). I\u0027d be happy to do that for you if you would like, since I know that code very well.","commit_id":"f3c597b7d5ab12f5d6e196f02e268a81fe1bc9c4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"27cb4335f0db1c88efcd37458b40db35c1d15ec2","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        assignment_list \u003d self.list_role_assignments("},{"line_number":152,"context_line":"            user_id\u003duser_id, domain_id\u003ddomain_id, effective\u003dTrue)"},{"line_number":153,"context_line":"        # Use set() to process the list to remove any duplicates"},{"line_number":154,"context_line":"        roles \u003d self._add_implied_roles("},{"line_number":155,"context_line":"            [x[\u0027role_id\u0027] for x in assignment_list])"},{"line_number":156,"context_line":"        return roles"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"fa69d971_8a404b09","line":154,"range":{"start_line":154,"start_character":8,"end_line":154,"end_character":40},"updated":"2015-12-29 16:01:12.000000000","message":"We shouldn\u0027t do this here - we should do it once inside list_role_assignments() - since we need that to expand implied roles anyway (when listing in effective mode).  However, doing it there is a little more complex (since you must create the indirect block dicts etc.). I\u0027d be happy to do that for you if you would like, since I know that code very well.","commit_id":"f3c597b7d5ab12f5d6e196f02e268a81fe1bc9c4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"27cb4335f0db1c88efcd37458b40db35c1d15ec2","unresolved":false,"context_lines":[{"line_number":1502,"context_line":"    def delete_role(self, role_id):"},{"line_number":1503,"context_line":"        self.driver.delete_role(role_id)"},{"line_number":1504,"context_line":""},{"line_number":1505,"context_line":"    def get_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1506,"context_line":"        \"\"\"Fetches a role inference rule"},{"line_number":1507,"context_line":""},{"line_number":1508,"context_line":"        :raises: keystone.exception.RoleNotFound"}],"source_content_type":"text/x-python","patch_set":29,"id":"fa69d971_8a57ebc9","line":1505,"range":{"start_line":1505,"start_character":4,"end_line":1505,"end_character":63},"updated":"2015-12-29 16:01:12.000000000","message":"These don\u0027t go here..they go in the V9 driver class.\n\nInstead, here (I would suggest) we would raise not implemented for get/create/delete...and just return a list containing the prior_id for list_implied_roles (since that would mean that all code except CRUD of implied roles would function with a V8 driver)","commit_id":"f3c597b7d5ab12f5d6e196f02e268a81fe1bc9c4"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"5a7659936bfc3ec8a6f3281b23904e20b77c5d1b","unresolved":false,"context_lines":[{"line_number":1435,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1436,"context_line":"        implied_role \u003d self.driver.get_role(implied_role_id)"},{"line_number":1437,"context_line":"        self.driver.get_role(prior_role_id)"},{"line_number":1438,"context_line":"        if implied_role[\u0027name\u0027] \u003d\u003d \u0027admin\u0027:"},{"line_number":1439,"context_line":"            raise exception.InvalidImpliedRole(role_id\u003dimplied_role_id)"},{"line_number":1440,"context_line":"        return self.driver.create_implied_role(prior_role_id, implied_role_id)"},{"line_number":1441,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_3fca97a2","line":1438,"updated":"2016-01-27 22:33:09.000000000","message":"Might be worth a comment stating why implied_role cannot be admin.  Is this to prevent privilege escalations? Is this all that was added to ensure this is made secure?","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9fefd2747be990116d920459a9036009d76ffa95","unresolved":false,"context_lines":[{"line_number":1435,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1436,"context_line":"        implied_role \u003d self.driver.get_role(implied_role_id)"},{"line_number":1437,"context_line":"        self.driver.get_role(prior_role_id)"},{"line_number":1438,"context_line":"        if implied_role[\u0027name\u0027] \u003d\u003d \u0027admin\u0027:"},{"line_number":1439,"context_line":"            raise exception.InvalidImpliedRole(role_id\u003dimplied_role_id)"},{"line_number":1440,"context_line":"        return self.driver.create_implied_role(prior_role_id, implied_role_id)"},{"line_number":1441,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_91585f58","line":1438,"in_reply_to":"7a5de9d1_3fca97a2","updated":"2016-01-27 22:53:05.000000000","message":"I think we should remove this restriction altogether. Role name has no meaning. \u0027admin\u0027 means only what the particular policy.json want it to mean.","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"4c788c02891329ebf13a76157a3ff4cc74414d1f","unresolved":false,"context_lines":[{"line_number":1435,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1436,"context_line":"        implied_role \u003d self.driver.get_role(implied_role_id)"},{"line_number":1437,"context_line":"        self.driver.get_role(prior_role_id)"},{"line_number":1438,"context_line":"        if implied_role[\u0027name\u0027] \u003d\u003d CONF.assignment.root_role:"},{"line_number":1439,"context_line":"            raise exception.InvalidImpliedRole(role_id\u003dimplied_role_id)"},{"line_number":1440,"context_line":"        return self.driver.create_implied_role(prior_role_id, implied_role_id)"},{"line_number":1441,"context_line":""}],"source_content_type":"text/x-python","patch_set":68,"id":"7a5de9d1_124bd8b1","line":1438,"range":{"start_line":1438,"start_character":51,"end_line":1438,"end_character":60},"updated":"2016-01-28 20:12:16.000000000","message":"OK, I can live with this.","commit_id":"0a94c2966b152cb8912357fc9ca4311730dbdcf2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a47f07a7863a6a4ee1ab960fd4d34781d0a00563","unresolved":false,"context_lines":[{"line_number":1455,"context_line":"    # TODO(ayoung): Add notification"},{"line_number":1456,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1457,"context_line":"        implied_role \u003d self.driver.get_role(implied_role_id)"},{"line_number":1458,"context_line":"        self.driver.get_role(prior_role_id)"},{"line_number":1459,"context_line":"        if implied_role[\u0027name\u0027] \u003d\u003d CONF.assignment.root_role:"},{"line_number":1460,"context_line":"            raise exception.InvalidImpliedRole(role_id\u003dimplied_role_id)"},{"line_number":1461,"context_line":"        response \u003d self.driver.create_implied_role("}],"source_content_type":"text/x-python","patch_set":73,"id":"5a5ae5dd_9d92ce56","line":1458,"range":{"start_line":1458,"start_character":8,"end_line":1458,"end_character":43},"updated":"2016-02-03 07:17:32.000000000","message":"this isn\u0027t used til later and can be moved down a few lines","commit_id":"e1b5751a4cd8e5cdbca8bf21f2a0263812d60cd0"}],"keystone/assignment/role_backends/ldap.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"# NOTE(henry-nash): A mixin class to enable the sharing of the LDAP structure"},{"line_number":112,"context_line":"# between here and the assignment LDAP."},{"line_number":113,"context_line":"class RoleLdapStructureMixin(object):"},{"line_number":114,"context_line":"    DEFAULT_OU \u003d \u0027ou\u003dRoles\u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_9ea93e27","line":111,"updated":"2015-12-10 05:03:36.000000000","message":"nice! :)","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e8e69c8aab217c0e3101126ced30631901cc02f1","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class Role(assignment.RoleDriverV8):"},{"line_number":32,"context_line":"    @versionutils.deprecated("},{"line_number":33,"context_line":"        versionutils.deprecated.MITAKA,"},{"line_number":34,"context_line":"        what\u003d\u0027ldap role\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a7b0d38_2472237c","line":31,"range":{"start_line":31,"start_character":22,"end_line":31,"end_character":34},"updated":"2015-12-27 19:00:21.000000000","message":"This was an error from my patch when I created the V9 role driver - I have a patch that fixes this - suggest you rebase on: https://review.openstack.org/#/c/261841/","commit_id":"3fe3ea8c4764508fda261e87bb312b69ae063878"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2be167e86182a9830a0f0ab88abfba6910ba7cdf","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class Role(assignment.RoleDriverV8):"},{"line_number":32,"context_line":"    @versionutils.deprecated("},{"line_number":33,"context_line":"        versionutils.deprecated.MITAKA,"},{"line_number":34,"context_line":"        what\u003d\u0027ldap role\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a7b0d38_9f76a7d5","line":31,"range":{"start_line":31,"start_character":22,"end_line":31,"end_character":34},"in_reply_to":"1a7b0d38_2472237c","updated":"2015-12-28 17:43:52.000000000","message":"This patch has now merged","commit_id":"3fe3ea8c4764508fda261e87bb312b69ae063878"}],"keystone/assignment/role_backends/sql.py":[{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a0733f6d3ffcd10ff6a7fce1b1ea1980c43b23b3","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027implied_role\u0027)"},{"line_number":87,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":88,"context_line":"        \"\"\"Deletes are role inference rule"},{"line_number":89,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_ec88efc8","line":88,"updated":"2015-11-20 22:00:26.000000000","message":"remove the docstring","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8483aaaec1192feab1f6754010a5f81aac2bf4bf","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027implied_role\u0027)"},{"line_number":87,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":88,"context_line":"        \"\"\"Deletes are role inference rule"},{"line_number":89,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_26a04e90","line":88,"in_reply_to":"ba8a016a_ec88efc8","updated":"2015-11-21 02:42:56.000000000","message":"Done","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a0733f6d3ffcd10ff6a7fce1b1ea1980c43b23b3","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            for ref in refs:"},{"line_number":99,"context_line":"                # TODO(ayoung): The filters do not seem to apply. Why?"},{"line_number":100,"context_line":"                # This might be an"},{"line_number":101,"context_line":"                # Issue with SQLite."},{"line_number":102,"context_line":"                if (ref.prior_role_id \u003d\u003d prior_role_id"},{"line_number":103,"context_line":"                        and ref.implied_role_id \u003d\u003d implied_role_id):"},{"line_number":104,"context_line":"                    session.delete(ref)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_cc7debb2","line":101,"updated":"2015-11-20 22:00:26.000000000","message":"I did it here: https://review.openstack.org/#/c/245916/3/keystone/resource/backends/sql.py and it seems to be working, if it might help","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8483aaaec1192feab1f6754010a5f81aac2bf4bf","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            for ref in refs:"},{"line_number":99,"context_line":"                # TODO(ayoung): The filters do not seem to apply. Why?"},{"line_number":100,"context_line":"                # This might be an"},{"line_number":101,"context_line":"                # Issue with SQLite."},{"line_number":102,"context_line":"                if (ref.prior_role_id \u003d\u003d prior_role_id"},{"line_number":103,"context_line":"                        and ref.implied_role_id \u003d\u003d implied_role_id):"},{"line_number":104,"context_line":"                    session.delete(ref)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_669df658","line":101,"in_reply_to":"ba8a016a_cc7debb2","updated":"2015-11-21 02:42:56.000000000","message":"Done.  What does the (synchronize_session\u003d\u0027fetch\u0027) do, anyway?","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a0733f6d3ffcd10ff6a7fce1b1ea1980c43b23b3","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    prior_role_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":127,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":128,"context_line":"    __table_args__ \u003d ("},{"line_number":129,"context_line":"        sql.UniqueConstraint(\u0027prior_role_id\u0027, \u0027implied_role_id\u0027), {})"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_ecaf8f29","line":129,"updated":"2015-11-20 22:00:26.000000000","message":"missing the foreign keys to the role table","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8483aaaec1192feab1f6754010a5f81aac2bf4bf","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    prior_role_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":127,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":128,"context_line":"    __table_args__ \u003d ("},{"line_number":129,"context_line":"        sql.UniqueConstraint(\u0027prior_role_id\u0027, \u0027implied_role_id\u0027), {})"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_46aa3287","line":129,"in_reply_to":"ba8a016a_ecaf8f29","updated":"2015-11-21 02:42:56.000000000","message":"Done","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone import exception"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from sqlalchemy import and_"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Role(assignment.RoleDriverV9):"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_c3d02656","line":18,"updated":"2015-12-04 23:44:24.000000000","message":"move this up to the first section.\n\n from sqlalchemy import and_\n\n from keystone import assignment\n from keystone.common import sql\n from keystone import exception","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone import exception"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from sqlalchemy import and_"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class Role(assignment.RoleDriverV9):"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_4978d7c4","line":18,"in_reply_to":"7a740942_c3d02656","updated":"2015-12-10 01:55:28.000000000","message":"Done","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            session.delete(ref)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027implied_role\u0027)"},{"line_number":76,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":77,"context_line":"        with sql.transaction() as session:"},{"line_number":78,"context_line":"            inference \u003d {\u0027prior_role_id\u0027: prior_role_id,"},{"line_number":79,"context_line":"                         \u0027implied_role_id\u0027: implied_role_id"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_e3d3e25d","line":76,"updated":"2015-12-04 23:44:24.000000000","message":"check the existence of `prior_role_id` and `implied_role_id`, raise RoleNotFound if not exists.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            session.delete(ref)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027implied_role\u0027)"},{"line_number":76,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":77,"context_line":"        with sql.transaction() as session:"},{"line_number":78,"context_line":"            inference \u003d {\u0027prior_role_id\u0027: prior_role_id,"},{"line_number":79,"context_line":"                         \u0027implied_role_id\u0027: implied_role_id"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_2b32d55f","line":76,"in_reply_to":"7a740942_e3d3e25d","updated":"2015-12-10 01:55:28.000000000","message":"Note that the SQLIte driver will not check the integrity constraints, but MySQL will.  This will require a Function test to confirm.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                         \u0027implied_role_id\u0027: implied_role_id"},{"line_number":80,"context_line":"                         }"},{"line_number":81,"context_line":"            ref \u003d ImpliedRoleTable.from_dict("},{"line_number":82,"context_line":"                inference, include_extra_dict\u003dFalse)"},{"line_number":83,"context_line":"            session.add(ref)"},{"line_number":84,"context_line":"            return ref.to_dict(include_extra_dict\u003dFalse)"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_43c5168c","line":82,"updated":"2015-12-04 23:44:24.000000000","message":"add this option `include_extra_dict` is not necessary, afaik, there are other entities in keystone such as IdP don\u0027t has \u0027extra\u0027 field but all of them work without this change.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                         \u0027implied_role_id\u0027: implied_role_id"},{"line_number":80,"context_line":"                         }"},{"line_number":81,"context_line":"            ref \u003d ImpliedRoleTable.from_dict("},{"line_number":82,"context_line":"                inference, include_extra_dict\u003dFalse)"},{"line_number":83,"context_line":"            session.add(ref)"},{"line_number":84,"context_line":"            return ref.to_dict(include_extra_dict\u003dFalse)"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_a947fb75","line":82,"in_reply_to":"7a740942_43c5168c","updated":"2015-12-10 01:55:28.000000000","message":"They have explicit code to work around it.  Should have done it this way years ago.  It has to do with the Base Class.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class ImpliedRoleTable(sql.ModelBase, sql.DictBase):"},{"line_number":105,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":106,"context_line":"        \"\"\"Returns the model\u0027s attributes as a dictionary.\"\"\""},{"line_number":107,"context_line":"        d \u003d {}"},{"line_number":108,"context_line":"        for attr in self.__class__.attributes:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_03bf0efc","line":105,"updated":"2015-12-04 23:44:24.000000000","message":"where is \u0027include_extra_dict\u0027 used?","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class ImpliedRoleTable(sql.ModelBase, sql.DictBase):"},{"line_number":105,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":106,"context_line":"        \"\"\"Returns the model\u0027s attributes as a dictionary.\"\"\""},{"line_number":107,"context_line":"        d \u003d {}"},{"line_number":108,"context_line":"        for attr in self.__class__.attributes:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_561b4873","line":105,"in_reply_to":"7a740942_03bf0efc","updated":"2015-12-10 01:55:28.000000000","message":"Done","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.common import sql"},{"line_number":16,"context_line":"from keystone import exception"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from oslo_db import exception as db_exception"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class Role(assignment.RoleDriverV9):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_1e9eae07","line":18,"updated":"2015-12-10 05:03:36.000000000","message":"change to:\n\n from oslo_db import exception as db_exception\n from sqlalchemy import and_\n\n from keystone import assignment\n from keystone.common import sql\n from keystone import exception","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"77210892e66a451b79bd23a90041fa9ac35da258","unresolved":false,"context_lines":[{"line_number":9,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":"from oslo_db import exception as db_exception"},{"line_number":13,"context_line":"from sqlalchemy import and_"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from keystone import assignment"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a7b0d38_1b0af021","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":45},"updated":"2015-12-26 08:12:38.000000000","message":"i think you need a new line between this import and the docstring","commit_id":"0ac80685b9f3bd2c6131e0279cba2c6068f45de6"}],"keystone/assignment/routers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"863b6b3d36888575be8b80d027d9f1516e4e39e2","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            mapper, implied_roles_controller,"},{"line_number":78,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"},{"line_number":79,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":80,"context_line":"            # get_head_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            path_vars\u003d{"},{"line_number":83,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_7adda86f","line":80,"updated":"2015-11-07 03:13:03.000000000","message":"delete commented out code","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c478206530570082fe3837b6056e23aa1447161d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            mapper, implied_roles_controller,"},{"line_number":78,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"},{"line_number":79,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":80,"context_line":"            # get_head_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            path_vars\u003d{"},{"line_number":83,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_42f31274","line":80,"in_reply_to":"da85f559_7adda86f","updated":"2015-11-18 03:00:52.000000000","message":"Done","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a8be0f723d957521745cadca5fc0cbd2d205426c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":76,"context_line":"        self._add_resource("},{"line_number":77,"context_line":"            mapper, implied_roles_controller,"},{"line_number":78,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"},{"line_number":79,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":80,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":81,"context_line":"            path_vars\u003d{"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_ff5fdd3e","line":78,"updated":"2015-11-18 03:35:00.000000000","message":"This also needs one without the prior_role_id to list all.","commit_id":"4363c99add9eca8ae90a6cf2def8ddc888b43ad9"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a8be0f723d957521745cadca5fc0cbd2d205426c","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self._add_resource("},{"line_number":87,"context_line":"            mapper, implied_roles_controller,"},{"line_number":88,"context_line":"            path\u003d\u0027/implied_role/{prior_role_id}/{implied_role_id}\u0027,"},{"line_number":89,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":90,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":91,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba8a016a_bf59555c","line":88,"updated":"2015-11-18 03:35:00.000000000","message":"This does not match the spec.","commit_id":"4363c99add9eca8ae90a6cf2def8ddc888b43ad9"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a0733f6d3ffcd10ff6a7fce1b1ea1980c43b23b3","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":90,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":91,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":92,"context_line":"            # get_head_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":93,"context_line":"            path_vars\u003d{"},{"line_number":94,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":95,"context_line":"                \u0027implied_role_id\u0027: json_home.Parameters.IMPLIED_ROLE_ID,"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_ac574725","line":92,"updated":"2015-11-20 22:00:26.000000000","message":"remove this comment","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8483aaaec1192feab1f6754010a5f81aac2bf4bf","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":90,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":91,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":92,"context_line":"            # get_head_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":93,"context_line":"            path_vars\u003d{"},{"line_number":94,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":95,"context_line":"                \u0027implied_role_id\u0027: json_home.Parameters.IMPLIED_ROLE_ID,"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_a62f5ef5","line":92,"in_reply_to":"ba8a016a_ac574725","updated":"2015-11-21 02:42:56.000000000","message":"Done.  Wasthinking I was going to go back and implement, but that is not required.","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        routers.append("},{"line_number":73,"context_line":"            router.Router(controllers.RoleV3(), \u0027roles\u0027, \u0027role\u0027,"},{"line_number":74,"context_line":"                          resource_descriptions\u003dself.v3_resources))"},{"line_number":75,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":76,"context_line":"        self._add_resource("},{"line_number":77,"context_line":"            mapper, implied_roles_controller,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_c337c6ae","line":74,"updated":"2015-12-04 23:44:24.000000000","message":"nit, add whitespace before here","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        routers.append("},{"line_number":73,"context_line":"            router.Router(controllers.RoleV3(), \u0027roles\u0027, \u0027role\u0027,"},{"line_number":74,"context_line":"                          resource_descriptions\u003dself.v3_resources))"},{"line_number":75,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":76,"context_line":"        self._add_resource("},{"line_number":77,"context_line":"            mapper, implied_roles_controller,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_8b56695a","line":74,"in_reply_to":"7a740942_c337c6ae","updated":"2015-12-10 01:55:28.000000000","message":"Done","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            router.Router(controllers.RoleV3(), \u0027roles\u0027, \u0027role\u0027,"},{"line_number":74,"context_line":"                          resource_descriptions\u003dself.v3_resources))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_c5f13ccf","line":76,"updated":"2015-12-17 09:43:52.000000000","message":"will role inference come in another patch later on? that\u0027s OK if it does, small patches ftw, just leave a TODO comment somewhere here\n\nrole inference: http://specs.openstack.org/openstack/keystone-specs/api/v3/identity-api-v3.html#list-all-role-inference-rules","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a4dbc48359478c2fd0369526e859e985f6a63664","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            router.Router(controllers.RoleV3(), \u0027roles\u0027, \u0027role\u0027,"},{"line_number":74,"context_line":"                          resource_descriptions\u003dself.v3_resources))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_8b4566b4","line":76,"in_reply_to":"3a7e1126_c5f13ccf","updated":"2015-12-17 15:07:03.000000000","message":"Ah...missed that.  Will get that in this patch.  I would like it to be self contained.","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4b4f2d4cd778163f7c72864d09703c870fedac7e","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            path_vars\u003d{"},{"line_number":83,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID"},{"line_number":84,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_6ed88ff0","line":81,"range":{"start_line":81,"start_character":12,"end_line":81,"end_character":22},"updated":"2015-12-22 15:48:13.000000000","message":"is there a reason this is not get_head_action ?","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fbd6a63d051fe72c403150ebde4eee113d7ca9eb","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            path_vars\u003d{"},{"line_number":83,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID"},{"line_number":84,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_de6c969e","line":81,"range":{"start_line":81,"start_character":12,"end_line":81,"end_character":22},"in_reply_to":"1a7b0d38_6ed88ff0","updated":"2015-12-23 21:36:08.000000000","message":"This should be returning a list, not a HEAD type action","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4b4f2d4cd778163f7c72864d09703c870fedac7e","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            path_vars\u003d{"},{"line_number":83,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID"},{"line_number":84,"context_line":"            }"},{"line_number":85,"context_line":"        )"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_ae10b7a9","line":84,"range":{"start_line":84,"start_character":12,"end_line":84,"end_character":13},"updated":"2015-12-22 15:48:13.000000000","message":"So I think we agreed that all new major API changes would be marked as experimental? We should there add here:\n\n            status\u003djson_home.Status.EXPERIMENTAL","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fbd6a63d051fe72c403150ebde4eee113d7ca9eb","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            path_vars\u003d{"},{"line_number":83,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID"},{"line_number":84,"context_line":"            }"},{"line_number":85,"context_line":"        )"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_a304177e","line":84,"range":{"start_line":84,"start_character":12,"end_line":84,"end_character":13},"in_reply_to":"1a7b0d38_ae10b7a9","updated":"2015-12-23 21:36:08.000000000","message":"Done","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self._add_resource("},{"line_number":88,"context_line":"            mapper, implied_roles_controller,"},{"line_number":89,"context_line":"            path\u003d\u0027/implied_role/{prior_role_id}/{implied_role_id}\u0027,"},{"line_number":90,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":91,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":92,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_e569d88c","line":89,"range":{"start_line":89,"start_character":46,"end_line":89,"end_character":49},"updated":"2015-12-17 09:43:52.000000000","message":"missing the \"implies\" between the two IDs\n\nhttp://specs.openstack.org/openstack/keystone-specs/api/v3/identity-api-v3.html#create-role-inference-rule","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self._add_resource("},{"line_number":88,"context_line":"            mapper, implied_roles_controller,"},{"line_number":89,"context_line":"            path\u003d\u0027/implied_role/{prior_role_id}/{implied_role_id}\u0027,"},{"line_number":90,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":91,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":92,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":93,"context_line":"            path_vars\u003d{"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_05fae4bd","line":90,"range":{"start_line":90,"start_character":12,"end_line":90,"end_character":22},"updated":"2015-12-17 09:43:52.000000000","message":"needs a GET action","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"fbd6a63d051fe72c403150ebde4eee113d7ca9eb","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self._add_resource("},{"line_number":88,"context_line":"            mapper, implied_roles_controller,"},{"line_number":89,"context_line":"            path\u003d\u0027/implied_role/{prior_role_id}/{implied_role_id}\u0027,"},{"line_number":90,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":91,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":92,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":93,"context_line":"            path_vars\u003d{"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_636dcf03","line":90,"range":{"start_line":90,"start_character":12,"end_line":90,"end_character":22},"in_reply_to":"1a7b0d38_6eff2f35","updated":"2015-12-23 21:36:08.000000000","message":"I think HEAD is appropriate for this one.","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4b4f2d4cd778163f7c72864d09703c870fedac7e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self._add_resource("},{"line_number":88,"context_line":"            mapper, implied_roles_controller,"},{"line_number":89,"context_line":"            path\u003d\u0027/implied_role/{prior_role_id}/{implied_role_id}\u0027,"},{"line_number":90,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":91,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":92,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":93,"context_line":"            path_vars\u003d{"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_6eff2f35","line":90,"range":{"start_line":90,"start_character":12,"end_line":90,"end_character":22},"in_reply_to":"3a7e1126_05fae4bd","updated":"2015-12-22 15:48:13.000000000","message":"and if so, should it be get_head_action ?","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4b4f2d4cd778163f7c72864d09703c870fedac7e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            path_vars\u003d{"},{"line_number":94,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":95,"context_line":"                \u0027implied_role_id\u0027: json_home.Parameters.IMPLIED_ROLE_ID,"},{"line_number":96,"context_line":"            }"},{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        grant_controller \u003d controllers.GrantAssignmentV3()"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a7b0d38_ce78a3fb","line":96,"range":{"start_line":96,"start_character":12,"end_line":96,"end_character":13},"updated":"2015-12-22 15:48:13.000000000","message":"same here for experimental","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"79291e647aa314f7e482c7317fd9ae518e86e4dc","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":32,"id":"fa69d971_08e866b3","line":79,"range":{"start_line":79,"start_character":19,"end_line":79,"end_character":32},"updated":"2016-01-04 21:17:52.000000000","message":"Adam - is this right? should this be \u0027prior_role\u0027 ?","commit_id":"cf418cf34e110e4eca77f715631a98a43a36ede7"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"54fa13683f76e748f5d6de3bb99980c6e958dcf2","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":32,"id":"fa69d971_5d013f04","line":79,"range":{"start_line":79,"start_character":19,"end_line":79,"end_character":32},"in_reply_to":"fa69d971_08e866b3","updated":"2016-01-04 21:56:32.000000000","message":"What you have here matches the spec.  prior would make more sense.","commit_id":"cf418cf34e110e4eca77f715631a98a43a36ede7"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8baf3a22cb14bc7075768abe923c7e72d3ea5bf4","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/implied_roles/{prior_role_id}\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":32,"id":"fa69d971_5d4fff6a","line":79,"range":{"start_line":79,"start_character":19,"end_line":79,"end_character":32},"in_reply_to":"fa69d971_5d013f04","updated":"2016-01-04 21:57:31.000000000","message":"Correction; we fixed the spec...that needs to change","commit_id":"cf418cf34e110e4eca77f715631a98a43a36ede7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"79291e647aa314f7e482c7317fd9ae518e86e4dc","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self._add_resource("},{"line_number":89,"context_line":"            mapper, implied_roles_controller,"},{"line_number":90,"context_line":"            path\u003d\u0027/implied_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            get_head_action\u003d\u0027check_implied_role\u0027,"}],"source_content_type":"text/x-python","patch_set":32,"id":"fa69d971_88c5363d","line":90,"range":{"start_line":90,"start_character":19,"end_line":90,"end_character":31},"updated":"2016-01-04 21:17:52.000000000","message":"Adam - is this right?  I think it is meant to be:\n\n/prior_role/{prior_role_id}/implies/{implied_role_id}","commit_id":"cf418cf34e110e4eca77f715631a98a43a36ede7"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"4951da90e88f06bd7b7c11bbd4eb1c9dca998aec","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":35,"id":"fa69d971_c770980d","line":79,"range":{"start_line":79,"start_character":53,"end_line":79,"end_character":55},"updated":"2016-01-06 20:13:13.000000000","message":"where is\n\n  GET /role_inferences\n\nAlso, we may\u0027ve missed an API to return all the effective roles for a given prior role.","commit_id":"aa1681a88239d5d8be8483e7509ff9c2834321f2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4bef2610a95700318b38d481b71d630dcc042839","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":35,"id":"fa69d971_ee21574e","line":79,"range":{"start_line":79,"start_character":53,"end_line":79,"end_character":55},"in_reply_to":"fa69d971_c770980d","updated":"2016-01-09 08:30:59.000000000","message":"agreed GET /role_inferences is missing. and the spec doesn\u0027t mention getting all implied roles for a given prior role (if that\u0027s what you meant).\n\nIn fact I wonder whether we just have GET /role_inferences that takes a filter parameter of ?implied_role\u003dx as well as ?prior_role\u003dx rather than have the individual GET APIs ??","commit_id":"aa1681a88239d5d8be8483e7509ff9c2834321f2"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"4951da90e88f06bd7b7c11bbd4eb1c9dca998aec","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            get_head_action\u003d\u0027check_implied_role\u0027,"},{"line_number":94,"context_line":"            get_action\u003d\u0027get_implied_role\u0027,"},{"line_number":95,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":96,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":35,"id":"fa69d971_47f1086a","line":93,"range":{"start_line":93,"start_character":47,"end_line":93,"end_character":49},"updated":"2016-01-06 20:13:13.000000000","message":"is the HEAD call on the API spec?","commit_id":"aa1681a88239d5d8be8483e7509ff9c2834321f2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4bef2610a95700318b38d481b71d630dcc042839","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            get_head_action\u003d\u0027check_implied_role\u0027,"},{"line_number":94,"context_line":"            get_action\u003d\u0027get_implied_role\u0027,"},{"line_number":95,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":96,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":35,"id":"fa69d971_0e1f0b09","line":93,"range":{"start_line":93,"start_character":47,"end_line":93,"end_character":49},"in_reply_to":"fa69d971_47f1086a","updated":"2016-01-09 08:30:59.000000000","message":"This does seem to be missing.....","commit_id":"aa1681a88239d5d8be8483e7509ff9c2834321f2"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"},{"line_number":83,"context_line":"            path_vars\u003d{"},{"line_number":84,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":85,"context_line":"            }"},{"line_number":86,"context_line":"        )"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_ec866eda","line":84,"range":{"start_line":84,"start_character":54,"end_line":84,"end_character":67},"updated":"2016-01-20 01:22:02.000000000","message":"ROLE_ID","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"4e25cc337354c5ebe2bcdf31acc80860a4622676","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"},{"line_number":83,"context_line":"            path_vars\u003d{"},{"line_number":84,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":85,"context_line":"            }"},{"line_number":86,"context_line":"        )"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"9a68dd71_f84bb929","line":84,"range":{"start_line":84,"start_character":54,"end_line":84,"end_character":67},"in_reply_to":"9a68dd71_a21761ec","updated":"2016-01-20 23:01:50.000000000","message":"It was added to json_home. It\u0027s for discovery i want to know what sort of value this resource takes, and it takes a role id the same as every other value of role id through out keystone. It is not a new type.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6e9d4ac0370195b8ddddd4978e5f7c70277c52ab","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"},{"line_number":83,"context_line":"            path_vars\u003d{"},{"line_number":84,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":85,"context_line":"            }"},{"line_number":86,"context_line":"        )"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"9a68dd71_a21761ec","line":84,"range":{"start_line":84,"start_character":54,"end_line":84,"end_character":67},"in_reply_to":"ba63e191_ec866eda","updated":"2016-01-20 18:10:25.000000000","message":"why? PRIOR_ROLE_ID is in json_home.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            get_head_action\u003d\u0027check_implied_role\u0027,"},{"line_number":94,"context_line":"            get_action\u003d\u0027get_implied_role\u0027,"},{"line_number":95,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":96,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_a2f5ddcb","line":93,"range":{"start_line":93,"start_character":27,"end_line":93,"end_character":29},"updated":"2016-01-20 01:22:02.000000000","message":"you have misunderstood get_head_action. It maps the function to BOTH get and head. In this case it means that GET is not being mapped.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"6e9d4ac0370195b8ddddd4978e5f7c70277c52ab","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            get_head_action\u003d\u0027check_implied_role\u0027,"},{"line_number":94,"context_line":"            get_action\u003d\u0027get_implied_role\u0027,"},{"line_number":95,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_role\u0027),"},{"line_number":96,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":55,"id":"9a68dd71_420545c0","line":93,"range":{"start_line":93,"start_character":27,"end_line":93,"end_character":29},"in_reply_to":"ba63e191_a2f5ddcb","updated":"2016-01-20 18:10:25.000000000","message":"++, besides, check_implied_roles is not on the API spec.\n\nhttps://github.com/openstack/keystone-specs/blob/master/api/v3/identity-api-v3.rst\n\nMay want to remove it for now.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"},{"line_number":97,"context_line":"            path_vars\u003d{"},{"line_number":98,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":99,"context_line":"                \u0027implied_role_id\u0027: json_home.Parameters.IMPLIED_ROLE_ID"},{"line_number":100,"context_line":"            }"},{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_0c618239","line":99,"range":{"start_line":99,"start_character":45,"end_line":99,"end_character":55},"updated":"2016-01-20 01:22:02.000000000","message":"ROLE_ID for both. \n\nThe prior and implied role ids are not new concepts they refer to the existing concept of a role id.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b88b73a05c7f864b68a07da4b38af16f81f82fb7","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"},{"line_number":97,"context_line":"            path_vars\u003d{"},{"line_number":98,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":99,"context_line":"                \u0027implied_role_id\u0027: json_home.Parameters.IMPLIED_ROLE_ID"},{"line_number":100,"context_line":"            }"},{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        self._add_resource("}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_8ce1eb00","line":99,"range":{"start_line":99,"start_character":45,"end_line":99,"end_character":55},"in_reply_to":"ba63e191_0c618239","updated":"2016-01-22 03:05:17.000000000","message":"Done","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"795141c4f8aa72a2ce943f71d5f9d1ae7bf14f69","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        self._add_resource("},{"line_number":103,"context_line":"            mapper, implied_roles_controller,"},{"line_number":104,"context_line":"            path\u003d\u0027/role_inferences\u0027,"},{"line_number":105,"context_line":"            get_action\u003d\u0027list_role_inference_rules\u0027,"},{"line_number":106,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027role_inferences\u0027),"},{"line_number":107,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_2c7d66e7","line":104,"range":{"start_line":104,"start_character":19,"end_line":104,"end_character":34},"updated":"2016-01-20 01:22:02.000000000","message":"still weird to me that this is on a completely different path.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b88b73a05c7f864b68a07da4b38af16f81f82fb7","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        self._add_resource("},{"line_number":103,"context_line":"            mapper, implied_roles_controller,"},{"line_number":104,"context_line":"            path\u003d\u0027/role_inferences\u0027,"},{"line_number":105,"context_line":"            get_action\u003d\u0027list_role_inference_rules\u0027,"},{"line_number":106,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027role_inferences\u0027),"},{"line_number":107,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_acbb8fe4","line":104,"range":{"start_line":104,"start_character":19,"end_line":104,"end_character":34},"in_reply_to":"ba63e191_2c7d66e7","updated":"2016-01-22 03:05:17.000000000","message":"The reason is that the data returned is much simpler and different from the other path; this is just the  rules, based on IDs.","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"2289277e8c016f1865eab765144a5bf1c1713c61","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self._add_resource("},{"line_number":89,"context_line":"            mapper, implied_roles_controller,"},{"line_number":90,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            head_action\u003d\u0027check_implied_role\u0027,"},{"line_number":94,"context_line":"            get_action\u003d\u0027get_implied_role\u0027,"}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_bbb1e4e1","line":91,"updated":"2016-01-26 05:04:13.000000000","message":"Is PUT correct since PUT is usually an update? Or are we mis-using/crossing put/post? Is this meant to be post? Just checking no change needed ifthis is confirmed correct.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"6adbda55153466b9210e44405743cc4750a24609","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self._add_resource("},{"line_number":89,"context_line":"            mapper, implied_roles_controller,"},{"line_number":90,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            head_action\u003d\u0027check_implied_role\u0027,"},{"line_number":94,"context_line":"            get_action\u003d\u0027get_implied_role\u0027,"}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_d6956188","line":91,"in_reply_to":"9a68dd71_bbb1e4e1","updated":"2016-01-26 20:58:41.000000000","message":"PUT when you know the whole path ahead of time, which we do here since we know both role_ids that compose the URL","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"145eaab44b49e82b82214560a7afccb1501e4cc2","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_04266ece","line":79,"updated":"2016-01-27 22:24:23.000000000","message":"The \"prior_\" here (and throughout) is not good REST in my opinion. At least not optimal. These are \"roles\", and should use that existing noun.\n\nAnd you should have a way to trace these relationships in both directions, not just one.\n\nI would suggest:\n\nGET /role?implied_by\u003d{role_id}\nGET /role?implies\u003d{role_id}","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9fefd2747be990116d920459a9036009d76ffa95","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_11122f63","line":79,"in_reply_to":"7a5de9d1_04266ece","updated":"2016-01-27 22:53:05.000000000","message":"too late to change the spec would it?","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"60bf46903f6c9fdb4098cc101c239fc8a4a88d3d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_d420054c","line":79,"in_reply_to":"7a5de9d1_11122f63","updated":"2016-01-27 22:59:41.000000000","message":"why would it be too late?","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f8981422b6eeb7b9138c36227e1276b2c8ce3299","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        implied_roles_controller \u003d controllers.ImpliedRolesV3()"},{"line_number":77,"context_line":"        self._add_resource("},{"line_number":78,"context_line":"            mapper, implied_roles_controller,"},{"line_number":79,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_aad8801e","line":79,"in_reply_to":"7a5de9d1_d420054c","updated":"2016-01-28 03:06:13.000000000","message":"Done.","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"145eaab44b49e82b82214560a7afccb1501e4cc2","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self._add_resource("},{"line_number":89,"context_line":"            mapper, implied_roles_controller,"},{"line_number":90,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            head_action\u003d\u0027check_implied_role\u0027,"},{"line_number":94,"context_line":"            get_action\u003d\u0027get_implied_role\u0027,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_7fa1efa8","line":91,"updated":"2016-01-27 22:24:23.000000000","message":"continuing the comment above, these would be:\n\nPATCH /role/{role_id} adding or removing things from new \"implied_by\" and \"implies\" elements in the json for a role to create and delete these relationships. Or POST /role_inferences and DELETE /role_inferences/{role_inference_id}.\n\nYou may not have a replacement for check_implied_role... Instead, call GET /role?implies\u003d{role_id} and parse the response to see whether what you\u0027re looking for is there. Or you could GET /role_inferences?prior_role\u003d{role_id}\u0026implied_role\u003d{role_id} and expect 404 if that doesn\u0027t exist.\n\nGET /role/{role_id} would replace get_implied_role","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f8981422b6eeb7b9138c36227e1276b2c8ce3299","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self._add_resource("},{"line_number":89,"context_line":"            mapper, implied_roles_controller,"},{"line_number":90,"context_line":"            path\u003d\u0027/prior_role/{prior_role_id}/implies/{implied_role_id}\u0027,"},{"line_number":91,"context_line":"            put_action\u003d\u0027create_implied_role\u0027,"},{"line_number":92,"context_line":"            delete_action\u003d\u0027delete_implied_role\u0027,"},{"line_number":93,"context_line":"            head_action\u003d\u0027check_implied_role\u0027,"},{"line_number":94,"context_line":"            get_action\u003d\u0027get_implied_role\u0027,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_2a033075","line":91,"in_reply_to":"7a5de9d1_7fa1efa8","updated":"2016-01-28 03:06:13.000000000","message":"yeah, this will work.  We don\u0027t need a different start to the URL..not sure why I thought we did.","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":10608,"name":"Matthew Edmonds","email":"edmondsw@us.ibm.com","username":"edmondsw"},"change_message_id":"145eaab44b49e82b82214560a7afccb1501e4cc2","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        self._add_resource("},{"line_number":103,"context_line":"            mapper, implied_roles_controller,"},{"line_number":104,"context_line":"            path\u003d\u0027/role_inferences\u0027,"},{"line_number":105,"context_line":"            get_action\u003d\u0027list_role_inference_rules\u0027,"},{"line_number":106,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027role_inferences\u0027),"},{"line_number":107,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_7104c314","line":104,"updated":"2016-01-27 22:24:23.000000000","message":"It\u0027s not good REST to be able to list this here but create/update/delete with a totally different path structure. If you\u0027re creating/deleting above, where you\u0027re also listing and getting, then you don\u0027t need this. If you move the create/delete down here, then the get/list could move here as well. But we should be consistent.","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"f8981422b6eeb7b9138c36227e1276b2c8ce3299","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        self._add_resource("},{"line_number":103,"context_line":"            mapper, implied_roles_controller,"},{"line_number":104,"context_line":"            path\u003d\u0027/role_inferences\u0027,"},{"line_number":105,"context_line":"            get_action\u003d\u0027list_role_inference_rules\u0027,"},{"line_number":106,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027role_inferences\u0027),"},{"line_number":107,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_2aec90c6","line":104,"in_reply_to":"7a5de9d1_7104c314","updated":"2016-01-28 03:06:13.000000000","message":"The structure of the resource here is different from above.  This API is probably superfluous, but it is the only way to display all of the rules.","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a47f07a7863a6a4ee1ab960fd4d34781d0a00563","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            path\u003d\u0027/roles/{prior_role_id}/implies\u0027,"},{"line_number":80,"context_line":"            rel\u003djson_home.build_v3_resource_relation(\u0027implied_roles\u0027),"},{"line_number":81,"context_line":"            get_action\u003d\u0027list_implied_roles\u0027,"},{"line_number":82,"context_line":"            status\u003djson_home.Status.EXPERIMENTAL,"},{"line_number":83,"context_line":"            path_vars\u003d{"},{"line_number":84,"context_line":"                \u0027prior_role_id\u0027: json_home.Parameters.ROLE_ID,"},{"line_number":85,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":73,"id":"5a5ae5dd_1dbb3ec6","line":82,"range":{"start_line":82,"start_character":19,"end_line":82,"end_character":48},"updated":"2016-02-03 07:17:32.000000000","message":"nice use of experimental","commit_id":"e1b5751a4cd8e5cdbca8bf21f2a0263812d60cd0"}],"keystone/common/config.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"cefdb9db371babb5fa57256a750620116ce37c9b","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                        \u0027middleware must be configured with the \u0027"},{"line_number":293,"context_line":"                        \u0027hash_algorithms, otherwise token revocation will \u0027"},{"line_number":294,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":295,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":296,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":297,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":298,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_85825451","line":295,"range":{"start_line":295,"start_character":42,"end_line":295,"end_character":43},"updated":"2015-12-17 09:43:52.000000000","message":"this should default to false since it\u0027s the first time we are adding a new feature","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"11427718a6f0ffcfdebaabd2a6abb7caf5a5a9e5","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                        \u0027middleware must be configured with the \u0027"},{"line_number":293,"context_line":"                        \u0027hash_algorithms, otherwise token revocation will \u0027"},{"line_number":294,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":295,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":296,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":297,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":298,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_dfd0fd55","line":295,"range":{"start_line":295,"start_character":42,"end_line":295,"end_character":43},"in_reply_to":"3a7e1126_19130fba","updated":"2015-12-17 17:18:32.000000000","message":"agreed that it is a kill switch, if there are no implied roles by default then there\u0027s no harm.\n\nagain this is just my gut saying that it\u0027s a major new feature and new APIs and the deployer should opt-in as opposed to opt-out. \n\ni think it\u0027s safe/wise to go this route, almost every new feature we land as a team will have a few bugs the first go around. Fernet/federation/etc.\n\nnot super for or against this, just going with what we normally do. but its a new crazy non-extension world out there!","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a4dbc48359478c2fd0369526e859e985f6a63664","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                        \u0027middleware must be configured with the \u0027"},{"line_number":293,"context_line":"                        \u0027hash_algorithms, otherwise token revocation will \u0027"},{"line_number":294,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":295,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":296,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":297,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":298,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a7e1126_19130fba","line":295,"range":{"start_line":295,"start_character":42,"end_line":295,"end_character":43},"in_reply_to":"3a7e1126_85825451","updated":"2015-12-17 15:07:03.000000000","message":"I think making it disabled by default is not necessary here.\n\nThis really is a kill switch, and I debated even putting it in.  Since no implied roles are defined by default,  there is no change in behavior by default; enabling the is will do nothing.\n\nIn the future, we may decide that we want to expand roles in the policy file as opposed to in the token, to minimize transfer size.  If that is the case, then we can disable this here as well.\n\n\nDisabling implied roles will  prevent people from being able to use the feature if it is disabled by default, delaying adoption. Is that wise.","commit_id":"0e42a08e64cc76ad70ad4c8d7fb43fa0bebe8e4f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"77210892e66a451b79bd23a90041fa9ac35da258","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":298,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":299,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":300,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":301,"context_line":"    ],"},{"line_number":302,"context_line":"    \u0027revoke\u0027: ["},{"line_number":303,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a7b0d38_7b2a1480","line":300,"range":{"start_line":300,"start_character":20,"end_line":300,"end_character":25},"updated":"2015-12-26 08:12:38.000000000","message":"bump this line over a few characters to line up the single quotes","commit_id":"0ac80685b9f3bd2c6131e0279cba2c6068f45de6"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"4c788c02891329ebf13a76157a3ff4cc74414d1f","unresolved":false,"context_lines":[{"line_number":380,"context_line":"                   default\u003d\u0027sql\u0027),"},{"line_number":381,"context_line":"        cfg.StrOpt(\u0027root_role\u0027, default\u003d\u0027admin\u0027,"},{"line_number":382,"context_line":"                   help\u003d\u0027A role that is not allowed to be an implied \u0027"},{"line_number":383,"context_line":"                   \u0027role, as it is the root of Role inference DAG.\u0027),"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    ],"},{"line_number":386,"context_line":"    \u0027resource\u0027: ["}],"source_content_type":"text/x-python","patch_set":68,"id":"7a5de9d1_326ff42c","line":383,"range":{"start_line":383,"start_character":62,"end_line":383,"end_character":65},"updated":"2016-01-28 20:12:16.000000000","message":"may want to expend this one","commit_id":"0a94c2966b152cb8912357fc9ca4311730dbdcf2"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"56e2238233cfb472a04a1ca4ef2276c9f73a6bee","unresolved":false,"context_lines":[{"line_number":378,"context_line":"                        \u0027keystone.assignment namespace. Only an SQL driver is \u0027"},{"line_number":379,"context_line":"                        \u0027supplied.\u0027,"},{"line_number":380,"context_line":"                   default\u003d\u0027sql\u0027),"},{"line_number":381,"context_line":"        cfg.StrOpt(\u0027root_role\u0027, default\u003d\u0027admin\u0027,"},{"line_number":382,"context_line":"                   help\u003d\u0027A role that is not allowed to be an implied \u0027"},{"line_number":383,"context_line":"                   \u0027role, as it is the root of role inference directed \u0027"},{"line_number":384,"context_line":"                   \u0027acyclic graph.\u0027),"}],"source_content_type":"text/x-python","patch_set":73,"id":"5a5ae5dd_baba0be0","line":381,"updated":"2016-02-03 18:21:56.000000000","message":"make this a listopt, one role is insufficient if we are using this pattern.","commit_id":"e1b5751a4cd8e5cdbca8bf21f2a0263812d60cd0"}],"keystone/common/models.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"863b6b3d36888575be8b80d027d9f1516e4e39e2","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class ImpliedRole(Model):"},{"line_number":156,"context_line":"    \"\"\"Role object."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    Required keys:"},{"line_number":159,"context_line":"        id"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_1ad57c42","line":156,"updated":"2015-11-07 03:13:03.000000000","message":"Implied Role object","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c478206530570082fe3837b6056e23aa1447161d","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class ImpliedRole(Model):"},{"line_number":156,"context_line":"    \"\"\"Role object."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    Required keys:"},{"line_number":159,"context_line":"        id"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_02ed0a8b","line":156,"in_reply_to":"da85f559_1ad57c42","updated":"2015-11-18 03:00:52.000000000","message":"Done","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"863b6b3d36888575be8b80d027d9f1516e4e39e2","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    \"\"\"Role object."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    Required keys:"},{"line_number":159,"context_line":"        id"},{"line_number":160,"context_line":"        name"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_dace14b4","line":159,"updated":"2015-11-07 03:13:03.000000000","message":"copy pasta","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c478206530570082fe3837b6056e23aa1447161d","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    \"\"\"Role object."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    Required keys:"},{"line_number":159,"context_line":"        id"},{"line_number":160,"context_line":"        name"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_a202fe3c","line":159,"in_reply_to":"da85f559_dace14b4","updated":"2015-11-18 03:00:52.000000000","message":"Done","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"}],"keystone/common/sql/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"863b6b3d36888575be8b80d027d9f1516e4e39e2","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    attributes \u003d []"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @classmethod"},{"line_number":124,"context_line":"    def from_dict(cls, d, include_extra_dict\u003dTrue):"},{"line_number":125,"context_line":"        new_d \u003d d.copy()"},{"line_number":126,"context_line":"        if include_extra_dict:"},{"line_number":127,"context_line":"            new_d[\u0027extra\u0027] \u003d {k: new_d.pop(k) for k in six.iterkeys(d)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_fa3678b3","line":124,"updated":"2015-11-07 03:13:03.000000000","message":"shouldn\u0027t need to do this, let\u0027s not depend on extra","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c478206530570082fe3837b6056e23aa1447161d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    attributes \u003d []"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @classmethod"},{"line_number":124,"context_line":"    def from_dict(cls, d, include_extra_dict\u003dTrue):"},{"line_number":125,"context_line":"        new_d \u003d d.copy()"},{"line_number":126,"context_line":"        if include_extra_dict:"},{"line_number":127,"context_line":"            new_d[\u0027extra\u0027] \u003d {k: new_d.pop(k) for k in six.iterkeys(d)"}],"source_content_type":"text/x-python","patch_set":1,"id":"da85f559_a2543e54","line":124,"in_reply_to":"da85f559_fa3678b3","updated":"2015-11-18 03:00:52.000000000","message":"Nah, this allows us to not have to depend on extra.  UI pass false to make this code work without extra.","commit_id":"728f4e462b5c460dfa28734c46fb14c10830ebe6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    attributes \u003d []"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @classmethod"},{"line_number":124,"context_line":"    def from_dict(cls, d, include_extra_dict\u003dTrue):"},{"line_number":125,"context_line":"        new_d \u003d d.copy()"},{"line_number":126,"context_line":"        if include_extra_dict:"},{"line_number":127,"context_line":"            new_d[\u0027extra\u0027] \u003d {k: new_d.pop(k) for k in six.iterkeys(d)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_a344fa1a","line":124,"updated":"2015-12-04 23:44:24.000000000","message":"this change should be in a separate review.","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    attributes \u003d []"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    @classmethod"},{"line_number":124,"context_line":"    def from_dict(cls, d, include_extra_dict\u003dTrue):"},{"line_number":125,"context_line":"        new_d \u003d d.copy()"},{"line_number":126,"context_line":"        if include_extra_dict:"},{"line_number":127,"context_line":"            new_d[\u0027extra\u0027] \u003d {k: new_d.pop(k) for k in six.iterkeys(d)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_76468450","line":124,"in_reply_to":"7a740942_a344fa1a","updated":"2015-12-10 01:55:28.000000000","message":"Done","commit_id":"ae0ac2593e3f31305db9735094176c1dd18e7459"}],"keystone/common/sql/migrate_repo/versions/086_implied_roles.py":[{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a0733f6d3ffcd10ff6a7fce1b1ea1980c43b23b3","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    implied_roles \u003d sql.Table("},{"line_number":29,"context_line":"        \u0027implied_role\u0027, meta,"},{"line_number":30,"context_line":"        sql.Column(\u0027prior_role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue),"},{"line_number":31,"context_line":"        sql.Column("}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_2c34b748","line":28,"updated":"2015-11-20 22:00:26.000000000","message":"rename it to implied_role","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8483aaaec1192feab1f6754010a5f81aac2bf4bf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":26,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    implied_roles \u003d sql.Table("},{"line_number":29,"context_line":"        \u0027implied_role\u0027, meta,"},{"line_number":30,"context_line":"        sql.Column(\u0027prior_role_id\u0027, sql.String(length\u003d64), primary_key\u003dTrue),"},{"line_number":31,"context_line":"        sql.Column("}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_263cce2e","line":28,"in_reply_to":"ba8a016a_2c34b748","updated":"2015-11-21 02:42:56.000000000","message":"Done","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import sqlalchemy as sql"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"ROLE_TABLE \u003d \u0027role\u0027"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_40f9b0c7","line":21,"updated":"2015-12-10 05:03:36.000000000","message":"IMPLIED_ROLE_TABLE\u003d\u0027implied_role\u0027, fine as it is.","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"}],"keystone/exception.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9fefd2747be990116d920459a9036009d76ffa95","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"class InvalidImpliedRole(Forbidden):"},{"line_number":293,"context_line":"    message_format \u003d _(\"%(role_id)s cannot be an implied roles\")"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"class RoleAssignmentNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_7404b114","line":293,"range":{"start_line":293,"start_character":62,"end_line":293,"end_character":64},"updated":"2016-01-27 22:53:05.000000000","message":"why not?","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"56e2238233cfb472a04a1ca4ef2276c9f73a6bee","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"class InvalidImpliedRole(Forbidden):"},{"line_number":293,"context_line":"    message_format \u003d _(\"%(role_id)s cannot be an implied roles\")"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"class RoleAssignmentNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":73,"id":"5a5ae5dd_172d3aa7","line":293,"updated":"2016-02-03 18:21:56.000000000","message":"\"cannot be an implied roles\" is incorrect grammar (NIT). Please fix in a followup","commit_id":"e1b5751a4cd8e5cdbca8bf21f2a0263812d60cd0"}],"keystone/tests/unit/test_v3.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9d259654f70924a6c22a8a8e5750d63484ec65b6","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"        return link"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"    def build_role_assignment_entity("},{"line_number":1295,"context_line":"            self, link\u003dNone, prior_link\u003dNone, **attribs):"},{"line_number":1296,"context_line":"        \"\"\"Build and return a role assignment entity with provided attributes."},{"line_number":1297,"context_line":""},{"line_number":1298,"context_line":"        Provided attributes are expected to contain: domain_id or project_id,"}],"source_content_type":"text/x-python","patch_set":55,"id":"ba63e191_688a71c1","line":1295,"range":{"start_line":1295,"start_character":29,"end_line":1295,"end_character":39},"updated":"2016-01-19 21:46:35.000000000","message":"prior_role_link ? Only prior_link seems meaningless","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b88b73a05c7f864b68a07da4b38af16f81f82fb7","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"        return link"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"    def build_role_assignment_entity("},{"line_number":1295,"context_line":"            self, link\u003dNone, prior_link\u003dNone, **attribs):"},{"line_number":1296,"context_line":"        \"\"\"Build and return a role assignment entity with provided attributes."},{"line_number":1297,"context_line":""},{"line_number":1298,"context_line":"        Provided attributes are expected to contain: domain_id or project_id,"}],"source_content_type":"text/x-python","patch_set":55,"id":"9a68dd71_4be4390c","line":1295,"range":{"start_line":1295,"start_character":29,"end_line":1295,"end_character":39},"in_reply_to":"ba63e191_688a71c1","updated":"2016-01-22 03:05:17.000000000","message":"Done","commit_id":"ae741f4dcd124e1380190b0a6ad4cfd476506c3e"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a0733f6d3ffcd10ff6a7fce1b1ea1980c43b23b3","unresolved":false,"context_lines":[{"line_number":3212,"context_line":"        url \u003d \u0027/implied_role/%s/%s\u0027 % (prior[\u0027id\u0027], implied[\u0027id\u0027])"},{"line_number":3213,"context_line":"        self.delete(url)"},{"line_number":3214,"context_line":""},{"line_number":3215,"context_line":"    def test_CRUD_implied_role(self):"},{"line_number":3216,"context_line":"        prior \u003d self._create_role()"},{"line_number":3217,"context_line":"        implied1 \u003d self._create_role()"},{"line_number":3218,"context_line":"        self._create_implied_role(prior, implied1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_92993822","line":3215,"updated":"2015-11-20 22:00:26.000000000","message":"we don\u0027t have the U of CRUD here :/","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"8483aaaec1192feab1f6754010a5f81aac2bf4bf","unresolved":false,"context_lines":[{"line_number":3212,"context_line":"        url \u003d \u0027/implied_role/%s/%s\u0027 % (prior[\u0027id\u0027], implied[\u0027id\u0027])"},{"line_number":3213,"context_line":"        self.delete(url)"},{"line_number":3214,"context_line":""},{"line_number":3215,"context_line":"    def test_CRUD_implied_role(self):"},{"line_number":3216,"context_line":"        prior \u003d self._create_role()"},{"line_number":3217,"context_line":"        implied1 \u003d self._create_role()"},{"line_number":3218,"context_line":"        self._create_implied_role(prior, implied1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba8a016a_460b127e","line":3215,"in_reply_to":"ba8a016a_92993822","updated":"2015-11-21 02:42:56.000000000","message":"Immutable.  CRD?  Done","commit_id":"bf0897fcbf6679baaf3def9d3eeaf416410b694f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":2036,"context_line":"        self.assertEqual(r.result[\u0027prior_role_id\u0027], prior[\u0027id\u0027])"},{"line_number":2037,"context_line":"        self.assertEqual(0, len(r.result[\u0027implied_roles\u0027]))"},{"line_number":2038,"context_line":""},{"line_number":2039,"context_line":"    def _create_implied_role(self, prior, implied):"},{"line_number":2040,"context_line":"        url \u003d \u0027/implied_role/%s/%s\u0027 % (prior[\u0027id\u0027], implied[\u0027id\u0027])"},{"line_number":2041,"context_line":"        self.put(url)"},{"line_number":2042,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_c05da0ed","line":2039,"updated":"2015-12-10 05:03:36.000000000","message":"\"\"\"Call ``PUT /implied_role/{prior_role_id}/{implied_role_id}``.\"\"\", fine as it is.","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":2040,"context_line":"        url \u003d \u0027/implied_role/%s/%s\u0027 % (prior[\u0027id\u0027], implied[\u0027id\u0027])"},{"line_number":2041,"context_line":"        self.put(url)"},{"line_number":2042,"context_line":""},{"line_number":2043,"context_line":"    def _delete_implied_role(self, prior, implied):"},{"line_number":2044,"context_line":"        url \u003d \u0027/implied_role/%s/%s\u0027 % (prior[\u0027id\u0027], implied[\u0027id\u0027])"},{"line_number":2045,"context_line":"        self.delete(url)"},{"line_number":2046,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_a05c14ee","line":2043,"updated":"2015-12-10 05:03:36.000000000","message":"\"\"\"Call ``DELETE /implied_role/{prior_role_id}/{implied_role_id}``.\"\"\", fine as it is.","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":2053,"context_line":""},{"line_number":2054,"context_line":"        r \u003d self.get(\u0027/implied_roles/%s\u0027 % (prior[\u0027id\u0027]))"},{"line_number":2055,"context_line":""},{"line_number":2056,"context_line":"        self.assertEqual(r.result[\u0027prior_role_id\u0027], prior[\u0027id\u0027])"},{"line_number":2057,"context_line":"        self.assertIn(implied1[\u0027id\u0027], r.result[\u0027implied_roles\u0027])"},{"line_number":2058,"context_line":"        self.assertIn(implied2[\u0027id\u0027], r.result[\u0027implied_roles\u0027])"},{"line_number":2059,"context_line":"        self.assertEqual(2, len(r.result[\u0027implied_roles\u0027]))"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_c0cfe0b1","line":2056,"updated":"2015-12-10 05:03:36.000000000","message":"pls switch the order for this assertion, the correct signature is\n self.assertEqual(expected, actual)","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":2061,"context_line":"        self._delete_implied_role(prior, implied2)"},{"line_number":2062,"context_line":"        r \u003d self.get(\u0027/implied_roles/%s\u0027 % (prior[\u0027id\u0027]))"},{"line_number":2063,"context_line":""},{"line_number":2064,"context_line":"        self.assertEqual(r.result[\u0027prior_role_id\u0027], prior[\u0027id\u0027])"},{"line_number":2065,"context_line":"        self.assertIn(implied1[\u0027id\u0027], r.result[\u0027implied_roles\u0027])"},{"line_number":2066,"context_line":"        self.assertNotIn(implied2[\u0027id\u0027], r.result[\u0027implied_roles\u0027])"},{"line_number":2067,"context_line":"        self.assertEqual(1, len(r.result[\u0027implied_roles\u0027]))"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_208d847b","line":2064,"updated":"2015-12-10 05:03:36.000000000","message":"pls switch the order for this assertion, the correct signature is\n self.assertEqual(expected, actual)","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"77210892e66a451b79bd23a90041fa9ac35da258","unresolved":false,"context_lines":[{"line_number":2169,"context_line":"        self.delete(member_url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":2170,"context_line":""},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"class ImpliedRoleTests(test_v3.RestfulTestCase, unit.TestCase):"},{"line_number":2173,"context_line":"    def _create_role(self):"},{"line_number":2174,"context_line":"        \"\"\"Call ``POST /roles``.\"\"\""},{"line_number":2175,"context_line":"        ref \u003d unit.new_role_ref()"}],"source_content_type":"text/x-python","patch_set":26,"id":"1a7b0d38_5b4e3870","line":2172,"range":{"start_line":2172,"start_character":0,"end_line":2172,"end_character":63},"updated":"2015-12-26 08:12:38.000000000","message":"needs a few more tests to complete the coverage:\n\n  - make sure an implied role name can\u0027t match the name of \u0027global\u0027 role\n\n  - a test that uses \"ImpliedRoleNotFound\"","commit_id":"0ac80685b9f3bd2c6131e0279cba2c6068f45de6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":2174,"context_line":"    def _create_role(self):"},{"line_number":2175,"context_line":"        \"\"\"Call ``POST /roles``.\"\"\""},{"line_number":2176,"context_line":"        ref \u003d unit.new_role_ref()"},{"line_number":2177,"context_line":"        r \u003d self.post("},{"line_number":2178,"context_line":"            \u0027/roles\u0027,"},{"line_number":2179,"context_line":"            body\u003d{\u0027role\u0027: ref})"},{"line_number":2180,"context_line":"        return self.assertValidRoleResponse(r, ref)"},{"line_number":2181,"context_line":""},{"line_number":2182,"context_line":"    def test_list_implied_roles_none(self):"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_b99a1dc4","line":2179,"range":{"start_line":2177,"start_character":0,"end_line":2179,"end_character":31},"updated":"2016-01-18 07:50:11.000000000","message":"wrap this in one line.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"51d2530d4d761f033fb831ae9f66ca4afc52924c","unresolved":false,"context_lines":[{"line_number":2174,"context_line":"    def _create_role(self):"},{"line_number":2175,"context_line":"        \"\"\"Call ``POST /roles``.\"\"\""},{"line_number":2176,"context_line":"        ref \u003d unit.new_role_ref()"},{"line_number":2177,"context_line":"        r \u003d self.post("},{"line_number":2178,"context_line":"            \u0027/roles\u0027,"},{"line_number":2179,"context_line":"            body\u003d{\u0027role\u0027: ref})"},{"line_number":2180,"context_line":"        return self.assertValidRoleResponse(r, ref)"},{"line_number":2181,"context_line":""},{"line_number":2182,"context_line":"    def test_list_implied_roles_none(self):"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_3f011107","line":2179,"range":{"start_line":2177,"start_character":0,"end_line":2179,"end_character":31},"in_reply_to":"da6ed579_b99a1dc4","updated":"2016-01-18 20:38:12.000000000","message":"Done","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":2183,"context_line":"        prior \u003d self._create_role()"},{"line_number":2184,"context_line":"        url \u003d \u0027/prior_role/%s/implies\u0027 % (prior[\u0027id\u0027])"},{"line_number":2185,"context_line":"        r \u003d self.get(url)"},{"line_number":2186,"context_line":"        self.assertEqual(r.result[\u0027prior_role_id\u0027], prior[\u0027id\u0027])"},{"line_number":2187,"context_line":"        self.assertEqual(0, len(r.result[\u0027implied_roles\u0027]))"},{"line_number":2188,"context_line":""},{"line_number":2189,"context_line":"    def _create_implied_role(self, prior, implied):"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_99a959e2","line":2186,"range":{"start_line":2186,"start_character":8,"end_line":2186,"end_character":64},"updated":"2016-01-18 07:50:11.000000000","message":"change this to:\n  self.assertEqual(prior[\u0027id\u0027], r.result[\u0027prior_role_id\u0027])\n\nthe signature is (expected, observed)","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"51d2530d4d761f033fb831ae9f66ca4afc52924c","unresolved":false,"context_lines":[{"line_number":2183,"context_line":"        prior \u003d self._create_role()"},{"line_number":2184,"context_line":"        url \u003d \u0027/prior_role/%s/implies\u0027 % (prior[\u0027id\u0027])"},{"line_number":2185,"context_line":"        r \u003d self.get(url)"},{"line_number":2186,"context_line":"        self.assertEqual(r.result[\u0027prior_role_id\u0027], prior[\u0027id\u0027])"},{"line_number":2187,"context_line":"        self.assertEqual(0, len(r.result[\u0027implied_roles\u0027]))"},{"line_number":2188,"context_line":""},{"line_number":2189,"context_line":"    def _create_implied_role(self, prior, implied):"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_e2fe7e04","line":2186,"range":{"start_line":2186,"start_character":8,"end_line":2186,"end_character":64},"in_reply_to":"da6ed579_99a959e2","updated":"2016-01-18 20:38:12.000000000","message":"Done","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":2193,"context_line":"        self.delete(\u0027/prior_role/%s/implies/%s\u0027 %"},{"line_number":2194,"context_line":"                    (prior[\u0027id\u0027], implied[\u0027id\u0027]))"},{"line_number":2195,"context_line":""},{"line_number":2196,"context_line":"    def test_CRD_implied_roles(self):"},{"line_number":2197,"context_line":"        prior \u003d self._create_role()"},{"line_number":2198,"context_line":"        implied1 \u003d self._create_role()"},{"line_number":2199,"context_line":"        self._create_implied_role(prior, implied1)"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_59ac41ed","line":2196,"range":{"start_line":2196,"start_character":8,"end_line":2196,"end_character":30},"updated":"2016-01-18 07:50:11.000000000","message":"this could be split into three patches, so that it\u0027s easier to identify where is the failure comes from if there is something wrong.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"51d2530d4d761f033fb831ae9f66ca4afc52924c","unresolved":false,"context_lines":[{"line_number":2193,"context_line":"        self.delete(\u0027/prior_role/%s/implies/%s\u0027 %"},{"line_number":2194,"context_line":"                    (prior[\u0027id\u0027], implied[\u0027id\u0027]))"},{"line_number":2195,"context_line":""},{"line_number":2196,"context_line":"    def test_CRD_implied_roles(self):"},{"line_number":2197,"context_line":"        prior \u003d self._create_role()"},{"line_number":2198,"context_line":"        implied1 \u003d self._create_role()"},{"line_number":2199,"context_line":"        self._create_implied_role(prior, implied1)"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_bfa18148","line":2196,"range":{"start_line":2196,"start_character":8,"end_line":2196,"end_character":30},"in_reply_to":"da6ed579_59ac41ed","updated":"2016-01-18 20:38:12.000000000","message":"I think you mean three tests.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"b5f8344326502ea159cf78293fc6642325589067","unresolved":false,"context_lines":[{"line_number":2193,"context_line":"        self.delete(\u0027/prior_role/%s/implies/%s\u0027 %"},{"line_number":2194,"context_line":"                    (prior[\u0027id\u0027], implied[\u0027id\u0027]))"},{"line_number":2195,"context_line":""},{"line_number":2196,"context_line":"    def test_CRD_implied_roles(self):"},{"line_number":2197,"context_line":"        prior \u003d self._create_role()"},{"line_number":2198,"context_line":"        implied1 \u003d self._create_role()"},{"line_number":2199,"context_line":"        self._create_implied_role(prior, implied1)"}],"source_content_type":"text/x-python","patch_set":52,"id":"ba63e191_54ad0287","line":2196,"range":{"start_line":2196,"start_character":8,"end_line":2196,"end_character":30},"in_reply_to":"da6ed579_bfa18148","updated":"2016-01-19 01:33:18.000000000","message":"yes, thanks for correcting me.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":2207,"context_line":"        self.assertIn(implied2[\u0027id\u0027], r.result[\u0027implied_roles\u0027])"},{"line_number":2208,"context_line":"        self.assertEqual(2, len(r.result[\u0027implied_roles\u0027]))"},{"line_number":2209,"context_line":""},{"line_number":2210,"context_line":"        r \u003d self.get(\u0027/prior_role/%s/implies/%s\u0027 %"},{"line_number":2211,"context_line":"                     (prior[\u0027id\u0027], implied1[\u0027id\u0027]),"},{"line_number":2212,"context_line":"                     expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":2213,"context_line":"        r \u003d self.get(\u0027/prior_role/%s/implies/%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_f9b8952c","line":2210,"range":{"start_line":2210,"start_character":8,"end_line":2210,"end_character":12},"updated":"2016-01-18 07:50:11.000000000","message":"remove \u0027r\u003d\u0027 if it\u0027s not used at all.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":2209,"context_line":""},{"line_number":2210,"context_line":"        r \u003d self.get(\u0027/prior_role/%s/implies/%s\u0027 %"},{"line_number":2211,"context_line":"                     (prior[\u0027id\u0027], implied1[\u0027id\u0027]),"},{"line_number":2212,"context_line":"                     expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":2213,"context_line":"        r \u003d self.get(\u0027/prior_role/%s/implies/%s\u0027 %"},{"line_number":2214,"context_line":"                     (prior[\u0027id\u0027], implied2[\u0027id\u0027]),"},{"line_number":2215,"context_line":"                     expected_status\u003dhttp_client.NO_CONTENT)"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_d986f164","line":2212,"range":{"start_line":2212,"start_character":21,"end_line":2212,"end_character":59},"updated":"2016-01-18 07:50:11.000000000","message":"why nothing returned? looks like you have created implied roles, this should get back the implied role you have created, and should verify the implied role afterwards.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":2210,"context_line":"        r \u003d self.get(\u0027/prior_role/%s/implies/%s\u0027 %"},{"line_number":2211,"context_line":"                     (prior[\u0027id\u0027], implied1[\u0027id\u0027]),"},{"line_number":2212,"context_line":"                     expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":2213,"context_line":"        r \u003d self.get(\u0027/prior_role/%s/implies/%s\u0027 %"},{"line_number":2214,"context_line":"                     (prior[\u0027id\u0027], implied2[\u0027id\u0027]),"},{"line_number":2215,"context_line":"                     expected_status\u003dhttp_client.NO_CONTENT)"},{"line_number":2216,"context_line":""}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_39962d95","line":2213,"range":{"start_line":2213,"start_character":8,"end_line":2213,"end_character":12},"updated":"2016-01-18 07:50:11.000000000","message":"remove \u0027r\u003d\u0027 if it\u0027s not used at all.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"}],"keystone/tests/unit/test_v3_auth.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9f2e241dabe965b51eb22872b481dfa476e5b380","unresolved":false,"context_lines":[{"line_number":4016,"context_line":""},{"line_number":4017,"context_line":""},{"line_number":4018,"context_line":"class TestAuthSpecificData(test_v3.RestfulTestCase):"},{"line_number":4019,"context_line":""},{"line_number":4020,"context_line":"    def test_get_catalog_project_scoped_token(self):"},{"line_number":4021,"context_line":"        \"\"\"Call ``GET /auth/catalog`` with a project-scoped token.\"\"\""},{"line_number":4022,"context_line":"        r \u003d self.get(\u0027/auth/catalog\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_03562ed2","side":"PARENT","line":4019,"updated":"2015-12-04 23:44:24.000000000","message":"revert it back, this is irrelevant change.","commit_id":"8d2f2929398fb1053624570b1ca241707556f981"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"37a179ae54d25d01668f0c41abdd2f6fd9e1ca55","unresolved":false,"context_lines":[{"line_number":4016,"context_line":""},{"line_number":4017,"context_line":""},{"line_number":4018,"context_line":"class TestAuthSpecificData(test_v3.RestfulTestCase):"},{"line_number":4019,"context_line":""},{"line_number":4020,"context_line":"    def test_get_catalog_project_scoped_token(self):"},{"line_number":4021,"context_line":"        \"\"\"Call ``GET /auth/catalog`` with a project-scoped token.\"\"\""},{"line_number":4022,"context_line":"        r \u003d self.get(\u0027/auth/catalog\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a740942_eb85adce","side":"PARENT","line":4019,"in_reply_to":"7a740942_03562ed2","updated":"2015-12-10 01:55:28.000000000","message":"Done","commit_id":"8d2f2929398fb1053624570b1ca241707556f981"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":483,"context_line":"    def _create_role(self):"},{"line_number":484,"context_line":"        \"\"\"Call ``POST /roles``.\"\"\""},{"line_number":485,"context_line":"        ref \u003d unit.new_role_ref()"},{"line_number":486,"context_line":"        r \u003d self.post("},{"line_number":487,"context_line":"            \u0027/roles\u0027,"},{"line_number":488,"context_line":"            body\u003d{\u0027role\u0027: ref})"},{"line_number":489,"context_line":"        return self.assertValidRoleResponse(r, ref)"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _create_implied_role(self, prior_id):"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_5993e1a3","line":488,"range":{"start_line":486,"start_character":0,"end_line":488,"end_character":31},"updated":"2016-01-18 07:50:11.000000000","message":"wrap this in one line.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"51d2530d4d761f033fb831ae9f66ca4afc52924c","unresolved":false,"context_lines":[{"line_number":483,"context_line":"    def _create_role(self):"},{"line_number":484,"context_line":"        \"\"\"Call ``POST /roles``.\"\"\""},{"line_number":485,"context_line":"        ref \u003d unit.new_role_ref()"},{"line_number":486,"context_line":"        r \u003d self.post("},{"line_number":487,"context_line":"            \u0027/roles\u0027,"},{"line_number":488,"context_line":"            body\u003d{\u0027role\u0027: ref})"},{"line_number":489,"context_line":"        return self.assertValidRoleResponse(r, ref)"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"    def _create_implied_role(self, prior_id):"}],"source_content_type":"text/x-python","patch_set":52,"id":"ba63e191_25770904","line":488,"range":{"start_line":486,"start_character":0,"end_line":488,"end_character":31},"in_reply_to":"da6ed579_5993e1a3","updated":"2016-01-18 20:38:12.000000000","message":"Done","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"de30298ce9d006d6691295d2660e0a8cda034461","unresolved":false,"context_lines":[{"line_number":510,"context_line":"        return token_roles"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def test_create_implied_role_shows_in_v3_project_token(self):"},{"line_number":513,"context_line":"        self.config_fixture.config(group\u003d\u0027token\u0027, infer_roles\u003dTrue)"},{"line_number":514,"context_line":"        self._create_implied_role_shows_in_v3_token(False)"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    def test_create_implied_role_shows_in_v3_domain_token(self):"}],"source_content_type":"text/x-python","patch_set":52,"id":"da6ed579_dc86df64","line":513,"range":{"start_line":513,"start_character":8,"end_line":513,"end_character":67},"updated":"2016-01-18 07:50:11.000000000","message":"why override the default config? good as it is if you think this is necessary.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"51d2530d4d761f033fb831ae9f66ca4afc52924c","unresolved":false,"context_lines":[{"line_number":510,"context_line":"        return token_roles"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"    def test_create_implied_role_shows_in_v3_project_token(self):"},{"line_number":513,"context_line":"        self.config_fixture.config(group\u003d\u0027token\u0027, infer_roles\u003dTrue)"},{"line_number":514,"context_line":"        self._create_implied_role_shows_in_v3_token(False)"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    def test_create_implied_role_shows_in_v3_domain_token(self):"}],"source_content_type":"text/x-python","patch_set":52,"id":"ba63e191_05652544","line":513,"range":{"start_line":513,"start_character":8,"end_line":513,"end_character":67},"in_reply_to":"da6ed579_dc86df64","updated":"2016-01-18 20:38:12.000000000","message":"added comment.  This is a positive test for the config option regardless of the default that gets set.","commit_id":"dc94e9457db5b40179bc7eb1e8bda91d9f78bf09"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"fe4639926162987b23823d2a5b01ed40f3fbf391","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        self.identity_api.add_user_to_group(self.user[\u0027id\u0027],"},{"line_number":562,"context_line":"                                            new_group[\u0027id\u0027])"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        token_roles \u003d self._get_scoped_token_roles(is_domain)"},{"line_number":565,"context_line":"        self.assertEqual(2, len(token_roles))"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"        implied1 \u003d self._create_implied_role(prior)"},{"line_number":568,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_1fe1eed0","line":565,"range":{"start_line":564,"start_character":0,"end_line":565,"end_character":45},"updated":"2016-01-26 11:51:02.000000000","message":"ha, the prior role id will appear two times after expansion.","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"6adbda55153466b9210e44405743cc4750a24609","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        self.identity_api.add_user_to_group(self.user[\u0027id\u0027],"},{"line_number":562,"context_line":"                                            new_group[\u0027id\u0027])"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        token_roles \u003d self._get_scoped_token_roles(is_domain)"},{"line_number":565,"context_line":"        self.assertEqual(2, len(token_roles))"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"        implied1 \u003d self._create_implied_role(prior)"},{"line_number":568,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"9a68dd71_b6e30d33","line":565,"range":{"start_line":564,"start_character":0,"end_line":565,"end_character":45},"in_reply_to":"9a68dd71_1fe1eed0","updated":"2016-01-26 20:58:41.000000000","message":"yes, but the role itself will only appear once.  One will be a different role with a link to the prior in the \u0027indirect\u0027 section","commit_id":"1baefc316c2a68007d065b32af3dfb1a38b79258"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9fefd2747be990116d920459a9036009d76ffa95","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        self._create_implied_role_shows_in_v3_token(True)"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"    def _create_implied_role_shows_in_v3_token(self, is_domain):"},{"line_number":525,"context_line":"        token_roles \u003d self._get_scoped_token_roles(is_domain)"},{"line_number":526,"context_line":"        self.assertEqual(1, len(token_roles))"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_74eef123","line":524,"range":{"start_line":524,"start_character":8,"end_line":524,"end_character":46},"updated":"2016-01-27 22:53:05.000000000","message":"move this method up prior to line 510 so its easier to read the rest of the test code","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ddea235fcd983d9764ed3686ccb6dad7b0c57554","unresolved":false,"context_lines":[{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        self._create_implied_role_shows_in_v3_token(True)"},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"    def _create_implied_role_shows_in_v3_token(self, is_domain):"},{"line_number":525,"context_line":"        token_roles \u003d self._get_scoped_token_roles(is_domain)"},{"line_number":526,"context_line":"        self.assertEqual(1, len(token_roles))"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":61,"id":"7a5de9d1_567975fb","line":524,"range":{"start_line":524,"start_character":8,"end_line":524,"end_character":46},"in_reply_to":"7a5de9d1_74eef123","updated":"2016-01-28 03:35:00.000000000","message":"Done","commit_id":"d52d9524d84a04230235887ec316afb8fdd3c1dd"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a47f07a7863a6a4ee1ab960fd4d34781d0a00563","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        r \u003d self.get(\u0027/auth/tokens\u0027, headers\u003d{\u0027X-Subject-Token\u0027: v3_token})"},{"line_number":482,"context_line":"        self.assertValidProjectScopedTokenResponse(r, is_admin_project\u003dFalse)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def _create_role(self):"},{"line_number":485,"context_line":"        \"\"\"Call ``POST /roles``.\"\"\""},{"line_number":486,"context_line":"        ref \u003d unit.new_role_ref()"},{"line_number":487,"context_line":"        r \u003d self.post(\u0027/roles\u0027, body\u003d{\u0027role\u0027: ref})"},{"line_number":488,"context_line":"        return self.assertValidRoleResponse(r, ref)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"    def _create_implied_role(self, prior_id):"},{"line_number":491,"context_line":"        implied \u003d self._create_role()"},{"line_number":492,"context_line":"        url \u003d \u0027/roles/%s/implies/%s\u0027 % (prior_id, implied[\u0027id\u0027])"},{"line_number":493,"context_line":"        self.put(url, expected_status\u003dhttp_client.CREATED)"},{"line_number":494,"context_line":"        return implied"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def _delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":497,"context_line":"        url \u003d \u0027/roles/%s/implies/%s\u0027 % (prior_role_id, implied_role_id)"},{"line_number":498,"context_line":"        self.delete(url)"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"    def _get_scoped_token_roles(self, is_domain\u003dFalse):"},{"line_number":501,"context_line":"        if is_domain:"}],"source_content_type":"text/x-python","patch_set":73,"id":"5a5ae5dd_3d771a04","line":498,"range":{"start_line":484,"start_character":0,"end_line":498,"end_character":24},"updated":"2016-02-03 07:17:32.000000000","message":"these are copy and paste of test_v3_assignment. suggest creating a common class in test_v3_assignment to expose those functions and mix them in here, no reason for code duplication","commit_id":"e1b5751a4cd8e5cdbca8bf21f2a0263812d60cd0"}],"keystone/tests/unit/test_versions.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":334,"context_line":"            \u0027prior_role_id\u0027: json_home.Parameters.PRIOR_ROLE_ID,"},{"line_number":335,"context_line":"            \u0027implied_role_id\u0027: json_home.Parameters.IMPLIED_ROLE_ID,"},{"line_number":336,"context_line":"        }},"},{"line_number":337,"context_line":"    json_home.build_v3_resource_relation(\u0027role\u0027): {"},{"line_number":338,"context_line":"        \u0027href-template\u0027: \u0027/roles/{role_id}\u0027,"},{"line_number":339,"context_line":"        \u0027href-vars\u0027: {"},{"line_number":340,"context_line":"            \u0027role_id\u0027: json_home.Parameters.ROLE_ID, }},"}],"source_content_type":"text/x-python","patch_set":21,"id":"7a740942_205fc40f","line":337,"updated":"2015-12-10 05:03:36.000000000","message":"duplicated with L326~L325, remove those unnecessary code block.","commit_id":"186e8307ae14437d83f7053254b5a436c202cdc8"}],"tox.ini":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7bc9172b0884559092284198ab5353b33b1e4294","unresolved":false,"context_lines":[{"line_number":78,"context_line":"  # Run each legacy test separately, to avoid SQL model redefinitions"},{"line_number":79,"context_line":"  nosetests -v \\"},{"line_number":80,"context_line":"      keystone/tests/unit/backend/legacy_drivers/assignment/V8/sql.py"},{"line_number":81,"context_line":"  nosetests -v \\"},{"line_number":82,"context_line":"      keystone/tests/unit/backend/legacy_drivers/role/V8/sql.py"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"[testenv:pep8]"}],"source_content_type":"text/x-properties","patch_set":21,"id":"7a740942_60370ce4","side":"PARENT","line":81,"updated":"2015-12-10 05:03:36.000000000","message":"irrelevant change, revert it back and possibly in another review.","commit_id":"3f888260a75d4f763b3cb81b71c00c8cb53cb0c9"}]}
