)]}'
{"keystone/common/sql/contract_repo/versions/011_contract_add_domain_id_to_idp.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6e787f6caac532a5ca3db0380fcb472a72cf2737","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"1a6eadb0_e9fdbdb1","updated":"2016-12-16 16:03:44.000000000","message":"this feels like it should be in data_migration","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"26d332add9dbdc0b5c8fbe9950f4ad373da3830c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"1a6eadb0_bb2ea689","in_reply_to":"1a6eadb0_e9fdbdb1","updated":"2016-12-16 17:41:24.000000000","message":"done, moved to data migration","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6e787f6caac532a5ca3db0380fcb472a72cf2737","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":15,"context_line":"import uuid"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from keystone.resource.backends import base"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_e98a1d63","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":11},"updated":"2016-12-16 16:03:44.000000000","message":"uuid is standard lib and should move to it\u0027s own section above the sqlalchemy stuff","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"26d332add9dbdc0b5c8fbe9950f4ad373da3830c","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":15,"context_line":"import uuid"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from keystone.resource.backends import base"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_fb52de11","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":11},"in_reply_to":"1a6eadb0_e98a1d63","updated":"2016-12-16 17:41:24.000000000","message":"Done","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6e787f6caac532a5ca3db0380fcb472a72cf2737","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    for idp_row in idp_table.select().execute():"},{"line_number":29,"context_line":"        domain_id \u003d _create_federated_domain(meta, session, idp_row[\u0027id\u0027])"},{"line_number":30,"context_line":"        # update idp with the new federated domain_id"},{"line_number":31,"context_line":"        values \u003d {\u0027domain_id\u0027: domain_id}"},{"line_number":32,"context_line":"        stmt \u003d idp_table.update().where("},{"line_number":33,"context_line":"            idp_table.c.id \u003d\u003d idp_row[\u0027id\u0027]).values(values)"},{"line_number":34,"context_line":"        stmt.execute()"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_29d6d54e","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":41},"updated":"2016-12-16 16:03:44.000000000","message":"don\u0027t we need to create the domain id column first?\n\nscratch that, it\u0027s in the expand :)","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6e787f6caac532a5ca3db0380fcb472a72cf2737","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    federated_domain \u003d {"},{"line_number":44,"context_line":"        \u0027id\u0027: domain_id,"},{"line_number":45,"context_line":"        \u0027name\u0027: domain_id,"},{"line_number":46,"context_line":"        \u0027enabled\u0027: True,"},{"line_number":47,"context_line":"        \u0027description\u0027: desc,"},{"line_number":48,"context_line":"        \u0027domain_id\u0027: base.NULL_DOMAIN_ID,"},{"line_number":49,"context_line":"        \u0027is_domain\u0027: True,"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_c9f1e196","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":24},"updated":"2016-12-16 16:03:44.000000000","message":"you can set this based on the IdP \u0027enabled\u0027 value: https://github.com/openstack/keystone/blob/master/keystone/federation/backends/sql.py#L58","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"753e44f2a079f84ee409156ee5ee6d656c2b27d6","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    federated_domain \u003d {"},{"line_number":44,"context_line":"        \u0027id\u0027: domain_id,"},{"line_number":45,"context_line":"        \u0027name\u0027: domain_id,"},{"line_number":46,"context_line":"        \u0027enabled\u0027: True,"},{"line_number":47,"context_line":"        \u0027description\u0027: desc,"},{"line_number":48,"context_line":"        \u0027domain_id\u0027: base.NULL_DOMAIN_ID,"},{"line_number":49,"context_line":"        \u0027is_domain\u0027: True,"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_2418bcd2","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":24},"in_reply_to":"1a6eadb0_c9f1e196","updated":"2016-12-16 16:23:35.000000000","message":"Disabled IdP doesn\u0027t necessarily mean the domain should be disabled, right?","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"}],"keystone/common/sql/contract_repo/versions/012_contract_add_domain_id_to_idp.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"ee1c53f38063cacafbad22a43d7a581c71765fdb","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            drop_idp_insert_trigger \u003d ("},{"line_number":32,"context_line":"                \u0027DROP TRIGGER idp_insert_read_only;\u0027"},{"line_number":33,"context_line":"            )"},{"line_number":34,"context_line":"        else:"},{"line_number":35,"context_line":"            drop_idp_insert_trigger \u003d ("},{"line_number":36,"context_line":"                \u0027DROP TRIGGER IF EXISTS idp_insert_read_only;\u0027"},{"line_number":37,"context_line":"            )"},{"line_number":38,"context_line":"        migrate_engine.execute(drop_idp_insert_trigger)"}],"source_content_type":"text/x-python","patch_set":36,"id":"ba5201f7_e46170d4","line":37,"range":{"start_line":34,"start_character":0,"end_line":37,"end_character":13},"updated":"2017-01-06 17:08:55.000000000","message":"(nit) during contract, any rdbms other than postgresql and mysql wil run this, which is different than expanding, see comment there.","commit_id":"8c190a1a29dbb17fee044827fc9b651918dfc51e"}],"keystone/common/sql/data_migration_repo/versions/012_migrate_add_domain_id_to_idp.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6e48af476ac17bd65c92447156268f5829a7df5d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        domain_id \u003d _create_federated_domain(meta, session, idp_row[\u0027id\u0027])"},{"line_number":31,"context_line":"        # update idp with the new federated domain_id"},{"line_number":32,"context_line":"        values \u003d {\u0027domain_id\u0027: domain_id}"},{"line_number":33,"context_line":"        stmt \u003d idp_table.update().where("},{"line_number":34,"context_line":"            idp_table.c.id \u003d\u003d idp_row[\u0027id\u0027]).values(values)"},{"line_number":35,"context_line":"        stmt.execute()"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_867ca673","line":33,"updated":"2016-12-20 21:48:25.000000000","message":"Ah - is this why we don\u0027t have triggers blocking updates to the identity_provider table?","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fcd2c7cd9f5951472307b8e9dc97d01cc9ab1529","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        domain_id \u003d _create_federated_domain(meta, session, idp_row[\u0027id\u0027])"},{"line_number":31,"context_line":"        # update idp with the new federated domain_id"},{"line_number":32,"context_line":"        values \u003d {\u0027domain_id\u0027: domain_id}"},{"line_number":33,"context_line":"        stmt \u003d idp_table.update().where("},{"line_number":34,"context_line":"            idp_table.c.id \u003d\u003d idp_row[\u0027id\u0027]).values(values)"},{"line_number":35,"context_line":"        stmt.execute()"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_1fba90e1","line":33,"in_reply_to":"1a6eadb0_867ca673","updated":"2016-12-21 03:34:03.000000000","message":"Yeah, all existing idps will get a domain from this update.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6e48af476ac17bd65c92447156268f5829a7df5d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"def _create_federated_domain(meta, session, idp_id):"},{"line_number":39,"context_line":"    domain_id \u003d uuid.uuid4().hex"},{"line_number":40,"context_line":"    desc \u003d \u0027Auto generated federated domain for Identity Provider: \u0027 + idp_id"},{"line_number":41,"context_line":"    federated_domain \u003d {"},{"line_number":42,"context_line":"        \u0027id\u0027: domain_id,"},{"line_number":43,"context_line":"        \u0027name\u0027: domain_id,"},{"line_number":44,"context_line":"        \u0027enabled\u0027: True,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_c6c4de93","line":41,"updated":"2016-12-20 21:48:25.000000000","message":"is there anyway to use the resource_api here to create the domain, instead of inserting it manually?","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fcd2c7cd9f5951472307b8e9dc97d01cc9ab1529","unresolved":false,"context_lines":[{"line_number":38,"context_line":"def _create_federated_domain(meta, session, idp_id):"},{"line_number":39,"context_line":"    domain_id \u003d uuid.uuid4().hex"},{"line_number":40,"context_line":"    desc \u003d \u0027Auto generated federated domain for Identity Provider: \u0027 + idp_id"},{"line_number":41,"context_line":"    federated_domain \u003d {"},{"line_number":42,"context_line":"        \u0027id\u0027: domain_id,"},{"line_number":43,"context_line":"        \u0027name\u0027: domain_id,"},{"line_number":44,"context_line":"        \u0027enabled\u0027: True,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_ffc31455","line":41,"in_reply_to":"1a6eadb0_c6c4de93","updated":"2016-12-21 03:34:03.000000000","message":"That was my first thought, however didn\u0027t see a way of doing it. And this does the trick.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"}],"keystone/common/sql/expand_repo/versions/012_expand_add_domain_id_to_idp.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ff680bd2bde1a701be6b429d06d279cf5e96bc8","unresolved":false,"context_lines":[{"line_number":19,"context_line":"CREATE TRIGGER idp_insert_read_only BEFORE INSERT ON identity_provider"},{"line_number":20,"context_line":"FOR EACH ROW"},{"line_number":21,"context_line":"BEGIN"},{"line_number":22,"context_line":"  SIGNAL SQLSTATE \u002745000\u0027"},{"line_number":23,"context_line":"    SET MESSAGE_TEXT \u003d \u0027%s\u0027;"},{"line_number":24,"context_line":"END;"},{"line_number":25,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_b2811bfe","line":22,"range":{"start_line":22,"start_character":9,"end_line":22,"end_character":25},"updated":"2016-12-19 19:22:57.000000000","message":"what is this ?","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c48318d5752fb6633cf615ee0522867ec4d61462","unresolved":false,"context_lines":[{"line_number":19,"context_line":"CREATE TRIGGER idp_insert_read_only BEFORE INSERT ON identity_provider"},{"line_number":20,"context_line":"FOR EACH ROW"},{"line_number":21,"context_line":"BEGIN"},{"line_number":22,"context_line":"  SIGNAL SQLSTATE \u002745000\u0027"},{"line_number":23,"context_line":"    SET MESSAGE_TEXT \u003d \u0027%s\u0027;"},{"line_number":24,"context_line":"END;"},{"line_number":25,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_95079c1c","line":22,"range":{"start_line":22,"start_character":9,"end_line":22,"end_character":25},"in_reply_to":"1a6eadb0_b2811bfe","updated":"2016-12-20 03:41:11.000000000","message":"To be honest, I copied this from Lance\u0027s patch:\nhttps://github.com/openstack/keystone/blob/master/keystone/common/sql/expand_repo/versions/003_add_key_hash_and_encrypted_blob_to_credential.py#L25\n\n\"State 45000 is a generic state representing an unhandled user-defined exception\"\nhttps://dev.mysql.com/doc/refman/5.7/en/signal.html","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ff680bd2bde1a701be6b429d06d279cf5e96bc8","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"CREATE TRIGGER idp_insert_read_only BEFORE INSERT ON identity_provider"},{"line_number":44,"context_line":"FOR EACH ROW"},{"line_number":45,"context_line":"EXECUTE PROCEDURE keystone_read_only_insert();"},{"line_number":46,"context_line":"\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_d29db75a","line":45,"updated":"2016-12-19 19:22:57.000000000","message":"I am not really a fan of these triggers as we don\u0027t test them in our gates :(","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c48318d5752fb6633cf615ee0522867ec4d61462","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"CREATE TRIGGER idp_insert_read_only BEFORE INSERT ON identity_provider"},{"line_number":44,"context_line":"FOR EACH ROW"},{"line_number":45,"context_line":"EXECUTE PROCEDURE keystone_read_only_insert();"},{"line_number":46,"context_line":"\"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_1029da89","line":45,"in_reply_to":"1a6eadb0_d29db75a","updated":"2016-12-20 03:41:11.000000000","message":"Agree, this is taking a very minimal approach in that I\u0027m not updating any data; only making identity_provider read-only during the data migration.","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9588891b2aab3eae0043bc8a6c1935f1305ee7b2","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    idp.create_column(domain_id)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    if upgrades.USE_TRIGGERS:"},{"line_number":60,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":61,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":62,"context_line":"                         \u0027this time.\u0027)"},{"line_number":63,"context_line":"        if migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":64,"context_line":"            idp_insert_trigger \u003d POSTGRESQL_INSERT_TRIGGER % error_message"},{"line_number":65,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027sqlite\u0027:"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_02880b70","line":62,"range":{"start_line":60,"start_character":0,"end_line":62,"end_character":38},"updated":"2016-12-16 19:07:38.000000000","message":"A note about why we are doing this would help explain the reasoning tor reviewers and maintainers","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ff680bd2bde1a701be6b429d06d279cf5e96bc8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    idp.create_column(domain_id)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    if upgrades.USE_TRIGGERS:"},{"line_number":60,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":61,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":62,"context_line":"                         \u0027this time.\u0027)"},{"line_number":63,"context_line":"        if migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":64,"context_line":"            idp_insert_trigger \u003d POSTGRESQL_INSERT_TRIGGER % error_message"},{"line_number":65,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027sqlite\u0027:"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_52ee07ed","line":62,"range":{"start_line":60,"start_character":0,"end_line":62,"end_character":38},"in_reply_to":"1a6eadb0_02880b70","updated":"2016-12-19 19:22:57.000000000","message":"++","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d73c8c86612f012017b530ac84a9220a8dfba750","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    idp.create_column(domain_id)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    if upgrades.USE_TRIGGERS:"},{"line_number":60,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":61,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":62,"context_line":"                         \u0027this time.\u0027)"},{"line_number":63,"context_line":"        if migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":64,"context_line":"            idp_insert_trigger \u003d POSTGRESQL_INSERT_TRIGGER % error_message"},{"line_number":65,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027sqlite\u0027:"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_741662f2","line":62,"range":{"start_line":60,"start_character":0,"end_line":62,"end_character":38},"in_reply_to":"1a6eadb0_02880b70","updated":"2016-12-20 15:28:55.000000000","message":"Done","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d73c8c86612f012017b530ac84a9220a8dfba750","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    idp.create_column(domain_id)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    if upgrades.USE_TRIGGERS:"},{"line_number":60,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":61,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":62,"context_line":"                         \u0027this time.\u0027)"},{"line_number":63,"context_line":"        if migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":64,"context_line":"            idp_insert_trigger \u003d POSTGRESQL_INSERT_TRIGGER % error_message"},{"line_number":65,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027sqlite\u0027:"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_541b261b","line":62,"range":{"start_line":60,"start_character":0,"end_line":62,"end_character":38},"in_reply_to":"1a6eadb0_52ee07ed","updated":"2016-12-20 15:28:55.000000000","message":"Done","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6e48af476ac17bd65c92447156268f5829a7df5d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        # be created during the migration and the impact would be minor"},{"line_number":62,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":63,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":64,"context_line":"                         \u0027this time.\u0027)"},{"line_number":65,"context_line":"        if migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":66,"context_line":"            idp_insert_trigger \u003d POSTGRESQL_INSERT_TRIGGER % error_message"},{"line_number":67,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027sqlite\u0027:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_46744e9b","line":64,"updated":"2016-12-20 21:48:25.000000000","message":"What about updates? Can we amend the comment to say why we need to make this read only?","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fcd2c7cd9f5951472307b8e9dc97d01cc9ab1529","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        # be created during the migration and the impact would be minor"},{"line_number":62,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":63,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":64,"context_line":"                         \u0027this time.\u0027)"},{"line_number":65,"context_line":"        if migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":66,"context_line":"            idp_insert_trigger \u003d POSTGRESQL_INSERT_TRIGGER % error_message"},{"line_number":67,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027sqlite\u0027:"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_3f074c82","line":64,"in_reply_to":"1a6eadb0_46744e9b","updated":"2016-12-21 03:34:03.000000000","message":"Done","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b5a181081c4dd54871fe157aac4b16994898c6f0","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        # Setting idp to be read-only to prevent old code from creating an idp"},{"line_number":61,"context_line":"        # without a domain_id during an upgrade. This should be okay as it is"},{"line_number":62,"context_line":"        # highly unlikely that an idp would be created during the migration and"},{"line_number":63,"context_line":"        # the impact from preventing creations is minor."},{"line_number":64,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":65,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":66,"context_line":"                         \u0027this time.\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_a1e4813b","line":63,"updated":"2016-12-29 16:35:38.000000000","message":"Just to be clear - we don\u0027t have any issues with old code updating and idp during an upgrade do we? I\u0027m wondering if we need to make the triggers more specific to allow only domain_id updates to identity providers and not allow anything else. The following case wouldn\u0027t be an issue would it?\n\n  - expand is executed, putting the triggers in place\n  - migration updates an existing idp to have an autogenerated domain_id\n  - a node with Newton code issues an update to the idp\n\nThat shouldn\u0027t break anything should it?","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"44abbe57921c4eff073f0709594aa7b7e8460a5b","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        # Setting idp to be read-only to prevent old code from creating an idp"},{"line_number":61,"context_line":"        # without a domain_id during an upgrade. This should be okay as it is"},{"line_number":62,"context_line":"        # highly unlikely that an idp would be created during the migration and"},{"line_number":63,"context_line":"        # the impact from preventing creations is minor."},{"line_number":64,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":65,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":66,"context_line":"                         \u0027this time.\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_c073d5e5","line":63,"in_reply_to":"ba5201f7_88cb1d72","updated":"2017-01-04 15:51:59.000000000","message":"Yeah, old code updating an idp shouldn\u0027t be an issue. And correct, the domain cannot be updated with new code.","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6598d3df2630730bc269de190a3b97d3aa7ed388","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        # Setting idp to be read-only to prevent old code from creating an idp"},{"line_number":61,"context_line":"        # without a domain_id during an upgrade. This should be okay as it is"},{"line_number":62,"context_line":"        # highly unlikely that an idp would be created during the migration and"},{"line_number":63,"context_line":"        # the impact from preventing creations is minor."},{"line_number":64,"context_line":"        error_message \u003d (\u0027Identity provider migration in progress. Cannot \u0027"},{"line_number":65,"context_line":"                         \u0027insert new rows into the identity_provider table at \u0027"},{"line_number":66,"context_line":"                         \u0027this time.\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_88cb1d72","line":63,"in_reply_to":"ba5201f7_a1e4813b","updated":"2016-12-30 00:39:47.000000000","message":"domain IDs of the IdP can\u0027t be updated","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"ee1c53f38063cacafbad22a43d7a581c71765fdb","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            idp_insert_trigger \u003d POSTGRESQL_INSERT_TRIGGER % error_message"},{"line_number":69,"context_line":"        elif migrate_engine.name \u003d\u003d \u0027sqlite\u0027:"},{"line_number":70,"context_line":"            idp_insert_trigger \u003d SQLITE_INSERT_TRIGGER % error_message"},{"line_number":71,"context_line":"        else:"},{"line_number":72,"context_line":"            idp_insert_trigger \u003d MYSQL_INSERT_TRIGGER % error_message"},{"line_number":73,"context_line":"        migrate_engine.execute(idp_insert_trigger)"}],"source_content_type":"text/x-python","patch_set":36,"id":"ba5201f7_847ee467","line":72,"range":{"start_line":71,"start_character":0,"end_line":72,"end_character":69},"updated":"2017-01-06 17:08:55.000000000","message":"(nit) during contract, any rdbms other than postgresql and sqlite wil run this, which is different than contract.\n\nI don\u0027t think this would be an issue as we are only supposed to support these 3 ?","commit_id":"8c190a1a29dbb17fee044827fc9b651918dfc51e"}],"keystone/federation/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6e48af476ac17bd65c92447156268f5829a7df5d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    member_name \u003d \u0027identity_provider\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    _public_parameters \u003d frozenset([\u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027,"},{"line_number":59,"context_line":"                                    \u0027remote_ids\u0027, \u0027links\u0027, \u0027domain_id\u0027"},{"line_number":60,"context_line":"                                    ])"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_66614aa8","line":59,"updated":"2016-12-20 21:48:25.000000000","message":"This will require an api-ref change I think.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"84ab4a8e91c2a896e2443ca6fac03ef75de048e0","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    member_name \u003d \u0027identity_provider\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    _public_parameters \u003d frozenset([\u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027,"},{"line_number":59,"context_line":"                                    \u0027remote_ids\u0027, \u0027links\u0027, \u0027domain_id\u0027"},{"line_number":60,"context_line":"                                    ])"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":34,"id":"ba5201f7_86fcf33f","line":59,"in_reply_to":"1a6eadb0_3f158c9a","updated":"2016-12-29 16:13:18.000000000","message":"Ah for some reason I took this as exposing it through the API.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fcd2c7cd9f5951472307b8e9dc97d01cc9ab1529","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    member_name \u003d \u0027identity_provider\u0027"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    _public_parameters \u003d frozenset([\u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027,"},{"line_number":59,"context_line":"                                    \u0027remote_ids\u0027, \u0027links\u0027, \u0027domain_id\u0027"},{"line_number":60,"context_line":"                                    ])"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_3f158c9a","line":59,"in_reply_to":"1a6eadb0_66614aa8","updated":"2016-12-21 03:34:03.000000000","message":"why? the domain_id is a nullable atribute and I think this would only mean that you can\u0027t change the domain_id once set.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"}],"keystone/federation/core.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a309789e4a968cc1c00ef72171d54c64eeeab4aa","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def create_identity_provider(self, idp_id, identity_provider):"},{"line_number":62,"context_line":"        if not identity_provider.get(\u0027domain_id\u0027):"},{"line_number":63,"context_line":"            identity_provider[\u0027domain_id\u0027] \u003d self._get_federated_domain_id()"},{"line_number":64,"context_line":"        return self.driver.create_idp(idp_id, identity_provider)"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a71b18c_7fa6bfae","line":62,"updated":"2016-12-06 21:49:31.000000000","message":"This maps many IdPs to one domain.  Since we can do that explicitly, it probably makes more sense for the default to create a new domain.","commit_id":"74cb533a4e8cc1ea32d243d1b5b2653a1b98199f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"6580899eab7cc9502b322a32313d1084b8df03fb","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def create_identity_provider(self, idp_id, identity_provider):"},{"line_number":62,"context_line":"        if not identity_provider.get(\u0027domain_id\u0027):"},{"line_number":63,"context_line":"            identity_provider[\u0027domain_id\u0027] \u003d self._get_federated_domain_id()"},{"line_number":64,"context_line":"        return self.driver.create_idp(idp_id, identity_provider)"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a71b18c_b7b87b12","line":62,"in_reply_to":"3a71b18c_7fa6bfae","updated":"2016-12-06 23:14:30.000000000","message":"I don\u0027t like the idea of automatically creating a bunch of domains when that might not be what people are expecting, which will happen with existing code. Going forward, they can create the 1:1 idp:domain relationship by passing in the domain_id when creating the idp.","commit_id":"74cb533a4e8cc1ea32d243d1b5b2653a1b98199f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7d6a4453af08a4259a92a0f67ef310d124cb9f53","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _create_idp_domain(self, idp_id):"},{"line_number":68,"context_line":"        domain_id \u003d uuid.uuid4().hex"},{"line_number":69,"context_line":"        desc \u003d \u0027Auto generated federated domain for Identity Provider: \u0027"},{"line_number":70,"context_line":"        desc +\u003d idp_id"},{"line_number":71,"context_line":"        domain \u003d {"},{"line_number":72,"context_line":"            \u0027id\u0027: domain_id,"}],"source_content_type":"text/x-python","patch_set":28,"id":"1a6eadb0_4eb345e9","line":69,"updated":"2016-12-15 17:41:03.000000000","message":"could\u0027ve just added + idp_id at the end of this line","commit_id":"90c716698d3e1e7a2da5778e406be6f93a1530b9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6e787f6caac532a5ca3db0380fcb472a72cf2737","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def __init__(self):"},{"line_number":60,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_idp(self, idp_id, identity_provider):"},{"line_number":63,"context_line":"        if not identity_provider.get(\u0027domain_id\u0027):"},{"line_number":64,"context_line":"            identity_provider[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":65,"context_line":"        return self.driver.create_idp(idp_id, identity_provider)"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_e9485db5","line":62,"range":{"start_line":62,"start_character":33,"end_line":62,"end_character":50},"updated":"2016-12-16 16:03:44.000000000","message":"this should match the backend and be named \u0027idp\u0027","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"26d332add9dbdc0b5c8fbe9950f4ad373da3830c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def __init__(self):"},{"line_number":60,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_idp(self, idp_id, identity_provider):"},{"line_number":63,"context_line":"        if not identity_provider.get(\u0027domain_id\u0027):"},{"line_number":64,"context_line":"            identity_provider[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":65,"context_line":"        return self.driver.create_idp(idp_id, identity_provider)"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_d107c3c7","line":62,"range":{"start_line":62,"start_character":33,"end_line":62,"end_character":50},"in_reply_to":"1a6eadb0_e9485db5","updated":"2016-12-16 17:41:24.000000000","message":"Done","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6e787f6caac532a5ca3db0380fcb472a72cf2737","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            \u0027id\u0027: domain_id,"},{"line_number":73,"context_line":"            \u0027name\u0027: domain_id,"},{"line_number":74,"context_line":"            \u0027description\u0027: desc,"},{"line_number":75,"context_line":"            \u0027enabled\u0027: True"},{"line_number":76,"context_line":"        }"},{"line_number":77,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"},{"line_number":78,"context_line":"        return domain_id"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_69d36dd5","line":75,"range":{"start_line":75,"start_character":23,"end_line":75,"end_character":27},"updated":"2016-12-16 16:03:44.000000000","message":"you can use the same value as the one from the idp ref","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"753e44f2a079f84ee409156ee5ee6d656c2b27d6","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            \u0027id\u0027: domain_id,"},{"line_number":73,"context_line":"            \u0027name\u0027: domain_id,"},{"line_number":74,"context_line":"            \u0027description\u0027: desc,"},{"line_number":75,"context_line":"            \u0027enabled\u0027: True"},{"line_number":76,"context_line":"        }"},{"line_number":77,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"},{"line_number":78,"context_line":"        return domain_id"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6eadb0_04e020cc","line":75,"range":{"start_line":75,"start_character":23,"end_line":75,"end_character":27},"in_reply_to":"1a6eadb0_69d36dd5","updated":"2016-12-16 16:23:35.000000000","message":"Why? Just because the the idp is disabled, doesn\u0027t mean the domain is disabled.","commit_id":"9c2fca99170969fbc2f0e8167363d83ed1d1634f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6e48af476ac17bd65c92447156268f5829a7df5d","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":63,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":64,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":65,"context_line":"        return self.driver.create_idp(idp_id, idp)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_e66d5a9a","line":63,"updated":"2016-12-20 21:48:25.000000000","message":"I slightly more pythonic representation might be:\n\n  if \u0027domain_id\u0027 not in idp:\n\nBut either way works (I think it was dstanek or dolphm that pointed that out to me).","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fcd2c7cd9f5951472307b8e9dc97d01cc9ab1529","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":63,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":64,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":65,"context_line":"        return self.driver.create_idp(idp_id, idp)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_ff723410","line":63,"in_reply_to":"1a6eadb0_e66d5a9a","updated":"2016-12-21 03:34:03.000000000","message":"But I also want to account for if the domain_id is there, but set to None.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"84ab4a8e91c2a896e2443ca6fac03ef75de048e0","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":63,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":64,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":65,"context_line":"        return self.driver.create_idp(idp_id, idp)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"ba5201f7_e6c05fe3","line":63,"in_reply_to":"1a6eadb0_ff723410","updated":"2016-12-29 16:13:18.000000000","message":"Yep - that should still work:\n\n  Python 2.7.9 (default, Apr  2 2015, 15:33:21) \n  [GCC 4.9.2] on linux2\n  Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n  \u003e\u003e\u003e d \u003d {\u0027domain_id\u0027: None}\n  \u003e\u003e\u003e d\n  {\u0027domain_id\u0027: None}\n  \u003e\u003e\u003e if \u0027domain_id\u0027 in d:\n  ...     print \u0027yes\u0027\n  ... \n  yes","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fb90cbbe1693aa37417ab70d6a6942c58e9dcf8e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":63,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":64,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":65,"context_line":"        return self.driver.create_idp(idp_id, idp)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"ba5201f7_3351590f","line":63,"in_reply_to":"ba5201f7_e6c05fe3","updated":"2017-01-04 15:52:52.000000000","message":"Okay, if another patch is required, I\u0027ll change this.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9bbf6784f92723990c1b54cbaba0e755063c7f8e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from keystone.i18n import _"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# This is a general cache region for service providers."},{"line_number":32,"context_line":"MEMOIZE \u003d cache.get_memoization_decorator(group\u003d\u0027federation\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_0e54eefc","line":29,"updated":"2017-01-06 00:36:04.000000000","message":"this is not used","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"6f24c12fc9b3a39dac1ea970e465184fe3315f45","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from keystone.i18n import _"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"# This is a general cache region for service providers."},{"line_number":32,"context_line":"MEMOIZE \u003d cache.get_memoization_decorator(group\u003d\u0027federation\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_f0920ef5","line":29,"in_reply_to":"ba5201f7_0e54eefc","updated":"2017-01-06 16:05:29.000000000","message":"Done","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1960921c7082bca453e32bbd3abd967920258ef5","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def __init__(self):"},{"line_number":64,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":67,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":68,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":69,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":35,"id":"da4df55a_3a43bc43","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":18},"updated":"2016-12-28 03:28:28.000000000","message":"just do this in one easy to read function?\n\ndef create_idp(self, idp_id, idp):\n        if not idp.get(\u0027domain_id\u0027):\n          domain_id \u003d uuid.uuid4().hex\n          desc \u003d \u0027Auto generated federated domain for Identity Provider: \u0027\n          desc +\u003d idp_id\n          domain \u003d {\n              \u0027id\u0027: domain_id,\n              \u0027name\u0027: domain_id,\n              \u0027description\u0027: desc,\n              \u0027enabled\u0027: True\n            }\n            self.resource_api.create_domain(domain[\u0027id\u0027], domain)\n            idp[\u0027domain_id\u0027] \u003d domain_id\n        else:\n            self.resource_api.get_domain(domain_id)\n        return self.driver.create_idp(idp_id, idp)","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"44abbe57921c4eff073f0709594aa7b7e8460a5b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def __init__(self):"},{"line_number":64,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":67,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":68,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":69,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_73a921df","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":18},"in_reply_to":"da4df55a_3a43bc43","updated":"2017-01-04 15:51:59.000000000","message":"I like breaking functions up into small pieces, but see your point","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b5a181081c4dd54871fe157aac4b16994898c6f0","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":67,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":68,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":69,"context_line":"        else:"},{"line_number":70,"context_line":"            self._assert_valid_domain_id(idp[\u0027domain_id\u0027])"},{"line_number":71,"context_line":"        return self.driver.create_idp(idp_id, idp)"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_e16209ad","line":68,"updated":"2016-12-29 16:35:38.000000000","message":"I had one follow up comment on this in the last patch set.","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1960921c7082bca453e32bbd3abd967920258ef5","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":68,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":69,"context_line":"        else:"},{"line_number":70,"context_line":"            self._assert_valid_domain_id(idp[\u0027domain_id\u0027])"},{"line_number":71,"context_line":"        return self.driver.create_idp(idp_id, idp)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _create_idp_domain(self, idp_id):"}],"source_content_type":"text/x-python","patch_set":35,"id":"da4df55a_9a46684d","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":40},"updated":"2016-12-28 03:28:28.000000000","message":"why are we doing this? leave a comment","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"44abbe57921c4eff073f0709594aa7b7e8460a5b","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":68,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":69,"context_line":"        else:"},{"line_number":70,"context_line":"            self._assert_valid_domain_id(idp[\u0027domain_id\u0027])"},{"line_number":71,"context_line":"        return self.driver.create_idp(idp_id, idp)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _create_idp_domain(self, idp_id):"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_e007f919","line":70,"range":{"start_line":70,"start_character":17,"end_line":70,"end_character":40},"in_reply_to":"da4df55a_9a46684d","updated":"2017-01-04 15:51:59.000000000","message":"this is just validation to ensure the domain exists.","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1960921c7082bca453e32bbd3abd967920258ef5","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        return domain_id"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _assert_valid_domain_id(self, domain_id):"},{"line_number":87,"context_line":"        self.resource_api.get_domain(domain_id)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @MEMOIZE"},{"line_number":90,"context_line":"    def get_enabled_service_providers(self):"}],"source_content_type":"text/x-python","patch_set":35,"id":"da4df55a_3a157c3f","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":47},"updated":"2016-12-28 03:28:28.000000000","message":"just put this at line 70, why make a one use function","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"44abbe57921c4eff073f0709594aa7b7e8460a5b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        return domain_id"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _assert_valid_domain_id(self, domain_id):"},{"line_number":87,"context_line":"        self.resource_api.get_domain(domain_id)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @MEMOIZE"},{"line_number":90,"context_line":"    def get_enabled_service_providers(self):"}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_b3ab89d5","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":47},"in_reply_to":"da4df55a_3a157c3f","updated":"2017-01-04 15:51:59.000000000","message":"True","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1837af95fad4a2bc16fc3b896b53b1cdf312484e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def __init__(self):"},{"line_number":60,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":63,"context_line":"        if not idp.get(\u0027domain_id\u0027):"},{"line_number":64,"context_line":"            idp[\u0027domain_id\u0027] \u003d self._create_idp_domain(idp_id)"},{"line_number":65,"context_line":"        else:"},{"line_number":66,"context_line":"            self._assert_valid_domain_id(idp[\u0027domain_id\u0027])"},{"line_number":67,"context_line":"        return self.driver.create_idp(idp_id, idp)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _create_idp_domain(self, idp_id):"},{"line_number":70,"context_line":"        domain_id \u003d uuid.uuid4().hex"},{"line_number":71,"context_line":"        desc \u003d \u0027Auto generated federated domain for Identity Provider: \u0027"},{"line_number":72,"context_line":"        desc +\u003d idp_id"},{"line_number":73,"context_line":"        domain \u003d {"},{"line_number":74,"context_line":"            \u0027id\u0027: domain_id,"},{"line_number":75,"context_line":"            \u0027name\u0027: domain_id,"},{"line_number":76,"context_line":"            \u0027description\u0027: desc,"},{"line_number":77,"context_line":"            \u0027enabled\u0027: True"},{"line_number":78,"context_line":"        }"},{"line_number":79,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"},{"line_number":80,"context_line":"        return domain_id"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _assert_valid_domain_id(self, domain_id):"},{"line_number":83,"context_line":"        self.resource_api.get_domain(domain_id)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    @MEMOIZE"},{"line_number":86,"context_line":"    def get_enabled_service_providers(self):"}],"source_content_type":"text/x-python","patch_set":36,"id":"ba5201f7_3392e04c","line":83,"range":{"start_line":62,"start_character":4,"end_line":83,"end_character":47},"updated":"2017-01-06 16:20:24.000000000","message":"i\u0027m still not a fan of how this is broken up, it would be very simple to read as a single function, \u003c20 lines.","commit_id":"8c190a1a29dbb17fee044827fc9b651918dfc51e"}],"keystone/federation/schema.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"22221b1b63eac5ebe99779850a118aa9207ed482","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    }"},{"line_number":92,"context_line":"}"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"_identity_provider_properties_update \u003d {"},{"line_number":95,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":96,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":97,"context_line":"    \u0027remote_ids\u0027: {"}],"source_content_type":"text/x-python","patch_set":36,"id":"ba5201f7_398e412e","line":94,"updated":"2017-01-06 17:02:58.000000000","message":"These could be pulled into the dictionary that needs them - but we can do that in a follow on and is totally a style thing.","commit_id":"8c190a1a29dbb17fee044827fc9b651918dfc51e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"22221b1b63eac5ebe99779850a118aa9207ed482","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        \u0027items\u0027: {"},{"line_number":100,"context_line":"            \u0027type\u0027: \u0027string\u0027"},{"line_number":101,"context_line":"        },"},{"line_number":102,"context_line":"        \u0027uniqueItems\u0027: True"},{"line_number":103,"context_line":"    }"},{"line_number":104,"context_line":"}"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"ba5201f7_5959458d","line":102,"updated":"2017-01-06 17:02:58.000000000","message":"The duplication in between these two makes me want to investigate jsd more - https://github.com/dstanek/jsd","commit_id":"8c190a1a29dbb17fee044827fc9b651918dfc51e"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"4ff680bd2bde1a701be6b429d06d279cf5e96bc8","unresolved":false,"context_lines":[{"line_number":1865,"context_line":"                          session,"},{"line_number":1866,"context_line":"                          idp_name,"},{"line_number":1867,"context_line":"                          new_idp)"},{"line_number":1868,"context_line":"        self.contract(12)"},{"line_number":1869,"context_line":"        self.assertTableColumns(idp_name,"},{"line_number":1870,"context_line":"                                [\u0027id\u0027,"},{"line_number":1871,"context_line":"                                 \u0027domain_id\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_d97a7876","line":1868,"updated":"2016-12-19 19:22:57.000000000","message":"it\u0027d be nice to make sure new_idp can be added after contact","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d73c8c86612f012017b530ac84a9220a8dfba750","unresolved":false,"context_lines":[{"line_number":1865,"context_line":"                          session,"},{"line_number":1866,"context_line":"                          idp_name,"},{"line_number":1867,"context_line":"                          new_idp)"},{"line_number":1868,"context_line":"        self.contract(12)"},{"line_number":1869,"context_line":"        self.assertTableColumns(idp_name,"},{"line_number":1870,"context_line":"                                [\u0027id\u0027,"},{"line_number":1871,"context_line":"                                 \u0027domain_id\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6eadb0_f93eebd8","line":1868,"in_reply_to":"1a6eadb0_d97a7876","updated":"2016-12-20 15:28:55.000000000","message":"Good suggestion, done.","commit_id":"1ddf4fbbcc7bbbae3c4306846b05c0ea7d1fa4e1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6e48af476ac17bd65c92447156268f5829a7df5d","unresolved":false,"context_lines":[{"line_number":1861,"context_line":"                                 \u0027enabled\u0027,"},{"line_number":1862,"context_line":"                                 \u0027description\u0027])"},{"line_number":1863,"context_line":"        self.migrate(12)"},{"line_number":1864,"context_line":"        # confirm we cannot insert an idp during migrate"},{"line_number":1865,"context_line":"        idp_domain \u003d {"},{"line_number":1866,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":1867,"context_line":"            \u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_26ff52ab","line":1864,"updated":"2016-12-20 21:48:25.000000000","message":"We could actually duplicate this assertion right after we execute `self.expand(12)`, since that is where the triggers are created and we shouldn\u0027t be able to insert identity providers at that point.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fcd2c7cd9f5951472307b8e9dc97d01cc9ab1529","unresolved":false,"context_lines":[{"line_number":1861,"context_line":"                                 \u0027enabled\u0027,"},{"line_number":1862,"context_line":"                                 \u0027description\u0027])"},{"line_number":1863,"context_line":"        self.migrate(12)"},{"line_number":1864,"context_line":"        # confirm we cannot insert an idp during migrate"},{"line_number":1865,"context_line":"        idp_domain \u003d {"},{"line_number":1866,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":1867,"context_line":"            \u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_3f63cc42","line":1864,"in_reply_to":"1a6eadb0_26ff52ab","updated":"2016-12-21 03:34:03.000000000","message":"Done","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6e48af476ac17bd65c92447156268f5829a7df5d","unresolved":false,"context_lines":[{"line_number":1867,"context_line":"            \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1868,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":1869,"context_line":"            \u0027description\u0027: uuid.uuid4().hex,"},{"line_number":1870,"context_line":"            \u0027domain_id\u0027: \u0027\u003c\u003cnull\u003e\u003e\u0027,"},{"line_number":1871,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":1872,"context_line":"            \u0027parent_id\u0027: None,"},{"line_number":1873,"context_line":"            \u0027extra\u0027: \u0027{}\u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_662f8a3e","line":1870,"updated":"2016-12-20 21:48:25.000000000","message":"We have a constant for this in the resource driver, don\u0027t we?","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fcd2c7cd9f5951472307b8e9dc97d01cc9ab1529","unresolved":false,"context_lines":[{"line_number":1867,"context_line":"            \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1868,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":1869,"context_line":"            \u0027description\u0027: uuid.uuid4().hex,"},{"line_number":1870,"context_line":"            \u0027domain_id\u0027: \u0027\u003c\u003cnull\u003e\u003e\u0027,"},{"line_number":1871,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":1872,"context_line":"            \u0027parent_id\u0027: None,"},{"line_number":1873,"context_line":"            \u0027extra\u0027: \u0027{}\u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_840f3987","line":1870,"in_reply_to":"1a6eadb0_662f8a3e","updated":"2016-12-21 03:34:03.000000000","message":"Yep, using it now.  Done.","commit_id":"cbd995c1094e89e7510bb6940fbf5dab63941574"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9bbf6784f92723990c1b54cbaba0e755063c7f8e","unresolved":false,"context_lines":[{"line_number":1896,"context_line":"        self.assertRaises(db_exception.DBError, self.insert_dict, session,"},{"line_number":1897,"context_line":"                          idp_name, new_idp)"},{"line_number":1898,"context_line":""},{"line_number":1899,"context_line":"        # confirm we can insert a new idp during contract"},{"line_number":1900,"context_line":"        self.contract(12)"},{"line_number":1901,"context_line":"        self.insert_dict(session, idp_name, new_idp)"},{"line_number":1902,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"1a6eadb0_0af07990","line":1899,"range":{"start_line":1899,"start_character":42,"end_line":1899,"end_character":48},"updated":"2017-01-06 00:36:04.000000000","message":"(nit) after","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"6f24c12fc9b3a39dac1ea970e465184fe3315f45","unresolved":false,"context_lines":[{"line_number":1896,"context_line":"        self.assertRaises(db_exception.DBError, self.insert_dict, session,"},{"line_number":1897,"context_line":"                          idp_name, new_idp)"},{"line_number":1898,"context_line":""},{"line_number":1899,"context_line":"        # confirm we can insert a new idp during contract"},{"line_number":1900,"context_line":"        self.contract(12)"},{"line_number":1901,"context_line":"        self.insert_dict(session, idp_name, new_idp)"},{"line_number":1902,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_50691af8","line":1899,"range":{"start_line":1899,"start_character":42,"end_line":1899,"end_character":48},"in_reply_to":"1a6eadb0_0af07990","updated":"2017-01-06 16:05:29.000000000","message":"Done","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"}],"keystone/tests/unit/test_v3_federation.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"38327e85c0c9f3f919290d62eda1d48db11f0b6c","unresolved":false,"context_lines":[{"line_number":944,"context_line":"        self.assertIn(\u0027Duplicate entry\u0027,"},{"line_number":945,"context_line":"                      resp_data.get(\u0027error\u0027, {}).get(\u0027message\u0027))"},{"line_number":946,"context_line":""},{"line_number":947,"context_line":"    def test_that_you_cannot_update_an_idp_domain(self):"},{"line_number":948,"context_line":"        # create new idp"},{"line_number":949,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":950,"context_line":"        default_resp \u003d self._create_default_idp(body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a6eadb0_83face73","line":947,"range":{"start_line":947,"start_character":13,"end_line":947,"end_character":22},"updated":"2016-12-14 18:56:32.000000000","message":"I\u0027d remove \u0027that_you\u0027 in the test name, it looks strange to me","commit_id":"2e98d2313a4cf993196f05c1f836d17e35f5cc10"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e5b5445cc99fbe7f109adca2ad22777d421fc17b","unresolved":false,"context_lines":[{"line_number":944,"context_line":"        self.assertIn(\u0027Duplicate entry\u0027,"},{"line_number":945,"context_line":"                      resp_data.get(\u0027error\u0027, {}).get(\u0027message\u0027))"},{"line_number":946,"context_line":""},{"line_number":947,"context_line":"    def test_that_you_cannot_update_an_idp_domain(self):"},{"line_number":948,"context_line":"        # create new idp"},{"line_number":949,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":950,"context_line":"        default_resp \u003d self._create_default_idp(body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a6eadb0_31439714","line":947,"range":{"start_line":947,"start_character":13,"end_line":947,"end_character":22},"in_reply_to":"1a6eadb0_83face73","updated":"2016-12-16 17:39:17.000000000","message":"Done","commit_id":"2e98d2313a4cf993196f05c1f836d17e35f5cc10"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"7d6a4453af08a4259a92a0f67ef310d124cb9f53","unresolved":false,"context_lines":[{"line_number":945,"context_line":"        self.assertIn(\u0027Duplicate entry\u0027,"},{"line_number":946,"context_line":"                      resp_data.get(\u0027error\u0027, {}).get(\u0027message\u0027))"},{"line_number":947,"context_line":""},{"line_number":948,"context_line":"    def test_that_you_cannot_update_an_idp_domain(self):"},{"line_number":949,"context_line":"        # create new idp"},{"line_number":950,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":951,"context_line":"        default_resp \u003d self._create_default_idp(body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":28,"id":"1a6eadb0_aeabf973","line":948,"range":{"start_line":948,"start_character":13,"end_line":948,"end_character":21},"updated":"2016-12-15 17:41:03.000000000","message":"this still looks weird to me :)","commit_id":"90c716698d3e1e7a2da5778e406be6f93a1530b9"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6e48af476ac17bd65c92447156268f5829a7df5d","unresolved":false,"context_lines":[{"line_number":886,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":887,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":888,"context_line":"                                 ref\u003dbody)"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def test_create_idp_remote(self):"},{"line_number":891,"context_line":"        \"\"\"Create the IdentityProvider entity associated to remote_ids.\"\"\""},{"line_number":892,"context_line":"        keys_to_check \u003d list(self.idp_keys)"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_2672f249","side":"PARENT","line":889,"updated":"2016-12-20 21:48:25.000000000","message":"We could add another test case here:\n\n  def test_create_idp_with_non_existant_domain_id_fails(self):\n      keys_to_check \u003d list(self.idp_keys)\n      body \u003d self.default_body.copy()\n      body[\u0027description\u0027] \u003d uuid.uuid4().hex\n      body[\u0027domain_id\u0027] \u003d uuid.uuid4().hex\n      # I would assume this to fail since the domain_id key exists\n      # in the reference, so it won\u0027t be populated by the federated manager,\n      # which should allow it to get to the driver, but that would fail because\n      # the constraint for a non-existent domain isn\u0027t true.\n      resp \u003d self._create_default_idp(body\u003dbody)","commit_id":"8f038adac7c728d3fd2eb751cd8eb2cb6e209aff"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fcd2c7cd9f5951472307b8e9dc97d01cc9ab1529","unresolved":false,"context_lines":[{"line_number":886,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":887,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":888,"context_line":"                                 ref\u003dbody)"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def test_create_idp_remote(self):"},{"line_number":891,"context_line":"        \"\"\"Create the IdentityProvider entity associated to remote_ids.\"\"\""},{"line_number":892,"context_line":"        keys_to_check \u003d list(self.idp_keys)"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6eadb0_bffd1c3d","side":"PARENT","line":889,"in_reply_to":"1a6eadb0_2672f249","updated":"2016-12-21 03:34:03.000000000","message":"Nice!  Thanks, added this test.","commit_id":"8f038adac7c728d3fd2eb751cd8eb2cb6e209aff"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9bbf6784f92723990c1b54cbaba0e755063c7f8e","unresolved":false,"context_lines":[{"line_number":880,"context_line":""},{"line_number":881,"context_line":"    def assertIdpDomainCreated(self, idp_id, domain_id):"},{"line_number":882,"context_line":"        domain \u003d self.resource_api.get_domain(domain_id)"},{"line_number":883,"context_line":"        self.assertEqual(domain_id, domain[\u0027id\u0027])"},{"line_number":884,"context_line":"        self.assertEqual(domain_id, domain[\u0027name\u0027])"},{"line_number":885,"context_line":"        self.assertIn(idp_id, domain[\u0027description\u0027])"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_6b980cc1","line":883,"range":{"start_line":883,"start_character":8,"end_line":883,"end_character":49},"updated":"2017-01-06 00:36:04.000000000","message":"this is not needed, the domain was just retrieved with this ID","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"6f24c12fc9b3a39dac1ea970e465184fe3315f45","unresolved":false,"context_lines":[{"line_number":880,"context_line":""},{"line_number":881,"context_line":"    def assertIdpDomainCreated(self, idp_id, domain_id):"},{"line_number":882,"context_line":"        domain \u003d self.resource_api.get_domain(domain_id)"},{"line_number":883,"context_line":"        self.assertEqual(domain_id, domain[\u0027id\u0027])"},{"line_number":884,"context_line":"        self.assertEqual(domain_id, domain[\u0027name\u0027])"},{"line_number":885,"context_line":"        self.assertIn(idp_id, domain[\u0027description\u0027])"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_f0804e8d","line":883,"range":{"start_line":883,"start_character":8,"end_line":883,"end_character":49},"in_reply_to":"ba5201f7_6b980cc1","updated":"2017-01-06 16:05:29.000000000","message":"Done","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"9bbf6784f92723990c1b54cbaba0e755063c7f8e","unresolved":false,"context_lines":[{"line_number":958,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":959,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"},{"line_number":960,"context_line":"        body \u003d {\u0027identity_provider\u0027: body}"},{"line_number":961,"context_line":"        body[\u0027domain_id\u0027] \u003d domain[\u0027id\u0027]"},{"line_number":962,"context_line":"        url \u003d self.base_url(suffix\u003didp_id)"},{"line_number":963,"context_line":"        self.patch(url, body\u003dbody, expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":964,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_cb01f807","line":961,"range":{"start_line":961,"start_character":8,"end_line":961,"end_character":40},"updated":"2017-01-06 00:36:04.000000000","message":"this is incorrect, should be:\n\n    body[\u0027identity_provider\u0027][\u0027domain_id\u0027] \u003d domain[\u0027id\u0027]\n\nor put this one line above","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"6f24c12fc9b3a39dac1ea970e465184fe3315f45","unresolved":false,"context_lines":[{"line_number":958,"context_line":"        domain \u003d unit.new_domain_ref()"},{"line_number":959,"context_line":"        self.resource_api.create_domain(domain[\u0027id\u0027], domain)"},{"line_number":960,"context_line":"        body \u003d {\u0027identity_provider\u0027: body}"},{"line_number":961,"context_line":"        body[\u0027domain_id\u0027] \u003d domain[\u0027id\u0027]"},{"line_number":962,"context_line":"        url \u003d self.base_url(suffix\u003didp_id)"},{"line_number":963,"context_line":"        self.patch(url, body\u003dbody, expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":964,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"ba5201f7_d05c2a4d","line":961,"range":{"start_line":961,"start_character":8,"end_line":961,"end_character":40},"in_reply_to":"ba5201f7_cb01f807","updated":"2017-01-06 16:05:29.000000000","message":"Wow, nice catch! Thanks Samuel.","commit_id":"9cc4e937894507c13e76fae2aa0bfbc8b324414c"}]}
