)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"70fcb1a761a373daf5fcb1feb4fd6a05b3ff1199","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"Shadow users: unified identity\" implementation"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"bp/shadow-users"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: If7a465123a76a90c092863557cb6ae258025b97b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa69d971_6af0c5fe","line":11,"updated":"2016-01-05 20:37:26.000000000","message":"bp shadow-users * (remove the / and replace it with a space)","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b966108306ab8511eb6c34658b9142e822f15e14","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"Shadow users: unified identity\" implementation"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"bp/shadow-users"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: If7a465123a76a90c092863557cb6ae258025b97b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa69d971_d8804ffa","line":11,"in_reply_to":"fa69d971_6af0c5fe","updated":"2016-01-07 16:03:12.000000000","message":"Done","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5096519be68afe8f374bcd0cda0bd2f848721b14","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#1 \"Separate user identities from their local-managed credentials.\""},{"line_number":11,"context_line":"Refactor user table into an identity table and a locally-managed"},{"line_number":12,"context_line":"password table. Migrate data from the user table to these new tables."},{"line_number":13,"context_line":"Modify backend code to utilize the new tables."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Note: #2 \"Shadow LDAP and federated users\" will be completed in a"},{"line_number":16,"context_line":"different patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"7a5de9d1_b7482eb4","line":13,"range":{"start_line":13,"start_character":45,"end_line":13,"end_character":46},"updated":"2016-02-01 20:31:28.000000000","message":"what will happen with the user table, then?","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8747a2314664a23709324c89501eda794bf2f8d2","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#1 \"Separate user identities from their local-managed credentials.\""},{"line_number":11,"context_line":"Refactor user table into an identity table and a locally-managed"},{"line_number":12,"context_line":"password table. Migrate data from the user table to these new tables."},{"line_number":13,"context_line":"Modify backend code to utilize the new tables."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Note: #2 \"Shadow LDAP and federated users\" will be completed in a"},{"line_number":16,"context_line":"different patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"7a5de9d1_2903530f","line":13,"range":{"start_line":13,"start_character":45,"end_line":13,"end_character":46},"in_reply_to":"7a5de9d1_3fc3a939","updated":"2016-02-02 15:21:36.000000000","message":"At the mid-cycle we did talk about deleting it and I think we decided not to...at least in this patch.","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e5a03d3cc5547deebb1162058b10900f9d31cb37","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#1 \"Separate user identities from their local-managed credentials.\""},{"line_number":11,"context_line":"Refactor user table into an identity table and a locally-managed"},{"line_number":12,"context_line":"password table. Migrate data from the user table to these new tables."},{"line_number":13,"context_line":"Modify backend code to utilize the new tables."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Note: #2 \"Shadow LDAP and federated users\" will be completed in a"},{"line_number":16,"context_line":"different patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"7a5de9d1_c938aed5","line":13,"range":{"start_line":13,"start_character":45,"end_line":13,"end_character":46},"in_reply_to":"7a5de9d1_b7482eb4","updated":"2016-02-01 20:47:27.000000000","message":"The user table will be removed in a subsequent release.  I\u0027m  leaving it there in order to support rolling upgrades:\nhttp://specs.openstack.org/openstack/keystone-specs/specs/mitaka/online-schema-migration.html","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e8fd8509b9012b9aec3f203110607123397eead0","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#1 \"Separate user identities from their local-managed credentials.\""},{"line_number":11,"context_line":"Refactor user table into an identity table and a locally-managed"},{"line_number":12,"context_line":"password table. Migrate data from the user table to these new tables."},{"line_number":13,"context_line":"Modify backend code to utilize the new tables."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Note: #2 \"Shadow LDAP and federated users\" will be completed in a"},{"line_number":16,"context_line":"different patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"7a5de9d1_ce242c0e","line":13,"range":{"start_line":13,"start_character":45,"end_line":13,"end_character":46},"in_reply_to":"7a5de9d1_c938aed5","updated":"2016-02-01 23:48:54.000000000","message":"we are postponing the spec and implementation to later release: https://review.openstack.org/274079","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"bf82d922888901efc047469f47c66576e7869ece","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#1 \"Separate user identities from their local-managed credentials.\""},{"line_number":11,"context_line":"Refactor user table into an identity table and a locally-managed"},{"line_number":12,"context_line":"password table. Migrate data from the user table to these new tables."},{"line_number":13,"context_line":"Modify backend code to utilize the new tables."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Note: #2 \"Shadow LDAP and federated users\" will be completed in a"},{"line_number":16,"context_line":"different patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":56,"id":"7a5de9d1_3fc3a939","line":13,"range":{"start_line":13,"start_character":45,"end_line":13,"end_character":46},"in_reply_to":"7a5de9d1_ce242c0e","updated":"2016-02-02 03:11:55.000000000","message":"That\u0027s fine, but we still can wait to remove the user table.","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"}],"keystone/common/sql/migrate_repo/versions/087_add_identity_and_password_tables.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_e1998a20","line":1,"updated":"2016-01-13 15:01:46.000000000","message":"You can remove marketing materials from new files.","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_f9128756","line":1,"in_reply_to":"da6ed579_e1998a20","updated":"2016-01-14 16:08:34.000000000","message":"Done","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        \u0027identity\u0027,"},{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":26,"context_line":"                   nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dTrue),"},{"line_number":28,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":29,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_7c21c19e","line":26,"updated":"2016-01-13 15:01:46.000000000","message":"I believe our existing convention is to use merely \u0027id\u0027 as the PK in the table itself, and use the longer form (\u0027identity_id\u0027 only as a FK name).","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        \u0027identity\u0027,"},{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":26,"context_line":"                   nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dTrue),"},{"line_number":28,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":29,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_594f136b","line":26,"in_reply_to":"da6ed579_7c21c19e","updated":"2016-01-14 16:08:34.000000000","message":"Done","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":26,"context_line":"                   nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dTrue),"},{"line_number":28,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":29,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":30,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_5c939da3","line":27,"updated":"2016-01-13 15:01:46.000000000","message":"This is nullable in other table definitions? I would have assumed it was non-nullable default\u003d\u0027{}\u0027.","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":26,"context_line":"                   nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dTrue),"},{"line_number":28,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":29,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":30,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_196c3bcf","line":27,"in_reply_to":"da6ed579_5c939da3","updated":"2016-01-14 16:08:34.000000000","message":"Done","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \u0027password\u0027,"},{"line_number":34,"context_line":"        meta,"},{"line_number":35,"context_line":"        sql.Column(\u0027password_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":36,"context_line":"                   nullable\u003dFalse),"},{"line_number":37,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027user_name\u0027, sql.String(255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_5c65ddde","line":36,"updated":"2016-01-13 15:01:46.000000000","message":"So this would be \u0027id\u0027 as well. I\u0027m also wondering if this is necessary, as the \u0027password_id\u0027 will be never be exposed to the API. Rather, a composite key on domain_id, user_name, password? And maybe expires_at?","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \u0027password\u0027,"},{"line_number":34,"context_line":"        meta,"},{"line_number":35,"context_line":"        sql.Column(\u0027password_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":36,"context_line":"                   nullable\u003dFalse),"},{"line_number":37,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027user_name\u0027, sql.String(255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_d9cc636c","line":36,"in_reply_to":"da6ed579_5c65ddde","updated":"2016-01-14 16:08:34.000000000","message":"Done","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                   nullable\u003dFalse),"},{"line_number":37,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027user_name\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.Column(\u0027namespace\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sql.Column(\u0027password\u0027, sql.String(256), nullable\u003dFalse),"},{"line_number":42,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_dcc0ede2","line":39,"updated":"2016-01-13 15:01:46.000000000","message":"This could just be \u0027name\u0027? I don\u0027t think we use \u0027user_name\u0027 anywhere in v3, it\u0027s more like user.name.","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                   nullable\u003dFalse),"},{"line_number":37,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027user_name\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.Column(\u0027namespace\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sql.Column(\u0027password\u0027, sql.String(256), nullable\u003dFalse),"},{"line_number":42,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_d9d30303","line":39,"in_reply_to":"da6ed579_dcc0ede2","updated":"2016-01-14 16:08:34.000000000","message":"Done","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027user_name\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.Column(\u0027namespace\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sql.Column(\u0027password\u0027, sql.String(256), nullable\u003dFalse),"},{"line_number":42,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":43,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_c1324610","line":40,"updated":"2016-01-13 15:01:46.000000000","message":"Let\u0027s keep this as a \u0027domain_id\u0027 for now, since that\u0027s the only use case we\u0027ll have for it in Mitaka.","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027user_name\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.Column(\u0027namespace\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sql.Column(\u0027password\u0027, sql.String(256), nullable\u003dFalse),"},{"line_number":42,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":43,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_f9d047f8","line":40,"in_reply_to":"da6ed579_c1324610","updated":"2016-01-14 16:08:34.000000000","message":"Done","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027user_name\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.Column(\u0027namespace\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sql.Column(\u0027password\u0027, sql.String(256), nullable\u003dFalse),"},{"line_number":42,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":43,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_dc9f8db2","line":41,"updated":"2016-01-13 15:01:46.000000000","message":"256, not 255?","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027user_name\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.Column(\u0027namespace\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sql.Column(\u0027password\u0027, sql.String(256), nullable\u003dFalse),"},{"line_number":42,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":43,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_790bf78e","line":41,"in_reply_to":"da6ed579_dc9f8db2","updated":"2016-01-14 16:08:34.000000000","message":"Done","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    federated_table \u003d sql.Table("},{"line_number":46,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":47,"context_line":"        meta,"},{"line_number":48,"context_line":"        sql.Column(\u0027federated_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":49,"context_line":"                   nullable\u003dFalse),"},{"line_number":50,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":51,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_5c6f1d92","line":48,"updated":"2016-01-13 15:01:46.000000000","message":"Same as above, this can just be \u0027id\u0027.","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    federated_table \u003d sql.Table("},{"line_number":46,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":47,"context_line":"        meta,"},{"line_number":48,"context_line":"        sql.Column(\u0027federated_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":49,"context_line":"                   nullable\u003dFalse),"},{"line_number":50,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":51,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_3901ff6a","line":48,"in_reply_to":"da6ed579_5c6f1d92","updated":"2016-01-14 16:08:34.000000000","message":"Done","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        sql.Column(\u0027federated_id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":49,"context_line":"                   nullable\u003dFalse),"},{"line_number":50,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":51,"context_line":"                   sql.ForeignKey(\u0027identity.identity_id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":52,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":53,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":54,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_9c86f511","line":51,"updated":"2016-01-13 15:01:46.000000000","message":"++ You might get (wrongly) called out for using CASCADE on these, but that\u0027s because we have really confusing conventions around FKs. We don\u0027t allow FKs to cross backends (for example, default_project_id does not have a FK to the resource backend), because we must assume that the other backend might not be SQL. But within a backend, standard best practices should apply (like using CASCADE here).","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"}],"keystone/common/sql/migrate_repo/versions/088_add_identity_and_password_tables.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"139f5e36d44d70ae9d52b5a76ddb8d8f412116ae","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":24,"context_line":"                   nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":27,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":28,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_732fcba1","line":25,"range":{"start_line":25,"start_character":8,"end_line":25,"end_character":56},"updated":"2016-01-18 15:06:13.000000000","message":"Isn\u0027t the following the established convention for \u0027extra\u0027? \n\n\n    from keystone.common import sql as ks_sql\n    ....\n    sql.Column(\u0027extra\u0027, ks_sql.JsonBlob.impl),\n\n\n\nhttps://github.com/openstack/keystone/blob/1baa32afd0b43887125e35cfba4597556fc187df/keystone/common/sql/migrate_repo/versions/044_icehouse.py#L49","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ead78e7730fc3a1133c959cb57577a7e2c7b5496","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":24,"context_line":"                   nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":27,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":28,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_4da546b3","line":25,"in_reply_to":"ba63e191_169c44bf","updated":"2016-01-19 19:03:16.000000000","message":"For other reviewers: \"have to\" only because this won\u0027t be populated with any new data.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"acf20f6e53524791a99f7a96162056975437bd07","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":24,"context_line":"                   nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":27,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":28,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_1fcc8e34","line":25,"range":{"start_line":25,"start_character":8,"end_line":25,"end_character":56},"in_reply_to":"da6ed579_732fcba1","updated":"2016-01-21 18:23:20.000000000","message":"Done","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":24,"context_line":"                   nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":27,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":28,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_169c44bf","line":25,"range":{"start_line":25,"start_character":8,"end_line":25,"end_character":56},"in_reply_to":"da6ed579_732fcba1","updated":"2016-01-19 17:00:10.000000000","message":"It\u0027s a bummer that we have to add this in here. We\u0027ve been trying not to propagate the bad patterns. Lance is correct that this isn\u0027t using the right column type.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":24,"context_line":"                   nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text(), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":27,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":28,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_17c50c3b","line":25,"range":{"start_line":25,"start_character":8,"end_line":25,"end_character":56},"in_reply_to":"da6ed579_732fcba1","updated":"2016-01-20 00:04:38.000000000","message":"Okay, I\u0027ll make this change in the next patch.  Thanks.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    password_table \u003d sql.Table("},{"line_number":31,"context_line":"        \u0027password\u0027,"},{"line_number":32,"context_line":"        meta,"},{"line_number":33,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), nullable\u003dFalse,"},{"line_number":34,"context_line":"                   primary_key\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_b6f45887","line":31,"updated":"2016-01-19 17:00:10.000000000","message":"password_identity?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    password_table \u003d sql.Table("},{"line_number":31,"context_line":"        \u0027password\u0027,"},{"line_number":32,"context_line":"        meta,"},{"line_number":33,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), nullable\u003dFalse,"},{"line_number":34,"context_line":"                   primary_key\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_57038442","line":31,"in_reply_to":"ba63e191_6d592a5a","updated":"2016-01-20 00:04:38.000000000","message":"So what do you think Dolph?  My preference would be to keep the password name, but I do see David\u0027s point.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ead78e7730fc3a1133c959cb57577a7e2c7b5496","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    password_table \u003d sql.Table("},{"line_number":31,"context_line":"        \u0027password\u0027,"},{"line_number":32,"context_line":"        meta,"},{"line_number":33,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), nullable\u003dFalse,"},{"line_number":34,"context_line":"                   primary_key\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_6d592a5a","line":31,"in_reply_to":"ba63e191_b6f45887","updated":"2016-01-19 19:03:16.000000000","message":"I wonder if we need to rethink this, or to rethink the \u0027federated_identity\u0027 table name. I hadn\u0027t considered that _identity in that table name explicitly referenced the \u0027identity\u0027 table.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":37,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":38,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":40,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    federated_table \u003d sql.Table("}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_1613e4b9","line":39,"updated":"2016-01-19 17:00:10.000000000","message":"Are we doing to start implementing IdP like password rules? This might open a large can of worms.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"fb12d6bdf085d0134edd5611a4aeb1a0a92ddda1","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":37,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":38,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":40,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    federated_table \u003d sql.Table("}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_63edabee","line":39,"in_reply_to":"9a68dd71_6d735a16","updated":"2016-01-21 19:04:20.000000000","message":"Some time ago we decided that we shall not do it. If people want credentials management, it should be done with external tools (in ldap or in idp).","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"acf20f6e53524791a99f7a96162056975437bd07","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":37,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":38,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":40,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    federated_table \u003d sql.Table("}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_6d735a16","line":39,"in_reply_to":"9a68dd71_e7d775bd","updated":"2016-01-21 18:23:20.000000000","message":"expires_at is used to allow password credentials to expire","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":37,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":38,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":40,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    federated_table \u003d sql.Table("}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_d763f418","line":39,"in_reply_to":"ba63e191_1613e4b9","updated":"2016-01-20 00:04:38.000000000","message":"We\u0027re not implementing IdP password rules in this spec, but this would allow it to easily be added in the future should we decide to do that.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c154ba6b771d4dd981b3856b12ac6ceaf0008e8c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":37,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":38,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":40,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    federated_table \u003d sql.Table("}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_e7d775bd","line":39,"in_reply_to":"ba63e191_d763f418","updated":"2016-01-21 15:20:28.000000000","message":"Keystone definitely doesn\u0027t want to do that. What is this column for?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":40,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    federated_table \u003d sql.Table("},{"line_number":43,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":44,"context_line":"        meta,"},{"line_number":45,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_9626f4cc","line":42,"updated":"2016-01-19 17:00:10.000000000","message":"Does a federated user not need a domain_id?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ead78e7730fc3a1133c959cb57577a7e2c7b5496","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":40,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    federated_table \u003d sql.Table("},{"line_number":43,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":44,"context_line":"        meta,"},{"line_number":45,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_cdf4d688","line":42,"in_reply_to":"ba63e191_9626f4cc","updated":"2016-01-19 19:03:16.000000000","message":"Out of scope here I think, but I\u0027d like to propose adding one, actually. But the question is what to populate it with? The obvious choice would be to source the value from the mapping or IdP, but I would love to pick this conversation up at the midcycle. Added to topics: https://etherpad.openstack.org/p/keystone-mitaka-midcycle","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fdd6f4e32b10d16b53da80bb9932597196c9258e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":40,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    federated_table \u003d sql.Table("},{"line_number":43,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":44,"context_line":"        meta,"},{"line_number":45,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_861ebb61","line":42,"in_reply_to":"ba63e191_cdf4d688","updated":"2016-01-19 19:49:53.000000000","message":"I ask because of the property-based way that User is using. I don\u0027t know what is returned by User.domain_id now for federated users.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def downgrade(migrate_engine):"},{"line_number":56,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_b647781c","line":55,"updated":"2016-01-19 17:00:10.000000000","message":"You don\u0027t need this.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"acf20f6e53524791a99f7a96162056975437bd07","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def downgrade(migrate_engine):"},{"line_number":56,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_8d556e51","line":55,"in_reply_to":"ba63e191_b647781c","updated":"2016-01-21 18:23:20.000000000","message":"Done","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def downgrade(migrate_engine):"},{"line_number":56,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_3754d01f","line":55,"in_reply_to":"ba63e191_b647781c","updated":"2016-01-20 00:04:38.000000000","message":"I know, but I get an error when running tests locally if it\u0027s not there.  I\u0027ll remove it later.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"be036c4509c33731d2764d66a80ec1a3a0674268","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"9a68dd71_c4a606c1","updated":"2016-01-21 07:27:23.000000000","message":"change the name of this file, you are creating not just identity and password table but also federated_identity.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"8aef4f7aceea2f7d916f4054eb946581a608f455","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"9a68dd71_af282f87","in_reply_to":"9a68dd71_c4a606c1","updated":"2016-01-22 16:32:54.000000000","message":"Done","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a1ef00d1c2a55e1b856c5b3e12fecf9ef339f69b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"9a68dd71_e118c086","in_reply_to":"9a68dd71_c4a606c1","updated":"2016-01-21 16:02:36.000000000","message":"Nit, I may change it if there is another patch","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"be036c4509c33731d2764d66a80ec1a3a0674268","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":42,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    federated_table \u003d sql.Table("},{"line_number":45,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":46,"context_line":"        meta,"},{"line_number":47,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":48,"context_line":"                   nullable\u003dFalse),"},{"line_number":49,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":50,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":51,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":52,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":53,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_a412f2b2","line":54,"range":{"start_line":44,"start_character":0,"end_line":54,"end_character":59},"updated":"2016-01-21 07:27:23.000000000","message":"pls include this table in the backends/sql.py too.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"63de262fe923eb8560c7e3f03eabd479bd1f34f5","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":42,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    federated_table \u003d sql.Table("},{"line_number":45,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":46,"context_line":"        meta,"},{"line_number":47,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":48,"context_line":"                   nullable\u003dFalse),"},{"line_number":49,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":50,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":51,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":52,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":53,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_4d30d601","line":54,"range":{"start_line":44,"start_character":0,"end_line":54,"end_character":59},"in_reply_to":"9a68dd71_049f22b5","updated":"2016-01-21 18:26:15.000000000","message":"Changed my mind, added the model in sql.py","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"63de262fe923eb8560c7e3f03eabd479bd1f34f5","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":42,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    federated_table \u003d sql.Table("},{"line_number":45,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":46,"context_line":"        meta,"},{"line_number":47,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":48,"context_line":"                   nullable\u003dFalse),"},{"line_number":49,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":50,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":51,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":52,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":53,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_8d5fae40","line":54,"range":{"start_line":44,"start_character":0,"end_line":54,"end_character":59},"in_reply_to":"9a68dd71_a245ebb3","updated":"2016-01-21 18:26:15.000000000","message":"Done","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d55d9a91f7f11f546a64ff92413b6fd45a4250bb","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":42,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    federated_table \u003d sql.Table("},{"line_number":45,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":46,"context_line":"        meta,"},{"line_number":47,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":48,"context_line":"                   nullable\u003dFalse),"},{"line_number":49,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":50,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":51,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":52,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":53,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_a245ebb3","line":54,"range":{"start_line":44,"start_character":0,"end_line":54,"end_character":59},"in_reply_to":"9a68dd71_a412f2b2","updated":"2016-01-21 15:29:48.000000000","message":"++","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"63de262fe923eb8560c7e3f03eabd479bd1f34f5","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":42,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    federated_table \u003d sql.Table("},{"line_number":45,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":46,"context_line":"        meta,"},{"line_number":47,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":48,"context_line":"                   nullable\u003dFalse),"},{"line_number":49,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":50,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":51,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":52,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":53,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_cd44c675","line":54,"range":{"start_line":44,"start_character":0,"end_line":54,"end_character":59},"in_reply_to":"9a68dd71_a412f2b2","updated":"2016-01-21 18:26:15.000000000","message":"Done","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a1ef00d1c2a55e1b856c5b3e12fecf9ef339f69b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        sql.Column(\u0027expires_at\u0027, sql.DateTime(), nullable\u003dTrue))"},{"line_number":42,"context_line":"    password_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    federated_table \u003d sql.Table("},{"line_number":45,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":46,"context_line":"        meta,"},{"line_number":47,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":48,"context_line":"                   nullable\u003dFalse),"},{"line_number":49,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":50,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":51,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":52,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":53,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_049f22b5","line":54,"range":{"start_line":44,"start_character":0,"end_line":54,"end_character":59},"in_reply_to":"9a68dd71_a412f2b2","updated":"2016-01-21 16:02:36.000000000","message":"I\u0027m just adding the table here. When I start working on #2 \"Shadow LDAP and federated users\", which will be a different patch, I\u0027ll create the model in sql.py","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"be036c4509c33731d2764d66a80ec1a3a0674268","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"},{"line_number":58,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_a44d1274","line":58,"range":{"start_line":57,"start_character":0,"end_line":58,"end_character":8},"updated":"2016-01-21 07:27:23.000000000","message":"remove this since keystone doesn\u0027t support downgrade anymore.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"63de262fe923eb8560c7e3f03eabd479bd1f34f5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"},{"line_number":58,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_6d2b5a95","line":58,"range":{"start_line":57,"start_character":0,"end_line":58,"end_character":8},"in_reply_to":"9a68dd71_a44d1274","updated":"2016-01-21 18:26:15.000000000","message":"Done","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a1ef00d1c2a55e1b856c5b3e12fecf9ef339f69b","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def downgrade(migrate_engine):"},{"line_number":58,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_c444aa1c","line":58,"range":{"start_line":57,"start_character":0,"end_line":58,"end_character":8},"in_reply_to":"9a68dd71_a44d1274","updated":"2016-01-21 16:02:36.000000000","message":"The downgrade method is needed there when doing local testing and I don\u0027t think it was hurting anything by leaving it there. However, I did remove it.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea4339856e4ede44783222d81d59c283baa5863a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        meta,"},{"line_number":35,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), nullable\u003dFalse,"},{"line_number":36,"context_line":"                   primary_key\u003dTrue),"},{"line_number":37,"context_line":"        sql.Column(\u0027name\u0027, sql.String(255), nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":38,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":39,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":40,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_f370cede","line":37,"range":{"start_line":37,"start_character":20,"end_line":37,"end_character":24},"updated":"2016-01-26 14:20:35.000000000","message":"This means that passwords will be unique to each user in a given domain, right? What if a user has two passwords?","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f488c98cf99dbd9241b364af05626d660ae5c92c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        meta,"},{"line_number":35,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), nullable\u003dFalse,"},{"line_number":36,"context_line":"                   primary_key\u003dTrue),"},{"line_number":37,"context_line":"        sql.Column(\u0027name\u0027, sql.String(255), nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":38,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":39,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":40,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_98b4f3d1","line":37,"range":{"start_line":37,"start_character":20,"end_line":37,"end_character":24},"in_reply_to":"9a68dd71_f370cede","updated":"2016-01-26 22:59:19.000000000","message":"Good point.  I\u0027ll think this through some more and address it in a subsequent patch.","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5096519be68afe8f374bcd0cda0bd2f848721b14","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_57d3fa5f","line":1,"updated":"2016-02-01 20:31:28.000000000","message":"Suggestion: Put this table creation and its corresponding tests to another patch, to reduce the approval time and ease the reviews. This current patch would be ok with the data migration and the backend support","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8747a2314664a23709324c89501eda794bf2f8d2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_ee29c138","line":1,"in_reply_to":"7a5de9d1_57d3fa5f","updated":"2016-02-02 15:21:36.000000000","message":"I disagree. I think having the table creation and the model changes in the same review is the right way to go.","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f4ffd5f100228bc8265078aa03d5cd370c7aae74","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":26,"context_line":"                   nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027extra\u0027, ks_sql.JsonBlob.impl),"},{"line_number":28,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":29,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":30,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_b7f564cc","line":27,"updated":"2016-02-02 14:03:53.000000000","message":"just a heads up. there was some debate around \u0027extra\u0027.\nWhat\u0027s gonna be kept there?","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8747a2314664a23709324c89501eda794bf2f8d2","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":26,"context_line":"                   nullable\u003dFalse),"},{"line_number":27,"context_line":"        sql.Column(\u0027extra\u0027, ks_sql.JsonBlob.impl),"},{"line_number":28,"context_line":"        sql.Column(\u0027enabled\u0027, sql.Boolean, nullable\u003dFalse, default\u003dTrue),"},{"line_number":29,"context_line":"        sql.Column(\u0027default_project_id\u0027, sql.String(64), nullable\u003dTrue))"},{"line_number":30,"context_line":"    identity_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_2ebef9d4","line":27,"in_reply_to":"7a5de9d1_b7f564cc","updated":"2016-02-02 15:21:36.000000000","message":"This is just being moved here from the existing user table. It\u0027s not a new column.","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f4ffd5f100228bc8265078aa03d5cd370c7aae74","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                   nullable\u003dFalse),"},{"line_number":37,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.Column(\u0027name\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027))"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_d7b26006","line":39,"updated":"2016-02-02 14:03:53.000000000","message":"why not make a proper FK to domain.id ?","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8747a2314664a23709324c89501eda794bf2f8d2","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                   nullable\u003dFalse),"},{"line_number":37,"context_line":"        sql.Column(\u0027identity_id\u0027, sql.String(64),"},{"line_number":38,"context_line":"                   sql.ForeignKey(\u0027identity.id\u0027, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":39,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.Column(\u0027name\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sql.Column(\u0027password\u0027, sql.String(255), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027))"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_0eb53dcf","line":39,"in_reply_to":"7a5de9d1_d7b26006","updated":"2016-02-02 15:21:36.000000000","message":"It\u0027s isn\u0027t a foreign key now","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"}],"keystone/common/sql/migrate_repo/versions/088_migrate_data_to_identity_and_password_tables.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"70fcb1a761a373daf5fcb1feb4fd6a05b3ff1199","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import sqlalchemy as sql"},{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_8ae5f938","line":16,"updated":"2016-01-05 20:37:26.000000000","message":"nit: order standard library dependencies first, then third party libraries. \n\n    import uuid\n\n\n    import sqlalchemy as sql","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b966108306ab8511eb6c34658b9142e822f15e14","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import sqlalchemy as sql"},{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_78e36334","line":16,"in_reply_to":"fa69d971_8ae5f938","updated":"2016-01-07 16:03:12.000000000","message":"Done","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"70fcb1a761a373daf5fcb1feb4fd6a05b3ff1199","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    password_table \u003d sql.Table(\u0027password\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # insert identities"},{"line_number":28,"context_line":"    identity_table.delete().execute()"},{"line_number":29,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.extra,"},{"line_number":30,"context_line":"                      user_table.c.enabled, user_table.c.default_project_id])"},{"line_number":31,"context_line":"    ins \u003d identity_table.insert().from_select([\u0027identity_id\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_0a24a95d","line":28,"updated":"2016-01-05 20:37:26.000000000","message":"The identity table doesn\u0027t exist does it? Or was this added in a previous patch set?","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a264f5e154d8839b7c5e76f6b0a256eab92ff60c","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    password_table \u003d sql.Table(\u0027password\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # insert identities"},{"line_number":28,"context_line":"    identity_table.delete().execute()"},{"line_number":29,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.extra,"},{"line_number":30,"context_line":"                      user_table.c.enabled, user_table.c.default_project_id])"},{"line_number":31,"context_line":"    ins \u003d identity_table.insert().from_select([\u0027identity_id\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_a170f440","line":28,"in_reply_to":"fa69d971_0a24a95d","updated":"2016-01-06 19:17:54.000000000","message":"It\u0027s a new table added in previous the file (087...).  However, I\u0027m running this several times, so want to ensure the data gets cleared out.","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"70fcb1a761a373daf5fcb1feb4fd6a05b3ff1199","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    # insert passwords"},{"line_number":38,"context_line":"    users \u003d user_table.select().execute()"},{"line_number":39,"context_line":"    password_values \u003d []"},{"line_number":40,"context_line":"    for user in users:"},{"line_number":41,"context_line":"        password_values.append({\u0027password_id\u0027: uuid.uuid4().hex,"},{"line_number":42,"context_line":"                                \u0027identity_id\u0027: user[\"id\"],"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_ca7e9118","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":19},"updated":"2016-01-05 20:37:26.000000000","message":"nit: maybe instead of \"values\" we can rename this to \"records\"? A list of password_values makes it seem like: \n\n    password_values \u003d [\u0027password\u0027, \u0027p@assword\u0027, \u0027secrete\u0027, \u0027qwerty\u0027]\n\nWhen it really consists of a list of rows to be inserted into the table.","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b966108306ab8511eb6c34658b9142e822f15e14","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    # insert passwords"},{"line_number":38,"context_line":"    users \u003d user_table.select().execute()"},{"line_number":39,"context_line":"    password_values \u003d []"},{"line_number":40,"context_line":"    for user in users:"},{"line_number":41,"context_line":"        password_values.append({\u0027password_id\u0027: uuid.uuid4().hex,"},{"line_number":42,"context_line":"                                \u0027identity_id\u0027: user[\"id\"],"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_18cfc7b4","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":19},"in_reply_to":"fa69d971_ca7e9118","updated":"2016-01-07 16:03:12.000000000","message":"Done","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"70fcb1a761a373daf5fcb1feb4fd6a05b3ff1199","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    password_values \u003d []"},{"line_number":40,"context_line":"    for user in users:"},{"line_number":41,"context_line":"        password_values.append({\u0027password_id\u0027: uuid.uuid4().hex,"},{"line_number":42,"context_line":"                                \u0027identity_id\u0027: user[\"id\"],"},{"line_number":43,"context_line":"                                \u0027user_name\u0027: user[\"name\"],"},{"line_number":44,"context_line":"                                \u0027namespace\u0027: user[\"domain_id\"],"},{"line_number":45,"context_line":"                                \u0027password\u0027: user[\"password\"]})"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_4ab861c8","line":42,"updated":"2016-01-05 20:37:26.000000000","message":"nit: suggest using either \u0027 or \" \n\n    \u0027identity_id\u0027: user[\u0027id\u0027],","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b966108306ab8511eb6c34658b9142e822f15e14","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    password_values \u003d []"},{"line_number":40,"context_line":"    for user in users:"},{"line_number":41,"context_line":"        password_values.append({\u0027password_id\u0027: uuid.uuid4().hex,"},{"line_number":42,"context_line":"                                \u0027identity_id\u0027: user[\"id\"],"},{"line_number":43,"context_line":"                                \u0027user_name\u0027: user[\"name\"],"},{"line_number":44,"context_line":"                                \u0027namespace\u0027: user[\"domain_id\"],"},{"line_number":45,"context_line":"                                \u0027password\u0027: user[\"password\"]})"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_38d40b46","line":42,"in_reply_to":"fa69d971_4ab861c8","updated":"2016-01-07 16:03:12.000000000","message":"Done","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 IBM Corp."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_219002ec","line":1,"updated":"2016-01-13 15:01:46.000000000","message":"Ditto.","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import sqlalchemy as sql"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def upgrade(migrate_engine):"},{"line_number":21,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_7c45416e","line":20,"updated":"2016-01-13 15:01:46.000000000","message":"I like that you separated the schema migration from the data migration, BTW. Much easier to work with failed migrations!","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import sqlalchemy as sql"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def upgrade(migrate_engine):"},{"line_number":21,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_597b93f5","line":20,"in_reply_to":"da6ed579_7c45416e","updated":"2016-01-14 16:08:34.000000000","message":"Thanks :)","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d3de4a1c8b1939830c6195066308d249528807e0","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                 \u0027namespace\u0027: user[\u0027domain_id\u0027],"},{"line_number":46,"context_line":"                                 \u0027password\u0027: user[\u0027password\u0027]})"},{"line_number":47,"context_line":"    if password_records:"},{"line_number":48,"context_line":"        password_table.insert().values(password_records).execute()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_bc7ad9ef","line":48,"updated":"2016-01-13 15:01:46.000000000","message":"Faster migrations FTW, but with thousands of users, you\u0027d need to batch this, right? Maybe add a TODO at least? We have an example of batching sqlalchemy queries if you grep for token_flush\u0027s implementation in the token backend.","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"440822afe72aaba6af0a471dd2fb05c73f68cad7","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                 \u0027namespace\u0027: user[\u0027domain_id\u0027],"},{"line_number":46,"context_line":"                                 \u0027password\u0027: user[\u0027password\u0027]})"},{"line_number":47,"context_line":"    if password_records:"},{"line_number":48,"context_line":"        password_table.insert().values(password_records).execute()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_dc98d1c2","line":48,"in_reply_to":"da6ed579_bc7ad9ef","updated":"2016-01-14 16:08:34.000000000","message":"Good point, I\u0027ll make a TODO note for this.","commit_id":"07e8ef4e5177a9347711e038495f6bc457924b8e"}],"keystone/common/sql/migrate_repo/versions/089_migrate_data_to_identity_and_password_tables.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8a5d3d66b85768bf1750b9857af4f02ac7292594","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":20,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    user_group_table \u003d sql.Table(\u0027user_group_membership\u0027, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    identity_table \u003d sql.Table(\u0027identity\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    password_table \u003d sql.Table(\u0027password\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_eebf4efa","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":55},"updated":"2016-01-18 16:12:18.000000000","message":"do I get it right that we don\u0027t remove this table further and leave it as is?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":20,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    user_group_table \u003d sql.Table(\u0027user_group_membership\u0027, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    identity_table \u003d sql.Table(\u0027identity\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    password_table \u003d sql.Table(\u0027password\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_e923c0a5","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":55},"in_reply_to":"da6ed579_eebf4efa","updated":"2016-01-20 00:04:38.000000000","message":"Correct, we\u0027re leaving the user table there in order to support rolling upgrades:\nhttp://specs.openstack.org/openstack/keystone-specs/specs/mitaka/online-schema-migration.html\n\nIt will be removed in the next version.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":20,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    user_group_table \u003d sql.Table(\u0027user_group_membership\u0027, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    identity_table \u003d sql.Table(\u0027identity\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    password_table \u003d sql.Table(\u0027password\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_968a74be","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":55},"in_reply_to":"da6ed579_eebf4efa","updated":"2016-01-19 17:00:10.000000000","message":"good question","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8a5d3d66b85768bf1750b9857af4f02ac7292594","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    # TODO(rderose): may want to batch these..."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # insert identities"},{"line_number":30,"context_line":"    identity_table.delete().execute()"},{"line_number":31,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.extra,"},{"line_number":32,"context_line":"                      user_table.c.enabled, user_table.c.default_project_id])"},{"line_number":33,"context_line":"    ins \u003d identity_table.insert().from_select([\u0027id\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_ae9ab66c","line":30,"range":{"start_line":30,"start_character":4,"end_line":30,"end_character":37},"updated":"2016-01-18 16:12:18.000000000","message":"why do you need to run this?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    # TODO(rderose): may want to batch these..."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # insert identities"},{"line_number":30,"context_line":"    identity_table.delete().execute()"},{"line_number":31,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.extra,"},{"line_number":32,"context_line":"                      user_table.c.enabled, user_table.c.default_project_id])"},{"line_number":33,"context_line":"    ins \u003d identity_table.insert().from_select([\u0027id\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_299f98b5","line":30,"range":{"start_line":30,"start_character":4,"end_line":30,"end_character":37},"in_reply_to":"da6ed579_ae9ab66c","updated":"2016-01-20 00:04:38.000000000","message":"During development, I was running the upgrade script several times and just wanted to ensure I wasn\u0027t migrated duplicate data.  I will probably remove this later, but it\u0027s not hurting anything keeping here.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    # TODO(rderose): may want to batch these..."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # insert identities"},{"line_number":30,"context_line":"    identity_table.delete().execute()"},{"line_number":31,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.extra,"},{"line_number":32,"context_line":"                      user_table.c.enabled, user_table.c.default_project_id])"},{"line_number":33,"context_line":"    ins \u003d identity_table.insert().from_select([\u0027id\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_5694fce0","line":30,"range":{"start_line":30,"start_character":4,"end_line":30,"end_character":37},"in_reply_to":"da6ed579_ae9ab66c","updated":"2016-01-19 17:00:10.000000000","message":"another good question","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8a5d3d66b85768bf1750b9857af4f02ac7292594","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":43,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"},{"line_number":44,"context_line":"                                               \u0027name\u0027,"},{"line_number":45,"context_line":"                                               \u0027domain_id\u0027,"},{"line_number":46,"context_line":"                                               \u0027password\u0027], sel)"},{"line_number":47,"context_line":"    ins.execute()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_1f23eea8","line":45,"range":{"start_line":45,"start_character":47,"end_line":45,"end_character":59},"updated":"2016-01-18 16:12:18.000000000","message":"++","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"139f5e36d44d70ae9d52b5a76ddb8d8f412116ae","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":43,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"},{"line_number":44,"context_line":"                                               \u0027name\u0027,"},{"line_number":45,"context_line":"                                               \u0027domain_id\u0027,"},{"line_number":46,"context_line":"                                               \u0027password\u0027], sel)"},{"line_number":47,"context_line":"    ins.execute()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_ee918e9b","line":45,"range":{"start_line":45,"start_character":47,"end_line":45,"end_character":59},"updated":"2016-01-18 15:06:13.000000000","message":"Just curious - why do we need the domain_id for passwords? Do we expect users to have passwords for different domains in the future?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"fb12d6bdf085d0134edd5611a4aeb1a0a92ddda1","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":43,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"},{"line_number":44,"context_line":"                                               \u0027name\u0027,"},{"line_number":45,"context_line":"                                               \u0027domain_id\u0027,"},{"line_number":46,"context_line":"                                               \u0027password\u0027], sel)"},{"line_number":47,"context_line":"    ins.execute()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_63d7ebed","line":45,"range":{"start_line":45,"start_character":47,"end_line":45,"end_character":59},"in_reply_to":"9a68dd71_02587731","updated":"2016-01-21 19:04:20.000000000","message":"+1. Lets do things by the spec now, and improve with another spec.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"1f2b61335a075833fce2e5f0ec04ddcca7e3c037","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":43,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"},{"line_number":44,"context_line":"                                               \u0027name\u0027,"},{"line_number":45,"context_line":"                                               \u0027domain_id\u0027,"},{"line_number":46,"context_line":"                                               \u0027password\u0027], sel)"},{"line_number":47,"context_line":"    ins.execute()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_b9575001","line":45,"range":{"start_line":45,"start_character":47,"end_line":45,"end_character":59},"in_reply_to":"9a68dd71_63d7ebed","updated":"2016-01-21 19:34:07.000000000","message":"Supporting one user, multiple credentials is in the spec.  However, the spec doesn\u0027t specifically call out that the domain_id be in the password table, but to me it makes more sense there than in the identity table.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"307628c713776e50e48cd7e67d65bca248d561fd","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":43,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"},{"line_number":44,"context_line":"                                               \u0027name\u0027,"},{"line_number":45,"context_line":"                                               \u0027domain_id\u0027,"},{"line_number":46,"context_line":"                                               \u0027password\u0027], sel)"},{"line_number":47,"context_line":"    ins.execute()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_8f50fe5f","line":45,"range":{"start_line":45,"start_character":47,"end_line":45,"end_character":59},"in_reply_to":"9a68dd71_b9575001","updated":"2016-01-21 20:30:41.000000000","message":"This makes sense to me if we want to tie together multiple user accounts into a single profile. For instance, user XXX-YYY-ZZZ-UUID (identity) maps back to (dstanek @ home), (david.stanek @ work) and a federated login. The opposite of single-signon.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c154ba6b771d4dd981b3856b12ac6ceaf0008e8c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":43,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"},{"line_number":44,"context_line":"                                               \u0027name\u0027,"},{"line_number":45,"context_line":"                                               \u0027domain_id\u0027,"},{"line_number":46,"context_line":"                                               \u0027password\u0027], sel)"},{"line_number":47,"context_line":"    ins.execute()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_02587731","line":45,"range":{"start_line":45,"start_character":47,"end_line":45,"end_character":59},"in_reply_to":"ba63e191_c9f35c09","updated":"2016-01-21 15:20:28.000000000","message":"This is a little strange since we don\u0027t do that now. I don\u0027t see this feature listed in the agreed upon spec.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":43,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"},{"line_number":44,"context_line":"                                               \u0027name\u0027,"},{"line_number":45,"context_line":"                                               \u0027domain_id\u0027,"},{"line_number":46,"context_line":"                                               \u0027password\u0027], sel)"},{"line_number":47,"context_line":"    ins.execute()"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_c9f35c09","line":45,"range":{"start_line":45,"start_character":47,"end_line":45,"end_character":59},"in_reply_to":"da6ed579_ee918e9b","updated":"2016-01-20 00:04:38.000000000","message":"Yes, I believe that is a valid use case.  That users could belong to multiple domains and have multiple credentials.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    migration_helpers.add_constraints(constraint_to_add)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def downgrade(migrate_engine):"},{"line_number":65,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_d6122c62","line":64,"updated":"2016-01-19 17:00:10.000000000","message":"i don\u0027t think you need this","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    migration_helpers.add_constraints(constraint_to_add)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def downgrade(migrate_engine):"},{"line_number":65,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_69ba700c","line":64,"in_reply_to":"ba63e191_d6122c62","updated":"2016-01-20 00:04:38.000000000","message":"As I mentioned, I was getting an error if I didn\u0027t have a downgrade method.  I\u0027ll remove it later, but it\u0027s not hurting anything keeping it here.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"acf20f6e53524791a99f7a96162056975437bd07","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    migration_helpers.add_constraints(constraint_to_add)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def downgrade(migrate_engine):"},{"line_number":65,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_add712be","line":64,"in_reply_to":"ba63e191_d6122c62","updated":"2016-01-21 18:23:20.000000000","message":"Done","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"be036c4509c33731d2764d66a80ec1a3a0674268","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    migration_helpers.add_constraints(constraint_to_add)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def downgrade(migrate_engine):"},{"line_number":65,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_84732eb1","line":65,"range":{"start_line":64,"start_character":0,"end_line":65,"end_character":8},"updated":"2016-01-21 07:27:23.000000000","message":"here too, pls remove it!","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a1ef00d1c2a55e1b856c5b3e12fecf9ef339f69b","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    migration_helpers.add_constraints(constraint_to_add)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def downgrade(migrate_engine):"},{"line_number":65,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_e45e8ee8","line":65,"range":{"start_line":64,"start_character":0,"end_line":65,"end_character":8},"in_reply_to":"9a68dd71_84732eb1","updated":"2016-01-21 16:02:36.000000000","message":"Done","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea4339856e4ede44783222d81d59c283baa5863a","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    password_table \u003d sql.Table(\u0027password\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # insert identities"},{"line_number":28,"context_line":"    identity_table.delete().execute()"},{"line_number":29,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.extra,"},{"line_number":30,"context_line":"                      user_table.c.enabled, user_table.c.default_project_id])"},{"line_number":31,"context_line":"    ins \u003d identity_table.insert().from_select([\u0027id\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_aed98d85","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":37},"updated":"2016-01-26 14:20:35.000000000","message":"This wipes out the entire identity table prior to loading anything into it. What happens if a migration is run twice?\n\n\n    1.) user table contains users A, B, and C\n    2.) migration wipes identity table\n    3.) migration moves users A, B, and C to identity table\n    4.) users A and B are modified and the changes are persisted in the identity table\n    5.) a new user is added to the identity able, call it D\n    6.) something terrible happens\n    7.) We run this migration again, losing user D and the changes to A and B\n\nIs that something we can hit?","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f488c98cf99dbd9241b364af05626d660ae5c92c","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    password_table \u003d sql.Table(\u0027password\u0027, meta, autoload\u003dTrue)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    # insert identities"},{"line_number":28,"context_line":"    identity_table.delete().execute()"},{"line_number":29,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.extra,"},{"line_number":30,"context_line":"                      user_table.c.enabled, user_table.c.default_project_id])"},{"line_number":31,"context_line":"    ins \u003d identity_table.insert().from_select([\u0027id\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_78e6dfe9","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":37},"in_reply_to":"9a68dd71_aed98d85","updated":"2016-01-26 22:59:19.000000000","message":"Done","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea4339856e4ede44783222d81d59c283baa5863a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    ins.execute()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    # insert passwords"},{"line_number":38,"context_line":"    password_table.delete().execute()"},{"line_number":39,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.name,"},{"line_number":40,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":41,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_ce3f2186","line":38,"range":{"start_line":38,"start_character":3,"end_line":38,"end_character":37},"updated":"2016-01-26 14:20:35.000000000","message":"Same comment applies here.","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f488c98cf99dbd9241b364af05626d660ae5c92c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    ins.execute()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    # insert passwords"},{"line_number":38,"context_line":"    password_table.delete().execute()"},{"line_number":39,"context_line":"    sel \u003d sql.select([user_table.c.id, user_table.c.name,"},{"line_number":40,"context_line":"                      user_table.c.domain_id, user_table.c.password])"},{"line_number":41,"context_line":"    ins \u003d password_table.insert().from_select([\u0027identity_id\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_98eb93b0","line":38,"range":{"start_line":38,"start_character":3,"end_line":38,"end_character":37},"in_reply_to":"9a68dd71_ce3f2186","updated":"2016-01-26 22:59:19.000000000","message":"Done","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8a5d3d66b85768bf1750b9857af4f02ac7292594","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":37,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":38,"context_line":"    default_project_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    passwords \u003d orm.relationship(\u0027Password\u0027, backref\u003d\u0027identity\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # name property"},{"line_number":42,"context_line":"    @hybrid_property"}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_9fb4be35","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":64},"updated":"2016-01-18 16:12:18.000000000","message":"++ to Lance\u0027s question above, but more general. Why is it `passwords` and not `password`?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"1f2b61335a075833fce2e5f0ec04ddcca7e3c037","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":37,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":38,"context_line":"    default_project_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    passwords \u003d orm.relationship(\u0027Password\u0027, backref\u003d\u0027identity\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # name property"},{"line_number":42,"context_line":"    @hybrid_property"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_f95e28e8","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":64},"in_reply_to":"9a68dd71_43f3c79e","updated":"2016-01-21 19:34:07.000000000","message":"The specs do call out refactoring the user table into an identity table and a locally managed password table. And its a one to many relationship (identity to password) to support one user, multiple credentials.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"fb12d6bdf085d0134edd5611a4aeb1a0a92ddda1","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":37,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":38,"context_line":"    default_project_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    passwords \u003d orm.relationship(\u0027Password\u0027, backref\u003d\u0027identity\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # name property"},{"line_number":42,"context_line":"    @hybrid_property"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_43f3c79e","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":64},"in_reply_to":"9a68dd71_82e8e711","updated":"2016-01-21 19:04:20.000000000","message":"+1","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c154ba6b771d4dd981b3856b12ac6ceaf0008e8c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":37,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":38,"context_line":"    default_project_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    passwords \u003d orm.relationship(\u0027Password\u0027, backref\u003d\u0027identity\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # name property"},{"line_number":42,"context_line":"    @hybrid_property"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_82e8e711","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":64},"in_reply_to":"ba63e191_89732480","updated":"2016-01-21 15:20:28.000000000","message":"Where did we document that we are doing this?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":37,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":38,"context_line":"    default_project_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    passwords \u003d orm.relationship(\u0027Password\u0027, backref\u003d\u0027identity\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # name property"},{"line_number":42,"context_line":"    @hybrid_property"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_89732480","line":39,"range":{"start_line":39,"start_character":4,"end_line":39,"end_character":64},"in_reply_to":"da6ed579_9fb4be35","updated":"2016-01-20 00:04:38.000000000","message":"It\u0027s passwords because we are expecting a collection of passwords in order to support multiple credentials.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"98d6bcd815b807534cc3b8f5f1a90c1faa0e5bda","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    default_project_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    passwords \u003d orm.relationship(\u0027Password\u0027, backref\u003d\u0027identity\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # name property"},{"line_number":42,"context_line":"    @hybrid_property"},{"line_number":43,"context_line":"    def name(self):"},{"line_number":44,"context_line":"        if self.passwords:"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_1906b7ce","line":41,"updated":"2016-01-19 17:00:10.000000000","message":"What happens with all these properties for a federated user? Do they still get the correct value?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    default_project_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    passwords \u003d orm.relationship(\u0027Password\u0027, backref\u003d\u0027identity\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # name property"},{"line_number":42,"context_line":"    @hybrid_property"},{"line_number":43,"context_line":"    def name(self):"},{"line_number":44,"context_line":"        if self.passwords:"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_e9eae0ab","line":41,"in_reply_to":"ba63e191_1906b7ce","updated":"2016-01-20 00:04:38.000000000","message":"That wouldn\u0027t get set and the passwords collection would be set to None.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c154ba6b771d4dd981b3856b12ac6ceaf0008e8c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    default_project_id \u003d sql.Column(sql.String(64))"},{"line_number":39,"context_line":"    passwords \u003d orm.relationship(\u0027Password\u0027, backref\u003d\u0027identity\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    # name property"},{"line_number":42,"context_line":"    @hybrid_property"},{"line_number":43,"context_line":"    def name(self):"},{"line_number":44,"context_line":"        if self.passwords:"}],"source_content_type":"text/x-python","patch_set":24,"id":"9a68dd71_a2516bda","line":41,"in_reply_to":"ba63e191_e9eae0ab","updated":"2016-01-21 15:20:28.000000000","message":"Do these return the same values for federated users as before this change?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"139f5e36d44d70ae9d52b5a76ddb8d8f412116ae","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    @hybrid_property"},{"line_number":43,"context_line":"    def name(self):"},{"line_number":44,"context_line":"        if self.passwords:"},{"line_number":45,"context_line":"            return self.passwords[0].name"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            return None"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_8ebed2fd","line":45,"range":{"start_line":45,"start_character":33,"end_line":45,"end_character":36},"updated":"2016-01-18 15:06:13.000000000","message":"Will there ever be more than one element in this list?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    @hybrid_property"},{"line_number":43,"context_line":"    def name(self):"},{"line_number":44,"context_line":"        if self.passwords:"},{"line_number":45,"context_line":"            return self.passwords[0].name"},{"line_number":46,"context_line":"        else:"},{"line_number":47,"context_line":"            return None"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_49a0cc9f","line":45,"range":{"start_line":45,"start_character":33,"end_line":45,"end_character":36},"in_reply_to":"da6ed579_8ebed2fd","updated":"2016-01-20 00:04:38.000000000","message":"Yes, there could be for multiple credentials.  However, currently we are only expect a 1 to 1 relationship between identity and password.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"be036c4509c33731d2764d66a80ec1a3a0674268","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class User(sql.ModelBase, sql.DictBase):"},{"line_number":31,"context_line":"    __tablename__ \u003d \u0027identity\u0027"},{"line_number":32,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":33,"context_line":"                  \u0027default_project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_49230fbe","line":30,"range":{"start_line":30,"start_character":6,"end_line":30,"end_character":10},"updated":"2016-01-21 07:27:23.000000000","message":"so, this looks weird now since the class is `User` but the table is `identity`.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a1ef00d1c2a55e1b856c5b3e12fecf9ef339f69b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class User(sql.ModelBase, sql.DictBase):"},{"line_number":31,"context_line":"    __tablename__ \u003d \u0027identity\u0027"},{"line_number":32,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":33,"context_line":"                  \u0027default_project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_040962dd","line":30,"range":{"start_line":30,"start_character":6,"end_line":30,"end_character":10},"in_reply_to":"9a68dd71_49230fbe","updated":"2016-01-21 16:02:36.000000000","message":"It doesn\u0027t look weird to me.  The user model is simply made up of 2 tables identity and password.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d55d9a91f7f11f546a64ff92413b6fd45a4250bb","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d cfg.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class User(sql.ModelBase, sql.DictBase):"},{"line_number":31,"context_line":"    __tablename__ \u003d \u0027identity\u0027"},{"line_number":32,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":33,"context_line":"                  \u0027default_project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_e250c360","line":30,"range":{"start_line":30,"start_character":6,"end_line":30,"end_character":10},"in_reply_to":"9a68dd71_49230fbe","updated":"2016-01-21 15:29:48.000000000","message":"i\u0027m OK with this for not, but a future refactoring may be to introduce a rename or probably even better to introduce a new abstraction","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea4339856e4ede44783222d81d59c283baa5863a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    __tablename__ \u003d \u0027identity\u0027"},{"line_number":32,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":33,"context_line":"                  \u0027default_project_id\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":36,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":37,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_8e71297a","line":34,"updated":"2016-01-26 14:20:35.000000000","message":"unrelated whitespace change?","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f488c98cf99dbd9241b364af05626d660ae5c92c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    __tablename__ \u003d \u0027identity\u0027"},{"line_number":32,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":33,"context_line":"                  \u0027default_project_id\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":36,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":37,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_58ce7b5b","line":34,"in_reply_to":"9a68dd71_8e71297a","updated":"2016-01-26 22:59:19.000000000","message":"Done","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"295dfeba098c0a913971348b49736358842c20e8","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    name \u003d sql.Column(sql.String(255))"},{"line_number":112,"context_line":"    password \u003d sql.Column(sql.String(255))"},{"line_number":113,"context_line":"    expires_at \u003d sql.Column(sql.DateTime())"},{"line_number":114,"context_line":"    # TODO(rderose): add expires_at to unique contraint, however a few unit"},{"line_number":115,"context_line":"    # test will fail because expires_at is nullable which causes the constraint"},{"line_number":116,"context_line":"    # to fail with sqlite"},{"line_number":117,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a5de9d1_070fe937","line":114,"updated":"2016-01-29 15:45:38.000000000","message":"What unique constraint do you want to add it to?  I don\u0027t think it belongs in the one below because that would allow a username to exist (and be active) for domain_id.","commit_id":"0db7322ff55f0351ecefae35928cd5db83345484"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"cbc249f2d1019404c02a22fb16c10bc8a35ac472","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    name \u003d sql.Column(sql.String(255))"},{"line_number":112,"context_line":"    password \u003d sql.Column(sql.String(255))"},{"line_number":113,"context_line":"    expires_at \u003d sql.Column(sql.DateTime())"},{"line_number":114,"context_line":"    # TODO(rderose): add expires_at to unique contraint, however a few unit"},{"line_number":115,"context_line":"    # test will fail because expires_at is nullable which causes the constraint"},{"line_number":116,"context_line":"    # to fail with sqlite"},{"line_number":117,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":50,"id":"7a5de9d1_676b3af2","line":114,"in_reply_to":"7a5de9d1_070fe937","updated":"2016-01-29 16:35:02.000000000","message":"Good point, you\u0027re right the name needs to be unique for all \"active\" users.  I think this would require a separate check.  And since we are not actually implementing any expires_at functionality in this patch, I\u0027m going to remove the column for now.","commit_id":"0db7322ff55f0351ecefae35928cd5db83345484"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5096519be68afe8f374bcd0cda0bd2f848721b14","unresolved":false,"context_lines":[{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class User(sql.ModelBase, sql.DictBase):"},{"line_number":33,"context_line":"    __tablename__ \u003d \u0027identity\u0027"},{"line_number":34,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":35,"context_line":"                  \u0027default_project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_7732b6a8","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":10},"updated":"2016-02-01 20:31:28.000000000","message":"Shouldn\u0027t this class name be identity too?\n\nAnd, is the User table still going to be used? If it isn\u0027t, you should drop it, or mention in the commit message that it\u0027ll be dropped in follow-up patches","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8747a2314664a23709324c89501eda794bf2f8d2","unresolved":false,"context_lines":[{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class User(sql.ModelBase, sql.DictBase):"},{"line_number":33,"context_line":"    __tablename__ \u003d \u0027identity\u0027"},{"line_number":34,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":35,"context_line":"                  \u0027default_project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_0e5f7d76","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":10},"in_reply_to":"7a5de9d1_095a46f2","updated":"2016-02-02 15:21:36.000000000","message":"I agree with Ron. That would be a possible refactoring, but even then I think that\u0027s a stretch and more of a partial rewrite.","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e5a03d3cc5547deebb1162058b10900f9d31cb37","unresolved":false,"context_lines":[{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class User(sql.ModelBase, sql.DictBase):"},{"line_number":33,"context_line":"    __tablename__ \u003d \u0027identity\u0027"},{"line_number":34,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027,"},{"line_number":35,"context_line":"                  \u0027default_project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_095a46f2","line":32,"range":{"start_line":32,"start_character":6,"end_line":32,"end_character":10},"in_reply_to":"7a5de9d1_7732b6a8","updated":"2016-02-01 20:47:27.000000000","message":"The user table is not going to be used. In order to support rolling upgrades, we shouldn\u0027t drop any tables or columns...\nhttp://specs.openstack.org/openstack/keystone-specs/specs/mitaka/online-schema-migration.html \n\nThere already is a class named Identity, so I didn\u0027t want to conflict with that and wanted to avoid doing too much refactoring in this patch as we are only changing the underlying tables and not the API.","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1c7e1eea7cdbd48e5d2cf16f607e6e5ed3737f93","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":109,"context_line":"    domain_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":110,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":111,"context_line":"    password \u003d sql.Column(sql.String(255))"},{"line_number":112,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_c9e67c43","line":111,"updated":"2016-02-01 15:56:19.000000000","message":"Any reason why we are increasing this?","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8747a2314664a23709324c89501eda794bf2f8d2","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":109,"context_line":"    domain_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":110,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":111,"context_line":"    password \u003d sql.Column(sql.String(255))"},{"line_number":112,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_eea2214b","line":111,"in_reply_to":"7a5de9d1_56f1c069","updated":"2016-02-02 15:21:36.000000000","message":"Is there a hash that needs to be this size? Even sha512 should be able to easily fit in the old size.","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0b6e4eb3d86d14c1908c29a956c9837f7727f9f4","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":109,"context_line":"    domain_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":110,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":111,"context_line":"    password \u003d sql.Column(sql.String(255))"},{"line_number":112,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_56f1c069","line":111,"in_reply_to":"7a5de9d1_c9e67c43","updated":"2016-02-01 19:04:48.000000000","message":"Just to allow for passwords with stronger encryption.","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"edbd0a05cd13bbea1eb101d6ad5c0547f7e71270","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":109,"context_line":"    domain_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":110,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":111,"context_line":"    password \u003d sql.Column(sql.String(255))"},{"line_number":112,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_ff763fd7","line":111,"in_reply_to":"7a5de9d1_eea2214b","updated":"2016-02-05 17:33:26.000000000","message":"ROT26","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1f618dbfbb17634e16c9631192cf4001ba610882","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":109,"context_line":"    domain_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":110,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":111,"context_line":"    password \u003d sql.Column(sql.String(255))"},{"line_number":112,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_bbb85676","line":111,"in_reply_to":"7a5de9d1_ff763fd7","updated":"2016-02-05 20:23:01.000000000","message":"ship it!","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"}],"keystone/tests/unit/test_backend_sql.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"be036c4509c33731d2764d66a80ec1a3a0674268","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                (\u0027enabled\u0027, sql.Boolean, None),"},{"line_number":129,"context_line":"                (\u0027extra\u0027, sql.JsonBlob, None))"},{"line_number":130,"context_line":"        self.assertExpectedSchema(\u0027identity\u0027, cols)"},{"line_number":131,"context_line":"        cols \u003d ((\u0027name\u0027, sql.String, 255),"},{"line_number":132,"context_line":"                (\u0027domain_id\u0027, sql.String, 64),"},{"line_number":133,"context_line":"                (\u0027identity_id\u0027, sql.String, 64),"},{"line_number":134,"context_line":"                (\u0027password\u0027, sql.String, 255),"},{"line_number":135,"context_line":"                (\u0027expires_at\u0027, sql.DateTime, None))"},{"line_number":136,"context_line":"        self.assertExpectedSchema(\u0027password\u0027, cols)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_group_model(self):"},{"line_number":139,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_84148ef5","line":136,"range":{"start_line":131,"start_character":0,"end_line":136,"end_character":51},"updated":"2016-01-21 07:27:23.000000000","message":"this should be a different testcase since `password` and \u0027identity\u0027 is in the same level.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"63de262fe923eb8560c7e3f03eabd479bd1f34f5","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                (\u0027enabled\u0027, sql.Boolean, None),"},{"line_number":129,"context_line":"                (\u0027extra\u0027, sql.JsonBlob, None))"},{"line_number":130,"context_line":"        self.assertExpectedSchema(\u0027identity\u0027, cols)"},{"line_number":131,"context_line":"        cols \u003d ((\u0027name\u0027, sql.String, 255),"},{"line_number":132,"context_line":"                (\u0027domain_id\u0027, sql.String, 64),"},{"line_number":133,"context_line":"                (\u0027identity_id\u0027, sql.String, 64),"},{"line_number":134,"context_line":"                (\u0027password\u0027, sql.String, 255),"},{"line_number":135,"context_line":"                (\u0027expires_at\u0027, sql.DateTime, None))"},{"line_number":136,"context_line":"        self.assertExpectedSchema(\u0027password\u0027, cols)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_group_model(self):"},{"line_number":139,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_ad08722e","line":136,"range":{"start_line":131,"start_character":0,"end_line":136,"end_character":51},"in_reply_to":"9a68dd71_42bd0f67","updated":"2016-01-21 18:26:15.000000000","message":"Done","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a1ef00d1c2a55e1b856c5b3e12fecf9ef339f69b","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                (\u0027enabled\u0027, sql.Boolean, None),"},{"line_number":129,"context_line":"                (\u0027extra\u0027, sql.JsonBlob, None))"},{"line_number":130,"context_line":"        self.assertExpectedSchema(\u0027identity\u0027, cols)"},{"line_number":131,"context_line":"        cols \u003d ((\u0027name\u0027, sql.String, 255),"},{"line_number":132,"context_line":"                (\u0027domain_id\u0027, sql.String, 64),"},{"line_number":133,"context_line":"                (\u0027identity_id\u0027, sql.String, 64),"},{"line_number":134,"context_line":"                (\u0027password\u0027, sql.String, 255),"},{"line_number":135,"context_line":"                (\u0027expires_at\u0027, sql.DateTime, None))"},{"line_number":136,"context_line":"        self.assertExpectedSchema(\u0027password\u0027, cols)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_group_model(self):"},{"line_number":139,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_e488ce24","line":136,"range":{"start_line":131,"start_character":0,"end_line":136,"end_character":51},"in_reply_to":"9a68dd71_42bd0f67","updated":"2016-01-21 16:02:36.000000000","message":"I\u0027ll add the federated_identity table when I start working on #2 \"Shadow LDAP and federated users\", which will be a different patch. Once I create the model in sql.py, I\u0027ll add the test case here.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d55d9a91f7f11f546a64ff92413b6fd45a4250bb","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                (\u0027enabled\u0027, sql.Boolean, None),"},{"line_number":129,"context_line":"                (\u0027extra\u0027, sql.JsonBlob, None))"},{"line_number":130,"context_line":"        self.assertExpectedSchema(\u0027identity\u0027, cols)"},{"line_number":131,"context_line":"        cols \u003d ((\u0027name\u0027, sql.String, 255),"},{"line_number":132,"context_line":"                (\u0027domain_id\u0027, sql.String, 64),"},{"line_number":133,"context_line":"                (\u0027identity_id\u0027, sql.String, 64),"},{"line_number":134,"context_line":"                (\u0027password\u0027, sql.String, 255),"},{"line_number":135,"context_line":"                (\u0027expires_at\u0027, sql.DateTime, None))"},{"line_number":136,"context_line":"        self.assertExpectedSchema(\u0027password\u0027, cols)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_group_model(self):"},{"line_number":139,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_42bd0f67","line":136,"range":{"start_line":131,"start_character":0,"end_line":136,"end_character":51},"in_reply_to":"9a68dd71_84148ef5","updated":"2016-01-21 15:29:48.000000000","message":"Also the federated_identity table needs a test.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a1ef00d1c2a55e1b856c5b3e12fecf9ef339f69b","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                (\u0027enabled\u0027, sql.Boolean, None),"},{"line_number":129,"context_line":"                (\u0027extra\u0027, sql.JsonBlob, None))"},{"line_number":130,"context_line":"        self.assertExpectedSchema(\u0027identity\u0027, cols)"},{"line_number":131,"context_line":"        cols \u003d ((\u0027name\u0027, sql.String, 255),"},{"line_number":132,"context_line":"                (\u0027domain_id\u0027, sql.String, 64),"},{"line_number":133,"context_line":"                (\u0027identity_id\u0027, sql.String, 64),"},{"line_number":134,"context_line":"                (\u0027password\u0027, sql.String, 255),"},{"line_number":135,"context_line":"                (\u0027expires_at\u0027, sql.DateTime, None))"},{"line_number":136,"context_line":"        self.assertExpectedSchema(\u0027password\u0027, cols)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def test_group_model(self):"},{"line_number":139,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_841c7214","line":136,"range":{"start_line":131,"start_character":0,"end_line":136,"end_character":51},"in_reply_to":"9a68dd71_84148ef5","updated":"2016-01-21 16:02:36.000000000","message":"Why 2 test cases? This is testing the user model which is made up of 2 tables.","commit_id":"232abfa6756014ee66364138a44a2c638de8bfcd"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5096519be68afe8f374bcd0cda0bd2f848721b14","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        self.assertItemsEqual(expected_schema, actual_schema)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def test_user_model(self):"},{"line_number":126,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"},{"line_number":127,"context_line":"                (\u0027default_project_id\u0027, sql.String, 64),"},{"line_number":128,"context_line":"                (\u0027enabled\u0027, sql.Boolean, None),"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_b7710e0e","line":125,"range":{"start_line":125,"start_character":12,"end_line":125,"end_character":19},"updated":"2016-02-01 20:31:28.000000000","message":"as we are creating two new entities, shouldn\u0027t we have identity and password model?","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e5a03d3cc5547deebb1162058b10900f9d31cb37","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        self.assertItemsEqual(expected_schema, actual_schema)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def test_user_model(self):"},{"line_number":126,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"},{"line_number":127,"context_line":"                (\u0027default_project_id\u0027, sql.String, 64),"},{"line_number":128,"context_line":"                (\u0027enabled\u0027, sql.Boolean, None),"}],"source_content_type":"text/x-python","patch_set":56,"id":"7a5de9d1_29a4e2b7","line":125,"range":{"start_line":125,"start_character":12,"end_line":125,"end_character":19},"in_reply_to":"7a5de9d1_b7710e0e","updated":"2016-02-01 20:47:27.000000000","message":"This test tests the user model, which is now made up of 2 tables (identity and password).","commit_id":"4ed4ba99af5ef33e2cd38847f12cac4db8697d22"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"70fcb1a761a373daf5fcb1feb4fd6a05b3ff1199","unresolved":false,"context_lines":[{"line_number":815,"context_line":"        constraint_names \u003d [constraint[\u0027name\u0027] for constraint in constraints]"},{"line_number":816,"context_line":"        self.assertIn(\u0027duplicate_trust_constraint\u0027, constraint_names)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def test_create_identity_password_tables(self):"},{"line_number":819,"context_line":"        self.assertTableDoesNotExist(\u0027identity\u0027)"},{"line_number":820,"context_line":"        self.assertTableDoesNotExist(\u0027password\u0027)"},{"line_number":821,"context_line":"        self.assertTableDoesNotExist(\u0027federated_identity\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_0ae589da","line":818,"range":{"start_line":818,"start_character":8,"end_line":818,"end_character":44},"updated":"2016-01-05 20:37:26.000000000","message":"we should ensure that we upgrade to at least 86 before making the following assertions: \n\n    self.upgrade(86)","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b966108306ab8511eb6c34658b9142e822f15e14","unresolved":false,"context_lines":[{"line_number":815,"context_line":"        constraint_names \u003d [constraint[\u0027name\u0027] for constraint in constraints]"},{"line_number":816,"context_line":"        self.assertIn(\u0027duplicate_trust_constraint\u0027, constraint_names)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def test_create_identity_password_tables(self):"},{"line_number":819,"context_line":"        self.assertTableDoesNotExist(\u0027identity\u0027)"},{"line_number":820,"context_line":"        self.assertTableDoesNotExist(\u0027password\u0027)"},{"line_number":821,"context_line":"        self.assertTableDoesNotExist(\u0027federated_identity\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_98941745","line":818,"range":{"start_line":818,"start_character":8,"end_line":818,"end_character":44},"in_reply_to":"fa69d971_0ae589da","updated":"2016-01-07 16:03:12.000000000","message":"Done","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"70fcb1a761a373daf5fcb1feb4fd6a05b3ff1199","unresolved":false,"context_lines":[{"line_number":816,"context_line":"        self.assertIn(\u0027duplicate_trust_constraint\u0027, constraint_names)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def test_create_identity_password_tables(self):"},{"line_number":819,"context_line":"        self.assertTableDoesNotExist(\u0027identity\u0027)"},{"line_number":820,"context_line":"        self.assertTableDoesNotExist(\u0027password\u0027)"},{"line_number":821,"context_line":"        self.assertTableDoesNotExist(\u0027federated_identity\u0027)"},{"line_number":822,"context_line":"        self.upgrade(87)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_aaed5db8","line":819,"updated":"2016-01-05 20:37:26.000000000","message":"nit: we could move the table names into variables: \n\n    identity_table \u003d \u0027identity\u0027\n    password_table \u003d \u0027password\u0027\n    federated_identity_table \u003d \u0027federated_identity\u0027\n    self.assertTableColumns(identity_table, [...])","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b966108306ab8511eb6c34658b9142e822f15e14","unresolved":false,"context_lines":[{"line_number":816,"context_line":"        self.assertIn(\u0027duplicate_trust_constraint\u0027, constraint_names)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def test_create_identity_password_tables(self):"},{"line_number":819,"context_line":"        self.assertTableDoesNotExist(\u0027identity\u0027)"},{"line_number":820,"context_line":"        self.assertTableDoesNotExist(\u0027password\u0027)"},{"line_number":821,"context_line":"        self.assertTableDoesNotExist(\u0027federated_identity\u0027)"},{"line_number":822,"context_line":"        self.upgrade(87)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_789b6373","line":819,"in_reply_to":"fa69d971_aaed5db8","updated":"2016-01-07 16:03:12.000000000","message":"Done","commit_id":"4297894a744b6fa3c302830b1e7f5bc0782fcd9e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"139f5e36d44d70ae9d52b5a76ddb8d8f412116ae","unresolved":false,"context_lines":[{"line_number":830,"context_line":"        self.assertTableDoesNotExist(identity_table)"},{"line_number":831,"context_line":"        self.assertTableDoesNotExist(password_table)"},{"line_number":832,"context_line":"        self.assertTableDoesNotExist(federated_table)"},{"line_number":833,"context_line":"        self.upgrade(88)"},{"line_number":834,"context_line":"        self.assertTableColumns(identity_table,"},{"line_number":835,"context_line":"                                [\u0027id\u0027,"},{"line_number":836,"context_line":"                                 \u0027extra\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"da6ed579_6ed6fe28","line":833,"range":{"start_line":833,"start_character":8,"end_line":833,"end_character":24},"updated":"2016-01-18 15:06:13.000000000","message":"We will need to add a test for upgrading to 89 too, right?","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4cc95723b905ec12c4be247c48685599d0aa8988","unresolved":false,"context_lines":[{"line_number":830,"context_line":"        self.assertTableDoesNotExist(identity_table)"},{"line_number":831,"context_line":"        self.assertTableDoesNotExist(password_table)"},{"line_number":832,"context_line":"        self.assertTableDoesNotExist(federated_table)"},{"line_number":833,"context_line":"        self.upgrade(88)"},{"line_number":834,"context_line":"        self.assertTableColumns(identity_table,"},{"line_number":835,"context_line":"                                [\u0027id\u0027,"},{"line_number":836,"context_line":"                                 \u0027extra\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_a9f4e886","line":833,"range":{"start_line":833,"start_character":8,"end_line":833,"end_character":24},"in_reply_to":"da6ed579_6ed6fe28","updated":"2016-01-20 00:04:38.000000000","message":"Good catch, I\u0027ll add this test in the next patch.","commit_id":"c3e98b96db97b810c6a2309a8d1b469ee2067686"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"17aa7041b877c576c6e8bfc2400896ed99be8a28","unresolved":false,"context_lines":[{"line_number":871,"context_line":"        password_table \u003d \u0027password\u0027"},{"line_number":872,"context_line":"        user_table \u003d \u0027user\u0027"},{"line_number":873,"context_line":"        self.upgrade(89)"},{"line_number":874,"context_line":"        self.assertTableCountsMatch(user_table, identity_table)"},{"line_number":875,"context_line":"        self.assertTableCountsMatch(identity_table, password_table)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_23cb3320","line":874,"range":{"start_line":874,"start_character":8,"end_line":874,"end_character":63},"updated":"2016-01-21 19:04:58.000000000","message":"This is not enough. The migration is complex and should be tested more thoroughly. Values of each field should be tested.","commit_id":"12cce92b7be1941cf811e093a301305e0928efed"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a5222d96743a2a79190ce3e80e514759ed34955a","unresolved":false,"context_lines":[{"line_number":871,"context_line":"        password_table \u003d \u0027password\u0027"},{"line_number":872,"context_line":"        user_table \u003d \u0027user\u0027"},{"line_number":873,"context_line":"        self.upgrade(89)"},{"line_number":874,"context_line":"        self.assertTableCountsMatch(user_table, identity_table)"},{"line_number":875,"context_line":"        self.assertTableCountsMatch(identity_table, password_table)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a68dd71_be30849f","line":874,"range":{"start_line":874,"start_character":8,"end_line":874,"end_character":63},"in_reply_to":"9a68dd71_23cb3320","updated":"2016-01-22 03:38:35.000000000","message":"Done","commit_id":"12cce92b7be1941cf811e093a301305e0928efed"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea4339856e4ede44783222d81d59c283baa5863a","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.assertTableCountsMatch(table1_name, table2_name)"},{"line_number":219,"context_line":"        table1 \u003d sqlalchemy.Table(table1_name, self.metadata, autoload\u003dTrue)"},{"line_number":220,"context_line":"        table2 \u003d sqlalchemy.Table(table2_name, self.metadata, autoload\u003dTrue)"},{"line_number":221,"context_line":"        stmt \u003d sqlalchemy.select([table1, table2], use_labels\u003dTrue).\\"},{"line_number":222,"context_line":"            select_from(table1.join(table2, table1.c[table1_join_id] \u003d\u003d"},{"line_number":223,"context_line":"                        table2.c[table2_join_id]))"},{"line_number":224,"context_line":"        rows \u003d stmt.execute()"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_6ea9557b","line":221,"range":{"start_line":221,"start_character":68,"end_line":221,"end_character":69},"updated":"2016-01-26 14:20:35.000000000","message":"nit: We can wrap statements in () to avoid using \\","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f488c98cf99dbd9241b364af05626d660ae5c92c","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.assertTableCountsMatch(table1_name, table2_name)"},{"line_number":219,"context_line":"        table1 \u003d sqlalchemy.Table(table1_name, self.metadata, autoload\u003dTrue)"},{"line_number":220,"context_line":"        table2 \u003d sqlalchemy.Table(table2_name, self.metadata, autoload\u003dTrue)"},{"line_number":221,"context_line":"        stmt \u003d sqlalchemy.select([table1, table2], use_labels\u003dTrue).\\"},{"line_number":222,"context_line":"            select_from(table1.join(table2, table1.c[table1_join_id] \u003d\u003d"},{"line_number":223,"context_line":"                        table2.c[table2_join_id]))"},{"line_number":224,"context_line":"        rows \u003d stmt.execute()"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a68dd71_18a7a350","line":221,"range":{"start_line":221,"start_character":68,"end_line":221,"end_character":69},"in_reply_to":"9a68dd71_6ea9557b","updated":"2016-01-26 22:59:19.000000000","message":"Done","commit_id":"a3ff927661deaab8cd935f90c50fe46a5e6265b0"}]}
