)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a2a649642c1e0fc975aea286715b9490f1f9a","unresolved":false,"context_lines":[{"line_number":20,"context_line":" is running on the destinaton host while some if its"},{"line_number":21,"context_line":" memory pages still remain on sourcehost."},{"line_number":22,"context_line":"*VIR_DOMAIN_EVENT_RESUMED_MIGRATED(destination)"},{"line_number":23,"context_line":"*VIR_DOMAIN_EVENT_STOPPED_MIGRATED(source)--migration"},{"line_number":24,"context_line":" finished successfully and the destination host holds"},{"line_number":25,"context_line":" a complete guest state."},{"line_number":26,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"df7087c5_2a5594c6","line":23,"range":{"start_line":23,"start_character":1,"end_line":23,"end_character":34},"updated":"2018-03-12 20:08:22.000000000","message":"Is this supposed to be VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED?","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"}],"nova/compute/manager.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"d9f2bf7732b6434fe941d0a22e262d175c01f633","unresolved":false,"context_lines":[{"line_number":1091,"context_line":"            self._sync_instance_power_state(context,"},{"line_number":1092,"context_line":"                                            instance,"},{"line_number":1093,"context_line":"                                            vm_power_state)"},{"line_number":1094,"context_line":"        if (event.get_transition() \u003d\u003d"},{"line_number":1095,"context_line":"                virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED or"},{"line_number":1096,"context_line":"            event.get_transition() \u003d\u003d"},{"line_number":1097,"context_line":"                    virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_fbdd2971","line":1094,"updated":"2017-03-07 18:41:47.000000000","message":"Maybe we should check the instance is in the migrating state?\n\nA bit like what is done in _sync_instance_power_state:\nhttps://github.com/openstack/nova/blob/63805735c25a54ad1b9b97e05080c1a6153d8e22/nova/compute/manager.py#L6382","commit_id":"eb5e5a443a04a128b44d34bdcca3de48bcbb25ec"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"6fcc26364fb737656d083aecc7e1826118252b1e","unresolved":false,"context_lines":[{"line_number":1091,"context_line":"            self._sync_instance_power_state(context,"},{"line_number":1092,"context_line":"                                            instance,"},{"line_number":1093,"context_line":"                                            vm_power_state)"},{"line_number":1094,"context_line":"        if (event.get_transition() \u003d\u003d"},{"line_number":1095,"context_line":"                virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED or"},{"line_number":1096,"context_line":"            event.get_transition() \u003d\u003d"},{"line_number":1097,"context_line":"                    virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_6887a461","line":1094,"range":{"start_line":1094,"start_character":12,"end_line":1094,"end_character":34},"updated":"2017-03-07 22:57:53.000000000","message":"Why dont you call this method one line above and assign the value to a variable and then just use that in your logic below?","commit_id":"eb5e5a443a04a128b44d34bdcca3de48bcbb25ec"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"d9f2bf7732b6434fe941d0a22e262d175c01f633","unresolved":false,"context_lines":[{"line_number":1098,"context_line":"            status \u003d \u0027running\u0027"},{"line_number":1099,"context_line":"            if (event.get_transition() \u003d\u003d"},{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"},{"line_number":1102,"context_line":"            migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1103,"context_line":"                        context.elevated(), instance.uuid, status)"},{"line_number":1104,"context_line":"            self.network_api.migrate_instance_finish(context, instance,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_fb68c9bc","line":1101,"updated":"2017-03-07 18:41:47.000000000","message":"I think we should add at least a debug log here, saying what we are up to.","commit_id":"eb5e5a443a04a128b44d34bdcca3de48bcbb25ec"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"6fcc26364fb737656d083aecc7e1826118252b1e","unresolved":false,"context_lines":[{"line_number":1098,"context_line":"            status \u003d \u0027running\u0027"},{"line_number":1099,"context_line":"            if (event.get_transition() \u003d\u003d"},{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"},{"line_number":1102,"context_line":"            migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1103,"context_line":"                        context.elevated(), instance.uuid, status)"},{"line_number":1104,"context_line":"            self.network_api.migrate_instance_finish(context, instance,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_0891c899","line":1101,"in_reply_to":"9a30ddce_fb68c9bc","updated":"2017-03-07 22:57:53.000000000","message":"Yea, that would be helpful.","commit_id":"eb5e5a443a04a128b44d34bdcca3de48bcbb25ec"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"d9f2bf7732b6434fe941d0a22e262d175c01f633","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"},{"line_number":1102,"context_line":"            migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1103,"context_line":"                        context.elevated(), instance.uuid, status)"},{"line_number":1104,"context_line":"            self.network_api.migrate_instance_finish(context, instance,"},{"line_number":1105,"context_line":"                                                     migration)"},{"line_number":1106,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_db3a2536","line":1103,"range":{"start_line":1103,"start_character":24,"end_line":1103,"end_character":42},"updated":"2017-03-07 18:41:47.000000000","message":"Is this really needed here?","commit_id":"eb5e5a443a04a128b44d34bdcca3de48bcbb25ec"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"6fcc26364fb737656d083aecc7e1826118252b1e","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"},{"line_number":1102,"context_line":"            migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1103,"context_line":"                        context.elevated(), instance.uuid, status)"},{"line_number":1104,"context_line":"            self.network_api.migrate_instance_finish(context, instance,"},{"line_number":1105,"context_line":"                                                     migration)"},{"line_number":1106,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a30ddce_08e8e80f","line":1103,"range":{"start_line":1103,"start_character":24,"end_line":1103,"end_character":42},"in_reply_to":"9a30ddce_db3a2536","updated":"2017-03-07 22:57:53.000000000","message":"+1","commit_id":"eb5e5a443a04a128b44d34bdcca3de48bcbb25ec"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"c518df8b88a1b1788fdf89103a942c2823b800c8","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1065,"context_line":"        elif (event.get_transition() \u003d\u003d virtevent."},{"line_number":1066,"context_line":"                EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1067,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1068,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1069,"context_line":"            vm_power_state \u003d power_state.RUNNING"},{"line_number":1070,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_SUSPENDED:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_db2cd74c","line":1067,"range":{"start_line":1067,"start_character":12,"end_line":1067,"end_character":47},"updated":"2017-03-15 20:13:35.000000000","message":"is this true?","commit_id":"b2814781c3e2868dc135208fd165cff0a5d7abb6"},{"author":{"_account_id":18339,"name":"Sivasathurappan Radhakrishnan","email":"siva.radhakrishnan@intel.com","username":"sivakrishnan"},"change_message_id":"43764a180f7a914e19be10eb475fe8beb4602121","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1065,"context_line":"        elif (event.get_transition() \u003d\u003d virtevent."},{"line_number":1066,"context_line":"                EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1067,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1068,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1069,"context_line":"            vm_power_state \u003d power_state.RUNNING"},{"line_number":1070,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_SUSPENDED:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_32697e26","line":1067,"range":{"start_line":1067,"start_character":12,"end_line":1067,"end_character":47},"in_reply_to":"3a1ff146_db2cd74c","updated":"2017-03-16 07:28:55.000000000","message":"yes, VM gets paused in source and gets resumed at destination. That is how precopy migration works currently. https://github.com/libvirt/libvirt/blob/0857a3bf5ceff01a62593a5e3389246948dd11a4/src/qemu/qemu_process.c#L705","commit_id":"b2814781c3e2868dc135208fd165cff0a5d7abb6"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"c518df8b88a1b1788fdf89103a942c2823b800c8","unresolved":false,"context_lines":[{"line_number":1099,"context_line":"            if (event_transition \u003d\u003d"},{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"},{"line_number":1102,"context_line":"            LOG.debug(\u0027Updating port binding of the instance\u0027)"},{"line_number":1103,"context_line":"            migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1104,"context_line":"                        context, instance.uuid, status)"},{"line_number":1105,"context_line":"            self.network_api.migrate_instance_finish(context, instance,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_bb19db7b","line":1102,"range":{"start_line":1102,"start_character":23,"end_line":1102,"end_character":61},"updated":"2017-03-15 20:13:35.000000000","message":"Good to log instance id here.","commit_id":"b2814781c3e2868dc135208fd165cff0a5d7abb6"},{"author":{"_account_id":18339,"name":"Sivasathurappan Radhakrishnan","email":"siva.radhakrishnan@intel.com","username":"sivakrishnan"},"change_message_id":"43764a180f7a914e19be10eb475fe8beb4602121","unresolved":false,"context_lines":[{"line_number":1099,"context_line":"            if (event_transition \u003d\u003d"},{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"},{"line_number":1102,"context_line":"            LOG.debug(\u0027Updating port binding of the instance\u0027)"},{"line_number":1103,"context_line":"            migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1104,"context_line":"                        context, instance.uuid, status)"},{"line_number":1105,"context_line":"            self.network_api.migrate_instance_finish(context, instance,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a1ff146_52c99a77","line":1102,"range":{"start_line":1102,"start_character":23,"end_line":1102,"end_character":61},"in_reply_to":"3a1ff146_bb19db7b","updated":"2017-03-16 07:28:55.000000000","message":"Done","commit_id":"b2814781c3e2868dc135208fd165cff0a5d7abb6"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"f8c16d0e6f3d347c8670e6f05414a36b1668cef2","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"            vm_power_state \u003d power_state.SHUTDOWN"},{"line_number":1058,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_STARTED:"},{"line_number":1059,"context_line":"            vm_power_state \u003d power_state.RUNNING"},{"line_number":1060,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_PAUSED:"},{"line_number":1061,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1062,"context_line":"        elif (event.get_transition() \u003d\u003d virtevent."},{"line_number":1063,"context_line":"                EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1064,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1065,"context_line":"        elif (event.get_transition() \u003d\u003d virtevent."},{"line_number":1066,"context_line":"                EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1067,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1068,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1069,"context_line":"            vm_power_state \u003d power_state.RUNNING"},{"line_number":1070,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_SUSPENDED:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a1ced50_00a94090","line":1067,"range":{"start_line":1060,"start_character":8,"end_line":1067,"end_character":47},"updated":"2017-03-21 19:21:49.000000000","message":"You can merge all these checks into same elif block.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"08de396264b449ee6c8194969dffb8405f87508c","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"            vm_power_state \u003d power_state.SHUTDOWN"},{"line_number":1058,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_STARTED:"},{"line_number":1059,"context_line":"            vm_power_state \u003d power_state.RUNNING"},{"line_number":1060,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_PAUSED:"},{"line_number":1061,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1062,"context_line":"        elif (event.get_transition() \u003d\u003d virtevent."},{"line_number":1063,"context_line":"                EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1064,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1065,"context_line":"        elif (event.get_transition() \u003d\u003d virtevent."},{"line_number":1066,"context_line":"                EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1067,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1068,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1069,"context_line":"            vm_power_state \u003d power_state.RUNNING"},{"line_number":1070,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_SUSPENDED:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_d9d53be7","line":1067,"range":{"start_line":1060,"start_character":8,"end_line":1067,"end_character":47},"in_reply_to":"1a1ced50_00a94090","updated":"2017-05-16 13:51:42.000000000","message":"+1","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a2a649642c1e0fc975aea286715b9490f1f9a","unresolved":false,"context_lines":[{"line_number":1057,"context_line":"            vm_power_state \u003d power_state.SHUTDOWN"},{"line_number":1058,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_STARTED:"},{"line_number":1059,"context_line":"            vm_power_state \u003d power_state.RUNNING"},{"line_number":1060,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_PAUSED:"},{"line_number":1061,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1062,"context_line":"        elif (event.get_transition() \u003d\u003d virtevent."},{"line_number":1063,"context_line":"                EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1064,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1065,"context_line":"        elif (event.get_transition() \u003d\u003d virtevent."},{"line_number":1066,"context_line":"                EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1067,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1068,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1069,"context_line":"            vm_power_state \u003d power_state.RUNNING"},{"line_number":1070,"context_line":"        elif event.get_transition() \u003d\u003d virtevent.EVENT_LIFECYCLE_SUSPENDED:"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_77b29996","line":1067,"range":{"start_line":1060,"start_character":8,"end_line":1067,"end_character":47},"in_reply_to":"1f013ff3_d9d53be7","updated":"2018-03-12 20:08:22.000000000","message":"Done","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"9d74bd7a47c44d2b3bbac75efa400bf4a7a98a31","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"        if instance.task_state \u003d\u003d task_states.MIGRATING and ("},{"line_number":1096,"context_line":"            event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED or"},{"line_number":1097,"context_line":"            event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1098,"context_line":"            status \u003d \u0027running\u0027"},{"line_number":1099,"context_line":"            if (event_transition \u003d\u003d"},{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a1ff146_17229f00","line":1098,"range":{"start_line":1098,"start_character":12,"end_line":1098,"end_character":30},"updated":"2017-03-16 15:30:06.000000000","message":"I will make this as else block of if statement below and add a comment that \"This code flow is part of pre-copy.\" That will be more clear for the reviewer.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"08de396264b449ee6c8194969dffb8405f87508c","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"        if instance.task_state \u003d\u003d task_states.MIGRATING and ("},{"line_number":1096,"context_line":"            event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED or"},{"line_number":1097,"context_line":"            event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1098,"context_line":"            status \u003d \u0027running\u0027"},{"line_number":1099,"context_line":"            if (event_transition \u003d\u003d"},{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_b9c70f13","line":1098,"range":{"start_line":1098,"start_character":12,"end_line":1098,"end_character":30},"in_reply_to":"1a1ced50_9a2510c4","updated":"2017-05-16 13:51:42.000000000","message":"Agree, can be something like:\n\n        migrate_finish_statuses  \u003d {\n            virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED: \u0027running\u0027,\n            virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED: \u0027running (post-copy)\u0027\n        }\n        if instance.task_state \u003d\u003d task_states.MIGRATING and\n            event_transition in migrate_finish_statuses.keys():\n            status \u003d migration.status[event_transition]\n\nevent_transition variable can be moved upped and be used in all previous checks.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a2a649642c1e0fc975aea286715b9490f1f9a","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"        if instance.task_state \u003d\u003d task_states.MIGRATING and ("},{"line_number":1096,"context_line":"            event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED or"},{"line_number":1097,"context_line":"            event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1098,"context_line":"            status \u003d \u0027running\u0027"},{"line_number":1099,"context_line":"            if (event_transition \u003d\u003d"},{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_ca73b8b0","line":1098,"range":{"start_line":1098,"start_character":12,"end_line":1098,"end_character":30},"in_reply_to":"1f013ff3_b9c70f13","updated":"2018-03-12 20:08:22.000000000","message":"Done","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":18339,"name":"Sivasathurappan Radhakrishnan","email":"siva.radhakrishnan@intel.com","username":"sivakrishnan"},"change_message_id":"027e5458e4e380cba01c3cfd46060445d0605d28","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"        if instance.task_state \u003d\u003d task_states.MIGRATING and ("},{"line_number":1096,"context_line":"            event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED or"},{"line_number":1097,"context_line":"            event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1098,"context_line":"            status \u003d \u0027running\u0027"},{"line_number":1099,"context_line":"            if (event_transition \u003d\u003d"},{"line_number":1100,"context_line":"                    virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED):"},{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a1ced50_9a2510c4","line":1098,"range":{"start_line":1098,"start_character":12,"end_line":1098,"end_character":30},"in_reply_to":"3a1ff146_17229f00","updated":"2017-03-17 18:03:24.000000000","message":"Thanks for the review Raj! yeah you are right. That makes code look cleaner and understandable. Will do these changes as part of next patchset. waiting for few more reviews.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a2a649642c1e0fc975aea286715b9490f1f9a","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"                status \u003d \u0027running (post-copy)\u0027"},{"line_number":1102,"context_line":"            LOG.debug(\u0027Updating port binding of the instance\u0027,"},{"line_number":1103,"context_line":"                      instance\u003dinstance)"},{"line_number":1104,"context_line":"            migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1105,"context_line":"                        context, instance.uuid, status)"},{"line_number":1106,"context_line":"            self.network_api.migrate_instance_finish(context, instance,"},{"line_number":1107,"context_line":"                                                     migration)"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_aa70c4a6","line":1104,"range":{"start_line":1104,"start_character":42,"end_line":1104,"end_character":68},"updated":"2018-03-12 20:08:22.000000000","message":"Should probably handle this raising MigrationNotFoundByStatus in case we are racing.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"75d7da59f9b20d4482df09ddecd9a54493975d16","unresolved":false,"context_lines":[{"line_number":1114,"context_line":"                            context, instance.uuid, status)"},{"line_number":1115,"context_line":"                LOG.debug(\u0027Updating port binding of the instance\u0027,"},{"line_number":1116,"context_line":"                          instance\u003dinstance)"},{"line_number":1117,"context_line":"                self.network_api.migrate_instance_finish(context, instance,"},{"line_number":1118,"context_line":"                                                         migration)"},{"line_number":1119,"context_line":"            except exception.MigrationNotFoundByStatus:"},{"line_number":1120,"context_line":"                LOG.warning(\"Unable to find migration record with status \""}],"source_content_type":"text/x-python","patch_set":8,"id":"df7087c5_6be1372a","line":1117,"range":{"start_line":1117,"start_character":33,"end_line":1117,"end_character":56},"updated":"2018-03-13 12:54:47.000000000","message":"I wonder if instead of this method, we should call a new method which just activates the port bindings for the destination host. During a live migration, the migrate_data.vifs field would have the port bindings for the destination host, but we could also find them by just getting port bindings for the instance against the destination host and change those to active.","commit_id":"78800d1c4e34886ae34f46f5ec4515852ca5d076"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd64286945ad05ac01127dd5480a295efc3ea3a9","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"                # attached to the instance. Something like:"},{"line_number":1124,"context_line":"                # self.network_api.activate_port_bindings_for_host("},{"line_number":1125,"context_line":"                #   context, instance, migration.dest_compute)"},{"line_number":1126,"context_line":"                self.network_api.migrate_instance_finish(context, instance,"},{"line_number":1127,"context_line":"                                                         migration)"},{"line_number":1128,"context_line":"            except exception.MigrationNotFoundByStatus:"},{"line_number":1129,"context_line":"                LOG.warning(\"Unable to find migration record with status \""}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_5772437e","line":1126,"updated":"2018-03-19 19:43:36.000000000","message":"This is causing post live migration to blow up:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_09_441129\n\nMar 19 14:25:09.441129 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]: ERROR nova.compute.manager [instance: 6347c3ea-894c-4cc8-a3b4-ea9bfe49033e] \nMar 19 14:25:09.667798 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]: Traceback (most recent call last):\nMar 19 14:25:09.668082 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/usr/local/lib/python2.7/dist-packages/eventlet/queue.py\", line 118, in switch\nMar 19 14:25:09.668333 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     self.greenlet.switch(value)\nMar 19 14:25:09.668556 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/utils.py\", line 894, in context_wrapper\nMar 19 14:25:09.668786 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     func(*args, **kwargs)\nMar 19 14:25:09.669001 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/compute/manager.py\", line 6156, in dispatch_live_migration\nMar 19 14:25:09.669217 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     self._do_live_migration(*args, **kwargs)\nMar 19 14:25:09.669430 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/compute/manager.py\", line 6135, in _do_live_migration\nMar 19 14:25:09.669643 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     clean_task_state\u003dTrue)\nMar 19 14:25:09.669857 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/usr/local/lib/python2.7/dist-packages/oslo_utils/excutils.py\", line 220, in __exit__\nMar 19 14:25:09.670070 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     self.force_reraise()\nMar 19 14:25:09.670283 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/usr/local/lib/python2.7/dist-packages/oslo_utils/excutils.py\", line 196, in force_reraise\nMar 19 14:25:09.670503 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     six.reraise(self.type_, self.value, self.tb)\nMar 19 14:25:09.670760 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/compute/manager.py\", line 6124, in _do_live_migration\nMar 19 14:25:09.671007 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     block_migration, migrate_data)\nMar 19 14:25:09.671227 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/virt/libvirt/driver.py\", line 6889, in live_migration\nMar 19 14:25:09.671440 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     migrate_data)\nMar 19 14:25:09.671654 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/virt/libvirt/driver.py\", line 7399, in _live_migration\nMar 19 14:25:09.671868 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     finish_event, disk_paths)\nMar 19 14:25:09.672083 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/virt/libvirt/driver.py\", line 7310, in _live_migration_monitor\nMar 19 14:25:09.672297 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     migrate_data)\nMar 19 14:25:09.672503 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/exception_wrapper.py\", line 76, in wrapped\nMar 19 14:25:09.672716 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     function_name, call_dict, binary)\nMar 19 14:25:09.672927 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/usr/local/lib/python2.7/dist-packages/oslo_utils/excutils.py\", line 220, in __exit__\nMar 19 14:25:09.673131 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     self.force_reraise()\nMar 19 14:25:09.673337 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/usr/local/lib/python2.7/dist-packages/oslo_utils/excutils.py\", line 196, in force_reraise\nMar 19 14:25:09.673545 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     six.reraise(self.type_, self.value, self.tb)\nMar 19 14:25:09.673752 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/exception_wrapper.py\", line 67, in wrapped\nMar 19 14:25:09.673968 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     return f(self, context, *args, **kw)\nMar 19 14:25:09.674182 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/compute/manager.py\", line 214, in decorated_function\nMar 19 14:25:09.674406 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     kwargs[\u0027instance\u0027], e, sys.exc_info())\nMar 19 14:25:09.674618 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/usr/local/lib/python2.7/dist-packages/oslo_utils/excutils.py\", line 220, in __exit__\nMar 19 14:25:09.674821 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     self.force_reraise()\nMar 19 14:25:09.675044 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/usr/local/lib/python2.7/dist-packages/oslo_utils/excutils.py\", line 196, in force_reraise\nMar 19 14:25:09.675251 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     six.reraise(self.type_, self.value, self.tb)\nMar 19 14:25:09.675454 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/compute/manager.py\", line 202, in decorated_function\nMar 19 14:25:09.675671 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     return function(self, context, *args, **kwargs)\nMar 19 14:25:09.675884 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/compute/manager.py\", line 6328, in _post_live_migration\nMar 19 14:25:09.676095 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     network_info)\nMar 19 14:25:09.676313 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/virt/libvirt/driver.py\", line 7796, in post_live_migration_at_source\nMar 19 14:25:09.676525 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     self.unplug_vifs(instance, network_info)\nMar 19 14:25:09.676737 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/virt/libvirt/driver.py\", line 860, in unplug_vifs\nMar 19 14:25:09.676949 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     self._unplug_vifs(instance, network_info, False)\nMar 19 14:25:09.677163 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/virt/libvirt/driver.py\", line 854, in _unplug_vifs\nMar 19 14:25:09.677375 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     self.vif_driver.unplug(instance, vif)\nMar 19 14:25:09.677741 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/virt/libvirt/vif.py\", line 921, in unplug\nMar 19 14:25:09.678001 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     vif_obj \u003d os_vif_util.nova_to_osvif_vif(vif)\nMar 19 14:25:09.678227 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:   File \"/opt/stack/new/nova/nova/network/os_vif_util.py\", line 492, in nova_to_osvif_vif\nMar 19 14:25:09.678441 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]:     {\u0027type\u0027: vif[\u0027type\u0027], \u0027func\u0027: funcname})\nMar 19 14:25:09.678653 ubuntu-xenial-rax-dfw-0003055554 nova-compute[29059]: NovaException: Unsupported VIF type unbound convert \u0027_nova_to_osvif_vif_unbound\u0027\n\nThis event handler runs here:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_06_588166\n\nConcurrently, _post_live_migration refreshes the network info cache:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_06_819694\n\nAnd after that, the migrate_instance_finish call is still running here, changing the port to be unbound:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_06_838681\n\nWe\u0027re also getting some network-vif-plugged events:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_07_796984\n\nAnd network-vif-unplugged events:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_07_840627\n\nSomething refreshes the network info cache and at that point the port is unbound:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_09_330452\n\nThen the compute manager\u0027s _post_live_migration() method calls the libvirt driver\u0027s post_live_migration_at_source() method but the port is unbound at that point, so we blow up:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_09_424544\n\nI\u0027m not sure what\u0027s unplugging the VIF before we get to calling the post_live_migration_at_source() method. I\u0027m wondering if the port binding changes are changing the port status from ACTIVE-\u003eDOWN and that\u0027s triggering a network-vif-unplugged event:\n\nhttps://github.com/openstack/neutron/blob/f2dced777acb7d87dc7048c3efec59dadf37930d/neutron/notifiers/nova.py#L186","commit_id":"7c685101028f5a0feac74dce373b180478b9abb1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"176893d7a69a7cb80f55367f06ed7e4a329b52cc","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"                # attached to the instance. Something like:"},{"line_number":1124,"context_line":"                # self.network_api.activate_port_bindings_for_host("},{"line_number":1125,"context_line":"                #   context, instance, migration.dest_compute)"},{"line_number":1126,"context_line":"                self.network_api.migrate_instance_finish(context, instance,"},{"line_number":1127,"context_line":"                                                         migration)"},{"line_number":1128,"context_line":"            except exception.MigrationNotFoundByStatus:"},{"line_number":1129,"context_line":"                LOG.warning(\"Unable to find migration record with status \""}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_12937951","line":1126,"in_reply_to":"df7087c5_5772437e","updated":"2018-03-19 20:36:46.000000000","message":"To tie in the neutron agent logs, from the source host this event handler calls migrate_instance_finish here:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-n-cpu.txt.gz#_Mar_19_14_25_06_838681\n\nAnd 2 seconds later the source host agent changes the binding and status to DOWN:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/screen-q-agt.txt.gz#_Mar_19_14_25_08_374523\n\nThat same message is also on the dest host neutron agent:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-q-agt.txt.gz#_Mar_19_14_25_08_371208\n\nWhat I\u0027m confused about is why the port is considered unbound, both on the source and dest:\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/screen-q-agt.txt.gz#_Mar_19_14_25_08_821754\n\nhttp://logs.openstack.org/71/551371/6/check/legacy-tempest-dsvm-multinode-live-migration/4d466b2/logs/subnode-2/screen-q-agt.txt.gz#_Mar_19_14_25_09_150483","commit_id":"7c685101028f5a0feac74dce373b180478b9abb1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"776eed52b465071d060dcbd9773f1683483b879e","unresolved":false,"context_lines":[{"line_number":1123,"context_line":"                # attached to the instance. Something like:"},{"line_number":1124,"context_line":"                # self.network_api.activate_port_bindings_for_host("},{"line_number":1125,"context_line":"                #   context, instance, migration.dest_compute)"},{"line_number":1126,"context_line":"                LOG.info(\u0027TODO: figure out what to do about port bindings\u0027)"},{"line_number":1127,"context_line":"                # self.network_api.migrate_instance_finish(context, instance,"},{"line_number":1128,"context_line":"                #                                          migration)"},{"line_number":1129,"context_line":"            except exception.MigrationNotFoundByStatus:"}],"source_content_type":"text/x-python","patch_set":12,"id":"df7087c5_af0b2022","line":1126,"updated":"2018-03-20 21:59:59.000000000","message":"http://logs.openstack.org/73/552173/5/check/legacy-tempest-dsvm-multinode-live-migration/f1afe92/logs/screen-n-cpu.txt.gz#_Mar_19_23_10_04_937902","commit_id":"595bd0373bfc486448bc74cf5a3dccec14ea8ff3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9a5deca9e976972f9c3766cbe1b6a5f1f8f29dec","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"        context \u003d nova.context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1048,"context_line":"        instance \u003d objects.Instance.get_by_uuid(context,"},{"line_number":1049,"context_line":"                                                event.get_instance_uuid(),"},{"line_number":1050,"context_line":"                                                expected_attrs\u003d[])"},{"line_number":1051,"context_line":"        vm_power_state \u003d None"},{"line_number":1052,"context_line":"        event_transition \u003d event.get_transition()"},{"line_number":1053,"context_line":"        if event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_STOPPED:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9f6a8fd7_7d2e6ffb","line":1050,"updated":"2018-04-26 12:09:06.000000000","message":"This needs to include \u0027info_cache\u0027 because migrate_instance_start uses that:\n\nhttp://logs.openstack.org/37/522537/24/check/legacy-tempest-dsvm-multinode-live-migration/71b1e6b/logs/screen-n-cpu.txt.gz#_Apr_25_23_07_18_613951\n\nApr 25 23:07:18.613951 ubuntu-xenial-rax-ord-0003742169 nova-compute[32415]: DEBUG nova.objects.instance [None req-356b7a08-e144-462b-b992-0853b9061867 service nova] Lazy-loading \u0027info_cache\u0027 on Instance uuid 46c63eea-4724-4cf5-9925-497679cb6e23 {{(pid\u003d32415) obj_load_attr /opt/stack/new/nova/nova/objects/instance.py:1077}}","commit_id":"5b3c89de51856905538839994ebcf1402ad3acd9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9a5deca9e976972f9c3766cbe1b6a5f1f8f29dec","unresolved":false,"context_lines":[{"line_number":1103,"context_line":"            try:"},{"line_number":1104,"context_line":"                migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1105,"context_line":"                            context, instance.uuid, status)"},{"line_number":1106,"context_line":"                LOG.debug(\u0027Binding ports to destination host: %s\u0027,"},{"line_number":1107,"context_line":"                          migration.dest_compute, instance\u003dinstance)"},{"line_number":1108,"context_line":"                # For neutron, migrate_instance_start will activate the"},{"line_number":1109,"context_line":"                # destination host port bindings, if there are any created by"}],"source_content_type":"text/x-python","patch_set":26,"id":"9f6a8fd7_1dfe536b","line":1106,"updated":"2018-04-26 12:09:06.000000000","message":"This is working properly now, as seen in the live migration run in the patch at the top of the series that turns this on:\n\nhttp://logs.openstack.org/37/522537/24/check/legacy-tempest-dsvm-multinode-live-migration/71b1e6b/logs/screen-n-cpu.txt.gz#_Apr_25_23_07_18_422885\n\nApr 25 23:07:18.422885 ubuntu-xenial-rax-ord-0003742169 nova-compute[32415]: DEBUG nova.virt.driver [None req-356b7a08-e144-462b-b992-0853b9061867 service nova] Emitting event \u003cLifecycleEvent: 1524697638.42, 46c63eea-4724-4cf5-9925-497679cb6e23 \u003d\u003e Migration completed\u003e {{(pid\u003d32415) emit_event /opt/stack/new/nova/nova/virt/driver.py:1531}}\n\n...\n\nApr 25 23:07:18.613579 ubuntu-xenial-rax-ord-0003742169 nova-compute[32415]: DEBUG nova.compute.manager [None req-356b7a08-e144-462b-b992-0853b9061867 service nova] [instance: 46c63eea-4724-4cf5-9925-497679cb6e23] Binding ports to destination host: ubuntu-xenial-rax-ord-0003742293 {{(pid\u003d32415) handle_lifecycle_event /opt/stack/new/nova/nova/compute/manager.py:1107}}","commit_id":"5b3c89de51856905538839994ebcf1402ad3acd9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fe5cb285c74ebaee17b732ccfc3d8d23978b2148","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                 {\u0027state\u0027: event.get_name()},"},{"line_number":1052,"context_line":"                 instance_uuid\u003devent.get_instance_uuid())"},{"line_number":1053,"context_line":"        context \u003d nova.context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1054,"context_line":"        # Join on info_cache since that\u0027s needed in migrate_instance_start."},{"line_number":1055,"context_line":"        instance \u003d objects.Instance.get_by_uuid(context,"},{"line_number":1056,"context_line":"                                                event.get_instance_uuid(),"},{"line_number":1057,"context_line":"                                                expected_attrs\u003d[\u0027info_cache\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_ffd1c15b","line":1054,"updated":"2018-07-25 15:30:53.000000000","message":"Okay, but the migration cases are by far the least likely reason to get an instance lifecycle event. Shouldn\u0027t we just let that lazy-load in that case so we don\u0027t penalize all lifecycle event processing? Alternatively, we could move this to after we examine the lifecycle event and only load it if we\u0027re likely to need it (i.e. event_transition in migrate_finish_statuses)?","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3af0ecfcb85373525e1c168e64a8a971eb423b82","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                 {\u0027state\u0027: event.get_name()},"},{"line_number":1052,"context_line":"                 instance_uuid\u003devent.get_instance_uuid())"},{"line_number":1053,"context_line":"        context \u003d nova.context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1054,"context_line":"        # Join on info_cache since that\u0027s needed in migrate_instance_start."},{"line_number":1055,"context_line":"        instance \u003d objects.Instance.get_by_uuid(context,"},{"line_number":1056,"context_line":"                                                event.get_instance_uuid(),"},{"line_number":1057,"context_line":"                                                expected_attrs\u003d[\u0027info_cache\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_bee48ba9","line":1054,"in_reply_to":"5f7c97a3_4fc4a760","updated":"2018-07-26 18:12:02.000000000","message":"Done","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"78813d09bd34f2489ad06eefaaaa722544433965","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                 {\u0027state\u0027: event.get_name()},"},{"line_number":1052,"context_line":"                 instance_uuid\u003devent.get_instance_uuid())"},{"line_number":1053,"context_line":"        context \u003d nova.context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1054,"context_line":"        # Join on info_cache since that\u0027s needed in migrate_instance_start."},{"line_number":1055,"context_line":"        instance \u003d objects.Instance.get_by_uuid(context,"},{"line_number":1056,"context_line":"                                                event.get_instance_uuid(),"},{"line_number":1057,"context_line":"                                                expected_attrs\u003d[\u0027info_cache\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_b9d7ce50","line":1054,"in_reply_to":"5f7c97a3_54b0d7fd","updated":"2018-07-26 13:27:57.000000000","message":"Lazy load feels like a performance optimization that can be done later, separately.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"571ae1024b73f6552713564cca68e4d80e815d7b","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                 {\u0027state\u0027: event.get_name()},"},{"line_number":1052,"context_line":"                 instance_uuid\u003devent.get_instance_uuid())"},{"line_number":1053,"context_line":"        context \u003d nova.context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1054,"context_line":"        # Join on info_cache since that\u0027s needed in migrate_instance_start."},{"line_number":1055,"context_line":"        instance \u003d objects.Instance.get_by_uuid(context,"},{"line_number":1056,"context_line":"                                                event.get_instance_uuid(),"},{"line_number":1057,"context_line":"                                                expected_attrs\u003d[\u0027info_cache\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_4fc4a760","line":1054,"in_reply_to":"5f7c97a3_b9d7ce50","updated":"2018-07-26 14:36:09.000000000","message":"+1","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5c4170304f42d3953040abdb18d4667945c610a0","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"                 {\u0027state\u0027: event.get_name()},"},{"line_number":1052,"context_line":"                 instance_uuid\u003devent.get_instance_uuid())"},{"line_number":1053,"context_line":"        context \u003d nova.context.get_admin_context(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1054,"context_line":"        # Join on info_cache since that\u0027s needed in migrate_instance_start."},{"line_number":1055,"context_line":"        instance \u003d objects.Instance.get_by_uuid(context,"},{"line_number":1056,"context_line":"                                                event.get_instance_uuid(),"},{"line_number":1057,"context_line":"                                                expected_attrs\u003d[\u0027info_cache\u0027])"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_54b0d7fd","line":1054,"in_reply_to":"5f7c97a3_ffd1c15b","updated":"2018-07-25 18:42:05.000000000","message":"\u003e Shouldn\u0027t we just let that lazy-load in that case so we don\u0027t penalize all lifecycle event processing?\n\nWe could, and that\u0027s what it was doing before I added this.\n\n\u003e Alternatively, we could move this to after we examine the lifecycle event and only load it if we\u0027re likely to need it (i.e. event_transition in migrate_finish_statuses)?\n\nYup, could also do that which makes the logic a tiny bit more complicated but not really an issue to change it that way. I just wasn\u0027t sure if it was worth splitting those hairs since by default we always join on info_cache anyway in the DB API, this was just one of the rare places where we actually passed expected_attrs\u003d[] to not do the default join.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fe5cb285c74ebaee17b732ccfc3d8d23978b2148","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        elif event_transition in ("},{"line_number":1065,"context_line":"                virtevent.EVENT_LIFECYCLE_PAUSED,"},{"line_number":1066,"context_line":"                virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED,"},{"line_number":1067,"context_line":"                virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1068,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1069,"context_line":"        elif event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1070,"context_line":"            vm_power_state \u003d power_state.RUNNING"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_5f955593","line":1067,"updated":"2018-07-25 15:30:53.000000000","message":"I\u0027m confused about this change. Presumably right now we\u0027re logging \"Unexpected lifecycle event\" for these even though they can happen right? I assume that means we\u0027re ignoring them (i.e. not doing self._sync_instance_power_state()) but we might do that after this change, right? Seems like we probably should be ignoring (but not logging) these while the migration is going on.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5c4170304f42d3953040abdb18d4667945c610a0","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        elif event_transition in ("},{"line_number":1065,"context_line":"                virtevent.EVENT_LIFECYCLE_PAUSED,"},{"line_number":1066,"context_line":"                virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED,"},{"line_number":1067,"context_line":"                virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1068,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1069,"context_line":"        elif event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1070,"context_line":"            vm_power_state \u003d power_state.RUNNING"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_748153fa","line":1067,"in_reply_to":"5f7c97a3_5f955593","updated":"2018-07-25 18:42:05.000000000","message":"\u003e Presumably right now we\u0027re logging \"Unexpected lifecycle event\" for these even though they can happen right?\n\nDo you mean before this code change? If so, then no, because the virt driver wouldn\u0027t call the callback method here, but now it will because we\u0027re listening for these events:\n\nhttps://review.openstack.org/#/c/434870/37/nova/virt/libvirt/host.py\n\n\u003e I assume that means we\u0027re ignoring them (i.e. not doing self._sync_instance_power_state()) but we might do that after this change, right? Seems like we probably should be ignoring (but not logging) these while the migration is going on.\n\nI\u0027m not following you here.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7b48ba78b009875f67e6074f6a0941db44364c92","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        elif event_transition in ("},{"line_number":1065,"context_line":"                virtevent.EVENT_LIFECYCLE_PAUSED,"},{"line_number":1066,"context_line":"                virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED,"},{"line_number":1067,"context_line":"                virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1068,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1069,"context_line":"        elif event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1070,"context_line":"            vm_power_state \u003d power_state.RUNNING"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_f40ead3b","line":1067,"in_reply_to":"5f7c97a3_748153fa","updated":"2018-07-26 13:55:25.000000000","message":"\u003e \u003e Presumably right now we\u0027re logging \"Unexpected lifecycle event\"\n \u003e for these even though they can happen right?\n \u003e \n \u003e Do you mean before this code change? If so, then no, because the\n \u003e virt driver wouldn\u0027t call the callback method here, but now it will\n \u003e because we\u0027re listening for these events:\n \u003e \n \u003e https://review.openstack.org/#/c/434870/37/nova/virt/libvirt/host.py\n\nAh okay I see.\n\n \u003e \u003e I assume that means we\u0027re ignoring them (i.e. not doing\n \u003e self._sync_instance_power_state()) but we might do that after this\n \u003e change, right? Seems like we probably should be ignoring (but not\n \u003e logging) these while the migration is going on.\n \u003e \n \u003e I\u0027m not following you here.\n\nWell, I\u0027m just not sure why we need to do the _get_power_state() and sync_power_state() dance for this. Since these new transitions are very temporary and very libvirt-specific, it just seems like we should ignore them in the \"does this change our nova state\" calculation. I understand why we need to do the migration bit below.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ae99957e2cc0c7cc8e4510c57caa76f8eb3b8d87","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        elif event_transition in ("},{"line_number":1065,"context_line":"                virtevent.EVENT_LIFECYCLE_PAUSED,"},{"line_number":1066,"context_line":"                virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED,"},{"line_number":1067,"context_line":"                virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1068,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1069,"context_line":"        elif event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1070,"context_line":"            vm_power_state \u003d power_state.RUNNING"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_cfc6779d","line":1067,"in_reply_to":"5f7c97a3_af9d3c59","updated":"2018-07-26 14:23:22.000000000","message":"From a CI run that hits this path, the sync method will noop quickly b/c there is a pending task_state on the instance:\n\nhttp://logs.openstack.org/37/522537/35/check/nova-live-migration/bc8cfc6/logs/screen-n-cpu.txt.gz#_Jul_26_12_03_28_056861\n\nSo this isn\u0027t any different/worse than how this has always worked for move operations where the guest power state changes (like cold migrate).","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"754d9594c874dba1950bc2996e4c7f3fb51ea656","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        elif event_transition in ("},{"line_number":1065,"context_line":"                virtevent.EVENT_LIFECYCLE_PAUSED,"},{"line_number":1066,"context_line":"                virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED,"},{"line_number":1067,"context_line":"                virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED):"},{"line_number":1068,"context_line":"            vm_power_state \u003d power_state.PAUSED"},{"line_number":1069,"context_line":"        elif event_transition \u003d\u003d virtevent.EVENT_LIFECYCLE_RESUMED:"},{"line_number":1070,"context_line":"            vm_power_state \u003d power_state.RUNNING"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_af9d3c59","line":1067,"in_reply_to":"5f7c97a3_f40ead3b","updated":"2018-07-26 14:01:58.000000000","message":"\u003e Well, I\u0027m just not sure why we need to do the _get_power_state() and sync_power_state() dance for this. Since these new transitions are very temporary and very libvirt-specific, it just seems like we should ignore them in the \"does this change our nova state\" calculation. I understand why we need to do the migration bit below.\n\nOh I see, so don\u0027t call _sync_instance_power_state if we\u0027re doing the very specific post-copy migration stuff. Honestly I\u0027m not sure what impact that might have because if you look at https://review.openstack.org/#/c/434870/37/nova/virt/libvirt/host.py it\u0027s still coming in as a SUSPENDED event, but the more specific ones are \"details\" of the suspended state. I\u0027m not sure if that means we get multiple events (one suspended with no details, then the specific ones). I could probably figure that out from the live migration job logs in the next patch in the series though. I also think _sync_instance_power_state is supposed to be smart enough to not try and change anything if there are no changes between what\u0027s in the db for the instance and the what the hypervisor says about the guest power state.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"78813d09bd34f2489ad06eefaaaa722544433965","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"        migrate_finish_statuses \u003d {"},{"line_number":1101,"context_line":"            # This happens on the source node and indicates live migration"},{"line_number":1102,"context_line":"            # entered post-copy mode."},{"line_number":1103,"context_line":"            virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED: \u0027running (post-copy)\u0027,"},{"line_number":1104,"context_line":"            # Suspended for offline migration."},{"line_number":1105,"context_line":"            virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED: \u0027running\u0027"},{"line_number":1106,"context_line":"        }"},{"line_number":1107,"context_line":"        if (instance.task_state \u003d\u003d task_states.MIGRATING and"},{"line_number":1108,"context_line":"                event_transition in migrate_finish_statuses):"},{"line_number":1109,"context_line":"            status \u003d migrate_finish_statuses[event_transition]"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_997692d5","line":1106,"range":{"start_line":1103,"start_character":0,"end_line":1106,"end_character":1},"updated":"2018-07-26 13:27:57.000000000","message":"migration status strings checks out. (We seriously need to convert these to enum at some point in near future.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3af0ecfcb85373525e1c168e64a8a971eb423b82","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"        migrate_finish_statuses \u003d {"},{"line_number":1101,"context_line":"            # This happens on the source node and indicates live migration"},{"line_number":1102,"context_line":"            # entered post-copy mode."},{"line_number":1103,"context_line":"            virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED: \u0027running (post-copy)\u0027,"},{"line_number":1104,"context_line":"            # Suspended for offline migration."},{"line_number":1105,"context_line":"            virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED: \u0027running\u0027"},{"line_number":1106,"context_line":"        }"},{"line_number":1107,"context_line":"        if (instance.task_state \u003d\u003d task_states.MIGRATING and"},{"line_number":1108,"context_line":"                event_transition in migrate_finish_statuses):"},{"line_number":1109,"context_line":"            status \u003d migrate_finish_statuses[event_transition]"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_be99eb1e","line":1106,"range":{"start_line":1103,"start_character":0,"end_line":1106,"end_character":1},"in_reply_to":"5f7c97a3_997692d5","updated":"2018-07-26 18:12:02.000000000","message":"We could strip this out of Takashi\u0027s change:\n\nhttps://review.openstack.org/#/c/430608/90/nova/objects/fields.py","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7b48ba78b009875f67e6074f6a0941db44364c92","unresolved":false,"context_lines":[{"line_number":1108,"context_line":"                event_transition in migrate_finish_statuses):"},{"line_number":1109,"context_line":"            status \u003d migrate_finish_statuses[event_transition]"},{"line_number":1110,"context_line":"            try:"},{"line_number":1111,"context_line":"                migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1112,"context_line":"                            context, instance.uuid, status)"},{"line_number":1113,"context_line":"                LOG.debug(\u0027Binding ports to destination host: %s\u0027,"},{"line_number":1114,"context_line":"                          migration.dest_compute, instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_8fe64013","line":1111,"updated":"2018-07-26 13:55:25.000000000","message":"Can we not use instance.migration_context to get this out?\n\nTo me, the encoding of this libvirt-specific postcopy behavior into compute manager feels like a layering violation. I would expect the compute manager to not need to distinguish between the two of these events for this purpose. I know this event processing mostly exists for libvirt anyway, but...","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"754d9594c874dba1950bc2996e4c7f3fb51ea656","unresolved":false,"context_lines":[{"line_number":1108,"context_line":"                event_transition in migrate_finish_statuses):"},{"line_number":1109,"context_line":"            status \u003d migrate_finish_statuses[event_transition]"},{"line_number":1110,"context_line":"            try:"},{"line_number":1111,"context_line":"                migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1112,"context_line":"                            context, instance.uuid, status)"},{"line_number":1113,"context_line":"                LOG.debug(\u0027Binding ports to destination host: %s\u0027,"},{"line_number":1114,"context_line":"                          migration.dest_compute, instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_ef2fb4f2","line":1111,"in_reply_to":"5f7c97a3_8fe64013","updated":"2018-07-26 14:01:58.000000000","message":"\u003e Can we not use instance.migration_context to get this out?\n\nAs far as I can tell, no, because the instance.migration_context is only set in the ResourceTracker.move_claim and we don\u0027t do claims for live migration.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ae99957e2cc0c7cc8e4510c57caa76f8eb3b8d87","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"            try:"},{"line_number":1111,"context_line":"                migration \u003d objects.Migration.get_by_instance_and_status("},{"line_number":1112,"context_line":"                            context, instance.uuid, status)"},{"line_number":1113,"context_line":"                LOG.debug(\u0027Binding ports to destination host: %s\u0027,"},{"line_number":1114,"context_line":"                          migration.dest_compute, instance\u003dinstance)"},{"line_number":1115,"context_line":"                # For neutron, migrate_instance_start will activate the"},{"line_number":1116,"context_line":"                # destination host port bindings, if there are any created by"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_afd21b5e","line":1113,"updated":"2018-07-26 14:23:22.000000000","message":"For examples of us hitting this from CI, the live migration job in the next change in the series that turns the port binding on hits this:\n\nhttp://logs.openstack.org/37/522537/35/check/nova-live-migration/bc8cfc6/logs/screen-n-cpu.txt.gz#_Jul_26_12_03_28_074727","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a2a649642c1e0fc975aea286715b9490f1f9a","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                                 \u0027running (post-copy)\u0027)"},{"line_number":110,"context_line":"            migrate_instance_finish.assert_called_once_with(mock.ANY,"},{"line_number":111,"context_line":"                                                         mock_get.return_value,"},{"line_number":112,"context_line":"                                                         mock.ANY)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if transition \u003d\u003d virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED:"},{"line_number":115,"context_line":"            mock_get_instance.assert_called_with(mock.ANY,"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_cdb992e9","line":112,"range":{"start_line":112,"start_character":57,"end_line":112,"end_character":65},"updated":"2018-03-12 20:08:22.000000000","message":"Should assert that migrate_instance_finish is called with the migration object (mock_get_instance.return_value).","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a2a649642c1e0fc975aea286715b9490f1f9a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        else:"},{"line_number":104,"context_line":"            self.assertFalse(mock_sync.called)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        if transition \u003d\u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED:"},{"line_number":107,"context_line":"            mock_get_instance.assert_called_with(mock.ANY,"},{"line_number":108,"context_line":"                                                 mock_get.return_value.uuid,"},{"line_number":109,"context_line":"                                                 \u0027running (post-copy)\u0027)"},{"line_number":110,"context_line":"            migrate_instance_finish.assert_called_once_with(mock.ANY,"},{"line_number":111,"context_line":"                                                         mock_get.return_value,"},{"line_number":112,"context_line":"                                                         mock.ANY)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if transition \u003d\u003d virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED:"},{"line_number":115,"context_line":"            mock_get_instance.assert_called_with(mock.ANY,"},{"line_number":116,"context_line":"                                                 mock_get.return_value.uuid,"},{"line_number":117,"context_line":"                                                 \u0027running\u0027)"},{"line_number":118,"context_line":"            migrate_instance_finish.assert_called_once_with(mock.ANY,"},{"line_number":119,"context_line":"                                                         mock_get.return_value,"},{"line_number":120,"context_line":"                                                         mock.ANY)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def test_handle_lifecycle_event(self):"},{"line_number":123,"context_line":"        event_map \u003d {virtevent.EVENT_LIFECYCLE_STOPPED: power_state.SHUTDOWN,"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_ed6016a8","line":120,"range":{"start_line":106,"start_character":8,"end_line":120,"end_character":66},"updated":"2018-03-12 20:08:22.000000000","message":"These could be combined (except for the status) and then we could also assert that migrate_instance_finish is not called for other transitions.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"78813d09bd34f2489ad06eefaaaa722544433965","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        with mock.patch.object(self.compute, \u0027_get_power_state\u0027,"},{"line_number":180,"context_line":"                               return_value\u003dpower_state.PAUSED):"},{"line_number":181,"context_line":"            with mock.patch.object(self.compute.network_api,"},{"line_number":182,"context_line":"                                   \u0027migrate_instance_finish\u0027) as mig_finish:"},{"line_number":183,"context_line":"                self.compute.handle_lifecycle_event(event)"},{"line_number":184,"context_line":"        # Since we failed to find the migration record, we shouldn\u0027t call"},{"line_number":185,"context_line":"        # migrate_instance_finish."}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_14db294e","line":182,"range":{"start_line":182,"start_character":36,"end_line":182,"end_character":59},"updated":"2018-07-26 13:27:57.000000000","message":"Isn\u0027t it migrate_instance_start ?","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87d494def29d54e819cb6564eb17e11cef272f80","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        with mock.patch.object(self.compute, \u0027_get_power_state\u0027,"},{"line_number":180,"context_line":"                               return_value\u003dpower_state.PAUSED):"},{"line_number":181,"context_line":"            with mock.patch.object(self.compute.network_api,"},{"line_number":182,"context_line":"                                   \u0027migrate_instance_finish\u0027) as mig_finish:"},{"line_number":183,"context_line":"                self.compute.handle_lifecycle_event(event)"},{"line_number":184,"context_line":"        # Since we failed to find the migration record, we shouldn\u0027t call"},{"line_number":185,"context_line":"        # migrate_instance_finish."}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_4fba68e0","line":182,"range":{"start_line":182,"start_character":36,"end_line":182,"end_character":59},"in_reply_to":"5f7c97a3_14db294e","updated":"2018-07-26 13:55:21.000000000","message":"Yes you\u0027re right, I must have changed the method called at some point and since we don\u0027t actually hit this b/c of the migration not found, it didn\u0027t fail the test.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3af0ecfcb85373525e1c168e64a8a971eb423b82","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        with mock.patch.object(self.compute, \u0027_get_power_state\u0027,"},{"line_number":180,"context_line":"                               return_value\u003dpower_state.PAUSED):"},{"line_number":181,"context_line":"            with mock.patch.object(self.compute.network_api,"},{"line_number":182,"context_line":"                                   \u0027migrate_instance_finish\u0027) as mig_finish:"},{"line_number":183,"context_line":"                self.compute.handle_lifecycle_event(event)"},{"line_number":184,"context_line":"        # Since we failed to find the migration record, we shouldn\u0027t call"},{"line_number":185,"context_line":"        # migrate_instance_finish."}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_feea0375","line":182,"range":{"start_line":182,"start_character":36,"end_line":182,"end_character":59},"in_reply_to":"5f7c97a3_4fba68e0","updated":"2018-07-26 18:12:02.000000000","message":"Done","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"}],"nova/tests/unit/virt/libvirt/test_host.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"78813d09bd34f2489ad06eefaaaa722544433965","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        expected_event \u003d hostimpl._queue_event.call_args[0][0]"},{"line_number":232,"context_line":"        self.assertEqual(event.EVENT_LIFECYCLE_POSTCOPY_STARTED,"},{"line_number":233,"context_line":"                         expected_event.transition)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def test_event_emit_delayed_call_delayed(self):"},{"line_number":236,"context_line":"        ev \u003d event.LifecycleEvent("},{"line_number":237,"context_line":"            \"cef19ce0-0ca2-11df-855d-b19fbce37686\","}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_d48db17d","line":234,"updated":"2018-07-26 13:27:57.000000000","message":"I guess a very similar testcase can be added where the callback sends in VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED and we expect a EVENT_LIFECYCLE_MIGRATION_COMPLETED  event","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3af0ecfcb85373525e1c168e64a8a971eb423b82","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        expected_event \u003d hostimpl._queue_event.call_args[0][0]"},{"line_number":232,"context_line":"        self.assertEqual(event.EVENT_LIFECYCLE_POSTCOPY_STARTED,"},{"line_number":233,"context_line":"                         expected_event.transition)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def test_event_emit_delayed_call_delayed(self):"},{"line_number":236,"context_line":"        ev \u003d event.LifecycleEvent("},{"line_number":237,"context_line":"            \"cef19ce0-0ca2-11df-855d-b19fbce37686\","}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_deb5c77e","line":234,"in_reply_to":"5f7c97a3_d48db17d","updated":"2018-07-26 18:12:02.000000000","message":"Done","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"}],"nova/virt/libvirt/host.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3903821b2d82d42973da0d824e1a4242992eb926","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        elif event \u003d\u003d libvirt.VIR_DOMAIN_EVENT_STARTED:"},{"line_number":173,"context_line":"            transition \u003d virtevent.EVENT_LIFECYCLE_STARTED"},{"line_number":174,"context_line":"        elif event \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED:"},{"line_number":175,"context_line":"            if detail \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY:"},{"line_number":176,"context_line":"                transition \u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED"},{"line_number":177,"context_line":"            elif detail \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED:"},{"line_number":178,"context_line":"                transition \u003d virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba2be162_d5b25ee4","line":175,"range":{"start_line":175,"start_character":25,"end_line":175,"end_character":69},"updated":"2017-03-03 21:25:29.000000000","message":"This is not in libvirt 1.3.1 and that\u0027s why it\u0027s killing nova-compute in the dsvm test runs:\n\nhttp://logs.openstack.org/70/434870/3/check/gate-tempest-dsvm-py35-ubuntu-xenial/a2c2fdd/logs/screen-n-cpu.txt.gz?level\u003dTRACE#_2017-03-01_01_51_37_675\n\nSo you need to figure out what version this constant is available in, probably whatever version supports post-copy, which I think is 1.3.3 based on the MIN_LIBVIRT_POSTCOPY_VERSION variable in nova/virt/libvirt/driver.py.","commit_id":"7c9be6f69db1d3e98dfad7421b2be178cdcc2374"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"05b37d2ab380f45a55b933ce46b9306e5b717f1e","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        elif event \u003d\u003d libvirt.VIR_DOMAIN_EVENT_STARTED:"},{"line_number":173,"context_line":"            transition \u003d virtevent.EVENT_LIFECYCLE_STARTED"},{"line_number":174,"context_line":"        elif event \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED:"},{"line_number":175,"context_line":"            if (conn.getLibVersion() \u003e\u003d 1003003 and"},{"line_number":176,"context_line":"                detail \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY):"},{"line_number":177,"context_line":"                transition \u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED"},{"line_number":178,"context_line":"            elif detail \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_7147ca4b","line":175,"range":{"start_line":175,"start_character":40,"end_line":175,"end_character":47},"updated":"2017-03-06 17:01:21.000000000","message":"Maybe we should just turn this into a constant? Or use the helper function below that does this in a friendlier way.","commit_id":"5331e20a570a07fa15b3ab112508f6e9fde1ecf2"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"08de396264b449ee6c8194969dffb8405f87508c","unresolved":false,"context_lines":[{"line_number":74,"context_line":"HV_DRIVER_XEN \u003d \"Xen\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"# libvirt postcopy support"},{"line_number":77,"context_line":"MIN_LIBVIRT_POSTCOPY_VERSION \u003d 1003003"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class Host(object):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_79b627fd","line":77,"updated":"2017-05-16 13:51:42.000000000","message":"It\u0027s better to use a different version representation (1.3.3). There is has_min_version method for that.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a2a649642c1e0fc975aea286715b9490f1f9a","unresolved":false,"context_lines":[{"line_number":74,"context_line":"HV_DRIVER_XEN \u003d \"Xen\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"# libvirt postcopy support"},{"line_number":77,"context_line":"MIN_LIBVIRT_POSTCOPY_VERSION \u003d 1003003"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class Host(object):"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_ca38983e","line":77,"in_reply_to":"1f013ff3_79b627fd","updated":"2018-03-12 20:08:22.000000000","message":"Or use nova.virt.libvirt.driver.MIN_LIBVIRT_POSTCOPY_VERSION, or we can simply use hasattr checks on the new events.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"08de396264b449ee6c8194969dffb8405f87508c","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            # we are checking for libvirt version before checking the"},{"line_number":181,"context_line":"            # attribute. This check can be removed once MIN_LIBVIRT_VERSION"},{"line_number":182,"context_line":"            # is bumped to 1.3.3"},{"line_number":183,"context_line":"            if (conn.getLibVersion() \u003e\u003d MIN_LIBVIRT_POSTCOPY_VERSION and"},{"line_number":184,"context_line":"                detail \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY):"},{"line_number":185,"context_line":"                transition \u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED"},{"line_number":186,"context_line":"            elif detail \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f013ff3_19c72348","line":183,"updated":"2017-05-16 13:51:42.000000000","message":"Probably we need tests to check new transitions are used only for an appropriate version.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"557a2a649642c1e0fc975aea286715b9490f1f9a","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            if (conn.getLibVersion() \u003e\u003d MIN_LIBVIRT_POSTCOPY_VERSION and"},{"line_number":184,"context_line":"                detail \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY):"},{"line_number":185,"context_line":"                transition \u003d virtevent.EVENT_LIFECYCLE_POSTCOPY_STARTED"},{"line_number":186,"context_line":"            elif detail \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED:"},{"line_number":187,"context_line":"                transition \u003d virtevent.EVENT_LIFECYCLE_MIGRATION_COMPLETED"},{"line_number":188,"context_line":"            else:"},{"line_number":189,"context_line":"                transition \u003d virtevent.EVENT_LIFECYCLE_PAUSED"}],"source_content_type":"text/x-python","patch_set":7,"id":"df7087c5_ca8658dc","line":186,"updated":"2018-03-12 20:08:22.000000000","message":"If the version check above fails, this will result in a failure since the version is missing from this line.","commit_id":"e3d8a3403bd8c36c9c495706da73b534d0ff8ac0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5c4170304f42d3953040abdb18d4667945c610a0","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        elif event \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED:"},{"line_number":173,"context_line":"            # NOTE(siva_krishnan): We have to check if"},{"line_number":174,"context_line":"            # VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY and"},{"line_number":175,"context_line":"            # VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED exist since the current"},{"line_number":176,"context_line":"            # minimum version of libvirt (1.2.9) don\u0027t have those attributes."},{"line_number":177,"context_line":"            # This check can be removed once MIN_LIBVIRT_VERSION is bumped to"},{"line_number":178,"context_line":"            # at least 1.3.3."},{"line_number":179,"context_line":"            if (hasattr(libvirt, \u0027VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY\u0027) and"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_f4932358","line":176,"range":{"start_line":175,"start_character":56,"end_line":176,"end_character":48},"updated":"2018-07-25 18:42:05.000000000","message":"nit: the current min libvirt is now 1.3.1 so this should be cleaned up in the follow up change.","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3af0ecfcb85373525e1c168e64a8a971eb423b82","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        elif event \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED:"},{"line_number":173,"context_line":"            # NOTE(siva_krishnan): We have to check if"},{"line_number":174,"context_line":"            # VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY and"},{"line_number":175,"context_line":"            # VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED exist since the current"},{"line_number":176,"context_line":"            # minimum version of libvirt (1.2.9) don\u0027t have those attributes."},{"line_number":177,"context_line":"            # This check can be removed once MIN_LIBVIRT_VERSION is bumped to"},{"line_number":178,"context_line":"            # at least 1.3.3."},{"line_number":179,"context_line":"            if (hasattr(libvirt, \u0027VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY\u0027) and"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_5efd3707","line":176,"range":{"start_line":175,"start_character":56,"end_line":176,"end_character":48},"in_reply_to":"5f7c97a3_8f363fe8","updated":"2018-07-26 18:12:02.000000000","message":"Done","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"571ae1024b73f6552713564cca68e4d80e815d7b","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        elif event \u003d\u003d libvirt.VIR_DOMAIN_EVENT_SUSPENDED:"},{"line_number":173,"context_line":"            # NOTE(siva_krishnan): We have to check if"},{"line_number":174,"context_line":"            # VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY and"},{"line_number":175,"context_line":"            # VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED exist since the current"},{"line_number":176,"context_line":"            # minimum version of libvirt (1.2.9) don\u0027t have those attributes."},{"line_number":177,"context_line":"            # This check can be removed once MIN_LIBVIRT_VERSION is bumped to"},{"line_number":178,"context_line":"            # at least 1.3.3."},{"line_number":179,"context_line":"            if (hasattr(libvirt, \u0027VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY\u0027) and"}],"source_content_type":"text/x-python","patch_set":37,"id":"5f7c97a3_8f363fe8","line":176,"range":{"start_line":175,"start_character":56,"end_line":176,"end_character":48},"in_reply_to":"5f7c97a3_f4932358","updated":"2018-07-26 14:36:09.000000000","message":"Fair enough","commit_id":"1f48d3d83b4d5f6f9cd96ee06d2fc005635c1ff9"}]}
