)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"d37948fe6a304d8d6a3ecf43c163e6c3d504cd29","unresolved":false,"context_lines":[{"line_number":14,"context_line":"mass token deletion (delete_tokens_for_(user|trust|project|domain),"},{"line_number":15,"context_line":"domain content deletion, credential deletion, etc."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This change also moves around the use of @dependancy decorator"},{"line_number":18,"context_line":"to ensure the *_api managers are added to the correct objects."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The token_api has been expanded to handle the token revocations"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F8md8%3D","line":17,"updated":"2013-12-24 14:06:37.000000000","message":"Typo s/dependancy/dependency","commit_id":"d67ee16064559d88ee88a1abdc781d72c5be70d5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"caf7b846da02ba887c43ad9c2a0a43cc87cf141c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"mass token deletion (delete_tokens_for_(user|trust|project|domain),"},{"line_number":15,"context_line":"domain content deletion, credential deletion, etc."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This change also moves around the use of @dependancy decorator"},{"line_number":18,"context_line":"to ensure the *_api managers are added to the correct objects."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The token_api has been expanded to handle the token revocations"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAAT3%2F%2F%2BFQ%3D","line":17,"in_reply_to":"AAAATn%2F8md8%3D","updated":"2013-12-26 03:40:19.000000000","message":"Done","commit_id":"d67ee16064559d88ee88a1abdc781d72c5be70d5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Based upon the feedback on the credential_api deletion changes,"},{"line_number":10,"context_line":"the deletion code should be moved down to the managers from the"},{"line_number":11,"context_line":"controllers. This means the business logic to delete / modify"},{"line_number":12,"context_line":"associated resources based upon an given action no longer resides"},{"line_number":13,"context_line":"in the controller. The changes include (but are not limited to)"},{"line_number":14,"context_line":"mass token deletion (delete_tokens_for_(user|trust|project|domain),"},{"line_number":15,"context_line":"domain content deletion, credential deletion, etc."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"AAAAT3%2F%2Ftnc%3D","line":12,"updated":"2014-01-03 02:12:07.000000000","message":"change \"an given\" to \"a given\"","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Based upon the feedback on the credential_api deletion changes,"},{"line_number":10,"context_line":"the deletion code should be moved down to the managers from the"},{"line_number":11,"context_line":"controllers. This means the business logic to delete / modify"},{"line_number":12,"context_line":"associated resources based upon an given action no longer resides"},{"line_number":13,"context_line":"in the controller. The changes include (but are not limited to)"},{"line_number":14,"context_line":"mass token deletion (delete_tokens_for_(user|trust|project|domain),"},{"line_number":15,"context_line":"domain content deletion, credential deletion, etc."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"AAAAT3%2F%2Fta8%3D","line":12,"in_reply_to":"AAAAT3%2F%2Ftnc%3D","updated":"2014-01-03 03:36:55.000000000","message":"Done","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6f1f2261d3f67fd9679ac5ba8b6d329fff66a5d9","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Based upon the feedback on the credential_api deletion changes,"},{"line_number":10,"context_line":"the deletion code should be moved down to the managers from the"},{"line_number":11,"context_line":"controllers. This means the business logic to delete / modify"},{"line_number":12,"context_line":"associated resources based upon an given action no longer resides"},{"line_number":13,"context_line":"in the controller. The changes include (but are not limited to)"},{"line_number":14,"context_line":"mass token deletion (delete_tokens_for_(user|trust|project|domain),"},{"line_number":15,"context_line":"domain content deletion, credential deletion, etc."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAT3%2F%2FrBg%3D","line":12,"updated":"2014-01-03 18:35:19.000000000","message":"change \"an given\" to \"a given\"","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1bf24323f24414b37c53487c03d37b1523266c4f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Based upon the feedback on the credential_api deletion changes,"},{"line_number":10,"context_line":"the deletion code should be moved down to the managers from the"},{"line_number":11,"context_line":"controllers. This means the business logic to delete / modify"},{"line_number":12,"context_line":"associated resources based upon an given action no longer resides"},{"line_number":13,"context_line":"in the controller. The changes include (but are not limited to)"},{"line_number":14,"context_line":"mass token deletion (delete_tokens_for_(user|trust|project|domain),"},{"line_number":15,"context_line":"domain content deletion, credential deletion, etc."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAT3%2F%2Fq8o%3D","line":12,"in_reply_to":"AAAAT3%2F%2FrBg%3D","updated":"2014-01-03 18:45:12.000000000","message":"Done","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6f1f2261d3f67fd9679ac5ba8b6d329fff66a5d9","unresolved":false,"context_lines":[{"line_number":23,"context_line":"user\u0027s password to the current password hash, effectively making"},{"line_number":24,"context_line":"it impossible to login with the user. The longer-term fix"},{"line_number":25,"context_line":"should ensure that the backend does not need to update the user"},{"line_number":26,"context_line":"itself from the driver level."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"The token_api has been expanded to handle the token revocations"},{"line_number":29,"context_line":"for users, projects, and domains directly (public methods). This"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAT3%2F%2FrBY%3D","line":26,"updated":"2014-01-03 18:35:19.000000000","message":"would be nice if there was a bug filed and referenced here.","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1bf24323f24414b37c53487c03d37b1523266c4f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"user\u0027s password to the current password hash, effectively making"},{"line_number":24,"context_line":"it impossible to login with the user. The longer-term fix"},{"line_number":25,"context_line":"should ensure that the backend does not need to update the user"},{"line_number":26,"context_line":"itself from the driver level."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"The token_api has been expanded to handle the token revocations"},{"line_number":29,"context_line":"for users, projects, and domains directly (public methods). This"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAT3%2F%2Fq8k%3D","line":26,"in_reply_to":"AAAAT3%2F%2FrBY%3D","updated":"2014-01-03 18:45:12.000000000","message":"Done","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"}],"keystone/assignment/backends/kvs.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                    # is to remove it from the ref before sending it on. The"},{"line_number":265,"context_line":"                    # correct solution is to remove the need to call the"},{"line_number":266,"context_line":"                    # identity_api from within the driver."},{"line_number":267,"context_line":"                    user_ref.pop(\u0027password\u0027, None)"},{"line_number":268,"context_line":"                    tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"},{"line_number":269,"context_line":"                    if tenant_id not in tenants:"},{"line_number":270,"context_line":"                        tenants.add(tenant_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtnI%3D","line":267,"updated":"2014-01-03 02:12:07.000000000","message":"This limitation should be mentioned in the commit message, because I\u0027m guessing kvs backend is kind of broken with this.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                    # is to remove it from the ref before sending it on. The"},{"line_number":265,"context_line":"                    # correct solution is to remove the need to call the"},{"line_number":266,"context_line":"                    # identity_api from within the driver."},{"line_number":267,"context_line":"                    user_ref.pop(\u0027password\u0027, None)"},{"line_number":268,"context_line":"                    tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"},{"line_number":269,"context_line":"                    if tenant_id not in tenants:"},{"line_number":270,"context_line":"                        tenants.add(tenant_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtbI%3D","line":267,"in_reply_to":"AAAAT3%2F%2FtnI%3D","updated":"2014-01-03 03:36:55.000000000","message":"I hope no one is using KVS beyond testing.  I\u0027ll add it to the commit message.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"}],"keystone/assignment/core.py":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"d37948fe6a304d8d6a3ecf43c163e6c3d504cd29","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                    self.identity_api.delete_group(group[\u0027id\u0027],"},{"line_number":352,"context_line":"                                                   domain_scope\u003ddomain_id)"},{"line_number":353,"context_line":"                except exception.GroupNotFound:"},{"line_number":354,"context_line":"                    LOG.debug((\u0027Group %(groupid)s not found when deleting \u0027"},{"line_number":355,"context_line":"                               \u0027domain contents for %(domainid)s, continuing \u0027"},{"line_number":356,"context_line":"                               \u0027with cleanup.\u0027),"},{"line_number":357,"context_line":"                              {\u0027groupid\u0027: group[\u0027id\u0027], \u0027domainid\u0027: domain_id})"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F8mgA%3D","line":354,"updated":"2013-12-24 14:06:37.000000000","message":"This log message is missing the _ prefix to make it translatable","commit_id":"d67ee16064559d88ee88a1abdc781d72c5be70d5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"caf7b846da02ba887c43ad9c2a0a43cc87cf141c","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                    self.identity_api.delete_group(group[\u0027id\u0027],"},{"line_number":352,"context_line":"                                                   domain_scope\u003ddomain_id)"},{"line_number":353,"context_line":"                except exception.GroupNotFound:"},{"line_number":354,"context_line":"                    LOG.debug((\u0027Group %(groupid)s not found when deleting \u0027"},{"line_number":355,"context_line":"                               \u0027domain contents for %(domainid)s, continuing \u0027"},{"line_number":356,"context_line":"                               \u0027with cleanup.\u0027),"},{"line_number":357,"context_line":"                              {\u0027groupid\u0027: group[\u0027id\u0027], \u0027domainid\u0027: domain_id})"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAT3%2F%2F%2BFE%3D","line":354,"in_reply_to":"AAAATn%2F8mgA%3D","updated":"2013-12-26 03:40:19.000000000","message":"Good catch.  Thanks!","commit_id":"d67ee16064559d88ee88a1abdc781d72c5be70d5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    @notifications.updated(\u0027project\u0027)"},{"line_number":80,"context_line":"    def update_project(self, tenant_id, tenant):"},{"line_number":81,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":82,"context_line":"        user_ids \u003d []"},{"line_number":83,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":84,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":85,"context_line":"            if tenant[\u0027enabled\u0027] is False:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtmQ%3D","line":82,"updated":"2014-01-03 02:12:07.000000000","message":"suggest change the name to \"users_to_disable\"","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    @notifications.updated(\u0027project\u0027)"},{"line_number":80,"context_line":"    def update_project(self, tenant_id, tenant):"},{"line_number":81,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":82,"context_line":"        user_ids \u003d []"},{"line_number":83,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":84,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":85,"context_line":"            if tenant[\u0027enabled\u0027] is False:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftck%3D","line":82,"in_reply_to":"AAAAT3%2F%2FtmQ%3D","updated":"2014-01-03 03:36:55.000000000","message":"Done","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        user_ids \u003d []"},{"line_number":83,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":84,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":85,"context_line":"            if tenant[\u0027enabled\u0027] is False:"},{"line_number":86,"context_line":"                user_ids \u003d self.list_user_ids_for_project(tenant_id)"},{"line_number":87,"context_line":"        ret \u003d self.driver.update_project(tenant_id, tenant)"},{"line_number":88,"context_line":"        self.get_project.invalidate(self, tenant_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtmY%3D","line":85,"updated":"2014-01-03 02:12:07.000000000","message":"I don\u0027t think we should mix \u0027enabled\u0027 cleanup with listing users, so suggest out-dent this.\n\nuse \"if not tenant.get(\u0027enabled\u0027, True):\" like we had in v2 controller. I\u0027m worried about the change to \"is False\"... it\u0027s not the same","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"b57d8346d132148cf130e7b7c78ec69a7e87ec56","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        user_ids \u003d []"},{"line_number":83,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":84,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":85,"context_line":"            if tenant[\u0027enabled\u0027] is False:"},{"line_number":86,"context_line":"                user_ids \u003d self.list_user_ids_for_project(tenant_id)"},{"line_number":87,"context_line":"        ret \u003d self.driver.update_project(tenant_id, tenant)"},{"line_number":88,"context_line":"        self.get_project.invalidate(self, tenant_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtaM%3D","line":85,"in_reply_to":"AAAAT3%2F%2Ftco%3D","updated":"2014-01-03 03:41:20.000000000","message":"To be fair, clean should always return a boolean here, but I\u0027m fine with mirroring logic for clarity sake at the very least.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        user_ids \u003d []"},{"line_number":83,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":84,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":85,"context_line":"            if tenant[\u0027enabled\u0027] is False:"},{"line_number":86,"context_line":"                user_ids \u003d self.list_user_ids_for_project(tenant_id)"},{"line_number":87,"context_line":"        ret \u003d self.driver.update_project(tenant_id, tenant)"},{"line_number":88,"context_line":"        self.get_project.invalidate(self, tenant_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftco%3D","line":85,"in_reply_to":"AAAAT3%2F%2FtmY%3D","updated":"2014-01-03 03:36:55.000000000","message":"Oh, yes, that is a good point.  Will do.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.get_project.invalidate(self, tenant_id)"},{"line_number":89,"context_line":"        self.get_project_by_name.invalidate(self, ret[\u0027name\u0027],"},{"line_number":90,"context_line":"                                            ret[\u0027domain_id\u0027])"},{"line_number":91,"context_line":"        self.token_api.delete_tokens_for_users(user_ids, project_id\u003dtenant_id)"},{"line_number":92,"context_line":"        return ret"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @notifications.deleted(\u0027project\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftlw%3D","line":91,"updated":"2014-01-03 02:12:07.000000000","message":"say that self.get_project.invalidate() fails with an exception, now the tokens aren\u0027t disabled. Seems like this should happen first, or even if those calls failed? The previous behavior was that the tokens were deleted before the project was updated (since it happened in controller).\n\nThis comment applies to delete_project and delete_role. The tokens used to be deleted first, and I think that\u0027s the right way to do it, since it\u0027s a little safer.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"fee53558b25d78ddc559c940dc115ad5dd6fc4a2","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.get_project.invalidate(self, tenant_id)"},{"line_number":89,"context_line":"        self.get_project_by_name.invalidate(self, ret[\u0027name\u0027],"},{"line_number":90,"context_line":"                                            ret[\u0027domain_id\u0027])"},{"line_number":91,"context_line":"        self.token_api.delete_tokens_for_users(user_ids, project_id\u003dtenant_id)"},{"line_number":92,"context_line":"        return ret"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @notifications.deleted(\u0027project\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtZs%3D","line":91,"in_reply_to":"AAAAT3%2F%2FtcU%3D","updated":"2014-01-03 03:43:49.000000000","message":"delete role already does token deletion first (due to the complexity in the role deletion logic)","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.get_project.invalidate(self, tenant_id)"},{"line_number":89,"context_line":"        self.get_project_by_name.invalidate(self, ret[\u0027name\u0027],"},{"line_number":90,"context_line":"                                            ret[\u0027domain_id\u0027])"},{"line_number":91,"context_line":"        self.token_api.delete_tokens_for_users(user_ids, project_id\u003dtenant_id)"},{"line_number":92,"context_line":"        return ret"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @notifications.deleted(\u0027project\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtcU%3D","line":91,"in_reply_to":"AAAAT3%2F%2Ftlw%3D","updated":"2014-01-03 03:36:55.000000000","message":"I\u0027m fine with doing that.  However, if invalidate (somehow fails) the project will only be partially disabled and in theory (depending on cache state) there are ways to issue new tokens.  This was to eliminate races on new tokens being issued while project deletion occurred.  \n\nI\u0027ll switch to token deletion first where appropriate.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6f1f2261d3f67fd9679ac5ba8b6d329fff66a5d9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        if not tenant.get(\u0027enabled\u0027, True):"},{"line_number":86,"context_line":"            users_to_disable \u003d self.list_user_ids_for_project(tenant_id)"},{"line_number":87,"context_line":"        ret \u003d self.driver.update_project(tenant_id, tenant)"},{"line_number":88,"context_line":"        self.token_api.delete_tokens_for_users(users_to_disable,"},{"line_number":89,"context_line":"                                               project_id\u003dtenant_id)"},{"line_number":90,"context_line":"        self.get_project.invalidate(self, tenant_id)"},{"line_number":91,"context_line":"        self.get_project_by_name.invalidate(self, ret[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2FrBM%3D","line":88,"updated":"2014-01-03 18:35:19.000000000","message":"Move this up to right after line 86 and into the if clause. Then remove line 82.\n\nIt\u0027s safer to delete tokens before attempting to update the project.","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1bf24323f24414b37c53487c03d37b1523266c4f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        if not tenant.get(\u0027enabled\u0027, True):"},{"line_number":86,"context_line":"            users_to_disable \u003d self.list_user_ids_for_project(tenant_id)"},{"line_number":87,"context_line":"        ret \u003d self.driver.update_project(tenant_id, tenant)"},{"line_number":88,"context_line":"        self.token_api.delete_tokens_for_users(users_to_disable,"},{"line_number":89,"context_line":"                                               project_id\u003dtenant_id)"},{"line_number":90,"context_line":"        self.get_project.invalidate(self, tenant_id)"},{"line_number":91,"context_line":"        self.get_project_by_name.invalidate(self, ret[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq9s%3D","line":88,"in_reply_to":"AAAAT3%2F%2FrBM%3D","updated":"2014-01-03 18:45:12.000000000","message":"If the update fails, do we really want to revoke all tokens for the project?","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"aae5a5994d3f2a13ea901084c66a622bce36b5a7","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        # explicitly forbid deleting the default domain (this should be a"},{"line_number":298,"context_line":"        # carefully orchestrated manual process involving configuration"},{"line_number":299,"context_line":"        # changes, etc)"},{"line_number":300,"context_line":"        if domain_id \u003d\u003d DEFAULT_DOMAIN[\u0027id\u0027]:"},{"line_number":301,"context_line":"            raise exception.ForbiddenAction(action\u003d\u0027delete the default domain\u0027)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        domain \u003d self.driver.get_domain(domain_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F7Mw%3D","line":300,"updated":"2014-01-06 18:24:46.000000000","message":"use CONF.identity.default_domain_id rather than DEFAULT_DOMAIN[\u0027id\u0027] ... see https://review.openstack.org/#/c/64589/","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d3e131c710a09bbd5d60e7ed0c87ff57e0af1c5d","unresolved":false,"context_lines":[{"line_number":297,"context_line":"        # explicitly forbid deleting the default domain (this should be a"},{"line_number":298,"context_line":"        # carefully orchestrated manual process involving configuration"},{"line_number":299,"context_line":"        # changes, etc)"},{"line_number":300,"context_line":"        if domain_id \u003d\u003d DEFAULT_DOMAIN[\u0027id\u0027]:"},{"line_number":301,"context_line":"            raise exception.ForbiddenAction(action\u003d\u0027delete the default domain\u0027)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        domain \u003d self.driver.get_domain(domain_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F628%3D","line":300,"in_reply_to":"AAAAUH%2F%2F7Mw%3D","updated":"2014-01-06 19:40:36.000000000","message":"Done","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"aae5a5994d3f2a13ea901084c66a622bce36b5a7","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        # carefully orchestrated manual process involving configuration"},{"line_number":299,"context_line":"        # changes, etc)"},{"line_number":300,"context_line":"        if domain_id \u003d\u003d DEFAULT_DOMAIN[\u0027id\u0027]:"},{"line_number":301,"context_line":"            raise exception.ForbiddenAction(action\u003d\u0027delete the default domain\u0027)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        domain \u003d self.driver.get_domain(domain_id)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F7Mg%3D","line":301,"updated":"2014-01-06 18:24:46.000000000","message":"this string isn\u0027t translated... maybe can just wrap in _().","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d3e131c710a09bbd5d60e7ed0c87ff57e0af1c5d","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        # carefully orchestrated manual process involving configuration"},{"line_number":299,"context_line":"        # changes, etc)"},{"line_number":300,"context_line":"        if domain_id \u003d\u003d DEFAULT_DOMAIN[\u0027id\u0027]:"},{"line_number":301,"context_line":"            raise exception.ForbiddenAction(action\u003d\u0027delete the default domain\u0027)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"        domain \u003d self.driver.get_domain(domain_id)"},{"line_number":304,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F620%3D","line":301,"in_reply_to":"AAAAUH%2F%2F7Mg%3D","updated":"2014-01-06 19:40:36.000000000","message":"Done","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"aae5a5994d3f2a13ea901084c66a622bce36b5a7","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        # to get a valid token to issue this delete."},{"line_number":309,"context_line":"        if domain[\u0027enabled\u0027]:"},{"line_number":310,"context_line":"            raise exception.ForbiddenAction("},{"line_number":311,"context_line":"                action\u003d\u0027delete a domain that is not disabled\u0027)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        self._delete_domain_contents(domain_id)"},{"line_number":314,"context_line":"        self.driver.delete_domain(domain_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F7Mc%3D","line":311,"updated":"2014-01-06 18:24:46.000000000","message":"this string isn\u0027t translated... maybe can just wrap in _().","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d3e131c710a09bbd5d60e7ed0c87ff57e0af1c5d","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        # to get a valid token to issue this delete."},{"line_number":309,"context_line":"        if domain[\u0027enabled\u0027]:"},{"line_number":310,"context_line":"            raise exception.ForbiddenAction("},{"line_number":311,"context_line":"                action\u003d\u0027delete a domain that is not disabled\u0027)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        self._delete_domain_contents(domain_id)"},{"line_number":314,"context_line":"        self.driver.delete_domain(domain_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F62w%3D","line":311,"in_reply_to":"AAAAUH%2F%2F7Mc%3D","updated":"2014-01-06 19:40:36.000000000","message":"Done","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"aae5a5994d3f2a13ea901084c66a622bce36b5a7","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                               \u0027domainid\u0027: domain_id})"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        for group in group_refs:"},{"line_number":367,"context_line":"            # NOTE(morganfainberg): Cleanup any existing groups."},{"line_number":368,"context_line":"            if group[\u0027domain_id\u0027] \u003d\u003d domain_id:"},{"line_number":369,"context_line":"                try:"},{"line_number":370,"context_line":"                    self.identity_api.delete_group(group[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F7ME%3D","line":367,"updated":"2014-01-06 18:24:46.000000000","message":"(nit) suggest remove \"NOTE(morganfainberg): \" here... it makes me think that maybe this should be a TODO and it\u0027s not getting done or something.","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d3e131c710a09bbd5d60e7ed0c87ff57e0af1c5d","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                               \u0027domainid\u0027: domain_id})"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        for group in group_refs:"},{"line_number":367,"context_line":"            # NOTE(morganfainberg): Cleanup any existing groups."},{"line_number":368,"context_line":"            if group[\u0027domain_id\u0027] \u003d\u003d domain_id:"},{"line_number":369,"context_line":"                try:"},{"line_number":370,"context_line":"                    self.identity_api.delete_group(group[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F63E%3D","line":367,"in_reply_to":"AAAAUH%2F%2F7ME%3D","updated":"2014-01-06 19:40:36.000000000","message":"Done","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"aae5a5994d3f2a13ea901084c66a622bce36b5a7","unresolved":false,"context_lines":[{"line_number":427,"context_line":"            # the controller. Now error or proper action will always come from"},{"line_number":428,"context_line":"            # the `delete_role` method logic. Work needs to be done to make"},{"line_number":429,"context_line":"            # the behavior between drivers consistent (capable of revoking"},{"line_number":430,"context_line":"            # tokens for the same circumstances)."},{"line_number":431,"context_line":"            pass"},{"line_number":432,"context_line":"        self.driver.delete_role(role_id)"},{"line_number":433,"context_line":"        self.get_role.invalidate(self, role_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F7Lo%3D","line":430,"updated":"2014-01-06 18:24:46.000000000","message":"is there a bug for this? bug should be referenced in the comment.","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d3e131c710a09bbd5d60e7ed0c87ff57e0af1c5d","unresolved":false,"context_lines":[{"line_number":427,"context_line":"            # the controller. Now error or proper action will always come from"},{"line_number":428,"context_line":"            # the `delete_role` method logic. Work needs to be done to make"},{"line_number":429,"context_line":"            # the behavior between drivers consistent (capable of revoking"},{"line_number":430,"context_line":"            # tokens for the same circumstances)."},{"line_number":431,"context_line":"            pass"},{"line_number":432,"context_line":"        self.driver.delete_role(role_id)"},{"line_number":433,"context_line":"        self.get_role.invalidate(self, role_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F61k%3D","line":430,"in_reply_to":"AAAAUH%2F%2F7Lo%3D","updated":"2014-01-06 19:40:36.000000000","message":"I\u0027ll get a bug filed for this.","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"}],"keystone/auth/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return AUTH_METHODS[method_name]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027identity_api\u0027, \u0027token_api\u0027,"},{"line_number":53,"context_line":"                     \u0027trust_api\u0027)"},{"line_number":54,"context_line":"class AuthInfo(object):"},{"line_number":55,"context_line":"    \"\"\"Encapsulation of \"auth\" request.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtlY%3D","line":52,"updated":"2014-01-03 02:12:07.000000000","message":"I don\u0027t see token_api being used.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return AUTH_METHODS[method_name]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027identity_api\u0027, \u0027token_api\u0027,"},{"line_number":53,"context_line":"                     \u0027trust_api\u0027)"},{"line_number":54,"context_line":"class AuthInfo(object):"},{"line_number":55,"context_line":"    \"\"\"Encapsulation of \"auth\" request.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtcQ%3D","line":52,"in_reply_to":"AAAAT3%2F%2FtlY%3D","updated":"2014-01-03 03:36:55.000000000","message":"Will 2x check and remove if possible.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"}],"keystone/common/controller.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"class V2Controller(wsgi.Application):"},{"line_number":222,"context_line":"    \"\"\"Base controller class for Identity API v2.\"\"\""},{"line_number":223,"context_line":"    def _require_attribute(self, ref, attr):"},{"line_number":224,"context_line":"        \"\"\"Ensures the reference contains the specified attribute.\"\"\""},{"line_number":225,"context_line":"        if ref.get(attr) is None or ref.get(attr) \u003d\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtlQ%3D","line":222,"updated":"2014-01-03 02:12:07.000000000","message":"is this docstring accurate?","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"class V2Controller(wsgi.Application):"},{"line_number":222,"context_line":"    \"\"\"Base controller class for Identity API v2.\"\"\""},{"line_number":223,"context_line":"    def _require_attribute(self, ref, attr):"},{"line_number":224,"context_line":"        \"\"\"Ensures the reference contains the specified attribute.\"\"\""},{"line_number":225,"context_line":"        if ref.get(attr) is None or ref.get(attr) \u003d\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtcE%3D","line":222,"in_reply_to":"AAAAT3%2F%2FtlQ%3D","updated":"2014-01-03 03:36:55.000000000","message":"Technically \"Identity API v2\" would be OpenStack Identity API v2, not to be confused with identity_api or assignment_api (managers) internal.  I\u0027d say yes, it is still accurate.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"}],"keystone/common/wsgi.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6f1f2261d3f67fd9679ac5ba8b6d329fff66a5d9","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        raise NotImplementedError(\u0027You must implement __call__\u0027)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027policy_api\u0027, \u0027token_api\u0027)"},{"line_number":182,"context_line":"class Application(BaseApplication):"},{"line_number":183,"context_line":"    @webob.dec.wsgify(RequestClass\u003dRequest)"},{"line_number":184,"context_line":"    def __call__(self, req):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq%2Fo%3D","line":181,"updated":"2014-01-03 18:35:19.000000000","message":"should this be a separate commit? Why is it required for this one?","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1bf24323f24414b37c53487c03d37b1523266c4f","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        raise NotImplementedError(\u0027You must implement __call__\u0027)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"@dependency.requires(\u0027assignment_api\u0027, \u0027policy_api\u0027, \u0027token_api\u0027)"},{"line_number":182,"context_line":"class Application(BaseApplication):"},{"line_number":183,"context_line":"    @webob.dec.wsgify(RequestClass\u003dRequest)"},{"line_number":184,"context_line":"    def __call__(self, req):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq9I%3D","line":181,"in_reply_to":"AAAAT3%2F%2Fq%2Fo%3D","updated":"2014-01-03 18:45:12.000000000","message":"This commit shuffled all the @requires for the new delete logic.  This was part of that (removing the no-longer-needed @requires from V2Controller).  The methods here still require it.  This could be split, but in theory this _is_ part of this changeset.","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"}],"keystone/identity/backends/ldap.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6f1f2261d3f67fd9679ac5ba8b6d329fff66a5d9","unresolved":false,"context_lines":[{"line_number":346,"context_line":"            # NOTE(morganfainberg): In the case of an empty group, it should"},{"line_number":347,"context_line":"            # simply make sure user_dns is an empty iterable so we skip the"},{"line_number":348,"context_line":"            # loop."},{"line_number":349,"context_line":"            user_dns \u003d member.get(self.member_attribute, [])"},{"line_number":350,"context_line":"            for user_dn in user_dns:"},{"line_number":351,"context_line":"                if self.use_dumb_member and user_dn \u003d\u003d self.dumb_member:"},{"line_number":352,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq%2Fg%3D","line":349,"updated":"2014-01-03 18:35:19.000000000","message":"this seems like it should be a separate commit.","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1bf24323f24414b37c53487c03d37b1523266c4f","unresolved":false,"context_lines":[{"line_number":346,"context_line":"            # NOTE(morganfainberg): In the case of an empty group, it should"},{"line_number":347,"context_line":"            # simply make sure user_dns is an empty iterable so we skip the"},{"line_number":348,"context_line":"            # loop."},{"line_number":349,"context_line":"            user_dns \u003d member.get(self.member_attribute, [])"},{"line_number":350,"context_line":"            for user_dn in user_dns:"},{"line_number":351,"context_line":"                if self.use_dumb_member and user_dn \u003d\u003d self.dumb_member:"},{"line_number":352,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq9E%3D","line":349,"in_reply_to":"AAAAT3%2F%2Fq%2BA%3D","updated":"2014-01-03 18:45:12.000000000","message":"Done. let me figure out the best place to do this rebase so we can get the best chain of patchsets.","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"33fe4fdf607333e2fa2ae36a0003c0bb92307709","unresolved":false,"context_lines":[{"line_number":346,"context_line":"            # NOTE(morganfainberg): In the case of an empty group, it should"},{"line_number":347,"context_line":"            # simply make sure user_dns is an empty iterable so we skip the"},{"line_number":348,"context_line":"            # loop."},{"line_number":349,"context_line":"            user_dns \u003d member.get(self.member_attribute, [])"},{"line_number":350,"context_line":"            for user_dn in user_dns:"},{"line_number":351,"context_line":"                if self.use_dumb_member and user_dn \u003d\u003d self.dumb_member:"},{"line_number":352,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq%2BA%3D","line":349,"in_reply_to":"AAAAT3%2F%2Fq%2Fg%3D","updated":"2014-01-03 18:39:22.000000000","message":"Actually, this already is a separate commit: https://review.openstack.org/#/c/56887/\n\nsuggest rebase this one on that change.","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"}],"keystone/identity/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":434,"context_line":"        user_ids \u003d [u[\u0027id\u0027]"},{"line_number":435,"context_line":"                    for u in self.list_users_in_group(group_id, domain_scope)]"},{"line_number":436,"context_line":"        driver.delete_group(group_id)"},{"line_number":437,"context_line":"        self.token_api.delete_tokens_for_users(user_ids)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    @domains_configured"},{"line_number":440,"context_line":"    def add_user_to_group(self, user_id, group_id, domain_scope\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtkQ%3D","line":437,"updated":"2014-01-03 02:12:07.000000000","message":"here\u0027s another few spots where we should consider revoking tokens first in case delete_group raises.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":434,"context_line":"        user_ids \u003d [u[\u0027id\u0027]"},{"line_number":435,"context_line":"                    for u in self.list_users_in_group(group_id, domain_scope)]"},{"line_number":436,"context_line":"        driver.delete_group(group_id)"},{"line_number":437,"context_line":"        self.token_api.delete_tokens_for_users(user_ids)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    @domains_configured"},{"line_number":440,"context_line":"    def add_user_to_group(self, user_id, group_id, domain_scope\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftb8%3D","line":437,"in_reply_to":"AAAAT3%2F%2FtkQ%3D","updated":"2014-01-03 03:36:55.000000000","message":"As stated in previous comment, i\u0027ll invert these to delete first.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"86e2d928706aa292840160833be41774698dde31","unresolved":false,"context_lines":[{"line_number":432,"context_line":"        # deletion, so that we can remove these tokens after we know"},{"line_number":433,"context_line":"        # the group deletion succeeded."},{"line_number":434,"context_line":"        user_ids \u003d [u[\u0027id\u0027]"},{"line_number":435,"context_line":"                    for u in self.list_users_in_group(group_id, domain_scope)]"},{"line_number":436,"context_line":"        self.token_api.delete_tokens_for_users(user_ids)"},{"line_number":437,"context_line":"        driver.delete_group(group_id)"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F3VM%3D","line":435,"updated":"2014-01-07 14:42:11.000000000","message":"wish this was on one line... took me a second to comprehend the first line\n\n  user_ids \u003d [\n    u[\u0027id\u0027] for u in self.list_users_in_group(group_id, domain_scope)]","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"86e2d928706aa292840160833be41774698dde31","unresolved":false,"context_lines":[{"line_number":2490,"context_line":"        # Make sure the domain no longer exists"},{"line_number":2491,"context_line":"        self.assertRaises(exception.DomainNotFound,"},{"line_number":2492,"context_line":"                          self.assignment_api.get_domain,"},{"line_number":2493,"context_line":"                          domain[\u0027id\u0027])"},{"line_number":2494,"context_line":""},{"line_number":2495,"context_line":"    def test_create_domain_case_sensitivity(self):"},{"line_number":2496,"context_line":"        # create a ref with a lowercase name"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F3Rk%3D","line":2493,"updated":"2014-01-07 14:42:11.000000000","message":"nice","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"}],"keystone/tests/test_keystoneclient.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        super(CompatTestCase, self).config(config_files)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # FIXME(morganfainberg): Since we are running tests through the"},{"line_number":43,"context_line":"        # controllers and some core systems are SQL-only, the correct approach"},{"line_number":44,"context_line":"        # is to ensure we have the correct backing store. The credential api"},{"line_number":45,"context_line":"        # makes some very SQL specific assumptions that should be addressed"},{"line_number":46,"context_line":"        # allowing for non-SQL based testing to occur."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftjs%3D","line":43,"updated":"2014-01-03 02:12:07.000000000","message":"what\u0027s a \"core system\"?","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        super(CompatTestCase, self).config(config_files)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # FIXME(morganfainberg): Since we are running tests through the"},{"line_number":43,"context_line":"        # controllers and some core systems are SQL-only, the correct approach"},{"line_number":44,"context_line":"        # is to ensure we have the correct backing store. The credential api"},{"line_number":45,"context_line":"        # makes some very SQL specific assumptions that should be addressed"},{"line_number":46,"context_line":"        # allowing for non-SQL based testing to occur."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftb4%3D","line":43,"in_reply_to":"AAAAT3%2F%2Ftjs%3D","updated":"2014-01-03 03:36:55.000000000","message":"I will clarify","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        # The backends should be loaded and initialized before the servers are"},{"line_number":55,"context_line":"        # started because the servers use the backends."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        self.load_backends()"},{"line_number":58,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        # TODO(termie): add an admin user to the fixtures and use that user"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftjk%3D","line":57,"updated":"2014-01-03 02:12:07.000000000","message":"seems like this would have been done already by config()?","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        # The backends should be loaded and initialized before the servers are"},{"line_number":55,"context_line":"        # started because the servers use the backends."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        self.load_backends()"},{"line_number":58,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        # TODO(termie): add an admin user to the fixtures and use that user"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftb0%3D","line":57,"in_reply_to":"AAAAT3%2F%2Ftjk%3D","updated":"2014-01-03 03:36:55.000000000","message":"hm. will 2x check and remove if appropriate.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"17426b0234e168a60b9174e01a7b719d1406efe6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        sql.ModelBase.metadata.create_all(bind\u003dself.engine)"},{"line_number":50,"context_line":"        self.addCleanup(sql.ModelBase.metadata.drop_all,"},{"line_number":51,"context_line":"                        bind\u003dself.engine)"},{"line_number":52,"context_line":"        self.addCleanup(session.cleanup)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def setUp(self):"},{"line_number":55,"context_line":"        super(CompatTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAT3%2F%2Fqb0%3D","line":52,"updated":"2014-01-03 21:41:13.000000000","message":"I think the cleanups are going to happen in the wrong order. Move line 52 right after line 48.","commit_id":"8a0291009ba837baf725bda27bedea3a422df13a"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d39672d2eede65534699711f0cdabe7872630e3f","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        sql.ModelBase.metadata.create_all(bind\u003dself.engine)"},{"line_number":50,"context_line":"        self.addCleanup(sql.ModelBase.metadata.drop_all,"},{"line_number":51,"context_line":"                        bind\u003dself.engine)"},{"line_number":52,"context_line":"        self.addCleanup(session.cleanup)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def setUp(self):"},{"line_number":55,"context_line":"        super(CompatTestCase, self).setUp()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAT3%2F%2Fqa0%3D","line":52,"in_reply_to":"AAAAT3%2F%2Fqb0%3D","updated":"2014-01-03 21:45:17.000000000","message":"Done","commit_id":"8a0291009ba837baf725bda27bedea3a422df13a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"aae5a5994d3f2a13ea901084c66a622bce36b5a7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.load_backends()"},{"line_number":48,"context_line":"        self.engine \u003d session.get_engine()"},{"line_number":49,"context_line":"        sql.ModelBase.metadata.create_all(bind\u003dself.engine)"},{"line_number":50,"context_line":"        self.addCleanup(session.cleanup)"},{"line_number":51,"context_line":"        self.addCleanup(sql.ModelBase.metadata.drop_all,"},{"line_number":52,"context_line":"                        bind\u003dself.engine)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F7Ng%3D","line":50,"updated":"2014-01-06 18:24:46.000000000","message":"this should be moved right after line 48 so that it runs even if line 49 fails.","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d3e131c710a09bbd5d60e7ed0c87ff57e0af1c5d","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.load_backends()"},{"line_number":48,"context_line":"        self.engine \u003d session.get_engine()"},{"line_number":49,"context_line":"        sql.ModelBase.metadata.create_all(bind\u003dself.engine)"},{"line_number":50,"context_line":"        self.addCleanup(session.cleanup)"},{"line_number":51,"context_line":"        self.addCleanup(sql.ModelBase.metadata.drop_all,"},{"line_number":52,"context_line":"                        bind\u003dself.engine)"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2F61c%3D","line":50,"in_reply_to":"AAAAUH%2F%2F7Ng%3D","updated":"2014-01-06 19:40:36.000000000","message":"Done","commit_id":"348d66260d883ff7017c9284b7541542d805bb23"}],"keystone/tests/test_keystoneclient_sql.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6f1f2261d3f67fd9679ac5ba8b6d329fff66a5d9","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.default_client \u003d self.get_client()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        sql.ModelBase.metadata.drop_all(bind\u003dself.engine)"},{"line_number":45,"context_line":"        session.cleanup()"},{"line_number":46,"context_line":"        super(KcMasterSqlTestCase, self).tearDown()"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq%2FA%3D","line":44,"updated":"2014-01-03 18:35:19.000000000","message":"since sql.ModelBase.metadata.create_all(bind\u003dself.engine) was removed, then don\u0027t need to do this anymore.","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1bf24323f24414b37c53487c03d37b1523266c4f","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.default_client \u003d self.get_client()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        sql.ModelBase.metadata.drop_all(bind\u003dself.engine)"},{"line_number":45,"context_line":"        session.cleanup()"},{"line_number":46,"context_line":"        super(KcMasterSqlTestCase, self).tearDown()"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq80%3D","line":44,"in_reply_to":"AAAAT3%2F%2Fq%2FA%3D","updated":"2014-01-03 18:45:12.000000000","message":"Done","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85987447cdaf823cdca7a2546931a8eb43f863bc","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.default_client \u003d self.get_client()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        sql.ModelBase.metadata.drop_all(bind\u003dself.engine)"},{"line_number":45,"context_line":"        session.cleanup()"},{"line_number":46,"context_line":"        super(KcMasterSqlTestCase, self).tearDown()"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq2c%3D","line":44,"in_reply_to":"AAAAT3%2F%2Fq%2FA%3D","updated":"2014-01-03 19:22:00.000000000","message":"Moved this to the parent class in an addCleanup step to mirror correct functionality","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6f1f2261d3f67fd9679ac5ba8b6d329fff66a5d9","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        sql.ModelBase.metadata.drop_all(bind\u003dself.engine)"},{"line_number":45,"context_line":"        session.cleanup()"},{"line_number":46,"context_line":"        super(KcMasterSqlTestCase, self).tearDown()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_endpoint_crud(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq%2B4%3D","line":45,"updated":"2014-01-03 18:35:19.000000000","message":"since \"self.engine \u003d session.get_engine()\" was removed, then don\u0027t need to do this.","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1bf24323f24414b37c53487c03d37b1523266c4f","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        sql.ModelBase.metadata.drop_all(bind\u003dself.engine)"},{"line_number":45,"context_line":"        session.cleanup()"},{"line_number":46,"context_line":"        super(KcMasterSqlTestCase, self).tearDown()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_endpoint_crud(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq8w%3D","line":45,"in_reply_to":"AAAAT3%2F%2Fq%2B4%3D","updated":"2014-01-03 18:45:12.000000000","message":"Done","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85987447cdaf823cdca7a2546931a8eb43f863bc","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        sql.ModelBase.metadata.drop_all(bind\u003dself.engine)"},{"line_number":45,"context_line":"        session.cleanup()"},{"line_number":46,"context_line":"        super(KcMasterSqlTestCase, self).tearDown()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_endpoint_crud(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAT3%2F%2Fq2Y%3D","line":45,"in_reply_to":"AAAAT3%2F%2Fq8w%3D","updated":"2014-01-03 19:22:00.000000000","message":"Moved this to the parent class in an addCleanup step to mirror correct functionality","commit_id":"9430177da57f6c04ed00421fc127149d4bb530a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"17426b0234e168a60b9174e01a7b719d1406efe6","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super(KcMasterSqlTestCase, self).setUp()"},{"line_number":40,"context_line":"        self.default_client \u003d self.get_client()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def tearDown(self):"},{"line_number":43,"context_line":"        super(KcMasterSqlTestCase, self).tearDown()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_endpoint_crud(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAT3%2F%2Fqbc%3D","line":42,"updated":"2014-01-03 21:41:13.000000000","message":"remove this function it\u0027s not doing anything.","commit_id":"8a0291009ba837baf725bda27bedea3a422df13a"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d39672d2eede65534699711f0cdabe7872630e3f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super(KcMasterSqlTestCase, self).setUp()"},{"line_number":40,"context_line":"        self.default_client \u003d self.get_client()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def tearDown(self):"},{"line_number":43,"context_line":"        super(KcMasterSqlTestCase, self).tearDown()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_endpoint_crud(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAT3%2F%2Fqas%3D","line":42,"in_reply_to":"AAAAT3%2F%2Fqbc%3D","updated":"2014-01-03 21:45:17.000000000","message":"Done","commit_id":"8a0291009ba837baf725bda27bedea3a422df13a"}],"keystone/token/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                for user_id in self.assignment_api.list_user_ids_for_project("},{"line_number":192,"context_line":"                        project[\u0027id\u0027]):"},{"line_number":193,"context_line":"                    self.delete_tokens_for_user(user_id, project[\u0027id\u0027])"},{"line_number":194,"context_line":"        # TODO(morganfainberg): implement deletion of domain_scoped tokens."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def delete_tokens_for_user(self, user_id, project_id\u003dNone):"},{"line_number":197,"context_line":"        \"\"\"Delete all tokens for a given user or user-project combination."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtjA%3D","line":194,"updated":"2014-01-03 02:12:07.000000000","message":"is this broken without implementing deletion of domain-scoped tokens?","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                for user_id in self.assignment_api.list_user_ids_for_project("},{"line_number":192,"context_line":"                        project[\u0027id\u0027]):"},{"line_number":193,"context_line":"                    self.delete_tokens_for_user(user_id, project[\u0027id\u0027])"},{"line_number":194,"context_line":"        # TODO(morganfainberg): implement deletion of domain_scoped tokens."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def delete_tokens_for_user(self, user_id, project_id\u003dNone):"},{"line_number":197,"context_line":"        \"\"\"Delete all tokens for a given user or user-project combination."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Ftbw%3D","line":194,"in_reply_to":"AAAAT3%2F%2FtjA%3D","updated":"2014-01-03 03:36:55.000000000","message":"This is the same functionality as before, we had a similar docstring with no related code previously (I just moved it over to this spot and tagged it to my name since I reworked this).  This should be addressed, but I also heard rumors of denying domain scoped tokens.  Depending on the direction taken (support/not support of domain scoped tokens) will dictate the end result here.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        trusts in the caller\u0027s logic."},{"line_number":202,"context_line":"        \"\"\""},{"line_number":203,"context_line":"        self.delete_tokens(user_id, tenant_id\u003dproject_id)"},{"line_number":204,"context_line":"        for trust in self.trust_api.list_trusts_for_trustee(user_id):"},{"line_number":205,"context_line":"            self.delete_tokens(user_id, trust_id\u003dtrust[\u0027id\u0027])"},{"line_number":206,"context_line":"        for trust in self.trust_api.list_trusts_for_trustor(user_id):"},{"line_number":207,"context_line":"            self.delete_tokens(trust[\u0027trustee_user_id\u0027], trust_id\u003dtrust[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtjI%3D","line":204,"updated":"2014-01-03 02:12:07.000000000","message":"I\u0027m a little confused as to how this is supposed to work if they pass in user_id + project_id, could you add a comment?","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        trusts in the caller\u0027s logic."},{"line_number":202,"context_line":"        \"\"\""},{"line_number":203,"context_line":"        self.delete_tokens(user_id, tenant_id\u003dproject_id)"},{"line_number":204,"context_line":"        for trust in self.trust_api.list_trusts_for_trustee(user_id):"},{"line_number":205,"context_line":"            self.delete_tokens(user_id, trust_id\u003dtrust[\u0027id\u0027])"},{"line_number":206,"context_line":"        for trust in self.trust_api.list_trusts_for_trustor(user_id):"},{"line_number":207,"context_line":"            self.delete_tokens(trust[\u0027trustee_user_id\u0027], trust_id\u003dtrust[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtbY%3D","line":204,"in_reply_to":"AAAAT3%2F%2FtjI%3D","updated":"2014-01-03 03:36:55.000000000","message":"I\u0027ll get some comments in here to help make it less opaque.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        if (not(hasattr(user_ids, \u0027__iter__\u0027) or"},{"line_number":216,"context_line":"                isinstance(user_ids, six.string_types))):"},{"line_number":217,"context_line":"            msg \u003d _(\u0027`user_ids` must be a non-string iterable, got: %s\u0027)"},{"line_number":218,"context_line":"            raise TypeError(msg % type(user_ids))"},{"line_number":219,"context_line":"        for user_id in user_ids:"},{"line_number":220,"context_line":"            self.delete_tokens_for_user(user_id, project_id)"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtjY%3D","line":218,"updated":"2014-01-03 02:12:07.000000000","message":"why would this happen? the caller should be able to ensure this.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        if (not(hasattr(user_ids, \u0027__iter__\u0027) or"},{"line_number":216,"context_line":"                isinstance(user_ids, six.string_types))):"},{"line_number":217,"context_line":"            msg \u003d _(\u0027`user_ids` must be a non-string iterable, got: %s\u0027)"},{"line_number":218,"context_line":"            raise TypeError(msg % type(user_ids))"},{"line_number":219,"context_line":"        for user_id in user_ids:"},{"line_number":220,"context_line":"            self.delete_tokens_for_user(user_id, project_id)"},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtbQ%3D","line":218,"in_reply_to":"AAAAT3%2F%2FtjY%3D","updated":"2014-01-03 03:36:55.000000000","message":"just being a bit more defensive.  will remove it.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be1346d9f4300ae45f03f5c3025337f9b4904836","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            msg \u003d _(\u0027`user_ids` must be a non-string iterable, got: %s\u0027)"},{"line_number":218,"context_line":"            raise TypeError(msg % type(user_ids))"},{"line_number":219,"context_line":"        for user_id in user_ids:"},{"line_number":220,"context_line":"            self.delete_tokens_for_user(user_id, project_id)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _invalidate_individual_token_cache(self, token_id):"},{"line_number":223,"context_line":"        # NOTE(morganfainberg): invalidate takes the exact same arguments as"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtjQ%3D","line":220,"updated":"2014-01-03 02:12:07.000000000","message":"should be project_id\u003dproject_id.","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a34db03e63ca6274b52422c7c917ac88540b62af","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            msg \u003d _(\u0027`user_ids` must be a non-string iterable, got: %s\u0027)"},{"line_number":218,"context_line":"            raise TypeError(msg % type(user_ids))"},{"line_number":219,"context_line":"        for user_id in user_ids:"},{"line_number":220,"context_line":"            self.delete_tokens_for_user(user_id, project_id)"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def _invalidate_individual_token_cache(self, token_id):"},{"line_number":223,"context_line":"        # NOTE(morganfainberg): invalidate takes the exact same arguments as"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2FtbM%3D","line":220,"in_reply_to":"AAAAT3%2F%2FtjQ%3D","updated":"2014-01-03 03:36:55.000000000","message":"Done","commit_id":"9a1552809a41b27505de79267dc6350e051e6dbd"}]}
