)]}'
{"etc/policy.json":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1bba6ce391c249a024f5a9d3ba5b830dd367cafd","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \"identity:list_users\": [[\"rule:admin_required\"]],"},{"line_number":36,"context_line":"    \"identity:create_user\": [[\"rule:admin_required\"]],"},{"line_number":37,"context_line":"    \"identity:update_user\": [[\"rule:admin_required\"],"},{"line_number":38,"context_line":"                              [\"user_id:%(user_id)s\"]],"},{"line_number":39,"context_line":"    \"identity:delete_user\": [[\"rule:admin_required\"]],"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"identity:get_group\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":2,"id":"AAAAN3%2F%2F1lg%3D","line":38,"updated":"2013-03-11 16:13:00.000000000","message":"Allows a user to  change their own password.","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a9b5848901801510f160c2e09f4fe65cca738128","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \"identity:list_users\": [[\"rule:admin_required\"]],"},{"line_number":36,"context_line":"    \"identity:create_user\": [[\"rule:admin_required\"]],"},{"line_number":37,"context_line":"    \"identity:update_user\": [[\"rule:admin_required\"],"},{"line_number":38,"context_line":"                              [\"user_id:%(user_id)s\"]],"},{"line_number":39,"context_line":"    \"identity:delete_user\": [[\"rule:admin_required\"]],"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    \"identity:get_group\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":5,"id":"AAAAN3%2F%2Fym4%3D","line":38,"updated":"2013-03-12 18:05:43.000000000","message":"Is this equivalent to [[\"rule:admin_or_owner\"]] defined at line 4? If so, should that be used since it\u0027s a little more descriptive?","commit_id":"712b27fae5d0a6467518079c210ae17370dca478"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"8ab38bffbe5accfdb386849afe5c129727555882","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"identity:list_users\": [[\"rule:admin_required\"]],"},{"line_number":35,"context_line":"    \"identity:create_user\": [[\"rule:admin_required\"]],"},{"line_number":36,"context_line":"    \"identity:update_user\": [[\"rule:admin_required\"],"},{"line_number":37,"context_line":"                              [\"user_id:%(user_id)s\"]],"},{"line_number":38,"context_line":"    \"identity:delete_user\": [[\"rule:admin_required\"]],"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    \"identity:get_group\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":6,"id":"AAAAN3%2F%2FwQ0%3D","line":37,"updated":"2013-03-13 18:54:37.000000000","message":"admin_or_owner?","commit_id":"e4a7dedc025263ff17dd29343eab27e649c8d3ad"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b2eaf67aa0773e6246551226f8eae5ab226693a0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \"identity:list_users\": [[\"rule:admin_required\"]],"},{"line_number":35,"context_line":"    \"identity:create_user\": [[\"rule:admin_required\"]],"},{"line_number":36,"context_line":"    \"identity:update_user\": [[\"rule:admin_required\"],"},{"line_number":37,"context_line":"                              [\"user_id:%(user_id)s\"]],"},{"line_number":38,"context_line":"    \"identity:delete_user\": [[\"rule:admin_required\"]],"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    \"identity:get_group\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":6,"id":"AAAAN3%2F%2Fvqs%3D","line":37,"in_reply_to":"AAAAN3%2F%2FwQ0%3D","updated":"2013-03-14 02:13:10.000000000","message":"Done","commit_id":"e4a7dedc025263ff17dd29343eab27e649c8d3ad"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    \"identity:get_user\": [[\"rule:admin_required\"]],"},{"line_number":34,"context_line":"    \"identity:list_users\": [[\"rule:admin_required\"]],"},{"line_number":35,"context_line":"    \"identity:create_user\": [[\"rule:admin_required\"]],"},{"line_number":36,"context_line":"    \"identity:update_user\": [[\"rule:admin_or_owner\"]],"},{"line_number":37,"context_line":"    \"identity:delete_user\": [[\"rule:admin_required\"]],"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    \"identity:get_group\": [[\"rule:admin_required\"]],"}],"source_content_type":"application/json","patch_set":7,"id":"AAAAN3%2F%2FvI0%3D","line":36,"updated":"2013-03-14 15:18:08.000000000","message":"cool","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"}],"keystone/auth/token_factory.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9c8ec329a28abb9428ef6100decc2b77165cfc71","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                    tenant\u003dtoken_data[\u0027token\u0027].get(\u0027project\u0027),"},{"line_number":287,"context_line":"                    metadata\u003dmetadata_ref,"},{"line_number":288,"context_line":"                    token_data\u003dtoken_data,"},{"line_number":289,"context_line":"                    trust_id\u003dtrust[\u0027id\u0027] if trust else None)"},{"line_number":290,"context_line":"        token_api.create_token(context, token_id, data)"},{"line_number":291,"context_line":"    except Exception as e:"},{"line_number":292,"context_line":"        # an identical token may have been created already."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1fc%3D","line":289,"updated":"2013-03-10 10:38:04.000000000","message":"..should we also support this in auth_token middleware to create X_TRUST_ID or something similar?","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1bba6ce391c249a024f5a9d3ba5b830dd367cafd","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                    tenant\u003dtoken_data[\u0027token\u0027].get(\u0027project\u0027),"},{"line_number":287,"context_line":"                    metadata\u003dmetadata_ref,"},{"line_number":288,"context_line":"                    token_data\u003dtoken_data,"},{"line_number":289,"context_line":"                    trust_id\u003dtrust[\u0027id\u0027] if trust else None)"},{"line_number":290,"context_line":"        token_api.create_token(context, token_id, data)"},{"line_number":291,"context_line":"    except Exception as e:"},{"line_number":292,"context_line":"        # an identical token may have been created already."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1lc%3D","line":289,"updated":"2013-03-11 16:13:00.000000000","message":"trust is in different locations in different tokens, this makes it consistent.  This way, testing on a trust_id does not fail, which would be a security issue.\n\nAgree with Dolph:  lets not make people think the y should/can test on a trust, as I see that leading to situations where, once again, people are forced to hand out their credentials.  SO, no header for trusts","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"94afb488b912ba8eeba7d5755a42374da2c79949","unresolved":false,"context_lines":[{"line_number":286,"context_line":"                    tenant\u003dtoken_data[\u0027token\u0027].get(\u0027project\u0027),"},{"line_number":287,"context_line":"                    metadata\u003dmetadata_ref,"},{"line_number":288,"context_line":"                    token_data\u003dtoken_data,"},{"line_number":289,"context_line":"                    trust_id\u003dtrust[\u0027id\u0027] if trust else None)"},{"line_number":290,"context_line":"        token_api.create_token(context, token_id, data)"},{"line_number":291,"context_line":"    except Exception as e:"},{"line_number":292,"context_line":"        # an identical token may have been created already."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F0ko%3D","line":289,"in_reply_to":"AAAAN3%2F%2F1fc%3D","updated":"2013-03-11 13:43:51.000000000","message":"interesting question -- i\u0027d want to hear a solid use case for a service to know that an auth is the result of delegation / impersonation before starting to provide that data. i\u0027d prefer to keep the feature as transparent to other services if possible","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"}],"keystone/common/controller.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a3f88d02ca998973ab354d162620eb11eec44345","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                                          trust[\u0027trustee_user_id\u0027],"},{"line_number":180,"context_line":"                                          trust[\u0027id\u0027])"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def _delete_tokens_for_group(self, context, group_id):"},{"line_number":183,"context_line":"        user_refs \u003d self.identity_api.list_users_in_group(context, group_id)"},{"line_number":184,"context_line":"        for user in user_refs:"},{"line_number":185,"context_line":"            self._delete_tokens_for_user(context, user[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAN3%2F%2Ft0E%3D","line":182,"updated":"2013-03-15 11:28:45.000000000","message":"I think this should actually go in the V3 controller, since V2 didn\u0027t have a concept of groups.","commit_id":"85f0034ca55bc59fc57934bd60b98bb3345d4443"}],"keystone/common/sql/migrate_repo/versions/019_add_trust_to_token.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9c8ec329a28abb9428ef6100decc2b77165cfc71","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                              sqlalchemy.String(128),"},{"line_number":41,"context_line":"                              nullable\u003dTrue))"},{"line_number":42,"context_line":"    #sqlite does not drop columns, so if we hit this,"},{"line_number":43,"context_line":"    #it thinks it has dropped them, but it hasn\u0027t"},{"line_number":44,"context_line":"    except exc.OperationalError as e:"},{"line_number":45,"context_line":"        if e.args[0].endswith(\u0027duplicate column name: trust_id\u0027):"},{"line_number":46,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1fU%3D","line":43,"updated":"2013-03-10 10:38:04.000000000","message":"..so is the implication of this that using sqlite when you downgrade from 19 to \u003csomething\u003e the user_id \u0026 trust_id columns will still be around?  If so, is it the proposal that we don\u0027t care since sqlite is not intended for production?","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"94afb488b912ba8eeba7d5755a42374da2c79949","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                              nullable\u003dTrue))"},{"line_number":42,"context_line":"    #sqlite does not drop columns, so if we hit this,"},{"line_number":43,"context_line":"    #it thinks it has dropped them, but it hasn\u0027t"},{"line_number":44,"context_line":"    except exc.OperationalError as e:"},{"line_number":45,"context_line":"        if e.args[0].endswith(\u0027duplicate column name: trust_id\u0027):"},{"line_number":46,"context_line":"            pass"},{"line_number":47,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F0kQ%3D","line":44,"updated":"2013-03-11 13:43:51.000000000","message":"i\u0027m not clear on why you would need to catch this and suppress it -- it seems indicative of a bad migration, not a misbehavior in the sql driver. are you seeing this with db_sync (valid issue then?) or test_sql_upgrade (maybe just need to manually commit here?)","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e186d0dfccb6ad21485db9ac145faf1f96794e26","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                              nullable\u003dTrue))"},{"line_number":42,"context_line":"    #sqlite does not drop columns, so if we hit this,"},{"line_number":43,"context_line":"    #it thinks it has dropped them, but it hasn\u0027t"},{"line_number":44,"context_line":"    except exc.OperationalError as e:"},{"line_number":45,"context_line":"        if e.args[0].endswith(\u0027duplicate column name: trust_id\u0027):"},{"line_number":46,"context_line":"            pass"},{"line_number":47,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F0Og%3D","line":44,"in_reply_to":"AAAAN3%2F%2F0Qw%3D","updated":"2013-03-11 16:26:20.000000000","message":"Ok, so I think you are saying that we should only hit this is:\n\na) You are using sqlite, and\nb) You did a downgrade, followed by an upgrade\n\nI would say that we should make that clearer in the text and potentially only pass on the error if we are using sqllite","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1bba6ce391c249a024f5a9d3ba5b830dd367cafd","unresolved":false,"context_lines":[{"line_number":41,"context_line":"                              nullable\u003dTrue))"},{"line_number":42,"context_line":"    #sqlite does not drop columns, so if we hit this,"},{"line_number":43,"context_line":"    #it thinks it has dropped them, but it hasn\u0027t"},{"line_number":44,"context_line":"    except exc.OperationalError as e:"},{"line_number":45,"context_line":"        if e.args[0].endswith(\u0027duplicate column name: trust_id\u0027):"},{"line_number":46,"context_line":"            pass"},{"line_number":47,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F0Qw%3D","line":44,"in_reply_to":"AAAAN3%2F%2F0kQ%3D","updated":"2013-03-11 16:13:00.000000000","message":"Its indicative of a bad migrations due to a bad driver.  Migrations work fine with the real DB backends, but SQLite does not support dropping columns.  I tried other numerous workarounds for SQLite, and have come to the conclusion that it is not worth it:  We really care about MySQL and PostgreSQL for live deployments.  SQLite will work \"well enough\" with this migration, too.","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"}],"keystone/common/sql/migrate_repo/versions/020_add_trust_to_token.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2a19c14ab401a417c39f460cf0dd5ebe67ba7f0c","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    except exc.OperationalError as e:"},{"line_number":45,"context_line":"        if (migrate_engine.name \u003d\u003d \"sqlite\" and"},{"line_number":46,"context_line":"                e.args[0].endswith(\u0027duplicate column name: trust_id\u0027)):"},{"line_number":47,"context_line":"                pass"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            raise(e)"},{"line_number":50,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzY8%3D","line":47,"updated":"2013-03-12 00:32:21.000000000","message":"this is extra-indented.","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e60e20c2931d3ecde829c511bb2eb9a5db8e5e68","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    except exc.OperationalError as e:"},{"line_number":45,"context_line":"        if (migrate_engine.name \u003d\u003d \"sqlite\" and"},{"line_number":46,"context_line":"                e.args[0].endswith(\u0027duplicate column name: trust_id\u0027)):"},{"line_number":47,"context_line":"                pass"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            raise(e)"},{"line_number":50,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzUA%3D","line":47,"in_reply_to":"AAAAN3%2F%2FzY8%3D","updated":"2013-03-12 04:22:28.000000000","message":"Blame our pep8 checker","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2a19c14ab401a417c39f460cf0dd5ebe67ba7f0c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                e.args[0].endswith(\u0027duplicate column name: trust_id\u0027)):"},{"line_number":47,"context_line":"                pass"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            raise(e)"},{"line_number":50,"context_line":"    try:"},{"line_number":51,"context_line":"        token_table.create_column("},{"line_number":52,"context_line":"            sqlalchemy.Column(\u0027user_id\u0027, sqlalchemy.String(128)))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzY4%3D","line":49,"updated":"2013-03-12 00:32:21.000000000","message":"change to just raise","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e60e20c2931d3ecde829c511bb2eb9a5db8e5e68","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                e.args[0].endswith(\u0027duplicate column name: trust_id\u0027)):"},{"line_number":47,"context_line":"                pass"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            raise(e)"},{"line_number":50,"context_line":"    try:"},{"line_number":51,"context_line":"        token_table.create_column("},{"line_number":52,"context_line":"            sqlalchemy.Column(\u0027user_id\u0027, sqlalchemy.String(128)))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzT8%3D","line":49,"in_reply_to":"AAAAN3%2F%2FzY4%3D","updated":"2013-03-12 04:22:28.000000000","message":"Done","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2a19c14ab401a417c39f460cf0dd5ebe67ba7f0c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                e.args[0].endswith(\u0027duplicate column name: user_id\u0027)):"},{"line_number":56,"context_line":"                pass"},{"line_number":57,"context_line":"        else:"},{"line_number":58,"context_line":"            raise(e)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzYo%3D","line":58,"updated":"2013-03-12 00:32:21.000000000","message":"suggest take this duplicated code and put it into a separate function (create_column())","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e60e20c2931d3ecde829c511bb2eb9a5db8e5e68","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                e.args[0].endswith(\u0027duplicate column name: user_id\u0027)):"},{"line_number":56,"context_line":"                pass"},{"line_number":57,"context_line":"        else:"},{"line_number":58,"context_line":"            raise(e)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzT4%3D","line":58,"in_reply_to":"AAAAN3%2F%2FzYo%3D","updated":"2013-03-12 04:22:28.000000000","message":"Done","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"192ced05aef09980e483c08ab021e72e820ac1ab","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                          sqlalchemy.String(64)))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def create_column(migrate_engine, token_table, column):"},{"line_number":36,"context_line":"    try:"},{"line_number":37,"context_line":"        token_table.create_column(column)"},{"line_number":38,"context_line":"#sqlite does not drop columns, so if we hit this,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2FyYk%3D","line":35,"updated":"2013-03-12 19:43:41.000000000","message":"this is a very generically named function but then token_table is an argument instead of \u0027table\u0027 and trust_id is hardcoded into the exception instead of being pulled from the column argument","commit_id":"712b27fae5d0a6467518079c210ae17370dca478"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a9b5848901801510f160c2e09f4fe65cca738128","unresolved":false,"context_lines":[{"line_number":38,"context_line":"#sqlite does not drop columns, so if we hit this,"},{"line_number":39,"context_line":"#it thinks it has dropped them, but it hasn\u0027t"},{"line_number":40,"context_line":"    except exc.OperationalError as e:"},{"line_number":41,"context_line":"        if (not migrate_engine.name \u003d\u003d \"sqlite\" and"},{"line_number":42,"context_line":"                e.args[0].endswith(\u0027duplicate column name: trust_id\u0027)):"},{"line_number":43,"context_line":"                    raise"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2Fymk%3D","line":41,"updated":"2013-03-12 18:05:43.000000000","message":"is this supposed to be not (migrate_engine.name \u003d\u003d \"sqlite\" and ... ) ?\n\nsuggest change to if (migrate_engine.name \u003d\u003d \"sqlite\" and ... ) : pass; else raise","commit_id":"712b27fae5d0a6467518079c210ae17370dca478"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"192ced05aef09980e483c08ab021e72e820ac1ab","unresolved":false,"context_lines":[{"line_number":38,"context_line":"#sqlite does not drop columns, so if we hit this,"},{"line_number":39,"context_line":"#it thinks it has dropped them, but it hasn\u0027t"},{"line_number":40,"context_line":"    except exc.OperationalError as e:"},{"line_number":41,"context_line":"        if (not migrate_engine.name \u003d\u003d \"sqlite\" and"},{"line_number":42,"context_line":"                e.args[0].endswith(\u0027duplicate column name: trust_id\u0027)):"},{"line_number":43,"context_line":"                    raise"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2FyS0%3D","line":41,"updated":"2013-03-12 19:43:41.000000000","message":"use !\u003d if that\u0027s what you\u0027re intending; this syntax is ambiguous","commit_id":"712b27fae5d0a6467518079c210ae17370dca478"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a9b5848901801510f160c2e09f4fe65cca738128","unresolved":false,"context_lines":[{"line_number":39,"context_line":"#it thinks it has dropped them, but it hasn\u0027t"},{"line_number":40,"context_line":"    except exc.OperationalError as e:"},{"line_number":41,"context_line":"        if (not migrate_engine.name \u003d\u003d \"sqlite\" and"},{"line_number":42,"context_line":"                e.args[0].endswith(\u0027duplicate column name: trust_id\u0027)):"},{"line_number":43,"context_line":"                    raise"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2Fymw%3D","line":42,"updated":"2013-03-12 18:05:43.000000000","message":"change to the correct column name (might be user_id)","commit_id":"712b27fae5d0a6467518079c210ae17370dca478"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"192ced05aef09980e483c08ab021e72e820ac1ab","unresolved":false,"context_lines":[{"line_number":39,"context_line":"#it thinks it has dropped them, but it hasn\u0027t"},{"line_number":40,"context_line":"    except exc.OperationalError as e:"},{"line_number":41,"context_line":"        if (not migrate_engine.name \u003d\u003d \"sqlite\" and"},{"line_number":42,"context_line":"                e.args[0].endswith(\u0027duplicate column name: trust_id\u0027)):"},{"line_number":43,"context_line":"                    raise"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2Fx5s%3D","line":42,"in_reply_to":"AAAAN3%2F%2Fymw%3D","updated":"2013-03-12 19:43:41.000000000","message":"can it be pulled from column? e.g.\n\n  column.name","commit_id":"712b27fae5d0a6467518079c210ae17370dca478"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d553d02569aab946d82715630a38a601926f230e","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sqlalchemy"},{"line_number":19,"context_line":"from sqlalchemy import exc"},{"line_number":20,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":21,"context_line":"from keystone import config"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2Fv28%3D","line":20,"updated":"2013-03-13 22:27:12.000000000","message":"(nit) should be an extra blank line here. see https://github.com/openstack/keystone/blame/master/HACKING.rst#L69","commit_id":"e4a7dedc025263ff17dd29343eab27e649c8d3ad"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b2eaf67aa0773e6246551226f8eae5ab226693a0","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sqlalchemy"},{"line_number":19,"context_line":"from sqlalchemy import exc"},{"line_number":20,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":21,"context_line":"from keystone import config"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2Fvqo%3D","line":20,"in_reply_to":"AAAAN3%2F%2Fv28%3D","updated":"2013-03-14 02:13:10.000000000","message":"Done","commit_id":"e4a7dedc025263ff17dd29343eab27e649c8d3ad"}],"keystone/common/sql/migrate_repo/versions/021_add_trust_to_token.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a3f88d02ca998973ab354d162620eb11eec44345","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        if (e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name)"},{"line_number":41,"context_line":"                and migrate_engine.name \u003d\u003d \"sqlite\"):"},{"line_number":42,"context_line":"                #sqlite does not drop columns, so if we hit this,"},{"line_number":43,"context_line":"                #it thinks it has dropped them, but it hasn\u0027t."},{"line_number":44,"context_line":"                    pass"},{"line_number":45,"context_line":"        else:"},{"line_number":46,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAN3%2F%2Ft0A%3D","line":43,"updated":"2013-03-15 11:28:45.000000000","message":"Great that we have added the check for sqlite.  I\u0027d prefer if we were still more explicit in the comment - I assuming that we will only hit this if we have down a downgrade and then an upgrade?  If that is the case, how about something like:\n\n\"sqlite fails, silently, to drop columns. So if we have already done a downgrade and are now upgrading, then we will hit this, since sqlite thinks it had dropped the columns on the downgrade, but it hasn\u0027t\"","commit_id":"85f0034ca55bc59fc57934bd60b98bb3345d4443"}],"keystone/identity/controllers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"94afb488b912ba8eeba7d5755a42374da2c79949","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        return o"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"def delete_tokens_for_user(context, token_api, trust_api, user_id):"},{"line_number":165,"context_line":"    try:"},{"line_number":166,"context_line":"        #First delete tokens that could get other tokens."},{"line_number":167,"context_line":"        for token_id in token_api.list_tokens(context, user_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F0kE%3D","line":164,"updated":"2013-03-11 13:43:51.000000000","message":".. why is this a standalone method?","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1bba6ce391c249a024f5a9d3ba5b830dd367cafd","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        return o"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"def delete_tokens_for_user(context, token_api, trust_api, user_id):"},{"line_number":165,"context_line":"    try:"},{"line_number":166,"context_line":"        #First delete tokens that could get other tokens."},{"line_number":167,"context_line":"        for token_id in token_api.list_tokens(context, user_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F0RY%3D","line":164,"in_reply_to":"AAAAN3%2F%2F0kE%3D","updated":"2013-03-11 16:13:00.000000000","message":"Because it can potentially be used from anywhere.  Here it is called from both V2 and V3 controllers.","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2a19c14ab401a417c39f460cf0dd5ebe67ba7f0c","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                            context,"},{"line_number":472,"context_line":"                            self.token_api,"},{"line_number":473,"context_line":"                            self.trust_api,"},{"line_number":474,"context_line":"                            user[\u0027id\u0027])"},{"line_number":475,"context_line":"        return DomainV3.wrap_member(context, ref)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzYg%3D","line":474,"updated":"2013-03-12 00:32:21.000000000","message":"this looks wrong... project isn\u0027t used.","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"197914de0e34dd3949d89109b1a47172ba6d1719","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                            context,"},{"line_number":472,"context_line":"                            self.token_api,"},{"line_number":473,"context_line":"                            self.trust_api,"},{"line_number":474,"context_line":"                            user[\u0027id\u0027])"},{"line_number":475,"context_line":"        return DomainV3.wrap_member(context, ref)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzOI%3D","line":474,"in_reply_to":"AAAAN3%2F%2FzYg%3D","updated":"2013-03-12 04:09:22.000000000","message":"Brant, excellent observation! Yeah, this logic definitely doesn\u0027t look right. It was intended to revoke all to project-scoped tokens for projects in the disabled domain.","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e60e20c2931d3ecde829c511bb2eb9a5db8e5e68","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                            context,"},{"line_number":472,"context_line":"                            self.token_api,"},{"line_number":473,"context_line":"                            self.trust_api,"},{"line_number":474,"context_line":"                            user[\u0027id\u0027])"},{"line_number":475,"context_line":"        return DomainV3.wrap_member(context, ref)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzSU%3D","line":474,"in_reply_to":"AAAAN3%2F%2FzYg%3D","updated":"2013-03-12 04:22:28.000000000","message":"Good catch.  It turns out that the logic I was using was a bit more draconian, and removed tokens that should have been left in place.  But passing the tenant_id on down the function chain is correct..","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a9b5848901801510f160c2e09f4fe65cca738128","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                           project_id\u003dNone):"},{"line_number":166,"context_line":"    try:"},{"line_number":167,"context_line":"        #First delete tokens that could get other tokens."},{"line_number":168,"context_line":"        for token_id in token_api.list_tokens(context, user_id, project_id):"},{"line_number":169,"context_line":"            token_api.delete_token(context, token_id)"},{"line_number":170,"context_line":"        #now delete trust tokens"},{"line_number":171,"context_line":"        for trust in trust_api.list_trusts_for_trustee(context, user_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2FymE%3D","line":168,"updated":"2013-03-12 18:05:43.000000000","message":"suggest use named argument for named parameter, e.g. \"project_id\" -\u003e \"tenant_id\u003dproject_id\".","commit_id":"712b27fae5d0a6467518079c210ae17370dca478"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                    # only revoke tokens on projects owned by this domain"},{"line_number":441,"context_line":"                    for project in projects:"},{"line_number":442,"context_line":"                        self._delete_tokens_for_user("},{"line_number":443,"context_line":"                            context, user[\u0027id\u0027], project[\u0027id\u0027])"},{"line_number":444,"context_line":"        return DomainV3.wrap_member(context, ref)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvD4%3D","line":443,"updated":"2013-03-14 15:18:08.000000000","message":"optional arguments (project) should be specified as keywords","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"eaf46976af5f95b68e0a48e890cc93911161266b","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                    # only revoke tokens on projects owned by this domain"},{"line_number":441,"context_line":"                    for project in projects:"},{"line_number":442,"context_line":"                        self._delete_tokens_for_user("},{"line_number":443,"context_line":"                            context, user[\u0027id\u0027], project[\u0027id\u0027])"},{"line_number":444,"context_line":"        return DomainV3.wrap_member(context, ref)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    @controller.protected"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FuDE%3D","line":443,"in_reply_to":"AAAAN3%2F%2FvD4%3D","updated":"2013-03-15 01:32:47.000000000","message":"Done","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"}],"keystone/token/backends/sql.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9c8ec329a28abb9428ef6100decc2b77165cfc71","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    expires \u003d sql.Column(sql.DateTime(), default\u003dNone)"},{"line_number":32,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":33,"context_line":"    valid \u003d sql.Column(sql.Boolean(), default\u003dTrue)"},{"line_number":34,"context_line":"    user_id \u003d sql.Column(sql.String(64))"},{"line_number":35,"context_line":"    trust_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1fk%3D","line":34,"updated":"2013-03-10 10:38:04.000000000","message":"At first glance, one would think that this and the trust_id should be foreign keys.  I suspect the reason they are not is that since  the physical deletion of tokens from the DB is an out-of-band exercise, having a FK relationship might be problematic. On the flip side, if a provider REALLY wanted full auditing, then they would want all the entities to which the tokens are related to hang around too - however, I\u0027m not sure we want to really enforce all that (and if we did we would probably need significant additional support for the operations of archiving whole batches of related entities) \n\nProbably worth a comment here about why these attributes are not FKs","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"1bba6ce391c249a024f5a9d3ba5b830dd367cafd","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    expires \u003d sql.Column(sql.DateTime(), default\u003dNone)"},{"line_number":32,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":33,"context_line":"    valid \u003d sql.Column(sql.Boolean(), default\u003dTrue)"},{"line_number":34,"context_line":"    user_id \u003d sql.Column(sql.String(64))"},{"line_number":35,"context_line":"    trust_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F0Rk%3D","line":34,"in_reply_to":"AAAAN3%2F%2F0kI%3D","updated":"2013-03-11 16:13:00.000000000","message":"Dolph is right.","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"94afb488b912ba8eeba7d5755a42374da2c79949","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    expires \u003d sql.Column(sql.DateTime(), default\u003dNone)"},{"line_number":32,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":33,"context_line":"    valid \u003d sql.Column(sql.Boolean(), default\u003dTrue)"},{"line_number":34,"context_line":"    user_id \u003d sql.Column(sql.String(64))"},{"line_number":35,"context_line":"    trust_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F0kI%3D","line":34,"in_reply_to":"AAAAN3%2F%2F1fk%3D","updated":"2013-03-11 13:43:51.000000000","message":"can\u0027t do foreign keys because it would cross driver boundaries","commit_id":"481851b1516457ce2b3e03c7768277238b3864e6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2a19c14ab401a417c39f460cf0dd5ebe67ba7f0c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":33,"context_line":"    valid \u003d sql.Column(sql.Boolean(), default\u003dTrue)"},{"line_number":34,"context_line":"    user_id \u003d sql.Column(sql.String(64))"},{"line_number":35,"context_line":"    trust_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class Token(sql.Base, token.Driver):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzYQ%3D","line":35,"updated":"2013-03-12 00:32:21.000000000","message":"why does migrate_repo/versions/020_add_trust_to_token.py have String(128) for these columns?","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e60e20c2931d3ecde829c511bb2eb9a5db8e5e68","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":33,"context_line":"    valid \u003d sql.Column(sql.Boolean(), default\u003dTrue)"},{"line_number":34,"context_line":"    user_id \u003d sql.Column(sql.String(64))"},{"line_number":35,"context_line":"    trust_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class Token(sql.Base, token.Driver):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzTM%3D","line":35,"in_reply_to":"AAAAN3%2F%2FzYQ%3D","updated":"2013-03-12 04:22:28.000000000","message":"Done.  I was looking at the wrong column (password)","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"}],"tests/test_backend.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":1955,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":1956,"context_line":"                \u0027user_id\u0027: \u0027testuserid\u0027,"},{"line_number":1957,"context_line":"                \u0027trust_id\u0027: None,"},{"line_number":1958,"context_line":"                \u0027user\u0027: {\u0027id\u0027: \u0027testuserid\u0027}}"},{"line_number":1959,"context_line":"        data_ref \u003d self.token_api.create_token(token_id, data)"},{"line_number":1960,"context_line":"        expires \u003d data_ref.pop(\u0027expires\u0027)"},{"line_number":1961,"context_line":"        self.assertTrue(isinstance(expires, datetime.datetime))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvDQ%3D","line":1958,"updated":"2013-03-14 15:18:08.000000000","message":"if you\u0027re having to specify user ID twice in this, then something is broken..? i hope \u0027user\u0027 can be removed","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"eaf46976af5f95b68e0a48e890cc93911161266b","unresolved":false,"context_lines":[{"line_number":1955,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":1956,"context_line":"                \u0027user_id\u0027: \u0027testuserid\u0027,"},{"line_number":1957,"context_line":"                \u0027trust_id\u0027: None,"},{"line_number":1958,"context_line":"                \u0027user\u0027: {\u0027id\u0027: \u0027testuserid\u0027}}"},{"line_number":1959,"context_line":"        data_ref \u003d self.token_api.create_token(token_id, data)"},{"line_number":1960,"context_line":"        expires \u003d data_ref.pop(\u0027expires\u0027)"},{"line_number":1961,"context_line":"        self.assertTrue(isinstance(expires, datetime.datetime))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2Fu1o%3D","line":1958,"in_reply_to":"AAAAN3%2F%2FvDQ%3D","updated":"2013-03-15 01:32:47.000000000","message":"Done.  It wasn\u0027t necessary, just made the comparator below work.  But I\u0027ll pop the user_id value instead:  user_id is now a key in the database, and thus must be in the model object.","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":1976,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":1977,"context_line":"        data \u003d {\u0027id\u0027: token_id, \u0027a\u0027: \u0027b\u0027,"},{"line_number":1978,"context_line":"                \u0027user_id\u0027: \u0027testuserid\u0027,"},{"line_number":1979,"context_line":"                \u0027user\u0027: {\u0027id\u0027: \u0027testuserid\u0027}}"},{"line_number":1980,"context_line":"        if tenant_id is not None:"},{"line_number":1981,"context_line":"            data[\u0027tenant\u0027] \u003d {\u0027id\u0027: tenant_id, \u0027name\u0027: tenant_id}"},{"line_number":1982,"context_line":"        if trust_id is not None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvDM%3D","line":1979,"updated":"2013-03-14 15:18:08.000000000","message":"same as above","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":2050,"context_line":"                \u0027expires\u0027: expire_time,"},{"line_number":2051,"context_line":"                \u0027user_id\u0027: \u0027testuserid\u0027,"},{"line_number":2052,"context_line":"                \u0027trust_id\u0027: None,"},{"line_number":2053,"context_line":"                \u0027user\u0027: {\u0027id\u0027: \u0027testuserid\u0027}}"},{"line_number":2054,"context_line":"        data_ref \u003d self.token_api.create_token(token_id, data)"},{"line_number":2055,"context_line":"        self.assertDictEqual(data_ref, data)"},{"line_number":2056,"context_line":"        self.assertRaises(exception.TokenNotFound,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvDI%3D","line":2053,"updated":"2013-03-14 15:18:08.000000000","message":"same as above","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0a40f55364e5b1a703decb79a6268fd8065a1be6","unresolved":false,"context_lines":[{"line_number":1957,"context_line":"                \u0027user\u0027: {\u0027id\u0027: \u0027testuserid\u0027}}"},{"line_number":1958,"context_line":"        data_ref \u003d self.token_api.create_token(token_id, data)"},{"line_number":1959,"context_line":"        expires \u003d data_ref.pop(\u0027expires\u0027)"},{"line_number":1960,"context_line":"        data_ref.pop(\u0027user_id\u0027)"},{"line_number":1961,"context_line":"        self.assertTrue(isinstance(expires, datetime.datetime))"},{"line_number":1962,"context_line":"        self.assertDictEqual(data_ref, data)"},{"line_number":1963,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAN3%2F%2FtlU%3D","line":1960,"updated":"2013-03-15 15:54:31.000000000","message":"this still seems really odd that you pass in user one way, and get it back out another way... setting user_id in data and getting user_id back in data_ref seems to be the most consistent with other backends. what\u0027s preventing it from working that way?","commit_id":"abcc2819d96b007c0dee9a4634af710399f2aebd"}],"tests/test_v3.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2a19c14ab401a417c39f460cf0dd5ebe67ba7f0c","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def v3_request(self, path, **kwargs):"},{"line_number":209,"context_line":"        # Check if the caller has passed in auth details for"},{"line_number":210,"context_line":"        # use in requesting the token"},{"line_number":211,"context_line":"        auth \u003d kwargs.pop(\u0027auth\u0027, None)"},{"line_number":212,"context_line":"        if auth:"},{"line_number":213,"context_line":"            token \u003d self.get_requested_token(auth)"},{"line_number":214,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzYI%3D","line":211,"updated":"2013-03-12 00:32:21.000000000","message":"suggest remove \", None\" since this is the default.","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e60e20c2931d3ecde829c511bb2eb9a5db8e5e68","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def v3_request(self, path, **kwargs):"},{"line_number":209,"context_line":"        # Check if the caller has passed in auth details for"},{"line_number":210,"context_line":"        # use in requesting the token"},{"line_number":211,"context_line":"        auth \u003d kwargs.pop(\u0027auth\u0027, None)"},{"line_number":212,"context_line":"        if auth:"},{"line_number":213,"context_line":"            token \u003d self.get_requested_token(auth)"},{"line_number":214,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzTA%3D","line":211,"in_reply_to":"AAAAN3%2F%2FzYI%3D","updated":"2013-03-12 04:22:28.000000000","message":"Tests start to fail if I do that, indicating that they are not the same thing.","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"}],"tests/test_v3_auth.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"197914de0e34dd3949d89109b1a47172ba6d1719","unresolved":false,"context_lines":[{"line_number":856,"context_line":"            password\u003dself.trustee_user[\u0027password\u0027])"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"        r \u003d self.patch(\u0027/users/%s\u0027 % self.trustee_user[\u0027id\u0027],"},{"line_number":859,"context_line":"                       body\u003d{\u0027user\u0027: {\u0027password\u0027: \u0027newpassword\u0027}},"},{"line_number":860,"context_line":"                       auth\u003dauth_data,"},{"line_number":861,"context_line":"                       expected_status\u003d200)"},{"line_number":862,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzO8%3D","line":859,"updated":"2013-03-12 04:09:22.000000000","message":"password: uuid.uuid4().hex","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e60e20c2931d3ecde829c511bb2eb9a5db8e5e68","unresolved":false,"context_lines":[{"line_number":856,"context_line":"            password\u003dself.trustee_user[\u0027password\u0027])"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"        r \u003d self.patch(\u0027/users/%s\u0027 % self.trustee_user[\u0027id\u0027],"},{"line_number":859,"context_line":"                       body\u003d{\u0027user\u0027: {\u0027password\u0027: \u0027newpassword\u0027}},"},{"line_number":860,"context_line":"                       auth\u003dauth_data,"},{"line_number":861,"context_line":"                       expected_status\u003d200)"},{"line_number":862,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAN3%2F%2FzNc%3D","line":859,"in_reply_to":"AAAAN3%2F%2FzO8%3D","updated":"2013-03-12 04:22:28.000000000","message":"Done","commit_id":"ba473baf19fcc16368529ab5fec4b6d9a6939f75"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"8ab38bffbe5accfdb386849afe5c129727555882","unresolved":false,"context_lines":[{"line_number":793,"context_line":"            password\u003dself.trustee_user[\u0027password\u0027])"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"        r \u003d self.patch(\u0027/users/%s\u0027 % self.trustee_user[\u0027id\u0027],"},{"line_number":796,"context_line":"                       body\u003d{\u0027user\u0027: {\u0027password\u0027: \u0027newpassword\u0027}},"},{"line_number":797,"context_line":"                       auth\u003dauth_data,"},{"line_number":798,"context_line":"                       expected_status\u003d200)"},{"line_number":799,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FwQM%3D","line":796,"updated":"2013-03-13 18:54:37.000000000","message":"\u0027password\u0027: uuid.uuid4().hex?","commit_id":"e4a7dedc025263ff17dd29343eab27e649c8d3ad"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"b2eaf67aa0773e6246551226f8eae5ab226693a0","unresolved":false,"context_lines":[{"line_number":793,"context_line":"            password\u003dself.trustee_user[\u0027password\u0027])"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"        r \u003d self.patch(\u0027/users/%s\u0027 % self.trustee_user[\u0027id\u0027],"},{"line_number":796,"context_line":"                       body\u003d{\u0027user\u0027: {\u0027password\u0027: \u0027newpassword\u0027}},"},{"line_number":797,"context_line":"                       auth\u003dauth_data,"},{"line_number":798,"context_line":"                       expected_status\u003d200)"},{"line_number":799,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2Fvqg%3D","line":796,"in_reply_to":"AAAAN3%2F%2FwQM%3D","updated":"2013-03-14 02:13:10.000000000","message":"Done","commit_id":"e4a7dedc025263ff17dd29343eab27e649c8d3ad"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        self.assertValidProjectTrustScopedTokenResponse(r, self.user)"},{"line_number":1089,"context_line":"        trust_token \u003d r.getheader(\u0027X-Subject-Token\u0027)"},{"line_number":1090,"context_line":"        from keystone.common import cms"},{"line_number":1091,"context_line":"        token_id \u003d cms.cms_hash_token(trust_token)"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvC8%3D","line":1090,"updated":"2013-03-14 15:18:08.000000000","message":"this should ideally come from keystoneclient","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"eaf46976af5f95b68e0a48e890cc93911161266b","unresolved":false,"context_lines":[{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        self.assertValidProjectTrustScopedTokenResponse(r, self.user)"},{"line_number":1089,"context_line":"        trust_token \u003d r.getheader(\u0027X-Subject-Token\u0027)"},{"line_number":1090,"context_line":"        from keystone.common import cms"},{"line_number":1091,"context_line":"        token_id \u003d cms.cms_hash_token(trust_token)"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FuDU%3D","line":1090,"in_reply_to":"AAAAN3%2F%2FvC8%3D","updated":"2013-03-15 01:32:47.000000000","message":"removed.  It was a debugging vestige that should not have been here.","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"        from keystone.common import cms"},{"line_number":1091,"context_line":"        token_id \u003d cms.cms_hash_token(trust_token)"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"},{"line_number":1094,"context_line":"                     self.user_id, expected_status\u003d200,"},{"line_number":1095,"context_line":"                     token\u003dtrust_token)"},{"line_number":1096,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvCo%3D","line":1093,"updated":"2013-03-14 15:18:08.000000000","message":"don\u0027t need to assign to r","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"eaf46976af5f95b68e0a48e890cc93911161266b","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"        from keystone.common import cms"},{"line_number":1091,"context_line":"        token_id \u003d cms.cms_hash_token(trust_token)"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"},{"line_number":1094,"context_line":"                     self.user_id, expected_status\u003d200,"},{"line_number":1095,"context_line":"                     token\u003dtrust_token)"},{"line_number":1096,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FuDQ%3D","line":1093,"in_reply_to":"AAAAN3%2F%2FvCo%3D","updated":"2013-03-15 01:32:47.000000000","message":"Done","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"},{"line_number":1094,"context_line":"                     self.user_id, expected_status\u003d200,"},{"line_number":1095,"context_line":"                     token\u003dtrust_token)"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":1098,"context_line":"            user_id\u003dself.trustee_user[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvCg%3D","line":1095,"updated":"2013-03-14 15:18:08.000000000","message":"self.assertValidTrustResponse(r)","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"eaf46976af5f95b68e0a48e890cc93911161266b","unresolved":false,"context_lines":[{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"},{"line_number":1094,"context_line":"                     self.user_id, expected_status\u003d200,"},{"line_number":1095,"context_line":"                     token\u003dtrust_token)"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":1098,"context_line":"            user_id\u003dself.trustee_user[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FuDM%3D","line":1095,"in_reply_to":"AAAAN3%2F%2FvCg%3D","updated":"2013-03-15 01:32:47.000000000","message":"list has a different format.  Just need an api call that is auth specific.  The 200 is sufficient to tests.","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"        r \u003d self.patch(\u0027/users/%s\u0027 % self.trustee_user[\u0027id\u0027],"},{"line_number":1102,"context_line":"                       body\u003d{\u0027user\u0027: {\u0027password\u0027: uuid.uuid4().hex}},"},{"line_number":1103,"context_line":"                       auth\u003dauth_data,"},{"line_number":1104,"context_line":"                       expected_status\u003d200)"},{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"},{"line_number":1107,"context_line":"                     self.user_id, expected_status\u003d401,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvCk%3D","line":1104,"updated":"2013-03-14 15:18:08.000000000","message":"self.assertValidUserResponse(r)","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"eaf46976af5f95b68e0a48e890cc93911161266b","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"        r \u003d self.patch(\u0027/users/%s\u0027 % self.trustee_user[\u0027id\u0027],"},{"line_number":1102,"context_line":"                       body\u003d{\u0027user\u0027: {\u0027password\u0027: uuid.uuid4().hex}},"},{"line_number":1103,"context_line":"                       auth\u003dauth_data,"},{"line_number":1104,"context_line":"                       expected_status\u003d200)"},{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"},{"line_number":1107,"context_line":"                     self.user_id, expected_status\u003d401,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FuDI%3D","line":1104,"in_reply_to":"AAAAN3%2F%2FvCk%3D","updated":"2013-03-15 01:32:47.000000000","message":"Done","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2319e3acf53a1d592db05eeda02c8a2d723baadf","unresolved":false,"context_lines":[{"line_number":1103,"context_line":"                       auth\u003dauth_data,"},{"line_number":1104,"context_line":"                       expected_status\u003d200)"},{"line_number":1105,"context_line":""},{"line_number":1106,"context_line":"        r \u003d self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"},{"line_number":1107,"context_line":"                     self.user_id, expected_status\u003d401,"},{"line_number":1108,"context_line":"                     token\u003dtrust_token)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2FvC0%3D","line":1106,"updated":"2013-03-14 15:18:08.000000000","message":"don\u0027t need to assign to r here","commit_id":"a1c1c71c9d62b53c6016f9f55b3e29f3cf6d6862"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ecca06c717bf682e6964b8e5e9a9218943ccd164","unresolved":false,"context_lines":[{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":"        self.get(\u0027/trusts?trustor_user_id\u003d%s\u0027 %"},{"line_number":1106,"context_line":"                 self.user_id, expected_status\u003d401,"},{"line_number":1107,"context_line":"                 token\u003dtrust_token)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAN3%2F%2FtR0%3D","line":1107,"updated":"2013-03-15 19:27:26.000000000","message":"nice test btw","commit_id":"eb4dd4afbffaa15be0af70a317da7034ae28dfd6"}]}
