)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7f75af795412cc38ea8360f7a6ef9ddb86be7247","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1d08eab1_f218a193","updated":"2021-11-08 12:17:55.000000000","message":"this would work but i think doing this with a lock instead of a sleep makes more sense\n\nyou could also do this with a condtion variable\n\nhttps://docs.python.org/3/library/threading.html#threading.Condition\nor event object https://docs.python.org/3/library/threading.html#event-objects\n","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3cfc9d08_e5ea90e8","updated":"2021-11-08 21:00:21.000000000","message":"The locking approach is much better than \u003cinsert big number here\u003e sleep :) Just a few style things to improve inline","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2754ee35712966b2394912fe513cd454e718b1f5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"2508eb4c_f1fe364a","updated":"2021-11-09 16:25:14.000000000","message":"I have slight beef with a couple of things inline, but nothing to block on, IMO.","commit_id":"1e28e8ce8c18043026377b3516eb3d38140d748e"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"a94c8214c879923348e438de429ed5e2cddcf082","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c4373751_0cfe79f7","updated":"2021-11-11 11:21:46.000000000","message":"-1 for the src/dest lookups when you\u0027re forcing hosts and to ask that you also write a test to assert the instance task state of an instance had it\u0027s running migration aborted, AFAICT that gets stuck to MIGRATING as well.","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"81f909bdf0b827211f42286126e61156c34984f0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"1c10e04c_8e0bea31","updated":"2022-02-08 13:53:38.000000000","message":"A follow-up for one of the points from my conversation with Lee about aborting running live migrations and VM\u0027s status being/not being reverted. I confirmed that this is not a problem in my lab: VM\u0027s status was reverted to ACTIVE after running live migration was aborted.","commit_id":"3e7b9b69e68c8594eac92d88f0579aab40d7d5ae"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"0ee7bf6ab6af44bbbc68c8f1d4c568bc72991449","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"e5648021_80c756ba","updated":"2022-01-12 14:51:26.000000000","message":"I am not sure if Lee would take another look, so kindly asking other Core reviewers to check this change.","commit_id":"3e7b9b69e68c8594eac92d88f0579aab40d7d5ae"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"28a6b70935ac817fed00790ceba9b29ef13fabcf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"58eb51cb_d85b3ad5","updated":"2022-01-21 11:11:42.000000000","message":"LGTM, thanks for cleaning this up!","commit_id":"3e7b9b69e68c8594eac92d88f0579aab40d7d5ae"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"79c1a00e22cd40744bf7c8e3a847eacaf97d7bef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"246a28bb_df01b48f","updated":"2022-01-21 20:16:21.000000000","message":"Nicely documented test, LGTM","commit_id":"3e7b9b69e68c8594eac92d88f0579aab40d7d5ae"}],"nova/tests/functional/compute/test_live_migration.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"87839ff653c423bc0fe7ddf3a1433005a2a6ef85","unresolved":true,"context_lines":[{"line_number":235,"context_line":"        # actually do anything. This will allow us to abort the live migration"},{"line_number":236,"context_line":"        # while it\u0027s queued."},{"line_number":237,"context_line":"        executor \u003d src.manager._live_migration_executor"},{"line_number":238,"context_line":"        executor._max_workers \u003d 0"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        server \u003d self._create_server(networks\u003d\u0027auto\u0027, host\u003dsrc.host)"},{"line_number":241,"context_line":"        # At this point the executor has nothing in its queue."}],"source_content_type":"text/x-python","patch_set":2,"id":"96a9e22f_a3fabacd","line":238,"updated":"2021-10-27 14:01:09.000000000","message":"This kind of \"deep\" mocking isn\u0027t great, and there\u0027s a better way to do this. When we talked about this during our internal RH tech call, Sean Mooney came up with the following idea:\n\n1. Use self.flags() to set max_concurrent_live_migrations to 1.\n\n2. Boot a VM and live migrate it, using mocking/stubbing to leave it running during the following steps. We\u0027ll probably need to use the libvirt functional tests for this, where we can stub migrateToURI3 to do whatever we want and not complete until we decide to.\n\n3. Boot a second VM and live migrate it, then abort the live migration. Assert the broken rollback behaviour.\n\n4. Complete the live migration from step 2.","commit_id":"ff37d9a54be423899d7182319e4295f39ab0737b"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"11de497ba500972d313af473f33f6bf00290ec27","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        # actually do anything. This will allow us to abort the live migration"},{"line_number":236,"context_line":"        # while it\u0027s queued."},{"line_number":237,"context_line":"        executor \u003d src.manager._live_migration_executor"},{"line_number":238,"context_line":"        executor._max_workers \u003d 0"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        server \u003d self._create_server(networks\u003d\u0027auto\u0027, host\u003dsrc.host)"},{"line_number":241,"context_line":"        # At this point the executor has nothing in its queue."}],"source_content_type":"text/x-python","patch_set":2,"id":"33c0eccb_84632653","line":238,"in_reply_to":"96a9e22f_a3fabacd","updated":"2021-11-07 09:19:26.000000000","message":"Done","commit_id":"ff37d9a54be423899d7182319e4295f39ab0737b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7f75af795412cc38ea8360f7a6ef9ddb86be7247","unresolved":true,"context_lines":[{"line_number":304,"context_line":"            hostname\u003d\u0027dest\u0027,"},{"line_number":305,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":306,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def test_live_migrate(self):"},{"line_number":309,"context_line":"        # Introduce function to delay mocked libvirt migrateToURI3"},{"line_number":310,"context_line":"        # call forever."}],"source_content_type":"text/x-python","patch_set":6,"id":"cc8dd235_7c489061","line":307,"updated":"2021-11-08 12:17:55.000000000","message":"self.lock \u003d threading.Lock()\nself.orig_migrateToURI3 \u003d nova.tests.fixtures.libvirt.Domain.migrateToURI3","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"9b981dd74ab20a6eb28b8f894c8ab27a6deab2af","unresolved":false,"context_lines":[{"line_number":304,"context_line":"            hostname\u003d\u0027dest\u0027,"},{"line_number":305,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":306,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def test_live_migrate(self):"},{"line_number":309,"context_line":"        # Introduce function to delay mocked libvirt migrateToURI3"},{"line_number":310,"context_line":"        # call forever."}],"source_content_type":"text/x-python","patch_set":6,"id":"ca4b943b_95a79f23","line":307,"in_reply_to":"a00fc44f_a7bd3b70","updated":"2021-11-08 20:36:52.000000000","message":"Done","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"ce8085d6ebdcf0c4f4e9598cc6798d4a95b75f49","unresolved":true,"context_lines":[{"line_number":304,"context_line":"            hostname\u003d\u0027dest\u0027,"},{"line_number":305,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":306,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def test_live_migrate(self):"},{"line_number":309,"context_line":"        # Introduce function to delay mocked libvirt migrateToURI3"},{"line_number":310,"context_line":"        # call forever."}],"source_content_type":"text/x-python","patch_set":6,"id":"a00fc44f_a7bd3b70","line":307,"in_reply_to":"cc8dd235_7c489061","updated":"2021-11-08 14:43:06.000000000","message":"IMO this would require to stub out nova.tests.fixtures.libvirt.Domain.migrateToURI3 because it is not implemented for fake_libvirt. It makes sense because we would complete simulation instead of stopping test in the process, so I would add appropriate code.","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7f75af795412cc38ea8360f7a6ef9ddb86be7247","unresolved":true,"context_lines":[{"line_number":309,"context_line":"        # Introduce function to delay mocked libvirt migrateToURI3"},{"line_number":310,"context_line":"        # call forever."},{"line_number":311,"context_line":"        def sleep_forever(*args, **kwargs):"},{"line_number":312,"context_line":"            time.sleep(1000000)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        with mock.patch(\u0027nova.tests.fixtures.libvirt.Domain.\u0027"},{"line_number":315,"context_line":"                        \u0027migrateToURI3\u0027) as mock_migratetouri3:"}],"source_content_type":"text/x-python","patch_set":6,"id":"d529f6a1_b79d7046","line":312,"range":{"start_line":312,"start_character":11,"end_line":312,"end_character":31},"updated":"2021-11-08 12:17:55.000000000","message":"this should aquireand release the lock\nwith self.lock:\n  self.orig_migrateToURI3(*args, **kwargs)","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"9b981dd74ab20a6eb28b8f894c8ab27a6deab2af","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        # Introduce function to delay mocked libvirt migrateToURI3"},{"line_number":310,"context_line":"        # call forever."},{"line_number":311,"context_line":"        def sleep_forever(*args, **kwargs):"},{"line_number":312,"context_line":"            time.sleep(1000000)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"        with mock.patch(\u0027nova.tests.fixtures.libvirt.Domain.\u0027"},{"line_number":315,"context_line":"                        \u0027migrateToURI3\u0027) as mock_migratetouri3:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ae203cc6_a37924d5","line":312,"range":{"start_line":312,"start_character":11,"end_line":312,"end_character":31},"in_reply_to":"d529f6a1_b79d7046","updated":"2021-11-08 20:36:52.000000000","message":"Done","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7f75af795412cc38ea8360f7a6ef9ddb86be7247","unresolved":true,"context_lines":[{"line_number":318,"context_line":"            # executor\u0027s live migration queue, second one would be used"},{"line_number":319,"context_line":"            # to actually confirm that queued live migrations are"},{"line_number":320,"context_line":"            # aborted properly."},{"line_number":321,"context_line":"            self.server_a \u003d self._create_server("},{"line_number":322,"context_line":"                host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":323,"context_line":"                networks\u003d\u0027none\u0027)"},{"line_number":324,"context_line":"            self.api.post_server_action("}],"source_content_type":"text/x-python","patch_set":6,"id":"7d8d1a95_156c6011","line":321,"updated":"2021-11-08 12:17:55.000000000","message":"self.lock.aquire() \n\nget the lock before launching the instnaces","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"9b981dd74ab20a6eb28b8f894c8ab27a6deab2af","unresolved":false,"context_lines":[{"line_number":318,"context_line":"            # executor\u0027s live migration queue, second one would be used"},{"line_number":319,"context_line":"            # to actually confirm that queued live migrations are"},{"line_number":320,"context_line":"            # aborted properly."},{"line_number":321,"context_line":"            self.server_a \u003d self._create_server("},{"line_number":322,"context_line":"                host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":323,"context_line":"                networks\u003d\u0027none\u0027)"},{"line_number":324,"context_line":"            self.api.post_server_action("}],"source_content_type":"text/x-python","patch_set":6,"id":"1a5ba1e1_08b9ce80","line":321,"in_reply_to":"7d8d1a95_156c6011","updated":"2021-11-08 20:36:52.000000000","message":"Done","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7f75af795412cc38ea8360f7a6ef9ddb86be7247","unresolved":true,"context_lines":[{"line_number":348,"context_line":"                                               serverb_migration[\u0027id\u0027]))"},{"line_number":349,"context_line":"            self._wait_for_migration_status(self.server_b,"},{"line_number":350,"context_line":"                                            [\u0027cancelled\u0027])"},{"line_number":351,"context_line":"            # FIXME(artom) Assert the server never comes out of \u0027MIGRATING\u0027"},{"line_number":352,"context_line":"            self.assertRaises("},{"line_number":353,"context_line":"                AssertionError,"},{"line_number":354,"context_line":"                self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"b4ec216c_1d597637","line":351,"updated":"2021-11-08 12:17:55.000000000","message":"then here release the lock so the server can finsih migrating\nself.lock.release()","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"9b981dd74ab20a6eb28b8f894c8ab27a6deab2af","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                                               serverb_migration[\u0027id\u0027]))"},{"line_number":349,"context_line":"            self._wait_for_migration_status(self.server_b,"},{"line_number":350,"context_line":"                                            [\u0027cancelled\u0027])"},{"line_number":351,"context_line":"            # FIXME(artom) Assert the server never comes out of \u0027MIGRATING\u0027"},{"line_number":352,"context_line":"            self.assertRaises("},{"line_number":353,"context_line":"                AssertionError,"},{"line_number":354,"context_line":"                self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"c0a9a90d_bd594edb","line":351,"in_reply_to":"b4ec216c_1d597637","updated":"2021-11-08 20:36:52.000000000","message":"Done","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7f75af795412cc38ea8360f7a6ef9ddb86be7247","unresolved":true,"context_lines":[{"line_number":349,"context_line":"            self._wait_for_migration_status(self.server_b,"},{"line_number":350,"context_line":"                                            [\u0027cancelled\u0027])"},{"line_number":351,"context_line":"            # FIXME(artom) Assert the server never comes out of \u0027MIGRATING\u0027"},{"line_number":352,"context_line":"            self.assertRaises("},{"line_number":353,"context_line":"                AssertionError,"},{"line_number":354,"context_line":"                self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":355,"context_line":"            self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"2cdc04b3_4216b9d9","line":354,"range":{"start_line":352,"start_character":6,"end_line":354,"end_character":69},"updated":"2021-11-08 12:17:55.000000000","message":"self._wait_for_state_change(self.server_b, \u0027ACTIVE\u0027)","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"eebc0309b270c572dc8d0e1c1b8f4db54552b46a","unresolved":true,"context_lines":[{"line_number":349,"context_line":"            self._wait_for_migration_status(self.server_b,"},{"line_number":350,"context_line":"                                            [\u0027cancelled\u0027])"},{"line_number":351,"context_line":"            # FIXME(artom) Assert the server never comes out of \u0027MIGRATING\u0027"},{"line_number":352,"context_line":"            self.assertRaises("},{"line_number":353,"context_line":"                AssertionError,"},{"line_number":354,"context_line":"                self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":355,"context_line":"            self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3d126ca1_9a191915","line":354,"range":{"start_line":352,"start_character":6,"end_line":354,"end_character":69},"in_reply_to":"2cdc04b3_4216b9d9","updated":"2021-11-08 15:50:30.000000000","message":"AFAIU, server_b migration would be deleted, so server_b state would not be reverted to \u0027ACTIVE\u0027. This assertion confirms that after appropriate period of time server_b state would not be reverted from MIGRATING to ACTIVE. IMO the check itself could be suboptimal, but logic looks valid. Please let me know if I am missing something.","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"9b981dd74ab20a6eb28b8f894c8ab27a6deab2af","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            self._wait_for_migration_status(self.server_b,"},{"line_number":350,"context_line":"                                            [\u0027cancelled\u0027])"},{"line_number":351,"context_line":"            # FIXME(artom) Assert the server never comes out of \u0027MIGRATING\u0027"},{"line_number":352,"context_line":"            self.assertRaises("},{"line_number":353,"context_line":"                AssertionError,"},{"line_number":354,"context_line":"                self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":355,"context_line":"            self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"d26f7b82_8ef6e15e","line":354,"range":{"start_line":352,"start_character":6,"end_line":354,"end_character":69},"in_reply_to":"3d126ca1_9a191915","updated":"2021-11-08 20:36:52.000000000","message":"Done","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7f75af795412cc38ea8360f7a6ef9ddb86be7247","unresolved":true,"context_lines":[{"line_number":352,"context_line":"            self.assertRaises("},{"line_number":353,"context_line":"                AssertionError,"},{"line_number":354,"context_line":"                self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":355,"context_line":"            self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"168615ad_2b3f4281","line":355,"range":{"start_line":355,"start_character":12,"end_line":355,"end_character":67},"updated":"2021-11-08 12:17:55.000000000","message":"self._wait_for_state_change(self.server_a, \u0027ACTIVE\u0027)","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"eebc0309b270c572dc8d0e1c1b8f4db54552b46a","unresolved":true,"context_lines":[{"line_number":352,"context_line":"            self.assertRaises("},{"line_number":353,"context_line":"                AssertionError,"},{"line_number":354,"context_line":"                self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":355,"context_line":"            self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"b09d5a20_42d839e5","line":355,"range":{"start_line":355,"start_character":12,"end_line":355,"end_character":67},"in_reply_to":"168615ad_2b3f4281","updated":"2021-11-08 15:50:30.000000000","message":"Ack","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"9b981dd74ab20a6eb28b8f894c8ab27a6deab2af","unresolved":false,"context_lines":[{"line_number":352,"context_line":"            self.assertRaises("},{"line_number":353,"context_line":"                AssertionError,"},{"line_number":354,"context_line":"                self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":355,"context_line":"            self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dc0d0697_a71d35d8","line":355,"range":{"start_line":355,"start_character":12,"end_line":355,"end_character":67},"in_reply_to":"b09d5a20_42d839e5","updated":"2021-11-08 20:36:52.000000000","message":"Done","commit_id":"6251dceadc62f36aa19a579cf3b355d6ba267585"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":282,"context_line":"            mock_notify.assert_called()"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"class LiveMigrationQueuedAbortTest(libvirt_base.ServersTestBase):"},{"line_number":286,"context_line":"    \"\"\"Functional test for bug 1949808."},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    This test is used to confirm that VM\u0027s state is reverted properly"}],"source_content_type":"text/x-python","patch_set":8,"id":"968b9607_5b06470a","line":285,"updated":"2021-11-08 21:00:21.000000000","message":"This would have to live under nova/tests/functional/libvirt","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":282,"context_line":"            mock_notify.assert_called()"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"class LiveMigrationQueuedAbortTest(libvirt_base.ServersTestBase):"},{"line_number":286,"context_line":"    \"\"\"Functional test for bug 1949808."},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    This test is used to confirm that VM\u0027s state is reverted properly"}],"source_content_type":"text/x-python","patch_set":8,"id":"2a8a3932_0f306039","line":285,"in_reply_to":"968b9607_5b06470a","updated":"2021-11-09 13:53:37.000000000","message":"Ack, will do","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":301,"context_line":"        self.flags(max_concurrent_live_migrations\u003d\u00271\u0027)"},{"line_number":302,"context_line":"        self.start_compute("},{"line_number":303,"context_line":"            hostname\u003d\u0027src\u0027,"},{"line_number":304,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":305,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":306,"context_line":"        self.start_compute("},{"line_number":307,"context_line":"            hostname\u003d\u0027dest\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"32d0baf2_18b49831","line":304,"updated":"2021-11-08 21:00:21.000000000","message":"We don\u0027t need the host_info here, the default will be just fine, nothing in the test requires caring about the host or instance NUMA toplogy.","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":301,"context_line":"        self.flags(max_concurrent_live_migrations\u003d\u00271\u0027)"},{"line_number":302,"context_line":"        self.start_compute("},{"line_number":303,"context_line":"            hostname\u003d\u0027src\u0027,"},{"line_number":304,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":305,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":306,"context_line":"        self.start_compute("},{"line_number":307,"context_line":"            hostname\u003d\u0027dest\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7c8ab99f_d46ff9d2","line":304,"in_reply_to":"32d0baf2_18b49831","updated":"2021-11-09 13:53:37.000000000","message":"Ack","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":305,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":306,"context_line":"        self.start_compute("},{"line_number":307,"context_line":"            hostname\u003d\u0027dest\u0027,"},{"line_number":308,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":309,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        self.useFixture(fixtures.MonkeyPatch("}],"source_content_type":"text/x-python","patch_set":8,"id":"8269763f_3ddb2353","line":308,"updated":"2021-11-08 21:00:21.000000000","message":"Ditto.","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":305,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":306,"context_line":"        self.start_compute("},{"line_number":307,"context_line":"            hostname\u003d\u0027dest\u0027,"},{"line_number":308,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":309,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        self.useFixture(fixtures.MonkeyPatch("}],"source_content_type":"text/x-python","patch_set":8,"id":"4e0ef3b4_4fb68fa3","line":308,"in_reply_to":"8269763f_3ddb2353","updated":"2021-11-09 13:53:37.000000000","message":"Ack","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":308,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":309,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":312,"context_line":"            \u0027nova.tests.fixtures.libvirt.Domain.migrateToURI3\u0027,"},{"line_number":313,"context_line":"            self._migrate_stub))"},{"line_number":314,"context_line":"        self.lock_live_migration \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":8,"id":"def884b8_c922d6f2","line":311,"updated":"2021-11-08 21:00:21.000000000","message":"Inheriting from LibvirtMigrationMixin in nova/tests/functional/libvirt/base.py will do this for you.","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            host_info\u003dnova_fixtures.libvirt.HostInfo("},{"line_number":309,"context_line":"                cpu_nodes\u003d1, cpu_sockets\u003d1, cpu_cores\u003d4, cpu_threads\u003d1))"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":312,"context_line":"            \u0027nova.tests.fixtures.libvirt.Domain.migrateToURI3\u0027,"},{"line_number":313,"context_line":"            self._migrate_stub))"},{"line_number":314,"context_line":"        self.lock_live_migration \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ade4761_2f3e957b","line":311,"in_reply_to":"def884b8_c922d6f2","updated":"2021-11-09 13:53:37.000000000","message":"I actually used LibvirtMigrationMixin originally, but it fails for multiple servers because its _migrate_stub hardcodes server object when running lookupByUUIDString operation. So it wouldn\u0027t work.","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":316,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":317,"context_line":"        # Execute only if live migration is not locked"},{"line_number":318,"context_line":"        with self.lock_live_migration:"},{"line_number":319,"context_line":"            src_hostname \u003d domain._connection.hostname"},{"line_number":320,"context_line":"            dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"            # In a real live migration, libvirt and QEMU on the source"}],"source_content_type":"text/x-python","patch_set":8,"id":"188c44c1_eefbbe65","line":319,"updated":"2021-11-08 21:00:21.000000000","message":"Since we already have self.computes[\u0027src\u0027] and self.computes[\u0027dest\u0027], why not use them directly?","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":316,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":317,"context_line":"        # Execute only if live migration is not locked"},{"line_number":318,"context_line":"        with self.lock_live_migration:"},{"line_number":319,"context_line":"            src_hostname \u003d domain._connection.hostname"},{"line_number":320,"context_line":"            dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"            # In a real live migration, libvirt and QEMU on the source"}],"source_content_type":"text/x-python","patch_set":8,"id":"a3d378a7_cc86ada8","line":319,"in_reply_to":"188c44c1_eefbbe65","updated":"2021-11-09 13:53:37.000000000","message":"Ack, will try and see","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"256afcc63ea177601322519890bce9b2048b0ea2","unresolved":false,"context_lines":[{"line_number":316,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":317,"context_line":"        # Execute only if live migration is not locked"},{"line_number":318,"context_line":"        with self.lock_live_migration:"},{"line_number":319,"context_line":"            src_hostname \u003d domain._connection.hostname"},{"line_number":320,"context_line":"            dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"            # In a real live migration, libvirt and QEMU on the source"}],"source_content_type":"text/x-python","patch_set":8,"id":"6c778390_cd5e95ea","line":319,"in_reply_to":"a3d378a7_cc86ada8","updated":"2021-11-09 15:08:57.000000000","message":"I have decided that current approach make sense because it is more general and flexible: if we would hardcode SRC/DST here, then it would be harder to implement additional tests or tune existing one (if needed).","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":353,"context_line":"        # to actually confirm that queued live migrations are"},{"line_number":354,"context_line":"        # aborted properly."},{"line_number":355,"context_line":"        self.server_a \u003d self._create_server("},{"line_number":356,"context_line":"            host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":357,"context_line":"            networks\u003d\u0027none\u0027)"},{"line_number":358,"context_line":"        self.api.post_server_action("},{"line_number":359,"context_line":"            self.server_a[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"7d812755_57c59e51","line":356,"updated":"2021-11-08 21:00:21.000000000","message":"Just use \u0027src\u0027 :)","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":353,"context_line":"        # to actually confirm that queued live migrations are"},{"line_number":354,"context_line":"        # aborted properly."},{"line_number":355,"context_line":"        self.server_a \u003d self._create_server("},{"line_number":356,"context_line":"            host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":357,"context_line":"            networks\u003d\u0027none\u0027)"},{"line_number":358,"context_line":"        self.api.post_server_action("},{"line_number":359,"context_line":"            self.server_a[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"47cd21c1_7f729627","line":356,"in_reply_to":"7d812755_57c59e51","updated":"2021-11-09 13:53:37.000000000","message":"Ack","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":355,"context_line":"        self.server_a \u003d self._create_server("},{"line_number":356,"context_line":"            host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":357,"context_line":"            networks\u003d\u0027none\u0027)"},{"line_number":358,"context_line":"        self.api.post_server_action("},{"line_number":359,"context_line":"            self.server_a[\u0027id\u0027],"},{"line_number":360,"context_line":"            {\u0027os-migrateLive\u0027: {"},{"line_number":361,"context_line":"                \u0027host\u0027: None,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3196b9cd_38330cd6","line":358,"updated":"2021-11-08 21:00:21.000000000","message":"You can use the self._live_migrate() helper for this.","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":355,"context_line":"        self.server_a \u003d self._create_server("},{"line_number":356,"context_line":"            host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":357,"context_line":"            networks\u003d\u0027none\u0027)"},{"line_number":358,"context_line":"        self.api.post_server_action("},{"line_number":359,"context_line":"            self.server_a[\u0027id\u0027],"},{"line_number":360,"context_line":"            {\u0027os-migrateLive\u0027: {"},{"line_number":361,"context_line":"                \u0027host\u0027: None,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ccb26843_62d6c354","line":358,"in_reply_to":"3196b9cd_38330cd6","updated":"2021-11-09 13:53:37.000000000","message":"I looked in this direction originally, but _live_migrate waits for server\u0027s status change, so I have decided that manual operations would make sense. I would take a second look...","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":361,"context_line":"                \u0027host\u0027: None,"},{"line_number":362,"context_line":"                \u0027block_migration\u0027: \u0027auto\u0027}})"},{"line_number":363,"context_line":"        self.server_b \u003d self._create_server("},{"line_number":364,"context_line":"            host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":365,"context_line":"            networks\u003d\u0027none\u0027)"},{"line_number":366,"context_line":"        self.api.post_server_action("},{"line_number":367,"context_line":"            self.server_b[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"4e270eb1_fbc1287a","line":364,"updated":"2021-11-08 21:00:21.000000000","message":"\u0027src\u0027 again","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":361,"context_line":"                \u0027host\u0027: None,"},{"line_number":362,"context_line":"                \u0027block_migration\u0027: \u0027auto\u0027}})"},{"line_number":363,"context_line":"        self.server_b \u003d self._create_server("},{"line_number":364,"context_line":"            host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":365,"context_line":"            networks\u003d\u0027none\u0027)"},{"line_number":366,"context_line":"        self.api.post_server_action("},{"line_number":367,"context_line":"            self.server_b[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"fb0da7cd_f221db95","line":364,"in_reply_to":"4e270eb1_fbc1287a","updated":"2021-11-09 13:53:37.000000000","message":"Ack","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":364,"context_line":"            host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":365,"context_line":"            networks\u003d\u0027none\u0027)"},{"line_number":366,"context_line":"        self.api.post_server_action("},{"line_number":367,"context_line":"            self.server_b[\u0027id\u0027],"},{"line_number":368,"context_line":"            {\u0027os-migrateLive\u0027: {"},{"line_number":369,"context_line":"                \u0027host\u0027: None,"},{"line_number":370,"context_line":"                \u0027block_migration\u0027: \u0027auto\u0027}})"}],"source_content_type":"text/x-python","patch_set":8,"id":"4995b40c_8a2af948","line":367,"updated":"2021-11-08 21:00:21.000000000","message":"self._live_migrate()","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":364,"context_line":"            host\u003dself.computes[\u0027src\u0027].host,"},{"line_number":365,"context_line":"            networks\u003d\u0027none\u0027)"},{"line_number":366,"context_line":"        self.api.post_server_action("},{"line_number":367,"context_line":"            self.server_b[\u0027id\u0027],"},{"line_number":368,"context_line":"            {\u0027os-migrateLive\u0027: {"},{"line_number":369,"context_line":"                \u0027host\u0027: None,"},{"line_number":370,"context_line":"                \u0027block_migration\u0027: \u0027auto\u0027}})"}],"source_content_type":"text/x-python","patch_set":8,"id":"02b6bf2e_9b5d2622","line":367,"in_reply_to":"4995b40c_8a2af948","updated":"2021-11-09 13:53:37.000000000","message":"Same as above.","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7080c58d3c6ea18ea9abc0407eb8668a2f7351e6","unresolved":true,"context_lines":[{"line_number":372,"context_line":"        # Wait till first server\u0027s migration would be started and"},{"line_number":373,"context_line":"        # second server\u0027s live migration would be queued. Then"},{"line_number":374,"context_line":"        # abort second server\u0027s live migration"},{"line_number":375,"context_line":"        self._wait_for_migration_status(self.server_a, [\u0027running\u0027])"},{"line_number":376,"context_line":"        self._wait_for_migration_status(self.server_b, [\u0027queued\u0027])"},{"line_number":377,"context_line":"        serverb_migration \u003d self.api.api_get("},{"line_number":378,"context_line":"            \u0027/os-migrations?instance_uuid\u003d%s\u0027 % self.server_b[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"25c145f7_b19ac967","line":375,"updated":"2021-11-08 21:00:21.000000000","message":"Using self._live_migrate() will get rid of these two lines as well, as you can pass an expected migration and server status to the helper.","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"4bd6b165c80532821d6ebb595dba8d0eda5ed352","unresolved":true,"context_lines":[{"line_number":372,"context_line":"        # Wait till first server\u0027s migration would be started and"},{"line_number":373,"context_line":"        # second server\u0027s live migration would be queued. Then"},{"line_number":374,"context_line":"        # abort second server\u0027s live migration"},{"line_number":375,"context_line":"        self._wait_for_migration_status(self.server_a, [\u0027running\u0027])"},{"line_number":376,"context_line":"        self._wait_for_migration_status(self.server_b, [\u0027queued\u0027])"},{"line_number":377,"context_line":"        serverb_migration \u003d self.api.api_get("},{"line_number":378,"context_line":"            \u0027/os-migrations?instance_uuid\u003d%s\u0027 % self.server_b[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"63314fb2_9bc2e2fe","line":375,"in_reply_to":"25c145f7_b19ac967","updated":"2021-11-09 13:53:37.000000000","message":"Same as above.","commit_id":"fe05e9b6e9b18503bce623aeab77855fcf88af9c"}],"nova/tests/functional/libvirt/test_live_migration.py":[{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2754ee35712966b2394912fe513cd454e718b1f5","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        self.start_compute(hostname\u003d\u0027src\u0027)"},{"line_number":45,"context_line":"        self.start_compute(hostname\u003d\u0027dest\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":48,"context_line":"            \u0027nova.tests.fixtures.libvirt.Domain.migrateToURI3\u0027,"},{"line_number":49,"context_line":"            self._migrate_stub))"},{"line_number":50,"context_line":"        self.lock_live_migration \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":9,"id":"d2992904_f647b3bb","line":47,"updated":"2021-11-09 16:25:14.000000000","message":"To follow up on the previous comment around this area, inheriting from the LiveMigrationHelperMixin will do the monkey-patching for you, but as you correctly saw you still need to write your own _migrate_stub(). It\u0027s not a massive difference, but I\u0027d still prefer the former.","commit_id":"1e28e8ce8c18043026377b3516eb3d38140d748e"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"cf6b5320a2f90305a998ee3ed3030f894a01f416","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.start_compute(hostname\u003d\u0027src\u0027)"},{"line_number":45,"context_line":"        self.start_compute(hostname\u003d\u0027dest\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":48,"context_line":"            \u0027nova.tests.fixtures.libvirt.Domain.migrateToURI3\u0027,"},{"line_number":49,"context_line":"            self._migrate_stub))"},{"line_number":50,"context_line":"        self.lock_live_migration \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":9,"id":"58e69783_139049d6","line":47,"in_reply_to":"d2992904_f647b3bb","updated":"2021-11-10 16:42:42.000000000","message":"Ack, will change that.","commit_id":"1e28e8ce8c18043026377b3516eb3d38140d748e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2754ee35712966b2394912fe513cd454e718b1f5","unresolved":true,"context_lines":[{"line_number":66,"context_line":"                \u0027fake-createXML-doesnt-care-about-flags\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"            src \u003d self.computes[src_hostname]"},{"line_number":69,"context_line":"            conn \u003d src.driver._host.get_connection()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            # Because migrateToURI3 is spawned in a background thread,"},{"line_number":72,"context_line":"            # this method does not block the upper nova layers. Because"}],"source_content_type":"text/x-python","patch_set":9,"id":"5141d704_35bf4c8b","line":69,"updated":"2021-11-09 16:25:14.000000000","message":"I still think you\u0027ve overcomplicating this, since the src and dest hosts and the fact that both servers will initially be on src is known in advance, but meh :)","commit_id":"1e28e8ce8c18043026377b3516eb3d38140d748e"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"cf6b5320a2f90305a998ee3ed3030f894a01f416","unresolved":true,"context_lines":[{"line_number":66,"context_line":"                \u0027fake-createXML-doesnt-care-about-flags\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"            src \u003d self.computes[src_hostname]"},{"line_number":69,"context_line":"            conn \u003d src.driver._host.get_connection()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            # Because migrateToURI3 is spawned in a background thread,"},{"line_number":72,"context_line":"            # this method does not block the upper nova layers. Because"}],"source_content_type":"text/x-python","patch_set":9,"id":"9b9d6fd8_d974434b","line":69,"in_reply_to":"5141d704_35bf4c8b","updated":"2021-11-10 16:42:42.000000000","message":"I think that it is better to have keep current approach to make solution more general, but am also open to tune this if it is really better to simplify the code.","commit_id":"1e28e8ce8c18043026377b3516eb3d38140d748e"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"a94c8214c879923348e438de429ed5e2cddcf082","unresolved":true,"context_lines":[{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":35,"context_line":"    microversion \u003d \u0027latest\u0027"},{"line_number":36,"context_line":"    ADMIN_API \u003d True"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"a9e8cc85_df88d478","line":35,"range":{"start_line":35,"start_character":4,"end_line":35,"end_character":27},"updated":"2021-11-11 11:21:46.000000000","message":"You might want to pin this to 2.74 for host support in the migration [1] , this also covers 2.65 that introduced support for cancelling queued migrations [2].\n\n[1] https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#id67\n[2] https://docs.openstack.org/nova/latest/reference/api-microversion-history.html#maximum-in-rocky","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"90596f25c6cde8d606cde772b56a6729f6c0911d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    api_major_version \u003d \u0027v2.1\u0027"},{"line_number":35,"context_line":"    microversion \u003d \u0027latest\u0027"},{"line_number":36,"context_line":"    ADMIN_API \u003d True"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"6c70668d_50e08f35","line":35,"range":{"start_line":35,"start_character":4,"end_line":35,"end_character":27},"in_reply_to":"a9e8cc85_df88d478","updated":"2021-12-08 14:56:38.000000000","message":"Ack","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"a94c8214c879923348e438de429ed5e2cddcf082","unresolved":true,"context_lines":[{"line_number":41,"context_line":"        # We will allow only one live migration to be processed at any"},{"line_number":42,"context_line":"        # given period of time"},{"line_number":43,"context_line":"        self.flags(max_concurrent_live_migrations\u003d\u00271\u0027)"},{"line_number":44,"context_line":"        self.start_compute(hostname\u003d\u0027src\u0027)"},{"line_number":45,"context_line":"        self.start_compute(hostname\u003d\u0027dest\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # Live migration\u0027s execution could be locked if needed"},{"line_number":48,"context_line":"        self.lock_live_migration \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":11,"id":"57483e43_dc3da679","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":43},"updated":"2021-11-11 11:21:46.000000000","message":"I know you\u0027re not using the original _migrate_stub from the fixture but you may as well make these instance variables:\n\n  self.src \u003d self.start_compute(hostname\u003d\u0027src\u0027)\n  self.dest \u003d self.start_compute(hostname\u003d\u0027dest\u0027)","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"90596f25c6cde8d606cde772b56a6729f6c0911d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        # We will allow only one live migration to be processed at any"},{"line_number":42,"context_line":"        # given period of time"},{"line_number":43,"context_line":"        self.flags(max_concurrent_live_migrations\u003d\u00271\u0027)"},{"line_number":44,"context_line":"        self.start_compute(hostname\u003d\u0027src\u0027)"},{"line_number":45,"context_line":"        self.start_compute(hostname\u003d\u0027dest\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # Live migration\u0027s execution could be locked if needed"},{"line_number":48,"context_line":"        self.lock_live_migration \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":11,"id":"bb26821f_ab59454d","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":43},"in_reply_to":"57483e43_dc3da679","updated":"2021-12-08 14:56:38.000000000","message":"Ack","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"a94c8214c879923348e438de429ed5e2cddcf082","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        self.start_compute(hostname\u003d\u0027src\u0027)"},{"line_number":45,"context_line":"        self.start_compute(hostname\u003d\u0027dest\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # Live migration\u0027s execution could be locked if needed"},{"line_number":48,"context_line":"        self.lock_live_migration \u003d threading.Lock()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":51,"context_line":"        # Execute only if live migration is not locked"}],"source_content_type":"text/x-python","patch_set":11,"id":"08777331_30cbbb67","line":48,"range":{"start_line":47,"start_character":0,"end_line":48,"end_character":51},"updated":"2021-11-11 11:21:46.000000000","message":"Nice, I\u0027d personally just add some kind of wait within _migrate_stub for the server_b migration to be queued and aborted before allowing server_a to migrate but this also works.","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"90596f25c6cde8d606cde772b56a6729f6c0911d","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        self.start_compute(hostname\u003d\u0027src\u0027)"},{"line_number":45,"context_line":"        self.start_compute(hostname\u003d\u0027dest\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # Live migration\u0027s execution could be locked if needed"},{"line_number":48,"context_line":"        self.lock_live_migration \u003d threading.Lock()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":51,"context_line":"        # Execute only if live migration is not locked"}],"source_content_type":"text/x-python","patch_set":11,"id":"6ca50bb8_5e512ef8","line":48,"range":{"start_line":47,"start_character":0,"end_line":48,"end_character":51},"in_reply_to":"08777331_30cbbb67","updated":"2021-12-08 14:56:38.000000000","message":"Yes, I agree, but when I thought about implementing this it looked like conditions for this check should be quite complex (and hard to understand) or we could end up having various race conditions. So to me locking approach looks simpler from readability/complexity perspective...","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"9b13df94ccf26d9133af7403ec83e02544332a2a","unresolved":true,"context_lines":[{"line_number":50,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":51,"context_line":"        # Execute only if live migration is not locked"},{"line_number":52,"context_line":"        with self.lock_live_migration:"},{"line_number":53,"context_line":"            src_hostname \u003d domain._connection.hostname"},{"line_number":54,"context_line":"            dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"            # In a real live migration, libvirt and QEMU on the source"}],"source_content_type":"text/x-python","patch_set":11,"id":"0211a33c_42f1c608","line":53,"updated":"2021-11-10 20:57:12.000000000","message":"Still \"meh\" on this approach to find the hosts, but not going to block on it.","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"a94c8214c879923348e438de429ed5e2cddcf082","unresolved":true,"context_lines":[{"line_number":50,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":51,"context_line":"        # Execute only if live migration is not locked"},{"line_number":52,"context_line":"        with self.lock_live_migration:"},{"line_number":53,"context_line":"            src_hostname \u003d domain._connection.hostname"},{"line_number":54,"context_line":"            dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"            # In a real live migration, libvirt and QEMU on the source"}],"source_content_type":"text/x-python","patch_set":11,"id":"04a9e4a3_46503d1c","line":53,"in_reply_to":"0211a33c_42f1c608","updated":"2021-11-11 11:21:46.000000000","message":"Yeah you shouldn\u0027t need this, you\u0027re using ADMIN_API and providing the host in the _create_server calls below so it should always be src?","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"90596f25c6cde8d606cde772b56a6729f6c0911d","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":51,"context_line":"        # Execute only if live migration is not locked"},{"line_number":52,"context_line":"        with self.lock_live_migration:"},{"line_number":53,"context_line":"            src_hostname \u003d domain._connection.hostname"},{"line_number":54,"context_line":"            dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"            # In a real live migration, libvirt and QEMU on the source"}],"source_content_type":"text/x-python","patch_set":11,"id":"0204e5cf_7aa20ccd","line":53,"in_reply_to":"04a9e4a3_46503d1c","updated":"2021-12-08 14:56:38.000000000","message":"Ack","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"a94c8214c879923348e438de429ed5e2cddcf082","unresolved":true,"context_lines":[{"line_number":51,"context_line":"        # Execute only if live migration is not locked"},{"line_number":52,"context_line":"        with self.lock_live_migration:"},{"line_number":53,"context_line":"            src_hostname \u003d domain._connection.hostname"},{"line_number":54,"context_line":"            dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"            # In a real live migration, libvirt and QEMU on the source"},{"line_number":57,"context_line":"            # and destination talk it out, resulting in the instance"}],"source_content_type":"text/x-python","patch_set":11,"id":"e4ac075e_3889feaa","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":64},"updated":"2021-11-11 11:21:46.000000000","message":"Likewise this should always be dest and as I said above just use instance variables to track the computes.","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"90596f25c6cde8d606cde772b56a6729f6c0911d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        # Execute only if live migration is not locked"},{"line_number":52,"context_line":"        with self.lock_live_migration:"},{"line_number":53,"context_line":"            src_hostname \u003d domain._connection.hostname"},{"line_number":54,"context_line":"            dst_hostname \u003d urlparse.urlparse(destination).netloc"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"            # In a real live migration, libvirt and QEMU on the source"},{"line_number":57,"context_line":"            # and destination talk it out, resulting in the instance"}],"source_content_type":"text/x-python","patch_set":11,"id":"78961312_2ba94a5b","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":64},"in_reply_to":"e4ac075e_3889feaa","updated":"2021-12-08 14:56:38.000000000","message":"Ack","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"a94c8214c879923348e438de429ed5e2cddcf082","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        # Unlock live migrations"},{"line_number":116,"context_line":"        self.lock_live_migration.release()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        # FIXME(artom) Assert the server_b never comes out of \u0027MIGRATING\u0027"},{"line_number":119,"context_line":"        self.assertRaises("},{"line_number":120,"context_line":"            AssertionError,"},{"line_number":121,"context_line":"            self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"e50dffb2_eface99c","line":118,"range":{"start_line":118,"start_character":0,"end_line":118,"end_character":73},"updated":"2021-11-11 11:21:46.000000000","message":"https://github.com/openstack/nova/blob/a1e7ed3670f925e07a398872d303ac2f3d4e3723/nova/compute/manager.py#L8635-L8645 - ACK, nice catch.\n\nFWIW I don\u0027t see the instance task state being changed if the instance had actually started the migration. So maybe another test is required for that case here?","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"90596f25c6cde8d606cde772b56a6729f6c0911d","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        # Unlock live migrations"},{"line_number":116,"context_line":"        self.lock_live_migration.release()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        # FIXME(artom) Assert the server_b never comes out of \u0027MIGRATING\u0027"},{"line_number":119,"context_line":"        self.assertRaises("},{"line_number":120,"context_line":"            AssertionError,"},{"line_number":121,"context_line":"            self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"5678cf6c_106e57b6","line":118,"range":{"start_line":118,"start_character":0,"end_line":118,"end_character":73},"in_reply_to":"e50dffb2_eface99c","updated":"2021-12-08 14:56:38.000000000","message":"I tried to quickly add it, but it looks like this is not that straightforward and requires some extra tuning for libvirt fixture. It is also possible that there is another bug in Nova. I would try this in lab and would upload separate patch.","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"a94c8214c879923348e438de429ed5e2cddcf082","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            AssertionError,"},{"line_number":121,"context_line":"            self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":122,"context_line":"        self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"},{"line_number":123,"context_line":"        # Confirm that server_a becomes active again after successful"},{"line_number":124,"context_line":"        # live migration"},{"line_number":125,"context_line":"        self._wait_for_state_change(self.server_a, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ed23ded6_894fe2a9","line":125,"range":{"start_line":123,"start_character":0,"end_line":125,"end_character":60},"updated":"2021-11-11 11:21:46.000000000","message":"nit - I\u0027d personally move this below the self.lock_live_migration.release()","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":19234,"name":"Alexey Stupnikov","email":"aleksey.stupnikov@gmail.com","username":"astupnikov"},"change_message_id":"90596f25c6cde8d606cde772b56a6729f6c0911d","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            AssertionError,"},{"line_number":121,"context_line":"            self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":122,"context_line":"        self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"},{"line_number":123,"context_line":"        # Confirm that server_a becomes active again after successful"},{"line_number":124,"context_line":"        # live migration"},{"line_number":125,"context_line":"        self._wait_for_state_change(self.server_a, \u0027ACTIVE\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"c776e0ff_c0ce1c8c","line":125,"range":{"start_line":123,"start_character":0,"end_line":125,"end_character":60},"in_reply_to":"ed23ded6_894fe2a9","updated":"2021-12-08 14:56:38.000000000","message":"Ack","commit_id":"411d851804e9f8c60c6e8666744379c9067b83aa"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"79c1a00e22cd40744bf7c8e3a847eacaf97d7bef","unresolved":true,"context_lines":[{"line_number":113,"context_line":"        # FIXME(artom) Assert the server_b never comes out of \u0027MIGRATING\u0027"},{"line_number":114,"context_line":"        self.assertRaises("},{"line_number":115,"context_line":"            AssertionError,"},{"line_number":116,"context_line":"            self._wait_for_state_change, self.server_b, \u0027ACTIVE\u0027)"},{"line_number":117,"context_line":"        self._wait_for_state_change(self.server_b, \u0027MIGRATING\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bf1bc39a_e9e32234","line":116,"updated":"2022-01-21 20:16:21.000000000","message":"I don\u0027t love this part because it will take at least 10 retries * sleep(0.5) \u003d 5 seconds to return ... but I don\u0027t think there\u0027s much we can do besides pass max_retries \u003c 10. And the test will speed up after the bug is fixed.\n\nIn the last run, the test took about 12 seconds:\n nova.tests.functional.libvirt.test_live_migration.LiveMigrationQueuedAbortTest.test_queued_live_migration_abort [12.156253s] ... ok\n\nhttps://zuul.opendev.org/t/openstack/build/a369dc6b8a324355b15d5cdd5fef8423/log/job-output.txt#2974","commit_id":"3e7b9b69e68c8594eac92d88f0579aab40d7d5ae"}]}
