)]}'
{"keystone/common/sql/migrate_repo/versions/017_membership_role.py":[{"author":{"_account_id":5733,"name":"Kieran Spear","email":"kispear@gmail.com","username":"kspear"},"change_message_id":"f9ae043b000816d29ff824b55846c416ef0a7492","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    user_project_role_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    conn \u003d migrate_engine.connect()"},{"line_number":37,"context_line":"    conn.execute(role_table.insert(),"},{"line_number":38,"context_line":"                 id\u003dCONF.member_role_id,"},{"line_number":39,"context_line":"                 name\u003dCONF.member_role_name,"},{"line_number":40,"context_line":"                 extra\u003djson.dumps({\u0027description\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F2EE%3D","line":37,"updated":"2013-03-09 04:32:08.000000000","message":"It would be great if this insert could be skipped if the member_role_id already exists. This would make for a cleaner upgrade for deployments that already have a \"member\" role. The downside is that in downgrade() we wouldn\u0027t know whether to delete it or not unless we added another \u0027extra\u0027 item to indicate that the role was added by the upgrade itself.\n\nKeystone devs might disagree with me here, so fix the other stuff first.","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":5733,"name":"Kieran Spear","email":"kispear@gmail.com","username":"kspear"},"change_message_id":"f9ae043b000816d29ff824b55846c416ef0a7492","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        conn.execute(ins)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    for metadata in session.query(old_metadata_table):"},{"line_number":57,"context_line":"        data \u003d {\u0027roles\u0027: [config.CONF.member_role_id]}"},{"line_number":58,"context_line":"        ins \u003d user_project_role_table.insert().values("},{"line_number":59,"context_line":"            user_id\u003dmetadata.user_id,"},{"line_number":60,"context_line":"            project_id\u003dmetadata.tenant_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F2EM%3D","line":57,"updated":"2013-03-09 04:32:08.000000000","message":"This still throws away roles. metadata.data needs to be used here at least. You also need to consider whether the insert loop above has already created the rows you\u0027re inserting here. My advice would be to do things in this order:\n\n1) Loop through metadata, inserting user_project_role rows. When inserting, add config.CONF.member_role_id to metadata.data[\u0027roles\u0027] iff it\u0027s not there already. Insert with data\u003dmetadata.data.\n\n2) Move the existing user_project_membership loop below this loop, and add a check for matching user_id/project_id. Skip the insert if a row exists.","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":53,"name":"Jason Cannavale","email":"jason@cannavale.com","username":"jcannava"},"change_message_id":"f8ee98e1413ad857ea72933487a75fd71817f726","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        conn.execute(ins)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    for metadata in session.query(old_metadata_table):"},{"line_number":57,"context_line":"        data \u003d {\u0027roles\u0027: [config.CONF.member_role_id]}"},{"line_number":58,"context_line":"        ins \u003d user_project_role_table.insert().values("},{"line_number":59,"context_line":"            user_id\u003dmetadata.user_id,"},{"line_number":60,"context_line":"            project_id\u003dmetadata.tenant_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1nc%3D","line":57,"in_reply_to":"AAAAN3%2F%2F2EM%3D","updated":"2013-03-10 03:38:57.000000000","message":"Thanks for the feedback missed a fairly basic change there. But part 1 should be correct now. Part 2 is mostly correct except that I think sqlalchemy will not allow the insert if there is a matching id. Forcing the check seemed excessive, but happy to re-look.","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":5733,"name":"Kieran Spear","email":"kispear@gmail.com","username":"kspear"},"change_message_id":"f9ae043b000816d29ff824b55846c416ef0a7492","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    session \u003d sql.orm.sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":118,"context_line":"    for membership in session.query(user_project_metadata_table):"},{"line_number":119,"context_line":"        if \u0027roles\u0027 in membership:"},{"line_number":120,"context_line":"            roles \u003d membership[\u0027roles\u0027]"},{"line_number":121,"context_line":"            if config.CONF.member_role_id in roles:"},{"line_number":122,"context_line":"                ins \u003d (user_project_membership_table.insert()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F2EA%3D","line":119,"updated":"2013-03-09 04:32:08.000000000","message":"I think this should be membership.data? And the json will need to be parsed into a dictionary.","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":53,"name":"Jason Cannavale","email":"jason@cannavale.com","username":"jcannava"},"change_message_id":"f8ee98e1413ad857ea72933487a75fd71817f726","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    session \u003d sql.orm.sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":118,"context_line":"    for membership in session.query(user_project_metadata_table):"},{"line_number":119,"context_line":"        if \u0027roles\u0027 in membership:"},{"line_number":120,"context_line":"            roles \u003d membership[\u0027roles\u0027]"},{"line_number":121,"context_line":"            if config.CONF.member_role_id in roles:"},{"line_number":122,"context_line":"                ins \u003d (user_project_membership_table.insert()"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1nY%3D","line":119,"in_reply_to":"AAAAN3%2F%2F2EA%3D","updated":"2013-03-10 03:38:57.000000000","message":"Done","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":5733,"name":"Kieran Spear","email":"kispear@gmail.com","username":"kspear"},"change_message_id":"f9ae043b000816d29ff824b55846c416ef0a7492","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    for membership in session.query(user_project_metadata_table):"},{"line_number":119,"context_line":"        if \u0027roles\u0027 in membership:"},{"line_number":120,"context_line":"            roles \u003d membership[\u0027roles\u0027]"},{"line_number":121,"context_line":"            if config.CONF.member_role_id in roles:"},{"line_number":122,"context_line":"                ins \u003d (user_project_membership_table.insert()"},{"line_number":123,"context_line":"                       .values(user_id\u003dmembership.user_id,"},{"line_number":124,"context_line":"                               tenant_id\u003dmembership.project_id))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F2D8%3D","line":121,"updated":"2013-03-09 04:32:08.000000000","message":"Someone could correct me on this, but I think the existence of any roles here at all confirms project membership, so there should be no need to check any particular role.","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":53,"name":"Jason Cannavale","email":"jason@cannavale.com","username":"jcannava"},"change_message_id":"f8ee98e1413ad857ea72933487a75fd71817f726","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    for membership in session.query(user_project_metadata_table):"},{"line_number":119,"context_line":"        if \u0027roles\u0027 in membership:"},{"line_number":120,"context_line":"            roles \u003d membership[\u0027roles\u0027]"},{"line_number":121,"context_line":"            if config.CONF.member_role_id in roles:"},{"line_number":122,"context_line":"                ins \u003d (user_project_membership_table.insert()"},{"line_number":123,"context_line":"                       .values(user_id\u003dmembership.user_id,"},{"line_number":124,"context_line":"                               tenant_id\u003dmembership.project_id))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1nU%3D","line":121,"in_reply_to":"AAAAN3%2F%2F2D8%3D","updated":"2013-03-10 03:38:57.000000000","message":"Done","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":5733,"name":"Kieran Spear","email":"kispear@gmail.com","username":"kspear"},"change_message_id":"f9ae043b000816d29ff824b55846c416ef0a7492","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                       .values(user_id\u003dmembership.user_id,"},{"line_number":124,"context_line":"                               tenant_id\u003dmembership.project_id))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    for metadata in session.query(metadata_table):"},{"line_number":127,"context_line":"        if \u0027roles\u0027 in metadata:"},{"line_number":128,"context_line":"            roles \u003d metadata[\u0027roles\u0027]"},{"line_number":129,"context_line":"            if config.CONF.member_role_id in roles:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F2D4%3D","line":126,"updated":"2013-03-09 04:32:08.000000000","message":"This should loop through user_project_metadata. Can probably be merged into the above loop. Don\u0027t forget data\u003dmetadata.data.","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":53,"name":"Jason Cannavale","email":"jason@cannavale.com","username":"jcannava"},"change_message_id":"f8ee98e1413ad857ea72933487a75fd71817f726","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                       .values(user_id\u003dmembership.user_id,"},{"line_number":124,"context_line":"                               tenant_id\u003dmembership.project_id))"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    for metadata in session.query(metadata_table):"},{"line_number":127,"context_line":"        if \u0027roles\u0027 in metadata:"},{"line_number":128,"context_line":"            roles \u003d metadata[\u0027roles\u0027]"},{"line_number":129,"context_line":"            if config.CONF.member_role_id in roles:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1nQ%3D","line":126,"in_reply_to":"AAAAN3%2F%2F2D4%3D","updated":"2013-03-10 03:38:57.000000000","message":"Done","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":5733,"name":"Kieran Spear","email":"kispear@gmail.com","username":"kspear"},"change_message_id":"f9ae043b000816d29ff824b55846c416ef0a7492","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    for metadata in session.query(metadata_table):"},{"line_number":127,"context_line":"        if \u0027roles\u0027 in metadata:"},{"line_number":128,"context_line":"            roles \u003d metadata[\u0027roles\u0027]"},{"line_number":129,"context_line":"            if config.CONF.member_role_id in roles:"},{"line_number":130,"context_line":"                ins \u003d (metadata_table.insert()"},{"line_number":131,"context_line":"                       .values(user_id\u003dmetadata.user_id,"},{"line_number":132,"context_line":"                               tenant_id\u003dmetadata.project_id))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F2Dc%3D","line":129,"updated":"2013-03-09 04:32:08.000000000","message":"As above, roles always need to be moved back into the metadata table, not just when member_role exists.","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"},{"author":{"_account_id":53,"name":"Jason Cannavale","email":"jason@cannavale.com","username":"jcannava"},"change_message_id":"f8ee98e1413ad857ea72933487a75fd71817f726","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    for metadata in session.query(metadata_table):"},{"line_number":127,"context_line":"        if \u0027roles\u0027 in metadata:"},{"line_number":128,"context_line":"            roles \u003d metadata[\u0027roles\u0027]"},{"line_number":129,"context_line":"            if config.CONF.member_role_id in roles:"},{"line_number":130,"context_line":"                ins \u003d (metadata_table.insert()"},{"line_number":131,"context_line":"                       .values(user_id\u003dmetadata.user_id,"},{"line_number":132,"context_line":"                               tenant_id\u003dmetadata.project_id))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2F1nM%3D","line":129,"in_reply_to":"AAAAN3%2F%2F2Dc%3D","updated":"2013-03-10 03:38:57.000000000","message":"Done","commit_id":"4053610e420d4e360bf2c3a428f925fba288addf"}],"tests/test_sql_upgrade.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e55048349e5347f6448a13685b00faeef0d06c69","unresolved":false,"context_lines":[{"line_number":501,"context_line":"        # And another role"},{"line_number":502,"context_line":"        role2 \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":503,"context_line":"                 \u0027name\u0027: uuid.uuid4().hex}"},{"line_number":504,"context_line":"        cmd \u003d role_table.insert().values(role2)"},{"line_number":505,"context_line":"        # Grant Role to User"},{"line_number":506,"context_line":"        data \u003d json.dumps({\"roles\": [role[\u0027id\u0027]]})"},{"line_number":507,"context_line":"        metadata_table \u003d sqlalchemy.Table(\u0027metadata\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FwGU%3D","line":504,"updated":"2013-03-13 20:12:20.000000000","message":"this cmd is not executed?","commit_id":"2349f01e2df1b6753540ac8e60153d37a157e760"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3e0b793e13a69f14383361ab09db7a5ccabf2bd8","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                            \u0027and tenant_id\u003d\"%s\"\u0027 %"},{"line_number":528,"context_line":"                            (user[\u0027id\u0027], project[\u0027id\u0027]))"},{"line_number":529,"context_line":"        test_project1 \u003d json.loads(r.fetchone()[\u0027data\u0027])"},{"line_number":530,"context_line":"        self.assertEqual(test_project1[\u0027roles\u0027][0], role[\u0027id\u0027])"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        # Test user in project2 has role2"},{"line_number":533,"context_line":"        r \u003d session.execute(\u0027select data from metadata where user_id\u003d\"%s\"\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FwLM%3D","line":530,"updated":"2013-03-13 19:40:23.000000000","message":"if this gets a rev, i prefer the assertion used near the end of the test to be used here as well:\n\n  self.assertIn(role[\u0027id\u0027], test_project1[\u0027roles\u0027])","commit_id":"2349f01e2df1b6753540ac8e60153d37a157e760"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3e0b793e13a69f14383361ab09db7a5ccabf2bd8","unresolved":false,"context_lines":[{"line_number":569,"context_line":"                            (user[\u0027id\u0027], project[\u0027id\u0027]))"},{"line_number":570,"context_line":"        test_project1 \u003d json.loads(r.fetchone()[\u0027data\u0027])"},{"line_number":571,"context_line":"        self.assertIn(role[\u0027id\u0027], test_project1[\u0027roles\u0027])"},{"line_number":572,"context_line":"        self.assertIn(role2[\u0027id\u0027], test_project1[\u0027roles\u0027])"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"        # pairs that only existed in old metadata table should be in"},{"line_number":575,"context_line":"        # user_project_metadata"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FwKs%3D","line":572,"updated":"2013-03-13 19:40:23.000000000","message":"nice","commit_id":"2349f01e2df1b6753540ac8e60153d37a157e760"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3e0b793e13a69f14383361ab09db7a5ccabf2bd8","unresolved":false,"context_lines":[{"line_number":576,"context_line":"        r \u003d session.execute(\u0027select data from user_project_metadata where \u0027"},{"line_number":577,"context_line":"                            \u0027user_id\u003d\"%s\" and project_id\u003d\"%s\"\u0027 %"},{"line_number":578,"context_line":"                            (user[\u0027id\u0027], project2[\u0027id\u0027]))"},{"line_number":579,"context_line":"        test_project2 \u003d json.loads(r.fetchone()[\u0027data\u0027])"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def test_upgrade_default_roles(self):"},{"line_number":582,"context_line":"        def count_member_roles():"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAN3%2F%2FwKk%3D","line":579,"updated":"2013-03-13 19:40:23.000000000","message":"missing an assertion for the contents of data here?\n\nAlso, add:\n\n  self.assertTableDoesNotExist(\u0027metadata\u0027)","commit_id":"2349f01e2df1b6753540ac8e60153d37a157e760"}]}
