)]}'
{"keystone/common/sql/contract_repo/versions/031_contract_add_domain_id_fk_to_user_table.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d36dd3a71c7612341677939da82506db63bff2a","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    # short-circuit if a FK exists already"},{"line_number":21,"context_line":"    inspector \u003d sql.engine.reflection.Inspector.from_engine(migrate_engine)"},{"line_number":22,"context_line":"    for fk in inspector.get_foreign_keys(\u0027user\u0027):"},{"line_number":23,"context_line":"        if \u0027domain_id\u0027 in fk[\u0027constrained_columns\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_8dbab707","line":20,"range":{"start_line":20,"start_character":28,"end_line":20,"end_character":34},"updated":"2017-10-20 20:16:44.000000000","message":"Why do we need this check at all? We should know for sure whether it exist or not based on the schema version right?","commit_id":"acf45fb4b0a450631fca4f11d441e85c6d64609d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"3ce6a23cdab5f97ae9678fac61dc713b8b6d9078","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    # short-circuit if a FK exists already"},{"line_number":21,"context_line":"    inspector \u003d sql.engine.reflection.Inspector.from_engine(migrate_engine)"},{"line_number":22,"context_line":"    for fk in inspector.get_foreign_keys(\u0027user\u0027):"},{"line_number":23,"context_line":"        if \u0027domain_id\u0027 in fk[\u0027constrained_columns\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_a2b559cf","line":20,"range":{"start_line":20,"start_character":28,"end_line":20,"end_character":34},"in_reply_to":"3f4b6375_85172ba4","updated":"2017-10-23 15:54:34.000000000","message":"Ouch! Hey, at least this time its \"idempotent\". :-)","commit_id":"acf45fb4b0a450631fca4f11d441e85c6d64609d"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"959b515bcd68b87a53c2ef25e227291cec196ad7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    # short-circuit if a FK exists already"},{"line_number":21,"context_line":"    inspector \u003d sql.engine.reflection.Inspector.from_engine(migrate_engine)"},{"line_number":22,"context_line":"    for fk in inspector.get_foreign_keys(\u0027user\u0027):"},{"line_number":23,"context_line":"        if \u0027domain_id\u0027 in fk[\u0027constrained_columns\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_85172ba4","line":20,"range":{"start_line":20,"start_character":28,"end_line":20,"end_character":34},"in_reply_to":"3f4b6375_8dbab707","updated":"2017-10-20 23:46:37.000000000","message":"Nope, this is a case where some deployments might have ended up broken due to how migrations worked.","commit_id":"acf45fb4b0a450631fca4f11d441e85c6d64609d"}],"keystone/common/sql/expand_repo/versions/031_expand_add_domain_id_fk_to_user_table.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6c993531de6a3d5c5815e51d17a67f8e264bf336","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    user \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    project \u003d sql.Table(\u0027project\u0027, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    user.c.domain_id.alter(sql.ForeignKey(project.c.id))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_e5062221","line":24,"range":{"start_line":24,"start_character":4,"end_line":24,"end_character":56},"updated":"2017-10-18 18:55:26.000000000","message":"This might break if the FK already exists. you likely need to inspect the table and check to see if the FK exists and then only add it if it does not.\n\nIs this safe for the \"rolling upgrade\" expand only requirements?","commit_id":"d423f6a696712bc2ae47692fd9fd8d75e0d75545"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"073e8f309799d40c75b4d9b9682d4d84bebb1208","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    user \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    project \u003d sql.Table(\u0027project\u0027, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    user.c.domain_id.alter(sql.ForeignKey(project.c.id))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_87ae1d96","line":24,"range":{"start_line":24,"start_character":4,"end_line":24,"end_character":56},"in_reply_to":"3f4b6375_29aaa2d1","updated":"2017-10-20 14:04:08.000000000","message":"for now I will put in the contract to see if things work. I still need a suggesiton","commit_id":"d423f6a696712bc2ae47692fd9fd8d75e0d75545"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"d8ce8bbe7135e0785e29d55ccc200ecd3d5cae96","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    user \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    project \u003d sql.Table(\u0027project\u0027, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    user.c.domain_id.alter(sql.ForeignKey(project.c.id))"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_29aaa2d1","line":24,"range":{"start_line":24,"start_character":4,"end_line":24,"end_character":56},"in_reply_to":"3f4b6375_e5062221","updated":"2017-10-20 12:33:48.000000000","message":"looks like no, I am getting:\n\nkeystone.tests.unit.test_sql_banned_operations.DBOperationNotAllowed: Operation Column.alter() is not allowed in expand_repo database migrations\u0027\n\nHow can I get around this? Can I add an exception or would it be more appropriate to put this in the contract phase?","commit_id":"d423f6a696712bc2ae47692fd9fd8d75e0d75545"}],"keystone/identity/core.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"f3ea983bdf3c432f2cd3ccc2df66af4b2161c688","unresolved":false,"context_lines":[{"line_number":508,"context_line":"                LOG.debug((\u0027Group %(groupid)s not found when deleting domain \u0027"},{"line_number":509,"context_line":"                           \u0027contents for %(domainid)s, continuing with \u0027"},{"line_number":510,"context_line":"                           \u0027cleanup.\u0027),"},{"line_number":511,"context_line":"                          {\u0027groupid\u0027: group[\u0027id\u0027], \u0027domainid\u0027: domain_id})"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    def _unset_default_project(self, service, resource_type, operation,"},{"line_number":514,"context_line":"                               payload):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_9e0e9ce3","line":511,"updated":"2017-09-22 13:06:19.000000000","message":"Would this problem not be the same for groups?","commit_id":"be9e8941e6980fa590f2fcfb6ecb9fd3b7349a6a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"f1727313bd8d8928c6f92ead34475eb6348a28f8","unresolved":false,"context_lines":[{"line_number":508,"context_line":"                LOG.debug((\u0027Group %(groupid)s not found when deleting domain \u0027"},{"line_number":509,"context_line":"                           \u0027contents for %(domainid)s, continuing with \u0027"},{"line_number":510,"context_line":"                           \u0027cleanup.\u0027),"},{"line_number":511,"context_line":"                          {\u0027groupid\u0027: group[\u0027id\u0027], \u0027domainid\u0027: domain_id})"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    def _unset_default_project(self, service, resource_type, operation,"},{"line_number":514,"context_line":"                               payload):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f515b1d_d130850a","line":511,"in_reply_to":"7f515b1d_9e0e9ce3","updated":"2017-09-22 14:05:10.000000000","message":"hmm, no because the FK does not exist in that case. I agree it would be great to have them to be consistent, but might be a separate covnersation","commit_id":"be9e8941e6980fa590f2fcfb6ecb9fd3b7349a6a"}],"keystone/resource/core.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6c993531de6a3d5c5815e51d17a67f8e264bf336","unresolved":false,"context_lines":[{"line_number":817,"context_line":"        for project in roots:"},{"line_number":818,"context_line":"            _delete_projects(project, proj_refs, examined)"},{"line_number":819,"context_line":""},{"line_number":820,"context_line":"        # And finally, delete the users"},{"line_number":821,"context_line":"        user_refs \u003d self.identity_api.list_users(domain_scope\u003ddomain_id)"},{"line_number":822,"context_line":""},{"line_number":823,"context_line":"        for user in user_refs:"},{"line_number":824,"context_line":"            try:"},{"line_number":825,"context_line":"                self.identity_api.delete_user(user[\u0027id\u0027])"},{"line_number":826,"context_line":"            except exception.UserNotFound:"},{"line_number":827,"context_line":"                LOG.debug((\u0027User %(userid)s not found when deleting domain \u0027"},{"line_number":828,"context_line":"                           \u0027contents for %(domainid)s, continuing with \u0027"},{"line_number":829,"context_line":"                           \u0027cleanup.\u0027),"},{"line_number":830,"context_line":"                          {\u0027userid\u0027: user[\u0027id\u0027], \u0027domainid\u0027: domain_id})"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    @manager.response_truncated"},{"line_number":833,"context_line":"    def list_projects(self, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_100f3a2f","line":830,"range":{"start_line":820,"start_character":0,"end_line":830,"end_character":72},"updated":"2017-10-18 18:55:26.000000000","message":"We could, instead of using this logic, in code, lean on the backend to do the delete via a FK CASCADE delete.\n\nWould a CASCADE be preferable to doing it like this?","commit_id":"d423f6a696712bc2ae47692fd9fd8d75e0d75545"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2978b2204a2a7e9a2bc82d8acdfefb6c7918a6cb","unresolved":false,"context_lines":[{"line_number":817,"context_line":"        for project in roots:"},{"line_number":818,"context_line":"            _delete_projects(project, proj_refs, examined)"},{"line_number":819,"context_line":""},{"line_number":820,"context_line":"        # And finally, delete the users"},{"line_number":821,"context_line":"        user_refs \u003d self.identity_api.list_users(domain_scope\u003ddomain_id)"},{"line_number":822,"context_line":""},{"line_number":823,"context_line":"        for user in user_refs:"},{"line_number":824,"context_line":"            try:"},{"line_number":825,"context_line":"                self.identity_api.delete_user(user[\u0027id\u0027])"},{"line_number":826,"context_line":"            except exception.UserNotFound:"},{"line_number":827,"context_line":"                LOG.debug((\u0027User %(userid)s not found when deleting domain \u0027"},{"line_number":828,"context_line":"                           \u0027contents for %(domainid)s, continuing with \u0027"},{"line_number":829,"context_line":"                           \u0027cleanup.\u0027),"},{"line_number":830,"context_line":"                          {\u0027userid\u0027: user[\u0027id\u0027], \u0027domainid\u0027: domain_id})"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    @manager.response_truncated"},{"line_number":833,"context_line":"    def list_projects(self, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_4195c7e3","line":830,"range":{"start_line":820,"start_character":0,"end_line":830,"end_character":72},"in_reply_to":"3f4b6375_100f3a2f","updated":"2017-10-19 20:52:05.000000000","message":"That would work but it would require coupling between the identity and resource backends. Don\u0027t we typically shy away from doing that?","commit_id":"d423f6a696712bc2ae47692fd9fd8d75e0d75545"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"72a9b07743158cb77e1664bd9018bfbea3d41124","unresolved":false,"context_lines":[{"line_number":824,"context_line":"        for project in roots:"},{"line_number":825,"context_line":"            _delete_projects(project, proj_refs, examined)"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        # And finally, delete the users"},{"line_number":828,"context_line":"        user_refs \u003d self.identity_api.list_users(domain_scope\u003ddomain_id)"},{"line_number":829,"context_line":""},{"line_number":830,"context_line":"        for user in user_refs:"},{"line_number":831,"context_line":"            try:"},{"line_number":832,"context_line":"                self.identity_api.delete_user(user[\u0027id\u0027])"},{"line_number":833,"context_line":"            except exception.UserNotFound:"},{"line_number":834,"context_line":"                LOG.debug((\u0027User %(userid)s not found when deleting domain \u0027"},{"line_number":835,"context_line":"                           \u0027contents for %(domainid)s, continuing with \u0027"},{"line_number":836,"context_line":"                           \u0027cleanup.\u0027),"},{"line_number":837,"context_line":"                          {\u0027userid\u0027: user[\u0027id\u0027], \u0027domainid\u0027: domain_id})"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"    @manager.response_truncated"},{"line_number":840,"context_line":"    def list_projects(self, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7f96bb07_75e7e713","line":837,"range":{"start_line":827,"start_character":0,"end_line":837,"end_character":72},"updated":"2018-01-24 13:22:35.000000000","message":"The bug is solved for me if I only include this part. How about we drop all of the foreign key fixes and just keep this part?","commit_id":"d2e311d16a5937895cd514e370b5504346d87f15"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"61ec1c16ca2f9773b9e499f05774ab4c2ebc3ef4","unresolved":false,"context_lines":[{"line_number":824,"context_line":"        for project in roots:"},{"line_number":825,"context_line":"            _delete_projects(project, proj_refs, examined)"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        # And finally, delete the users"},{"line_number":828,"context_line":"        user_refs \u003d self.identity_api.list_users(domain_scope\u003ddomain_id)"},{"line_number":829,"context_line":""},{"line_number":830,"context_line":"        for user in user_refs:"},{"line_number":831,"context_line":"            try:"},{"line_number":832,"context_line":"                self.identity_api.delete_user(user[\u0027id\u0027])"},{"line_number":833,"context_line":"            except exception.UserNotFound:"},{"line_number":834,"context_line":"                LOG.debug((\u0027User %(userid)s not found when deleting domain \u0027"},{"line_number":835,"context_line":"                           \u0027contents for %(domainid)s, continuing with \u0027"},{"line_number":836,"context_line":"                           \u0027cleanup.\u0027),"},{"line_number":837,"context_line":"                          {\u0027userid\u0027: user[\u0027id\u0027], \u0027domainid\u0027: domain_id})"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"    @manager.response_truncated"},{"line_number":840,"context_line":"    def list_projects(self, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f93b717_38baa2c0","line":837,"range":{"start_line":827,"start_character":0,"end_line":837,"end_character":72},"updated":"2018-01-30 21:44:34.000000000","message":"This has to handle the case that the backend (aka LDAP) doesn\u0027t allow deletion of the users.","commit_id":"237b93f800cf57825ac73f9d62d86c1b2adf1379"}],"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":"6c479ee387a1e26f43549b61d9534b995be1fddd","unresolved":false,"context_lines":[{"line_number":2493,"context_line":"        self.expand(30)"},{"line_number":2494,"context_line":"        self.migrate(30)"},{"line_number":2495,"context_line":"        self.contract(30)"},{"line_number":2496,"context_line":"        self.assertTrue(self.does_fk_exist(\u0027user\u0027, \u0027domain_id\u0027))"},{"line_number":2497,"context_line":"        self.expand(31)"},{"line_number":2498,"context_line":"        self.migrate(31)"},{"line_number":2499,"context_line":"        self.contract(31)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_05f6de90","line":2496,"updated":"2017-10-18 18:30:33.000000000","message":"since we run all previous migrations to run 31, I don\u0027t know how we can test this. the fk is added in 14, so it already exists.\n\nthe idea of 31 is to add the FK for deployments launched between the time 14 was merged and now.","commit_id":"d423f6a696712bc2ae47692fd9fd8d75e0d75545"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"6c993531de6a3d5c5815e51d17a67f8e264bf336","unresolved":false,"context_lines":[{"line_number":2493,"context_line":"        self.expand(30)"},{"line_number":2494,"context_line":"        self.migrate(30)"},{"line_number":2495,"context_line":"        self.contract(30)"},{"line_number":2496,"context_line":"        self.assertTrue(self.does_fk_exist(\u0027user\u0027, \u0027domain_id\u0027))"},{"line_number":2497,"context_line":"        self.expand(31)"},{"line_number":2498,"context_line":"        self.migrate(31)"},{"line_number":2499,"context_line":"        self.contract(31)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_d031a2ee","line":2496,"in_reply_to":"3f4b6375_05f6de90","updated":"2017-10-18 18:55:26.000000000","message":"Explicitly drop the FK, then run 31 and check to make sure it is was re-added.\n\nThis is going to require an explicit new metadata object that is loaded *after* the FK drop and self.does_fk_exist wont work.","commit_id":"d423f6a696712bc2ae47692fd9fd8d75e0d75545"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"073e8f309799d40c75b4d9b9682d4d84bebb1208","unresolved":false,"context_lines":[{"line_number":2493,"context_line":"        self.expand(30)"},{"line_number":2494,"context_line":"        self.migrate(30)"},{"line_number":2495,"context_line":"        self.contract(30)"},{"line_number":2496,"context_line":"        self.assertTrue(self.does_fk_exist(\u0027user\u0027, \u0027domain_id\u0027))"},{"line_number":2497,"context_line":"        self.expand(31)"},{"line_number":2498,"context_line":"        self.migrate(31)"},{"line_number":2499,"context_line":"        self.contract(31)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f4b6375_a7ab5987","line":2496,"in_reply_to":"3f4b6375_d031a2ee","updated":"2017-10-20 14:04:08.000000000","message":"how do I get a new metadata? what is a new metadata going to be used for?\n\nindeed self.does_fk_exist does not, how should I use instead?","commit_id":"d423f6a696712bc2ae47692fd9fd8d75e0d75545"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"959b515bcd68b87a53c2ef25e227291cec196ad7","unresolved":false,"context_lines":[{"line_number":2494,"context_line":"        self.migrate(30)"},{"line_number":2495,"context_line":"        self.contract(30)"},{"line_number":2496,"context_line":""},{"line_number":2497,"context_line":"        # The FK exists because it was added in 014. Drop it."},{"line_number":2498,"context_line":"        self.assertTrue(self.does_fk_exist(\u0027user\u0027, \u0027domain_id\u0027))"},{"line_number":2499,"context_line":"        user \u003d sqlalchemy.Table(\u0027user\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2500,"context_line":"        project \u003d sqlalchemy.Table(\u0027project\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2501,"context_line":"        migrate.ForeignKeyConstraint(columns\u003d[user.c.domain_id],"},{"line_number":2502,"context_line":"                                     refcolumns\u003d[project.c.id]).drop()"},{"line_number":2503,"context_line":"        self.assertFalse(self.does_fk_exist(\u0027user\u0027, \u0027domain_id\u0027))"},{"line_number":2504,"context_line":""},{"line_number":2505,"context_line":"        self.expand(31)"},{"line_number":2506,"context_line":"        self.migrate(31)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f4b6375_c571a30e","line":2503,"range":{"start_line":2497,"start_character":0,"end_line":2503,"end_character":65},"updated":"2017-10-20 23:46:37.000000000","message":"create a new meta insted of using self.meta for dropping the value. \n\nmeta \u003d sqlalchemy.MetaData(self.engine)\n\nand use that. It *should* work.\n\nIn ALL cases you should have the FK because 14 was run. You can probably drop the assertTrue above (2497), it should simply be \"drop the FK\", \"assert doesn\u0027t exist\", \"migrate\", then \"assert exists\".","commit_id":"acf45fb4b0a450631fca4f11d441e85c6d64609d"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9a169e98b127ad838b12bb190a9be0c6f215363c","unresolved":false,"context_lines":[{"line_number":2794,"context_line":"        self.contract(34)"},{"line_number":2795,"context_line":""},{"line_number":2796,"context_line":"        # The FK exists because it was added in 014. Drop it."},{"line_number":2797,"context_line":"        self.assertTrue(self.does_fk_exist(\u0027user\u0027, \u0027domain_id\u0027))"},{"line_number":2798,"context_line":"        user \u003d sqlalchemy.Table(\u0027user\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2799,"context_line":"        project \u003d sqlalchemy.Table(\u0027project\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2800,"context_line":"        migrate.ForeignKeyConstraint(columns\u003d[user.c.domain_id],"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_ea84c5b3","line":2797,"updated":"2018-01-22 12:47:32.000000000","message":"Please address Morgan\u0027s comments from patchset 5","commit_id":"f4a0372abc4c5d0ed04c80e3bf5397e04643daf0"},{"author":{"_account_id":27668,"name":"CHARLES WANG","email":"charleswang007@gmail.com","username":"charleswang007"},"change_message_id":"148f531f5d812e5a01aca6ea3ec1c481fa170c17","unresolved":false,"context_lines":[{"line_number":2794,"context_line":"        self.contract(34)"},{"line_number":2795,"context_line":""},{"line_number":2796,"context_line":"        # The FK exists because it was added in 014. Drop it."},{"line_number":2797,"context_line":"        self.assertTrue(self.does_fk_exist(\u0027user\u0027, \u0027domain_id\u0027))"},{"line_number":2798,"context_line":"        user \u003d sqlalchemy.Table(\u0027user\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2799,"context_line":"        project \u003d sqlalchemy.Table(\u0027project\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2800,"context_line":"        migrate.ForeignKeyConstraint(columns\u003d[user.c.domain_id],"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_c16527e3","line":2797,"in_reply_to":"7f96bb07_ea84c5b3","updated":"2018-01-22 16:42:55.000000000","message":"done","commit_id":"f4a0372abc4c5d0ed04c80e3bf5397e04643daf0"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9a169e98b127ad838b12bb190a9be0c6f215363c","unresolved":false,"context_lines":[{"line_number":2818,"context_line":""},{"line_number":2819,"context_line":"        self.expand(34)"},{"line_number":2820,"context_line":"        self.migrate(34)"},{"line_number":2821,"context_line":"        self.contract(34)"},{"line_number":2822,"context_line":""},{"line_number":2823,"context_line":"        # Check 035 did not do anything. The FK has not been re-added."},{"line_number":2824,"context_line":"        inspector \u003d reflection.Inspector.from_engine(self.engine)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_6af4355c","line":2821,"updated":"2018-01-22 12:47:32.000000000","message":"You need to update these to version 35","commit_id":"f4a0372abc4c5d0ed04c80e3bf5397e04643daf0"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"01ba9abd139e5e59df9fa03b850bee7e5f81480a","unresolved":false,"context_lines":[{"line_number":2818,"context_line":""},{"line_number":2819,"context_line":"        self.expand(34)"},{"line_number":2820,"context_line":"        self.migrate(34)"},{"line_number":2821,"context_line":"        self.contract(34)"},{"line_number":2822,"context_line":""},{"line_number":2823,"context_line":"        # Check 035 did not do anything. The FK has not been re-added."},{"line_number":2824,"context_line":"        inspector \u003d reflection.Inspector.from_engine(self.engine)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_f61b48c7","line":2821,"in_reply_to":"7f96bb07_015b0f2e","updated":"2018-01-22 17:42:48.000000000","message":"No, check the test above, named \"test_migration_034_adds_application_credential_table\" as an example. The test must first do a migration to the last version, here version 34. That brings it up to the current version. Then it does one more upgrade, up to version 35. 35 is the version you are adding, that\u0027s the number in the names of the new migration files. The test is to make sure your new version works. You cannot upgrade from version 34 to version 34, you need to upgrade from version 34 to version 35.\n\nAlso we just merged some other database migrations today so you will need to rebase this and renumber your migrations, sorry :(","commit_id":"f4a0372abc4c5d0ed04c80e3bf5397e04643daf0"},{"author":{"_account_id":27668,"name":"CHARLES WANG","email":"charleswang007@gmail.com","username":"charleswang007"},"change_message_id":"148f531f5d812e5a01aca6ea3ec1c481fa170c17","unresolved":false,"context_lines":[{"line_number":2818,"context_line":""},{"line_number":2819,"context_line":"        self.expand(34)"},{"line_number":2820,"context_line":"        self.migrate(34)"},{"line_number":2821,"context_line":"        self.contract(34)"},{"line_number":2822,"context_line":""},{"line_number":2823,"context_line":"        # Check 035 did not do anything. The FK has not been re-added."},{"line_number":2824,"context_line":"        inspector \u003d reflection.Inspector.from_engine(self.engine)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f96bb07_015b0f2e","line":2821,"in_reply_to":"7f96bb07_6af4355c","updated":"2018-01-22 16:42:55.000000000","message":"I followed previous pattern, e.g. test_migration_015_xxx has self.expand(14) \u0026 self.migrate(14), same for all other tests. So I think here we point to 34 which is prior to 35 should be correct.","commit_id":"f4a0372abc4c5d0ed04c80e3bf5397e04643daf0"}]}
