)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"39655ebcc708628067c34168a0b0d96e05519fba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0d4910b6_22e9765e","updated":"2026-06-24 16:33:10.000000000","message":"This test looks good to me, +1 while Sean reviews.","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c3981c47339abb7137d17a0c0140565191568d7a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0c4a0a32_eb33e4bd","updated":"2026-06-24 17:12:19.000000000","message":"we could procced with this as is\n\nsome minior nits inline","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"83e6d89bee5016864cd8eeccdfc9a10f2c9c37fd","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e837baef_0c394155","updated":"2026-06-29 20:53:26.000000000","message":"i think we can proceed with this.\nat some point we may want to factor out a libvirt functional mix-in to duplicate some fo the function but that is out of scope fo this patch","commit_id":"cd00ebf57e879d8548273f5cc1eb426144687139"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"605a2550f245a18b3144c0e27b97ad8634c8716d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"67a8de69_3cb0de33","in_reply_to":"e837baef_0c394155","updated":"2026-06-30 13:47:28.000000000","message":"Acknowledged","commit_id":"cd00ebf57e879d8548273f5cc1eb426144687139"}],"nova/tests/fixtures/libvirt.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"d6ffa136042232b6cba288bcc09defa07c0d9d67","unresolved":false,"context_lines":[{"line_number":1648,"context_line":"    \u003cdisk type\u003d\u0027%(type)s\u0027 device\u003d\u0027%(device)s\u0027\u003e"},{"line_number":1649,"context_line":"      \u003cdriver name\u003d\u0027%(driver_name)s\u0027 type\u003d\u0027%(driver_type)s\u0027/\u003e"},{"line_number":1650,"context_line":"      \u003calias name\u003d\u0027%(alias)s\u0027/\u003e%(auth_xml)s"},{"line_number":1651,"context_line":"      \u003csource protocol\u003d\u0027%(source_protocol)s\u0027 name\u003d\u0027%(source_name)s\u0027\u003e%(hosts_xml)s"},{"line_number":1652,"context_line":"      \u003c/source\u003e"},{"line_number":1653,"context_line":"      \u003ctarget dev\u003d\u0027%(target_dev)s\u0027 bus\u003d\u0027%(target_bus)s\u0027/\u003e"},{"line_number":1654,"context_line":"      \u003caddress type\u003d\u0027drive\u0027 controller\u003d\u00270\u0027 bus\u003d\u00270\u0027 unit\u003d\u00270\u0027/\u003e"}],"source_content_type":"text/x-python","patch_set":1,"id":"77bb0197_6990abe5","line":1651,"updated":"2026-06-16 16:19:33.000000000","message":"pep8: E501 line too long (81 \u003e 79 characters)","commit_id":"ed9571768a930d5b87ab74e0438a7dafbdb36347"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c3981c47339abb7137d17a0c0140565191568d7a","unresolved":true,"context_lines":[{"line_number":1634,"context_line":"                auth_xml \u003d \u0027\u0027"},{"line_number":1635,"context_line":"                if disk.get(\u0027auth_username\u0027):"},{"line_number":1636,"context_line":"                    auth_xml \u003d ("},{"line_number":1637,"context_line":"                        \"\\n      \u003cauth username\u003d\u0027%s\u0027\u003e\""},{"line_number":1638,"context_line":"                        \"\\n        \u003csecret type\u003d\u0027%s\u0027 uuid\u003d\u0027%s\u0027/\u003e\""},{"line_number":1639,"context_line":"                        \"\\n      \u003c/auth\u003e\") % ("},{"line_number":1640,"context_line":"                            disk[\u0027auth_username\u0027],"},{"line_number":1641,"context_line":"                            disk.get(\u0027auth_secret_type\u0027, \u0027ceph\u0027),"},{"line_number":1642,"context_line":"                            disk.get(\u0027auth_secret_uuid\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"0b047d07_877263c0","line":1639,"range":{"start_line":1637,"start_character":0,"end_line":1639,"end_character":41},"updated":"2026-06-24 17:12:19.000000000","message":"this is ok\ni woudl personally use a multi line string like we doline 1647\n\nto avoid the need for the \\n btu this shoudl be ok\n```suggestion\n                        \"\"\"\n                        \u003cauth username\u003d\u0027%s\u0027\u003e\"\n                            \u003csecret type\u003d\u0027%s\u0027 uuid\u003d\u0027%s\u0027/\u003e\"\n                        \u003c/auth\u003e\n                        \"\"\") % (\n```","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"83e6d89bee5016864cd8eeccdfc9a10f2c9c37fd","unresolved":false,"context_lines":[{"line_number":1634,"context_line":"                auth_xml \u003d \u0027\u0027"},{"line_number":1635,"context_line":"                if disk.get(\u0027auth_username\u0027):"},{"line_number":1636,"context_line":"                    auth_xml \u003d ("},{"line_number":1637,"context_line":"                        \"\\n      \u003cauth username\u003d\u0027%s\u0027\u003e\""},{"line_number":1638,"context_line":"                        \"\\n        \u003csecret type\u003d\u0027%s\u0027 uuid\u003d\u0027%s\u0027/\u003e\""},{"line_number":1639,"context_line":"                        \"\\n      \u003c/auth\u003e\") % ("},{"line_number":1640,"context_line":"                            disk[\u0027auth_username\u0027],"},{"line_number":1641,"context_line":"                            disk.get(\u0027auth_secret_type\u0027, \u0027ceph\u0027),"},{"line_number":1642,"context_line":"                            disk.get(\u0027auth_secret_uuid\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"d11a8c66_5d1357d7","line":1639,"range":{"start_line":1637,"start_character":0,"end_line":1639,"end_character":41},"in_reply_to":"0b047d07_877263c0","updated":"2026-06-29 20:53:26.000000000","message":"Done","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c3981c47339abb7137d17a0c0140565191568d7a","unresolved":true,"context_lines":[{"line_number":1640,"context_line":"                            disk[\u0027auth_username\u0027],"},{"line_number":1641,"context_line":"                            disk.get(\u0027auth_secret_type\u0027, \u0027ceph\u0027),"},{"line_number":1642,"context_line":"                            disk.get(\u0027auth_secret_uuid\u0027, \u0027\u0027))"},{"line_number":1643,"context_line":"                hosts_xml \u003d \u0027\u0027.join("},{"line_number":1644,"context_line":"                    \"\\n        \u003chost name\u003d\u0027%s\u0027 port\u003d\u0027%s\u0027/\u003e\" % ("},{"line_number":1645,"context_line":"                        h[\u0027name\u0027], h[\u0027port\u0027])"},{"line_number":1646,"context_line":"                    for h in disk.get(\u0027source_hosts\u0027) or [])"},{"line_number":1647,"context_line":"                disks +\u003d (\"\"\""},{"line_number":1648,"context_line":"    \u003cdisk type\u003d\u0027%(type)s\u0027 device\u003d\u0027%(device)s\u0027\u003e"},{"line_number":1649,"context_line":"      \u003cdriver name\u003d\u0027%(driver_name)s\u0027 type\u003d\u0027%(driver_type)s\u0027/\u003e"}],"source_content_type":"text/x-python","patch_set":4,"id":"5cf3e69b_9b5ee691","line":1646,"range":{"start_line":1643,"start_character":0,"end_line":1646,"end_character":60},"updated":"2026-06-24 17:12:19.000000000","message":"nit: same here\n```suggestion\n                hosts_xml \u003d \u0027\\n\u0027.join(\n                    f\"\u003chost name\u003d\u0027%s\u0027 port\u003d\u0027%s\u0027/\u003e\" % (\n                        , h[\u0027port\u0027])\n                    for h in disk.get(\u0027source_hosts\u0027) or [])\n```","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"83e6d89bee5016864cd8eeccdfc9a10f2c9c37fd","unresolved":false,"context_lines":[{"line_number":1640,"context_line":"                            disk[\u0027auth_username\u0027],"},{"line_number":1641,"context_line":"                            disk.get(\u0027auth_secret_type\u0027, \u0027ceph\u0027),"},{"line_number":1642,"context_line":"                            disk.get(\u0027auth_secret_uuid\u0027, \u0027\u0027))"},{"line_number":1643,"context_line":"                hosts_xml \u003d \u0027\u0027.join("},{"line_number":1644,"context_line":"                    \"\\n        \u003chost name\u003d\u0027%s\u0027 port\u003d\u0027%s\u0027/\u003e\" % ("},{"line_number":1645,"context_line":"                        h[\u0027name\u0027], h[\u0027port\u0027])"},{"line_number":1646,"context_line":"                    for h in disk.get(\u0027source_hosts\u0027) or [])"},{"line_number":1647,"context_line":"                disks +\u003d (\"\"\""},{"line_number":1648,"context_line":"    \u003cdisk type\u003d\u0027%(type)s\u0027 device\u003d\u0027%(device)s\u0027\u003e"},{"line_number":1649,"context_line":"      \u003cdriver name\u003d\u0027%(driver_name)s\u0027 type\u003d\u0027%(driver_type)s\u0027/\u003e"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f505911_37a484c3","line":1646,"range":{"start_line":1643,"start_character":0,"end_line":1646,"end_character":60},"in_reply_to":"5cf3e69b_9b5ee691","updated":"2026-06-29 20:53:26.000000000","message":"Done","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"}],"nova/tests/functional/regressions/test_bug_1741364.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"83e6d89bee5016864cd8eeccdfc9a10f2c9c37fd","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class TestLiveMigrationRbdMonAddrsNotRefreshed("},{"line_number":55,"context_line":"    base.LibvirtMigrationMixin,"},{"line_number":56,"context_line":"    base.ServersTestBase,"},{"line_number":57,"context_line":"    integrated_helpers.InstanceHelperMixin,"},{"line_number":58,"context_line":"):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f2d8fdf_df67fc1a","line":55,"range":{"start_line":55,"start_character":4,"end_line":55,"end_character":31},"updated":"2026-06-29 20:53:26.000000000","message":"base.LibvirtMigrationMixin is there a reason you removed this?","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"f49af46e61ca922cb0616cd6ed70e5e9e84d7823","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class TestLiveMigrationRbdMonAddrsNotRefreshed("},{"line_number":55,"context_line":"    base.LibvirtMigrationMixin,"},{"line_number":56,"context_line":"    base.ServersTestBase,"},{"line_number":57,"context_line":"    integrated_helpers.InstanceHelperMixin,"},{"line_number":58,"context_line":"):"}],"source_content_type":"text/x-python","patch_set":4,"id":"953e06bd_352e111b","line":55,"range":{"start_line":55,"start_character":4,"end_line":55,"end_character":31},"in_reply_to":"5f2d8fdf_df67fc1a","updated":"2026-06-29 21:28:40.000000000","message":"+1 this seems to be a bit of an overcorrection to remove both `LibvirtMigrationMixin` and `InstanceHelperMixin`. Was there a reason you had to remove these?","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"605a2550f245a18b3144c0e27b97ad8634c8716d","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class TestLiveMigrationRbdMonAddrsNotRefreshed("},{"line_number":55,"context_line":"    base.LibvirtMigrationMixin,"},{"line_number":56,"context_line":"    base.ServersTestBase,"},{"line_number":57,"context_line":"    integrated_helpers.InstanceHelperMixin,"},{"line_number":58,"context_line":"):"}],"source_content_type":"text/x-python","patch_set":4,"id":"97d4b194_0b8126fa","line":55,"range":{"start_line":55,"start_character":4,"end_line":55,"end_character":31},"in_reply_to":"6d3a6235_302f3a30","updated":"2026-06-30 13:47:28.000000000","message":"Hey folks, thanks for the quick turnaround. No, I just removed those classes because they live in the same nova.tests.functional.libvirt.base module as ServersTestBase and I was eliminating all base imports. I\u0027ll re-add the LibvirtMigrationMixin and remove the migration stubing wihtout the mocking issue.","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"50d00e80c65a6a2dcf8f8646dcf2c30501338b7b","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class TestLiveMigrationRbdMonAddrsNotRefreshed("},{"line_number":55,"context_line":"    base.LibvirtMigrationMixin,"},{"line_number":56,"context_line":"    base.ServersTestBase,"},{"line_number":57,"context_line":"    integrated_helpers.InstanceHelperMixin,"},{"line_number":58,"context_line":"):"}],"source_content_type":"text/x-python","patch_set":4,"id":"6d3a6235_302f3a30","line":55,"range":{"start_line":55,"start_character":4,"end_line":55,"end_character":31},"in_reply_to":"953e06bd_352e111b","updated":"2026-06-29 21:46:47.000000000","message":"the InstanceHelperMixin we get for free form PlacementInstanceHelperMixin\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/integrated_helpers.py#L1362\nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/integrated_helpers.py#L1060\n\nso thats ok for now i woudl just readd LibvirtMigrationMixin\n\nadn then speratly we may want to factor oth some of the libvir setup stuff into a mixin that allows some ot the more invaive mocking to be disabled. or at least refiend\n\nLibvirtProviderUsageBaseTestCase is perhas a good middleground bteween teh two today\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/libvirt/integrated_helpers.py#L23\n\nbut i dont want to give too many options here.\n\nthe impoant thing about it is it enable the libvirt fixuteres and set\n compute_driver \u003d \u0027libvirt.LibvirtDriver\u0027\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/libvirt/integrated_helpers.py#L28\n\nbut yous still need to define your onw fuction for the connection when using it\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/libvirt/test_vpmem.py#L86-L124\nso there is room for impovement but i think we shoudl look at that sepertly\n\nif we can re-add  LibvirtMigrationMixin and remove the migration stubing wihtout mocking issue i think that good enough for me.\n\nill think about if there is a easy way to factor out a libvirt driver mixing or fixture \n\nthat will handel seting up the libvirt connection fixture and provide teh start_comptue and _get_connection methods ectra","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"26473968dd95a37cdbd2553b250bf61feb94dd53","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class TestLiveMigrationRbdMonAddrsNotRefreshed("},{"line_number":55,"context_line":"    base.LibvirtMigrationMixin,"},{"line_number":56,"context_line":"    base.ServersTestBase,"},{"line_number":57,"context_line":"    integrated_helpers.InstanceHelperMixin,"},{"line_number":58,"context_line":"):"}],"source_content_type":"text/x-python","patch_set":4,"id":"78eec0d4_0d651dd9","line":55,"range":{"start_line":55,"start_character":4,"end_line":55,"end_character":31},"in_reply_to":"97d4b194_0b8126fa","updated":"2026-07-27 13:14:23.000000000","message":"Done","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c3981c47339abb7137d17a0c0140565191568d7a","unresolved":true,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class TestLiveMigrationRbdMonAddrsNotRefreshed("},{"line_number":55,"context_line":"    base.LibvirtMigrationMixin,"},{"line_number":56,"context_line":"    base.ServersTestBase,"},{"line_number":57,"context_line":"    integrated_helpers.InstanceHelperMixin,"},{"line_number":58,"context_line":"):"},{"line_number":59,"context_line":"    \"\"\"Reproducer for bug #1741364."}],"source_content_type":"text/x-python","patch_set":4,"id":"b30cf1d6_4f226f62","line":56,"range":{"start_line":56,"start_character":9,"end_line":56,"end_character":24},"updated":"2026-06-24 17:12:19.000000000","message":"we often avoid inheriting form this in the regression suite\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/regressions/README.rst\n\nwe do allwo it but it can over mock","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"83e6d89bee5016864cd8eeccdfc9a10f2c9c37fd","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class TestLiveMigrationRbdMonAddrsNotRefreshed("},{"line_number":55,"context_line":"    base.LibvirtMigrationMixin,"},{"line_number":56,"context_line":"    base.ServersTestBase,"},{"line_number":57,"context_line":"    integrated_helpers.InstanceHelperMixin,"},{"line_number":58,"context_line":"):"},{"line_number":59,"context_line":"    \"\"\"Reproducer for bug #1741364."}],"source_content_type":"text/x-python","patch_set":4,"id":"d859cf5f_13fb2367","line":56,"range":{"start_line":56,"start_character":9,"end_line":56,"end_character":24},"in_reply_to":"b30cf1d6_4f226f62","updated":"2026-06-29 20:53:26.000000000","message":"Done","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c3981c47339abb7137d17a0c0140565191568d7a","unresolved":true,"context_lines":[{"line_number":94,"context_line":"        self.mock_rbd_driver.pool \u003d \u0027rbd\u0027"},{"line_number":95,"context_line":"        self.mock_rbd_driver.ceph_conf \u003d \u0027\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # ServersTestBase installs LibvirtImageBackendFixture, which"},{"line_number":98,"context_line":"        # replaces imagebackend.Backend.backend with a stub that always"},{"line_number":99,"context_line":"        # returns a \u0027file\u0027-style disk via _fake_libvirt_info(). That"},{"line_number":100,"context_line":"        # bypasses Rbd.libvirt_info() and therefore the get_mon_addrs()"}],"source_content_type":"text/x-python","patch_set":4,"id":"b0c7c90d_d6b31afd","line":97,"range":{"start_line":97,"start_character":0,"end_line":97,"end_character":2},"updated":"2026-06-24 17:12:19.000000000","message":"as you fohnd here\n\nthis is an example of building up a test with libvir twithout that\n\nhttps://github.com/openstack/nova/blob/6d52ef14b602396d3bc5298fc7c827d6c56cc708/nova/tests/functional/regressions/test_bug_1595962.py#L28-L67\n\nwe try to avoid double mocking as its has caused issues in the past with test stability.\n\nit might be better to use that but your current approch is proably ok\n\n@melwittt@gmail.com any prefence.\n\nwe use base.ServersTestBase in a lot of other regression tests anyways\n\nso we are not strict on https://github.com/openstack/nova/blob/6d52ef14b602396d3bc5298fc7c827d6c56cc708/nova/tests/functional/regressions/README.rst#writing-regression-tests\n\neven if it is the best practice","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"83e6d89bee5016864cd8eeccdfc9a10f2c9c37fd","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        self.mock_rbd_driver.pool \u003d \u0027rbd\u0027"},{"line_number":95,"context_line":"        self.mock_rbd_driver.ceph_conf \u003d \u0027\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # ServersTestBase installs LibvirtImageBackendFixture, which"},{"line_number":98,"context_line":"        # replaces imagebackend.Backend.backend with a stub that always"},{"line_number":99,"context_line":"        # returns a \u0027file\u0027-style disk via _fake_libvirt_info(). That"},{"line_number":100,"context_line":"        # bypasses Rbd.libvirt_info() and therefore the get_mon_addrs()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9599e61a_45ed47a7","line":97,"range":{"start_line":97,"start_character":0,"end_line":97,"end_character":2},"in_reply_to":"26aa1341_37173ec0","updated":"2026-06-29 20:53:26.000000000","message":"Done","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"0252f193c257d49ca82407ab150a60f5bc3ae8f0","unresolved":true,"context_lines":[{"line_number":94,"context_line":"        self.mock_rbd_driver.pool \u003d \u0027rbd\u0027"},{"line_number":95,"context_line":"        self.mock_rbd_driver.ceph_conf \u003d \u0027\u0027"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # ServersTestBase installs LibvirtImageBackendFixture, which"},{"line_number":98,"context_line":"        # replaces imagebackend.Backend.backend with a stub that always"},{"line_number":99,"context_line":"        # returns a \u0027file\u0027-style disk via _fake_libvirt_info(). That"},{"line_number":100,"context_line":"        # bypasses Rbd.libvirt_info() and therefore the get_mon_addrs()"}],"source_content_type":"text/x-python","patch_set":4,"id":"26aa1341_37173ec0","line":97,"range":{"start_line":97,"start_character":0,"end_line":97,"end_character":2},"in_reply_to":"b0c7c90d_d6b31afd","updated":"2026-06-24 17:40:31.000000000","message":"Hm yeah, this is kind of unfortunate/awkward. If we can avoid it by inheriting from `_IntegratedTestBase` instead, it would be better I think.","commit_id":"642e62091bbf8f4bb9ce84e8c9cf0b270be65577"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"125b3555e560edbe0228c49390f0ad02e95891e8","unresolved":false,"context_lines":[{"line_number":41,"context_line":"import fixtures"},{"line_number":42,"context_line":"from lxml import etree"},{"line_number":43,"context_line":"from oslo_utils import units"},{"line_number":44,"context_line":"from oslo_utils.fixture import uuidsentinel as uuids"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"from nova.tests import fixtures as nova_fixtures"},{"line_number":47,"context_line":"from nova.tests.fixtures import libvirt as fakelibvirt"}],"source_content_type":"text/x-python","patch_set":5,"id":"23bca1cc_a9fed95d","line":44,"updated":"2026-06-29 17:25:07.000000000","message":"pep8: H306: imports not in alphabetical order (oslo_utils.units, oslo_utils.fixture.uuidsentinel)","commit_id":"426648329c91a119331210a0ef49d946c9688dac"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"83e6d89bee5016864cd8eeccdfc9a10f2c9c37fd","unresolved":true,"context_lines":[{"line_number":107,"context_line":"            \u0027nova.virt.libvirt.host.Host.get_online_cpus\u0027,"},{"line_number":108,"context_line":"            return_value\u003dset(range(16))))"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        _p \u003d mock.patch(\u0027nova.virt.libvirt.host.Host.get_connection\u0027)"},{"line_number":111,"context_line":"        self.mock_conn \u003d _p.start()"},{"line_number":112,"context_line":"        self.addCleanup(_p.stop)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":115,"context_line":"            \u0027nova.tests.fixtures.libvirt.Domain.migrateToURI3\u0027,"},{"line_number":116,"context_line":"            self._migrate_stub))"},{"line_number":117,"context_line":"        self.migrate_stub_ran \u003d False"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        self.flags(group\u003d\u0027libvirt\u0027, images_type\u003d\u0027rbd\u0027)"},{"line_number":120,"context_line":"        self.flags(group\u003d\u0027libvirt\u0027, rbd_secret_uuid\u003d\u00271234\u0027)"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"bf225e70_d3d82481","line":118,"range":{"start_line":110,"start_character":7,"end_line":118,"end_character":1},"updated":"2026-06-29 20:53:26.000000000","message":"this can basiclly be done for you by the mitration mixin \n\nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/libvirt/base.py#L264\n\nthat woudl be afe to reuse","commit_id":"cd00ebf57e879d8548273f5cc1eb426144687139"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"26473968dd95a37cdbd2553b250bf61feb94dd53","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            \u0027nova.virt.libvirt.host.Host.get_online_cpus\u0027,"},{"line_number":108,"context_line":"            return_value\u003dset(range(16))))"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        _p \u003d mock.patch(\u0027nova.virt.libvirt.host.Host.get_connection\u0027)"},{"line_number":111,"context_line":"        self.mock_conn \u003d _p.start()"},{"line_number":112,"context_line":"        self.addCleanup(_p.stop)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        self.useFixture(fixtures.MonkeyPatch("},{"line_number":115,"context_line":"            \u0027nova.tests.fixtures.libvirt.Domain.migrateToURI3\u0027,"},{"line_number":116,"context_line":"            self._migrate_stub))"},{"line_number":117,"context_line":"        self.migrate_stub_ran \u003d False"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        self.flags(group\u003d\u0027libvirt\u0027, images_type\u003d\u0027rbd\u0027)"},{"line_number":120,"context_line":"        self.flags(group\u003d\u0027libvirt\u0027, rbd_secret_uuid\u003d\u00271234\u0027)"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5292db49_d8567f7a","line":118,"range":{"start_line":110,"start_character":7,"end_line":118,"end_character":1},"in_reply_to":"bf225e70_d3d82481","updated":"2026-07-27 13:14:23.000000000","message":"Done","commit_id":"cd00ebf57e879d8548273f5cc1eb426144687139"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"83e6d89bee5016864cd8eeccdfc9a10f2c9c37fd","unresolved":true,"context_lines":[{"line_number":176,"context_line":"            \u0027resource_providers\u0027][0][\u0027uuid\u0027]"},{"line_number":177,"context_line":"        return hostname"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":180,"context_line":"        self.dest.driver._host.get_connection().createXML("},{"line_number":181,"context_line":"            params[\u0027destination_xml\u0027],"},{"line_number":182,"context_line":"            \u0027fake-createXML-doesnt-care-about-flags\u0027)"},{"line_number":183,"context_line":"        conn \u003d self.src.driver._host.get_connection()"},{"line_number":184,"context_line":"        dom \u003d conn.lookupByUUIDString(self.server[\u0027id\u0027])"},{"line_number":185,"context_line":"        dom.complete_job()"},{"line_number":186,"context_line":"        self.migrate_stub_ran \u003d True"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    @staticmethod"},{"line_number":189,"context_line":"    def _rbd_disk_hosts(xml):"},{"line_number":190,"context_line":"        \"\"\"Return [(host, port), ...] for every rbd \u003csource\u003e/\u003chost\u003e in xml.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"247098cc_46a80e07","line":187,"range":{"start_line":179,"start_character":2,"end_line":187,"end_character":1},"updated":"2026-06-29 20:53:26.000000000","message":"which means you coudl drop this","commit_id":"cd00ebf57e879d8548273f5cc1eb426144687139"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"26473968dd95a37cdbd2553b250bf61feb94dd53","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            \u0027resource_providers\u0027][0][\u0027uuid\u0027]"},{"line_number":177,"context_line":"        return hostname"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _migrate_stub(self, domain, destination, params, flags):"},{"line_number":180,"context_line":"        self.dest.driver._host.get_connection().createXML("},{"line_number":181,"context_line":"            params[\u0027destination_xml\u0027],"},{"line_number":182,"context_line":"            \u0027fake-createXML-doesnt-care-about-flags\u0027)"},{"line_number":183,"context_line":"        conn \u003d self.src.driver._host.get_connection()"},{"line_number":184,"context_line":"        dom \u003d conn.lookupByUUIDString(self.server[\u0027id\u0027])"},{"line_number":185,"context_line":"        dom.complete_job()"},{"line_number":186,"context_line":"        self.migrate_stub_ran \u003d True"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    @staticmethod"},{"line_number":189,"context_line":"    def _rbd_disk_hosts(xml):"},{"line_number":190,"context_line":"        \"\"\"Return [(host, port), ...] for every rbd \u003csource\u003e/\u003chost\u003e in xml.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"72f8cfb3_fd2111ec","line":187,"range":{"start_line":179,"start_character":2,"end_line":187,"end_character":1},"in_reply_to":"247098cc_46a80e07","updated":"2026-07-27 13:14:23.000000000","message":"Done","commit_id":"cd00ebf57e879d8548273f5cc1eb426144687139"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a557100deed9266520deea0a2f19b8e4a9d31b49","unresolved":true,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class TestLiveMigrationRbdMonAddrsNotRefreshed("},{"line_number":53,"context_line":"    base.LibvirtMigrationMixin,"},{"line_number":54,"context_line":"    integrated_helpers._IntegratedTestBase,"},{"line_number":55,"context_line":"):"},{"line_number":56,"context_line":"    \"\"\"Reproducer for bug #1741364."},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3d9d6c18_858d4d8e","line":54,"updated":"2026-07-14 18:38:27.000000000","message":"Note to self: I didn\u0027t realize just how much duplication dropping `ServersTestCase` would force 🫤 and that apparently it would have been much less change to temporarily mock patch `LibvirtImageBackendFixture` in setUp with a plain/empty no-op Fixture. That would have its own downside as a hack though. As Sean mentioned, it would be a lot better to factor out some duplicated things into a mixin.","commit_id":"dd88b0c99be9480ade9b1a4e0db2dc89bc5d0379"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"a557100deed9266520deea0a2f19b8e4a9d31b49","unresolved":true,"context_lines":[{"line_number":233,"context_line":"            expected_new, dest_hosts,"},{"line_number":234,"context_line":"            \"Bug #1741364 reproducer: destination libvirt XML must NOT \""},{"line_number":235,"context_line":"            \"yet contain the freshly reported mon addresses; if it does, \""},{"line_number":236,"context_line":"            \"the bug has been fixed and this test should be updated.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"fb493e62_625c17b8","line":236,"updated":"2026-07-14 18:38:27.000000000","message":"I think the only notable issue is this assert isn\u0027t really asserting that the old mon IPs are still present (the bug) ... it\u0027s just saying the new ones are not present. Which would also be true if the new mon IPs were empty, for example.","commit_id":"dd88b0c99be9480ade9b1a4e0db2dc89bc5d0379"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"74c66da6d0cb748314d81cbf78f4c8667c6a37fc","unresolved":true,"context_lines":[{"line_number":233,"context_line":"            expected_new, dest_hosts,"},{"line_number":234,"context_line":"            \"Bug #1741364 reproducer: destination libvirt XML must NOT \""},{"line_number":235,"context_line":"            \"yet contain the freshly reported mon addresses; if it does, \""},{"line_number":236,"context_line":"            \"the bug has been fixed and this test should be updated.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"ad6c3fb1_085dc1af","line":236,"in_reply_to":"820786f2_70bd9090","updated":"2026-07-22 22:24:49.000000000","message":"Yeah, sorry, I meant that if there was something else wrong in the code path and dest_hosts came back as empty or something (XML went somehow wrong), the test would still pass and it was a bit weird to think about that. What you have updated makes it easier, thanks.","commit_id":"dd88b0c99be9480ade9b1a4e0db2dc89bc5d0379"},{"author":{"_account_id":10058,"name":"Erlon R. Cruz","email":"erlon.rodrigues.cruz@canonical.com","username":"sombrafam"},"change_message_id":"252db53b6cd3d3a3c7db5e4a1c03da0de56e9797","unresolved":true,"context_lines":[{"line_number":233,"context_line":"            expected_new, dest_hosts,"},{"line_number":234,"context_line":"            \"Bug #1741364 reproducer: destination libvirt XML must NOT \""},{"line_number":235,"context_line":"            \"yet contain the freshly reported mon addresses; if it does, \""},{"line_number":236,"context_line":"            \"the bug has been fixed and this test should be updated.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"820786f2_70bd9090","line":236,"in_reply_to":"fb493e62_625c17b8","updated":"2026-07-22 20:07:37.000000000","message":"Asserting that would make sense in a real life scenario where I could get an arbitrary value. But for this test where everything is artificial, I don\u0027t think it adds much value to do that testing. To me it looks like the checks will be a bit redundant. If I understood correctly what you\u0027re saying:\n\n```\n        self.assertNotEqual(\n            expected_new, dest_hosts,\n            \"Bug #1741364 reproducer: destination libvirt XML must NOT \"\n            \"yet contain the freshly reported mon addresses; if it does, \"\n            \"the bug has been fixed and this test should be updated.\")\n        self.assertEqual(\n            expected_old, dest_hosts,\n            \"Bug #1741364 reproducer: destination libvirt XML still \"\n            \"contains the old mon addresses. If not, the bug has been \"\n            \"fixed and this test should be updated.\")\n```\nPlease let me know if you still want me to change.","commit_id":"dd88b0c99be9480ade9b1a4e0db2dc89bc5d0379"}]}
