)]}'
{"keystone/cmd/cli.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7882793e62ca608ec6c0bcc3f7e5acc20690066b","unresolved":false,"context_lines":[{"line_number":425,"context_line":"                                  \u0027to the latest code version, this command \u0027"},{"line_number":426,"context_line":"                                  \u0027will ensure that any data created during \u0027"},{"line_number":427,"context_line":"                                  \u0027the upgrade process is correct and has \u0027"},{"line_number":428,"context_line":"                                  \u0027indeed been migrated. This  command should \u0027"},{"line_number":429,"context_line":"                                  \u0027always be run at the end of  a migration - \u0027"},{"line_number":430,"context_line":"                                  \u0027even if this was a single  node keystone \u0027"},{"line_number":431,"context_line":"                                  \u0027configuration.\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_39a3b401","line":428,"range":{"start_line":428,"start_character":61,"end_line":428,"end_character":63},"updated":"2016-08-07 10:35:34.000000000","message":"double space?","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6628b53fa323d815d3765f8c84f44008379c9b78","unresolved":false,"context_lines":[{"line_number":425,"context_line":"                                  \u0027to the latest code version, this command \u0027"},{"line_number":426,"context_line":"                                  \u0027will ensure that any data created during \u0027"},{"line_number":427,"context_line":"                                  \u0027the upgrade process is correct and has \u0027"},{"line_number":428,"context_line":"                                  \u0027indeed been migrated. This  command should \u0027"},{"line_number":429,"context_line":"                                  \u0027always be run at the end of  a migration - \u0027"},{"line_number":430,"context_line":"                                  \u0027even if this was a single  node keystone \u0027"},{"line_number":431,"context_line":"                                  \u0027configuration.\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_9a6c2c9e","line":428,"range":{"start_line":428,"start_character":61,"end_line":428,"end_character":63},"in_reply_to":"bacf61ea_39a3b401","updated":"2016-08-08 13:09:06.000000000","message":"Done","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7882793e62ca608ec6c0bcc3f7e5acc20690066b","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                                  \u0027will ensure that any data created during \u0027"},{"line_number":427,"context_line":"                                  \u0027the upgrade process is correct and has \u0027"},{"line_number":428,"context_line":"                                  \u0027indeed been migrated. This  command should \u0027"},{"line_number":429,"context_line":"                                  \u0027always be run at the end of  a migration - \u0027"},{"line_number":430,"context_line":"                                  \u0027even if this was a single  node keystone \u0027"},{"line_number":431,"context_line":"                                  \u0027configuration.\u0027))"},{"line_number":432,"context_line":"        parser.add_argument(\u0027--contract\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_19a6b00e","line":429,"range":{"start_line":429,"start_character":62,"end_line":429,"end_character":64},"updated":"2016-08-07 10:35:34.000000000","message":"double space?","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6628b53fa323d815d3765f8c84f44008379c9b78","unresolved":false,"context_lines":[{"line_number":426,"context_line":"                                  \u0027will ensure that any data created during \u0027"},{"line_number":427,"context_line":"                                  \u0027the upgrade process is correct and has \u0027"},{"line_number":428,"context_line":"                                  \u0027indeed been migrated. This  command should \u0027"},{"line_number":429,"context_line":"                                  \u0027always be run at the end of  a migration - \u0027"},{"line_number":430,"context_line":"                                  \u0027even if this was a single  node keystone \u0027"},{"line_number":431,"context_line":"                                  \u0027configuration.\u0027))"},{"line_number":432,"context_line":"        parser.add_argument(\u0027--contract\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_da04e4c7","line":429,"range":{"start_line":429,"start_character":62,"end_line":429,"end_character":64},"in_reply_to":"bacf61ea_19a6b00e","updated":"2016-08-08 13:09:06.000000000","message":"Done","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7882793e62ca608ec6c0bcc3f7e5acc20690066b","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                                  \u0027the upgrade process is correct and has \u0027"},{"line_number":428,"context_line":"                                  \u0027indeed been migrated. This  command should \u0027"},{"line_number":429,"context_line":"                                  \u0027always be run at the end of  a migration - \u0027"},{"line_number":430,"context_line":"                                  \u0027even if this was a single  node keystone \u0027"},{"line_number":431,"context_line":"                                  \u0027configuration.\u0027))"},{"line_number":432,"context_line":"        parser.add_argument(\u0027--contract\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"},{"line_number":433,"context_line":"                            help\u003d(\u0027Remove any database tables and columns \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_b99164f3","line":430,"range":{"start_line":430,"start_character":60,"end_line":430,"end_character":62},"updated":"2016-08-07 10:35:34.000000000","message":"double space?","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6628b53fa323d815d3765f8c84f44008379c9b78","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                                  \u0027the upgrade process is correct and has \u0027"},{"line_number":428,"context_line":"                                  \u0027indeed been migrated. This  command should \u0027"},{"line_number":429,"context_line":"                                  \u0027always be run at the end of  a migration - \u0027"},{"line_number":430,"context_line":"                                  \u0027even if this was a single  node keystone \u0027"},{"line_number":431,"context_line":"                                  \u0027configuration.\u0027))"},{"line_number":432,"context_line":"        parser.add_argument(\u0027--contract\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"},{"line_number":433,"context_line":"                            help\u003d(\u0027Remove any database tables and columns \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_ba0930e0","line":430,"range":{"start_line":430,"start_character":60,"end_line":430,"end_character":62},"in_reply_to":"bacf61ea_b99164f3","updated":"2016-08-08 13:09:06.000000000","message":"Done","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"021c8a865ba4cbd3c5f948bc58046b63ab9b453a","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                                  \u0027specifying db_sync without this option \u0027"},{"line_number":409,"context_line":"                                  \u0027will cause all extensions to be migrated.\u0027))"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        return parser"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @staticmethod"},{"line_number":414,"context_line":"    def main():"}],"source_content_type":"text/x-python","patch_set":12,"id":"5ac665da_654e06c3","side":"PARENT","line":411,"updated":"2016-08-13 16:59:58.000000000","message":"I mentioned this in Dave Chen\u0027s review too. You can actually make these options mutually exclusive https://docs.python.org/2/library/argparse.html#mutual-exclusion","commit_id":"1fff127d047d53d77ba655fc79cbe4b220b8cbbd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3c19b3ec8674a887ba28eb16153ff76cc8326a7c","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                                  \u0027specifying db_sync without this option \u0027"},{"line_number":409,"context_line":"                                  \u0027will cause all extensions to be migrated.\u0027))"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        return parser"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @staticmethod"},{"line_number":414,"context_line":"    def main():"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ac371cc_3e6899ba","side":"PARENT","line":411,"in_reply_to":"5ac665da_654e06c3","updated":"2016-08-14 07:26:11.000000000","message":"Done","commit_id":"1fff127d047d53d77ba655fc79cbe4b220b8cbbd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                                  \u0027will cause all extensions to be migrated.\u0027))"},{"line_number":410,"context_line":"        group \u003d parser.add_mutually_exclusive_group()"},{"line_number":411,"context_line":"        group.add_argument(\u0027--expand\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"},{"line_number":412,"context_line":"                           help\u003d(\u0027Migrate the database ahead of running the \u0027"},{"line_number":413,"context_line":"                                 \u0027first upgraded keystone node.\u0027))"},{"line_number":414,"context_line":"        group.add_argument(\u0027--migrate\u0027, default\u003dFalse,"},{"line_number":415,"context_line":"                           action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_84882d24","line":412,"updated":"2016-08-15 19:35:14.000000000","message":"I\u0027d like to avoid using the term \"migrate\" in this help text, when --expand contrasts itself from --migrate by explicitly not performing any data migration, and instead only makes additive schema changes, and introduces triggers to assist during the data migration phase.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                                  \u0027will cause all extensions to be migrated.\u0027))"},{"line_number":410,"context_line":"        group \u003d parser.add_mutually_exclusive_group()"},{"line_number":411,"context_line":"        group.add_argument(\u0027--expand\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"},{"line_number":412,"context_line":"                           help\u003d(\u0027Migrate the database ahead of running the \u0027"},{"line_number":413,"context_line":"                                 \u0027first upgraded keystone node.\u0027))"},{"line_number":414,"context_line":"        group.add_argument(\u0027--migrate\u0027, default\u003dFalse,"},{"line_number":415,"context_line":"                           action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_ace8ab11","line":412,"in_reply_to":"3ac371cc_84882d24","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":418,"context_line":"                                 \u0027will ensure that any data created during \u0027"},{"line_number":419,"context_line":"                                 \u0027the upgrade process is correct and has \u0027"},{"line_number":420,"context_line":"                                 \u0027indeed been migrated. This command should \u0027"},{"line_number":421,"context_line":"                                 \u0027always be run at the end of a migration - \u0027"},{"line_number":422,"context_line":"                                 \u0027even if this was a single node keystone \u0027"},{"line_number":423,"context_line":"                                 \u0027configuration.\u0027))"},{"line_number":424,"context_line":"        group.add_argument(\u0027--contract\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_a49e0954","line":421,"updated":"2016-08-15 19:35:14.000000000","message":"--migrate should never be run before --contract, so making the assertion that this should be run \"at the end\" of something is misleading.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":418,"context_line":"                                 \u0027will ensure that any data created during \u0027"},{"line_number":419,"context_line":"                                 \u0027the upgrade process is correct and has \u0027"},{"line_number":420,"context_line":"                                 \u0027indeed been migrated. This command should \u0027"},{"line_number":421,"context_line":"                                 \u0027always be run at the end of a migration - \u0027"},{"line_number":422,"context_line":"                                 \u0027even if this was a single node keystone \u0027"},{"line_number":423,"context_line":"                                 \u0027configuration.\u0027))"},{"line_number":424,"context_line":"        group.add_argument(\u0027--contract\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_ecd0e355","line":421,"in_reply_to":"3ac371cc_a49e0954","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":431,"context_line":"        assert_not_extension(CONF.command.extension)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if CONF.command.expand:"},{"line_number":434,"context_line":"            migration_helpers.migration_expand()"},{"line_number":435,"context_line":"        elif CONF.command.migrate:"},{"line_number":436,"context_line":"            migration_helpers.force_migration_complete()"},{"line_number":437,"context_line":"        elif CONF.command.contract:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_e4c76143","line":434,"updated":"2016-08-15 19:35:14.000000000","message":"I\u0027m fine with this (other than perhaps force_migration_complete() below, which is just terribly verbose), but the API as a whole would make more sense to me as:\n\n  migration_helpers.expand_schema()\n  migration_helpers.migrate_data()\n  migration_helpers.contract_schema()\n\nWhich explicitly uses the expand -\u003e migrate -\u003e contract verbs and clearly communicate what is being affected (schema or data) as the noun.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":431,"context_line":"        assert_not_extension(CONF.command.extension)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if CONF.command.expand:"},{"line_number":434,"context_line":"            migration_helpers.migration_expand()"},{"line_number":435,"context_line":"        elif CONF.command.migrate:"},{"line_number":436,"context_line":"            migration_helpers.force_migration_complete()"},{"line_number":437,"context_line":"        elif CONF.command.contract:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_ccd3675e","line":434,"in_reply_to":"3ac371cc_e4c76143","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"cccd14760f127ac2f81d2fd1a28de4a189d1cf93","unresolved":false,"context_lines":[{"line_number":407,"context_line":"                                  \u0027now part of the main repository, \u0027"},{"line_number":408,"context_line":"                                  \u0027specifying db_sync without this option \u0027"},{"line_number":409,"context_line":"                                  \u0027will cause all extensions to be migrated.\u0027))"},{"line_number":410,"context_line":"        group \u003d parser.add_mutually_exclusive_group()"},{"line_number":411,"context_line":"        group.add_argument(\u0027--expand\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"},{"line_number":412,"context_line":"                           help\u003d(\u0027Expand the database schema in preparation \u0027"},{"line_number":413,"context_line":"                                 \u0027for data migration and starting the first \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_c4820c52","line":410,"range":{"start_line":410,"start_character":8,"end_line":410,"end_character":53},"updated":"2016-08-16 08:53:18.000000000","message":"maybe any testcase for this new addon?","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bd4f87c1b6d9a69e9d607fcfc7534f8735ab78ea","unresolved":false,"context_lines":[{"line_number":407,"context_line":"                                  \u0027now part of the main repository, \u0027"},{"line_number":408,"context_line":"                                  \u0027specifying db_sync without this option \u0027"},{"line_number":409,"context_line":"                                  \u0027will cause all extensions to be migrated.\u0027))"},{"line_number":410,"context_line":"        group \u003d parser.add_mutually_exclusive_group()"},{"line_number":411,"context_line":"        group.add_argument(\u0027--expand\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"},{"line_number":412,"context_line":"                           help\u003d(\u0027Expand the database schema in preparation \u0027"},{"line_number":413,"context_line":"                                 \u0027for data migration and starting the first \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_53fffca9","line":410,"range":{"start_line":410,"start_character":8,"end_line":410,"end_character":53},"in_reply_to":"3ac371cc_c4820c52","updated":"2016-08-16 10:01:02.000000000","message":"yep...a good point...I\u0027ll add that as a follow up.","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"90ad0e1f1cea46fcb67eeee4016a4d780d01d883","unresolved":false,"context_lines":[{"line_number":411,"context_line":"        group.add_argument(\u0027--expand\u0027, default\u003dFalse, action\u003d\u0027store_true\u0027,"},{"line_number":412,"context_line":"                           help\u003d(\u0027Expand the database schema in preparation \u0027"},{"line_number":413,"context_line":"                                 \u0027for data migration and starting the first \u0027"},{"line_number":414,"context_line":"                                 \u0027keystone node upgraded to the new release.\u0027))"},{"line_number":415,"context_line":"        group.add_argument(\u0027--migrate\u0027, default\u003dFalse,"},{"line_number":416,"context_line":"                           action\u003d\u0027store_true\u0027,"},{"line_number":417,"context_line":"                           help\u003d(\u0027Copy all data that needs to be migrated \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_281c7511","line":414,"updated":"2016-08-16 17:34:15.000000000","message":"This implies that it\u0027s safe to start a new node after running this step, which is not true (as the help text for --migrate also implies). The upgraded node will not have the data it needs to operate correctly.","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"90ad0e1f1cea46fcb67eeee4016a4d780d01d883","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                           help\u003d(\u0027Remove any database tables and columns \u0027"},{"line_number":428,"context_line":"                                 \u0027that are no longer required. This command \u0027"},{"line_number":429,"context_line":"                                 \u0027should be run after all keystone nodes are \u0027"},{"line_number":430,"context_line":"                                 \u0027running the new release.\u0027))"},{"line_number":431,"context_line":"        return parser"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_68a2edaf","line":430,"updated":"2016-08-16 17:34:15.000000000","message":"++","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"}],"keystone/common/sql/migration_helpers.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"1427c712c4de25ba1ec9273bff9c60eb7baf31ec","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    MIGRATION_STATUS_RESTART_COMPLETED: {"},{"line_number":224,"context_line":"        \u0027next\u0027: MIGRATION_STATUS_COMPLETED,"},{"line_number":225,"context_line":"        \u0027help\u0027: _(\"You are currently in the phase of background data \""},{"line_number":226,"context_line":"                  \" migration after upgrading your keystone nodes. The next \""},{"line_number":227,"context_line":"                  \" command in the sequence should be \""},{"line_number":228,"context_line":"                  \"\u0027keystone-manage db_sync --force-migration-complete\u0027 to \""},{"line_number":229,"context_line":"                  \"complete this phase.\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_ce944938","line":226,"range":{"start_line":226,"start_character":19,"end_line":226,"end_character":20},"updated":"2016-08-02 09:06:40.000000000","message":"remove these leading whitespace.","commit_id":"5d7534c1413ddf8699bfae60967f61ec66862ee7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f9348091373df674bcc4564f98f6e165d84bcd40","unresolved":false,"context_lines":[{"line_number":223,"context_line":"    MIGRATION_STATUS_RESTART_COMPLETED: {"},{"line_number":224,"context_line":"        \u0027next\u0027: MIGRATION_STATUS_COMPLETED,"},{"line_number":225,"context_line":"        \u0027help\u0027: _(\"You are currently in the phase of background data \""},{"line_number":226,"context_line":"                  \" migration after upgrading your keystone nodes. The next \""},{"line_number":227,"context_line":"                  \" command in the sequence should be \""},{"line_number":228,"context_line":"                  \"\u0027keystone-manage db_sync --force-migration-complete\u0027 to \""},{"line_number":229,"context_line":"                  \"complete this phase.\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_687a6dbe","line":226,"range":{"start_line":226,"start_character":19,"end_line":226,"end_character":20},"in_reply_to":"bacf61ea_ce944938","updated":"2016-08-02 09:16:39.000000000","message":"Done","commit_id":"5d7534c1413ddf8699bfae60967f61ec66862ee7"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"1427c712c4de25ba1ec9273bff9c60eb7baf31ec","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    migration_phase \u003d migration_phase_sql.MigratonPhase()"},{"line_number":265,"context_line":"    current_status \u003d migration_phase.get_migration_status()"},{"line_number":266,"context_line":"    if current_status is None:"},{"line_number":267,"context_line":"        phase \u003d {\u0027current_version\u0027: EARLIER_VERSION,"},{"line_number":268,"context_line":"                 \u0027migrating_to_version\u0027: CURRENT_VERSION,"},{"line_number":269,"context_line":"                 \u0027current_phase\u0027: MIGRATION_STATUS_STARTED}"},{"line_number":270,"context_line":"        migration_phase.create_migration_status(phase)"},{"line_number":271,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_7ddfcdd5","line":268,"range":{"start_line":267,"start_character":0,"end_line":268,"end_character":57},"updated":"2016-08-02 09:06:40.000000000","message":"How does these columns get updated?","commit_id":"5d7534c1413ddf8699bfae60967f61ec66862ee7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f9348091373df674bcc4564f98f6e165d84bcd40","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    migration_phase \u003d migration_phase_sql.MigratonPhase()"},{"line_number":265,"context_line":"    current_status \u003d migration_phase.get_migration_status()"},{"line_number":266,"context_line":"    if current_status is None:"},{"line_number":267,"context_line":"        phase \u003d {\u0027current_version\u0027: EARLIER_VERSION,"},{"line_number":268,"context_line":"                 \u0027migrating_to_version\u0027: CURRENT_VERSION,"},{"line_number":269,"context_line":"                 \u0027current_phase\u0027: MIGRATION_STATUS_STARTED}"},{"line_number":270,"context_line":"        migration_phase.create_migration_status(phase)"},{"line_number":271,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_283a35e7","line":268,"range":{"start_line":267,"start_character":0,"end_line":268,"end_character":57},"in_reply_to":"bacf61ea_7ddfcdd5","updated":"2016-08-02 09:16:39.000000000","message":"Haven\u0027t added that bit! Basically at the end of the sequence.","commit_id":"5d7534c1413ddf8699bfae60967f61ec66862ee7"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a40b6670b0574a8babf0c18a2fb17f9c6dafcae9","unresolved":false,"context_lines":[{"line_number":186,"context_line":"MIGRATION_STATUS_FORCE_MIGRATE_COMPLETED \u003d \u0027Force Migrate Completed\u0027"},{"line_number":187,"context_line":"MIGRATION_STATUS_COMPLETED \u003d \u0027Completed\u0027"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"NO_VERSION \u003d \u0027None\u0027"},{"line_number":190,"context_line":"EARLIER_VERSION \u003d \u0027Pre-Newton\u0027"},{"line_number":191,"context_line":"NEWTON_VERSION \u003d \u0027Newton\u0027"},{"line_number":192,"context_line":"OCATA_VERSION \u003d \u0027Ocata\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"CURRENT_VERSION \u003d NEWTON_VERSION"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_d90e91e4","line":192,"range":{"start_line":189,"start_character":0,"end_line":192,"end_character":23},"updated":"2016-08-03 07:50:17.000000000","message":"I think those version could be configurable, maybe define a conf for this, and possibly generate them automatically. It\u0027s not likely we come back each release and update those versions manually.","commit_id":"5db1e0e40703500b9989ce3954173c5b6ccc6131"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5d211654de458315459a9f84c534549d90bd5afc","unresolved":false,"context_lines":[{"line_number":186,"context_line":"MIGRATION_STATUS_FORCE_MIGRATE_COMPLETED \u003d \u0027Force Migrate Completed\u0027"},{"line_number":187,"context_line":"MIGRATION_STATUS_COMPLETED \u003d \u0027Completed\u0027"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"NO_VERSION \u003d \u0027None\u0027"},{"line_number":190,"context_line":"EARLIER_VERSION \u003d \u0027Pre-Newton\u0027"},{"line_number":191,"context_line":"NEWTON_VERSION \u003d \u0027Newton\u0027"},{"line_number":192,"context_line":"OCATA_VERSION \u003d \u0027Ocata\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"CURRENT_VERSION \u003d NEWTON_VERSION"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_6609a72c","line":192,"range":{"start_line":189,"start_character":0,"end_line":192,"end_character":23},"in_reply_to":"bacf61ea_d90e91e4","updated":"2016-08-03 16:14:35.000000000","message":"We could, although you only need to add the one item for the new release....and we\u0027re going to have to add contract repos etc. for each release, so I think this is OK.","commit_id":"5db1e0e40703500b9989ce3954173c5b6ccc6131"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7882793e62ca608ec6c0bcc3f7e5acc20690066b","unresolved":false,"context_lines":[{"line_number":169,"context_line":"MIGRATION_STATUS_FORCE_MIGRATE_COMPLETED \u003d \u0027Force Migrate Completed\u0027"},{"line_number":170,"context_line":"MIGRATION_STATUS_COMPLETED \u003d \u0027Completed\u0027"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"VERSION_THAT_CREATES_MIGRATION_STATUS_TABLE \u003d 108"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"PHASE_STATE_DIAGRAM \u003d {"},{"line_number":175,"context_line":"    MIGRATION_STATUS_STARTED: {"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_7979acc7","line":172,"range":{"start_line":172,"start_character":0,"end_line":172,"end_character":43},"updated":"2016-08-07 10:35:34.000000000","message":"Will this be in migration_control.py? consider we are not at the end of the cycle.","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6628b53fa323d815d3765f8c84f44008379c9b78","unresolved":false,"context_lines":[{"line_number":169,"context_line":"MIGRATION_STATUS_FORCE_MIGRATE_COMPLETED \u003d \u0027Force Migrate Completed\u0027"},{"line_number":170,"context_line":"MIGRATION_STATUS_COMPLETED \u003d \u0027Completed\u0027"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"VERSION_THAT_CREATES_MIGRATION_STATUS_TABLE \u003d 108"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"PHASE_STATE_DIAGRAM \u003d {"},{"line_number":175,"context_line":"    MIGRATION_STATUS_STARTED: {"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_babe50d2","line":172,"range":{"start_line":172,"start_character":0,"end_line":172,"end_character":43},"in_reply_to":"bacf61ea_7979acc7","updated":"2016-08-08 13:09:06.000000000","message":"No, this never needs changing (once the preceding patch is merged)","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7882793e62ca608ec6c0bcc3f7e5acc20690066b","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        raise RuntimeError"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"def _get_migration_status(driver):"},{"line_number":302,"context_line":"    \"\"\"Get the migration status."},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    Return None if either the table does not exist yet or the row does not yet"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_fc4e2a6d","line":301,"range":{"start_line":301,"start_character":26,"end_line":301,"end_character":32},"updated":"2016-08-07 10:35:34.000000000","message":"driver?","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6628b53fa323d815d3765f8c84f44008379c9b78","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        raise RuntimeError"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"def _get_migration_status(driver):"},{"line_number":302,"context_line":"    \"\"\"Get the migration status."},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    Return None if either the table does not exist yet or the row does not yet"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_7ac5f859","line":301,"range":{"start_line":301,"start_character":26,"end_line":301,"end_character":32},"in_reply_to":"bacf61ea_fc4e2a6d","updated":"2016-08-08 13:09:06.000000000","message":"didn\u0027t know what to call it! It\u0027s kind of a driver!!","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7882793e62ca608ec6c0bcc3f7e5acc20690066b","unresolved":false,"context_lines":[{"line_number":369,"context_line":"    migration_phase.update_migration_status(next_status)"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"def rolling_restart_complete():"},{"line_number":373,"context_line":"    \"\"\"Mark the database phase as all nodes aware of upgrade is complete."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    This is run manually by the keystone-manage command once the"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_dc03660b","line":372,"range":{"start_line":372,"start_character":4,"end_line":372,"end_character":28},"updated":"2016-08-07 10:35:34.000000000","message":"We rely on the operators to maually execute all of these steps on all the nodes and strictly follow the sequence to write the status into DB, or else the final status will be messed up, some nodes may not work as expected. I am gonna say it\u0027s a little fragile.","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6628b53fa323d815d3765f8c84f44008379c9b78","unresolved":false,"context_lines":[{"line_number":369,"context_line":"    migration_phase.update_migration_status(next_status)"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"def rolling_restart_complete():"},{"line_number":373,"context_line":"    \"\"\"Mark the database phase as all nodes aware of upgrade is complete."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    This is run manually by the keystone-manage command once the"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_3af54083","line":372,"range":{"start_line":372,"start_character":4,"end_line":372,"end_character":28},"in_reply_to":"bacf61ea_dc03660b","updated":"2016-08-08 13:09:06.000000000","message":"well, we  rely on them to have restart all the machines before they run this command on one of the machines, true. If they get in a mess...that\u0027s the idea of the naked db_sync command- if all else fails, revert back to an offline upgrade and db_sync will force it through.","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7882793e62ca608ec6c0bcc3f7e5acc20690066b","unresolved":false,"context_lines":[{"line_number":392,"context_line":"    This is run manually by the keystone-manage command once all keystone"},{"line_number":393,"context_line":"    nodes have been migrated to the latest release."},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    This method should ensure all data has been migrated to its new locations"},{"line_number":396,"context_line":"    as well as ensuring that any data inconsistencies that could have been"},{"line_number":397,"context_line":"    created during a rolling upgrade are tidied up."},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    \"\"\""},{"line_number":400,"context_line":"    _assert_under_migration_control()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_3939f4f2","line":397,"range":{"start_line":395,"start_character":0,"end_line":397,"end_character":51},"updated":"2016-08-07 10:35:34.000000000","message":"I am curious how to ensure the data has been migrated correctly, how to identify these column/field efficiently. Do we really need this step?","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6628b53fa323d815d3765f8c84f44008379c9b78","unresolved":false,"context_lines":[{"line_number":392,"context_line":"    This is run manually by the keystone-manage command once all keystone"},{"line_number":393,"context_line":"    nodes have been migrated to the latest release."},{"line_number":394,"context_line":""},{"line_number":395,"context_line":"    This method should ensure all data has been migrated to its new locations"},{"line_number":396,"context_line":"    as well as ensuring that any data inconsistencies that could have been"},{"line_number":397,"context_line":"    created during a rolling upgrade are tidied up."},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    \"\"\""},{"line_number":400,"context_line":"    _assert_under_migration_control()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ad45d7e_9aad4c8b","line":397,"range":{"start_line":395,"start_character":0,"end_line":397,"end_character":51},"in_reply_to":"bacf61ea_3939f4f2","updated":"2016-08-08 13:09:06.000000000","message":"Today we don\u0027t need this step. If we do on-the-fly migration, then we need this step to ensure that any data remaining that has not been on-the-fly migrated (maybe nobody has accessed that entity) is moved across....perhaps before we do the next upgrade.","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7882793e62ca608ec6c0bcc3f7e5acc20690066b","unresolved":false,"context_lines":[{"line_number":425,"context_line":"    else:"},{"line_number":426,"context_line":"        # TODO(henry-nash): Migrate contract repo here."},{"line_number":427,"context_line":"        pass"},{"line_number":428,"context_line":"    next_status \u003d {\u0027current_phase\u0027: MIGRATION_STATUS_COMPLETED,"},{"line_number":429,"context_line":"                   \u0027current_version\u0027: migration_control.LATEST_RELEASE,"},{"line_number":430,"context_line":"                   \u0027migrating_to_version\u0027: migration_control.NO_RELEASE}"},{"line_number":431,"context_line":"    migration_phase.update_migration_status(next_status)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bacf61ea_b97fa4a9","line":430,"range":{"start_line":428,"start_character":0,"end_line":430,"end_character":72},"updated":"2016-08-07 10:35:34.000000000","message":"yep!","commit_id":"c067f3e2c9063d5f006f7aa077aa314aafb91e5a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":163,"context_line":"def offline_sync_database_to_version(version\u003dNone):"},{"line_number":164,"context_line":"    \"\"\"Perform and off-line sync of the database."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    Migrate the database upto the latest version, allowing a migration across"},{"line_number":167,"context_line":"    two release versions. In addition, run all the tidy-up, force data"},{"line_number":168,"context_line":"    migration and contract phases to ensure the resulting database is the same"},{"line_number":169,"context_line":"    irrespective of whether an offline or online (i.e. rolling) upgrade was"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_444ab5c6","line":166,"updated":"2016-08-15 19:35:14.000000000","message":"\"upto\" is not a word.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8f46805556286f9bdb4104dcc06fff7f1914647a","unresolved":false,"context_lines":[{"line_number":163,"context_line":"def offline_sync_database_to_version(version\u003dNone):"},{"line_number":164,"context_line":"    \"\"\"Perform and off-line sync of the database."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    Migrate the database upto the latest version, allowing a migration across"},{"line_number":167,"context_line":"    two release versions. In addition, run all the tidy-up, force data"},{"line_number":168,"context_line":"    migration and contract phases to ensure the resulting database is the same"},{"line_number":169,"context_line":"    irrespective of whether an offline or online (i.e. rolling) upgrade was"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_37308901","line":166,"in_reply_to":"3ac371cc_444ab5c6","updated":"2016-08-15 19:51:51.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    \"\"\"Perform and off-line sync of the database."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    Migrate the database upto the latest version, allowing a migration across"},{"line_number":167,"context_line":"    two release versions. In addition, run all the tidy-up, force data"},{"line_number":168,"context_line":"    migration and contract phases to ensure the resulting database is the same"},{"line_number":169,"context_line":"    irrespective of whether an offline or online (i.e. rolling) upgrade was"},{"line_number":170,"context_line":"    performed."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_6417f1a3","line":167,"updated":"2016-08-15 19:35:14.000000000","message":"We\u0027ve never supported, recommended, or tested the notion of migrating across two releases as a viable upgrade path.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8f46805556286f9bdb4104dcc06fff7f1914647a","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    \"\"\"Perform and off-line sync of the database."},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    Migrate the database upto the latest version, allowing a migration across"},{"line_number":167,"context_line":"    two release versions. In addition, run all the tidy-up, force data"},{"line_number":168,"context_line":"    migration and contract phases to ensure the resulting database is the same"},{"line_number":169,"context_line":"    irrespective of whether an offline or online (i.e. rolling) upgrade was"},{"line_number":170,"context_line":"    performed."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_5736e503","line":167,"in_reply_to":"3ac371cc_6417f1a3","updated":"2016-08-15 19:51:51.000000000","message":"Is that true? I always thought we did support a jump of +2?  If we can confirm that this is not a requirement, I agree we can simplify this nicely.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    Migrate the database upto the latest version, allowing a migration across"},{"line_number":167,"context_line":"    two release versions. In addition, run all the tidy-up, force data"},{"line_number":168,"context_line":"    migration and contract phases to ensure the resulting database is the same"},{"line_number":169,"context_line":"    irrespective of whether an offline or online (i.e. rolling) upgrade was"},{"line_number":170,"context_line":"    performed."},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_24e339a5","line":168,"updated":"2016-08-15 19:35:14.000000000","message":"I\u0027m not sure what you mean when you differentiate between \"tidy-up\" and \"force data migration\". There\u0027s a schema expansion, a data migration, and a schema contraction.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8f46805556286f9bdb4104dcc06fff7f1914647a","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    Migrate the database upto the latest version, allowing a migration across"},{"line_number":167,"context_line":"    two release versions. In addition, run all the tidy-up, force data"},{"line_number":168,"context_line":"    migration and contract phases to ensure the resulting database is the same"},{"line_number":169,"context_line":"    irrespective of whether an offline or online (i.e. rolling) upgrade was"},{"line_number":170,"context_line":"    performed."},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_d722d5b8","line":168,"in_reply_to":"3ac371cc_24e339a5","updated":"2016-08-15 19:51:51.000000000","message":"sorry, old comment. will delete","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        # goals of still supporting the raw db_sync command is to try and"},{"line_number":192,"context_line":"        # force through an off-line upgrade if the operator has run into issues"},{"line_number":193,"context_line":"        # with an on-line rolling upgrade. So instead we duplicate the actions"},{"line_number":194,"context_line":"        # and then stamp the status row at the end."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        # TODO(henry-nash): Call the migration helpers here."},{"line_number":197,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_04039d43","line":194,"updated":"2016-08-15 19:35:14.000000000","message":"status row?","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        # goals of still supporting the raw db_sync command is to try and"},{"line_number":192,"context_line":"        # force through an off-line upgrade if the operator has run into issues"},{"line_number":193,"context_line":"        # with an on-line rolling upgrade. So instead we duplicate the actions"},{"line_number":194,"context_line":"        # and then stamp the status row at the end."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        # TODO(henry-nash): Call the migration helpers here."},{"line_number":197,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_ec9583e4","line":194,"in_reply_to":"3ac371cc_04039d43","updated":"2016-08-15 22:52:20.000000000","message":"removed","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        # with an on-line rolling upgrade. So instead we duplicate the actions"},{"line_number":194,"context_line":"        # and then stamp the status row at the end."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        # TODO(henry-nash): Call the migration helpers here."},{"line_number":197,"context_line":"        pass"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_44fd9539","line":196,"updated":"2016-08-15 19:35:14.000000000","message":"They don\u0027t do anything, anyway, so just call them now.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def migration_expand():"},{"line_number":212,"context_line":"    \"\"\"Expand the database ahead of code upgrade."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    Since we currently do not support on-the-fly migration at the point of"},{"line_number":215,"context_line":"    object access, we run all the migration scripts now."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_a4a44957","line":212,"updated":"2016-08-15 19:35:14.000000000","message":"Expand the database schema*\n\nThe data migration needs to occur before a code upgrade as well, so it might be misleading to mention the code upgrade here.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"def migration_expand():"},{"line_number":212,"context_line":"    \"\"\"Expand the database ahead of code upgrade."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    Since we currently do not support on-the-fly migration at the point of"},{"line_number":215,"context_line":"    object access, we run all the migration scripts now."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_cf023909","line":212,"in_reply_to":"3ac371cc_a4a44957","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":212,"context_line":"    \"\"\"Expand the database ahead of code upgrade."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    Since we currently do not support on-the-fly migration at the point of"},{"line_number":215,"context_line":"    object access, we run all the migration scripts now."},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    This is run manually by the keystone-manage command before the first"},{"line_number":218,"context_line":"    keystone node is migrated to the latest release."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_844aed81","line":215,"updated":"2016-08-15 19:35:14.000000000","message":"Is this an old comment? It\u0027s neither accurate nor relevant with the trigger-based approach.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":212,"context_line":"    \"\"\"Expand the database ahead of code upgrade."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    Since we currently do not support on-the-fly migration at the point of"},{"line_number":215,"context_line":"    object access, we run all the migration scripts now."},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    This is run manually by the keystone-manage command before the first"},{"line_number":218,"context_line":"    keystone node is migrated to the latest release."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_0f0d7137","line":215,"in_reply_to":"3ac371cc_844aed81","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    object access, we run all the migration scripts now."},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    This is run manually by the keystone-manage command before the first"},{"line_number":218,"context_line":"    keystone node is migrated to the latest release."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    \"\"\""},{"line_number":221,"context_line":"    # TODO(henry-nash): Add implementation here."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_d73e55b7","line":218,"updated":"2016-08-15 19:35:14.000000000","message":"\"latest\" is relative, which makes these statements hard to follow (does latest refer to the code branch where you\u0027re reading this, the latest release on openstack.org, or... ?). Using \"previous\" and \"next\" to refer to each release would be more clear.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    object access, we run all the migration scripts now."},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    This is run manually by the keystone-manage command before the first"},{"line_number":218,"context_line":"    keystone node is migrated to the latest release."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    \"\"\""},{"line_number":221,"context_line":"    # TODO(henry-nash): Add implementation here."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_6f14e543","line":218,"in_reply_to":"3ac371cc_d73e55b7","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"def force_migration_complete():"},{"line_number":226,"context_line":"    \"\"\"Tidy the database after migration."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    This is run manually by the keystone-manage command once all keystone"},{"line_number":229,"context_line":"    nodes have been migrated to the latest release."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_e4092133","line":226,"updated":"2016-08-15 19:35:14.000000000","message":"This *is* the data migration, so I don\u0027t understand the contrast to \"after migration.\" I also don\u0027t see this as a \"tidy up\" of any sort - it will be doing the manual labor of migrating data, which may be a quick \"clean up\" (if --expand was run long ago) or may be a complete data migration (if the app is inactive or offline).","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"def force_migration_complete():"},{"line_number":226,"context_line":"    \"\"\"Tidy the database after migration."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    This is run manually by the keystone-manage command once all keystone"},{"line_number":229,"context_line":"    nodes have been migrated to the latest release."}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_af1edd60","line":226,"in_reply_to":"3ac371cc_e4092133","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    \"\"\"Tidy the database after migration."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    This is run manually by the keystone-manage command once all keystone"},{"line_number":229,"context_line":"    nodes have been migrated to the latest release."},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    This method should ensure all data has been migrated to its new locations"},{"line_number":232,"context_line":"    as well as ensuring that any data inconsistencies that could have been"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_f713915a","line":229,"updated":"2016-08-15 19:35:14.000000000","message":"This needs to be run before the latest release is brought online, to ensure that both versions of the application are capable of reading and writing to their own schema.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":226,"context_line":"    \"\"\"Tidy the database after migration."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    This is run manually by the keystone-manage command once all keystone"},{"line_number":229,"context_line":"    nodes have been migrated to the latest release."},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    This method should ensure all data has been migrated to its new locations"},{"line_number":232,"context_line":"    as well as ensuring that any data inconsistencies that could have been"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_8f19617c","line":229,"in_reply_to":"3ac371cc_f713915a","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    nodes have been migrated to the latest release."},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    This method should ensure all data has been migrated to its new locations"},{"line_number":232,"context_line":"    as well as ensuring that any data inconsistencies that could have been"},{"line_number":233,"context_line":"    created during a rolling upgrade are tidied up."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_572b8582","line":232,"updated":"2016-08-15 19:35:14.000000000","message":"I\u0027d remove everything after \"as well as\" because there should not be any possibility for \"inconsistencies.\" If there were, that\u0027d be a critical bug.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    nodes have been migrated to the latest release."},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    This method should ensure all data has been migrated to its new locations"},{"line_number":232,"context_line":"    as well as ensuring that any data inconsistencies that could have been"},{"line_number":233,"context_line":"    created during a rolling upgrade are tidied up."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_cf29998b","line":232,"in_reply_to":"3ac371cc_572b8582","updated":"2016-08-15 22:52:20.000000000","message":"Done","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"c816aef4a6bb545098e5ea83e7d65bbca70e985d","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    _sync_common_repo(version)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    if not version:"},{"line_number":179,"context_line":"        migrate_data()"},{"line_number":180,"context_line":"        contract_schema()"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"def get_db_version():"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_536eeb01","line":180,"range":{"start_line":179,"start_character":8,"end_line":180,"end_character":25},"updated":"2016-08-16 03:51:13.000000000","message":"not a big deal, but shouldn\u0027t \"expand_schema\" be added here?","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"611dd035430cba00ecf7b713e3f3c7c261e12d9d","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    _sync_common_repo(version)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    if not version:"},{"line_number":179,"context_line":"        migrate_data()"},{"line_number":180,"context_line":"        contract_schema()"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"def get_db_version():"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_62e86fb5","line":180,"range":{"start_line":179,"start_character":8,"end_line":180,"end_character":25},"in_reply_to":"3ac371cc_536eeb01","updated":"2016-08-16 07:05:49.000000000","message":"well expand_schema() is the equivalent of the _sync_common_repo(version) above....so we could replace that line (although in this patch did\u0027 want to change the logic too much). Also, was going to perhaps leave expand_schema() without taking a version param, rather than pollute it with old capabilities.","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"79d4b1dcaa9d4f86a17dc9ce43142cadb758b404","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    _sync_common_repo(version)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    if not version:"},{"line_number":179,"context_line":"        migrate_data()"},{"line_number":180,"context_line":"        contract_schema()"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"def get_db_version():"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_fc4062a7","line":180,"range":{"start_line":179,"start_character":8,"end_line":180,"end_character":25},"in_reply_to":"3ac371cc_62e86fb5","updated":"2016-08-16 16:32:40.000000000","message":"I think expand should be a separate repo, but other than that, this looks good.","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"90ad0e1f1cea46fcb67eeee4016a4d780d01d883","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    if not version:"},{"line_number":179,"context_line":"        migrate_data()"},{"line_number":180,"context_line":"        contract_schema()"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"def get_db_version():"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_a89a2561","line":180,"in_reply_to":"3ac371cc_fc4062a7","updated":"2016-08-16 17:34:15.000000000","message":"I agree with Steve and Ron, because expand_schema() should not have anything to do with the legacy migration repository other than that the first expand step must be run after all legacy migrations have run.","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"90ad0e1f1cea46fcb67eeee4016a4d780d01d883","unresolved":false,"context_lines":[{"line_number":220,"context_line":"    nodes have been upgraded to the latest release and will remove any old"},{"line_number":221,"context_line":"    tables/columns that are no longer required. In addition, if any data"},{"line_number":222,"context_line":"    could have been left inconsistent while running with a mix of releases,"},{"line_number":223,"context_line":"    then this should be fixed up here."},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    \"\"\""},{"line_number":226,"context_line":"    # TODO(henry-nash): Add implementation here."}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_c83b2137","line":223,"updated":"2016-08-16 17:34:15.000000000","message":"-1 Absolutely no \"fixing up\" should be required. If we *ever* leave the database in an inconsistent state, we\u0027ve introduced a critical bug in the upgrade process.","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"}],"keystone/tests/unit/test_cli.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b8a6b713c6c7c68f57aec16d4b5732b4b15dc6bf","unresolved":false,"context_lines":[{"line_number":569,"context_line":"            else:"},{"line_number":570,"context_line":"                self.assertFalse(func.called)"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def test_db_sync(self):"},{"line_number":573,"context_line":"        self.useFixture(mockpatch.PatchObject("},{"line_number":574,"context_line":"            CONF, \u0027command\u0027, self.FakeConfCommand(self)))"},{"line_number":575,"context_line":"        cli.DbSync.main()"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_d7dad577","line":572,"updated":"2016-08-15 19:35:14.000000000","message":"In the base case, all 4 functions should be called.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"5854afa6edbb29462d861ac6aae7cc15f2817d97","unresolved":false,"context_lines":[{"line_number":569,"context_line":"            else:"},{"line_number":570,"context_line":"                self.assertFalse(func.called)"},{"line_number":571,"context_line":""},{"line_number":572,"context_line":"    def test_db_sync(self):"},{"line_number":573,"context_line":"        self.useFixture(mockpatch.PatchObject("},{"line_number":574,"context_line":"            CONF, \u0027command\u0027, self.FakeConfCommand(self)))"},{"line_number":575,"context_line":"        cli.DbSync.main()"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ac371cc_8f3041ea","line":572,"in_reply_to":"3ac371cc_d7dad577","updated":"2016-08-15 22:52:20.000000000","message":"Yes (although maybe not expand depending on how we handle the legacy support for expanding to a specific version)....but in any case, I think I\u0027d rather keep the tests here treating the migration_heleprs as a black box.","commit_id":"80c3bad5d8f9d174379ca14456f6d30a008a7ae2"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"cccd14760f127ac2f81d2fd1a28de4a189d1cf93","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        self.command_migrate \u003d False"},{"line_number":560,"context_line":"        self.command_contract \u003d False"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    def _assert_correct_call(self, mocked_function):"},{"line_number":563,"context_line":"        for func in [migration_helpers.offline_sync_database_to_version,"},{"line_number":564,"context_line":"                     migration_helpers.expand_schema,"},{"line_number":565,"context_line":"                     migration_helpers.migrate_data,"}],"source_content_type":"text/x-python","patch_set":14,"id":"3ac371cc_c49b2cc8","line":562,"range":{"start_line":562,"start_character":4,"end_line":562,"end_character":52},"updated":"2016-08-16 08:53:18.000000000","message":"Nice! :)","commit_id":"4569d41e13aa6196311de46cd4dab3449dcac11f"}]}
