)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f73b2ecb9f791f318270f97808907ee2e2076d44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"ac492cf8_e99371c8","updated":"2025-02-27 13:54:44.000000000","message":"I see nothing blocking here just a bit of cleanup.","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b669fa79_9f3f7153","updated":"2025-02-27 14:58:30.000000000","message":"The implementation still seems reasonable to me\n\nBut we have sizeable testing gaps in the functional env. So it would be good to have a paste with the scenario and logs about a successful live migration from a real test env showing that the feature works.\n\nIf we have the proof that is works OK in a real env then I can be persuaded to approve this and have the functional test gaps fixed as followup.","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e4abcaba3d77b1740d9cafad4daddaa2d03103a9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c0cf5aaa_5b395acf","updated":"2025-02-27 13:55:09.000000000","message":"sorry resetting my vote I haven\u0027t looked at the functional test yet...","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0b0be16cbe76e3443664574a2bb34edb3eb2b49a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1e1a9754_7cb70cf6","updated":"2025-02-28 11:20:48.000000000","message":"I see a potential bug in the XML updating code when a VM has both flavor based PCI and neutron direct_physical port based PCI device in the XML","commit_id":"47922135b1a0b54f636f1eb02cb1e0bc1a5edb5c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a31b56b62879696f56a1e6fbc65a277aa500b32","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"18165e17_54005e75","updated":"2025-03-03 13:45:40.000000000","message":"I still need to look at the functional test coverage but publishing comments on the implementation. I think the xml update logic is good, I only have some requests there.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3cf5d5ec_40a4877a","updated":"2025-03-03 15:57:11.000000000","message":"Run out of time for today why reviewing the functional test. I will continue tomorrow.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"af60130f3566f0002bb0c7cffd17be1c883d3c40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"be65fe65_4a622aff","updated":"2025-03-03 14:48:42.000000000","message":"couple of comments for the fixture extension","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"081920b0d8f9d054e1d98afd5c82fe18a71fc7e0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"92771b2e_5d509a31","updated":"2025-03-04 18:04:38.000000000","message":"I haven\u0027t finished reviewing the functional test coverage. Still I\u0027m approving this as the code works (tested with real hardware) and the exiting functional coverage gives us enough proof that legacy works too. The missing coverage can be added in followups. I synced with this with Bauzas and Rene as well.","commit_id":"fd656f394375231de9beb54087e2ecb910060045"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ec99c136ed429ae8b758d76abdfbf72f7630ba9a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"303f5b85_05f88b56","updated":"2025-03-10 15:49:28.000000000","message":"recheck parent requeued","commit_id":"fd656f394375231de9beb54087e2ecb910060045"}],"nova/conf/pci.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"93ea653cabf623abe333cadef1b70cd95d4e0b45","unresolved":true,"context_lines":[{"line_number":240,"context_line":"      May have boolean-like string values case-insensitive values:"},{"line_number":241,"context_line":"      \"yes\" or \"no\". By default, \"no\" is assumed for all devices."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"      - ``live_migratable\u003d\u0027yes\u0027`` means that the device can be live migrated."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"      - ``live_migratable\u003d\u0027no\u0027`` means that the device cannot be live migrated."},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"87a8c932_2afabfee","line":243,"updated":"2025-02-24 13:54:38.000000000","message":"I would note that this requires hardware support and hypervisor configuration.","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"35298cfb054cab56366f9b0e33bc793993715d04","unresolved":false,"context_lines":[{"line_number":240,"context_line":"      May have boolean-like string values case-insensitive values:"},{"line_number":241,"context_line":"      \"yes\" or \"no\". By default, \"no\" is assumed for all devices."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"      - ``live_migratable\u003d\u0027yes\u0027`` means that the device can be live migrated."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"      - ``live_migratable\u003d\u0027no\u0027`` means that the device cannot be live migrated."},{"line_number":246,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"68ef00c6_e7786c65","line":243,"in_reply_to":"87a8c932_2afabfee","updated":"2025-02-26 18:50:11.000000000","message":"Done","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"1c09b788fe506845c1424db809d18a387ef119e7","unresolved":true,"context_lines":[{"line_number":50,"context_line":"      [\"live_migratable\": \"\u003clive_migratable\u003e\"],"},{"line_number":51,"context_line":"    }"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"  Where ``[`` indicates zero or one occurrences, ``{`` indicates zero or"},{"line_number":54,"context_line":"  multiple occurrences, and ``|`` mutually exclusive options."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"  For example::"}],"source_content_type":"text/x-python","patch_set":9,"id":"27b32616_4ccc8ad3","line":53,"updated":"2025-03-16 13:38:36.000000000","message":"I guess this was copied from device_spec, but I find this quite confusing because\n * there are no mutually exclusive options\n * there are no options allowing multiple occurrences. I believe multiple occurrences is not even allowed.\n\nI\u0027m fixing this by https://review.opendev.org/c/openstack/nova/+/944611","commit_id":"fd656f394375231de9beb54087e2ecb910060045"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"45b183a4021eb9b93065bf66e9b917d53a2f2941","unresolved":false,"context_lines":[{"line_number":210,"context_line":"    - ``physical_network``"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    - ``trusted``"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    - ``remote_managed`` - a VF is managed remotely by an off-path networking"},{"line_number":215,"context_line":"      backend. May have boolean-like string values case-insensitive values:"},{"line_number":216,"context_line":"      \"true\" or \"false\". By default, \"false\" is assumed for all devices."}],"source_content_type":"text/x-python","patch_set":9,"id":"cfe2e656_b649a734","line":213,"updated":"2025-03-04 10:11:49.000000000","message":"nit: not necessary blank line.","commit_id":"fd656f394375231de9beb54087e2ecb910060045"}],"nova/tests/fixtures/libvirt.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"af60130f3566f0002bb0c7cffd17be1c883d3c40","unresolved":true,"context_lines":[{"line_number":974,"context_line":"            hostdev_info[\u0027bus\u0027] \u003d address.get(\u0027bus\u0027)"},{"line_number":975,"context_line":"            hostdev_info[\u0027slot\u0027] \u003d address.get(\u0027slot\u0027)"},{"line_number":976,"context_line":"            hostdev_info[\u0027function\u0027] \u003d address.get(\u0027function\u0027)"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"    return hostdev_info"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"084d51f3_4f06263a","line":977,"updated":"2025-03-03 14:48:42.000000000","message":"this does not populate the managed flag in the hostdef_info and therefore the fixture will fail L1614 when it try to generate an xml with a managed flag. This is not visible in your tests because the attach code of the fixture is wrong and does not try to attach the hostdev. See my comment there","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4e0d5bb5a83b9cb3150eba0ba6e5144295299d6c","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            hostdev_info[\u0027bus\u0027] \u003d address.get(\u0027bus\u0027)"},{"line_number":975,"context_line":"            hostdev_info[\u0027slot\u0027] \u003d address.get(\u0027slot\u0027)"},{"line_number":976,"context_line":"            hostdev_info[\u0027function\u0027] \u003d address.get(\u0027function\u0027)"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"    return hostdev_info"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7f968dfc_1271365c","line":977,"in_reply_to":"084d51f3_4f06263a","updated":"2025-03-03 20:23:02.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a31b56b62879696f56a1e6fbc65a277aa500b32","unresolved":true,"context_lines":[{"line_number":1279,"context_line":"                        \u0027address_uuid\u0027: address.get(\u0027uuid\u0027)"},{"line_number":1280,"context_line":"                    })"},{"line_number":1281,"context_line":"                if dev_type \u003d\u003d \u0027pci\u0027:"},{"line_number":1282,"context_line":"                    hostdev_info.append({"},{"line_number":1283,"context_line":"                        \u0027type\u0027: dev_type,"},{"line_number":1284,"context_line":"                        \u0027managed\u0027: hostdev.get(\u0027managed\u0027),"},{"line_number":1285,"context_line":"                        \u0027domain\u0027: address.get(\u0027domain\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"6dbc1ece_5479ed1c","line":1282,"updated":"2025-03-03 13:45:40.000000000","message":"could we user _parse_hostdev_info here?","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4e0d5bb5a83b9cb3150eba0ba6e5144295299d6c","unresolved":false,"context_lines":[{"line_number":1279,"context_line":"                        \u0027address_uuid\u0027: address.get(\u0027uuid\u0027)"},{"line_number":1280,"context_line":"                    })"},{"line_number":1281,"context_line":"                if dev_type \u003d\u003d \u0027pci\u0027:"},{"line_number":1282,"context_line":"                    hostdev_info.append({"},{"line_number":1283,"context_line":"                        \u0027type\u0027: dev_type,"},{"line_number":1284,"context_line":"                        \u0027managed\u0027: hostdev.get(\u0027managed\u0027),"},{"line_number":1285,"context_line":"                        \u0027domain\u0027: address.get(\u0027domain\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"c0b7b7e3_c0bd7ee7","line":1282,"in_reply_to":"6dbc1ece_5479ed1c","updated":"2025-03-03 20:23:02.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"af60130f3566f0002bb0c7cffd17be1c883d3c40","unresolved":true,"context_lines":[{"line_number":1419,"context_line":"            nic_info[\u0027_attached\u0027] \u003d True"},{"line_number":1420,"context_line":"            self._def[\u0027devices\u0027][\u0027nics\u0027] +\u003d [nic_info]"},{"line_number":1421,"context_line":"            result \u003d True"},{"line_number":1422,"context_line":"        elif xml.startswith(\"\u003chostdevs\"):"},{"line_number":1423,"context_line":"            hostdev_info \u003d _parse_hostdev_info(etree.fromstring(xml))"},{"line_number":1424,"context_line":"            hostdev_info[\u0027_attached\u0027] \u003d True"},{"line_number":1425,"context_line":"            self._def[\u0027devices\u0027][\u0027hostdevs\u0027] +\u003d [hostdev_info]"}],"source_content_type":"text/x-python","patch_set":8,"id":"de32c178_c8f48719","line":1422,"updated":"2025-03-03 14:48:42.000000000","message":"this is attachDevice so a single device is passed, the xml will start with \u003chostdev not \u003chostdevs","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4e0d5bb5a83b9cb3150eba0ba6e5144295299d6c","unresolved":false,"context_lines":[{"line_number":1419,"context_line":"            nic_info[\u0027_attached\u0027] \u003d True"},{"line_number":1420,"context_line":"            self._def[\u0027devices\u0027][\u0027nics\u0027] +\u003d [nic_info]"},{"line_number":1421,"context_line":"            result \u003d True"},{"line_number":1422,"context_line":"        elif xml.startswith(\"\u003chostdevs\"):"},{"line_number":1423,"context_line":"            hostdev_info \u003d _parse_hostdev_info(etree.fromstring(xml))"},{"line_number":1424,"context_line":"            hostdev_info[\u0027_attached\u0027] \u003d True"},{"line_number":1425,"context_line":"            self._def[\u0027devices\u0027][\u0027hostdevs\u0027] +\u003d [hostdev_info]"}],"source_content_type":"text/x-python","patch_set":8,"id":"792eaa23_e9b6c323","line":1422,"in_reply_to":"de32c178_c8f48719","updated":"2025-03-03 20:23:02.000000000","message":"Nice catch thanks.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"}],"nova/tests/functional/libvirt/test_pci_sriov_servers.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":496,"context_line":"                \"vendor_id\": fakelibvirt.PCI_VEND_ID,"},{"line_number":497,"context_line":"                \"product_id\": fakelibvirt.VF_PROD_ID,"},{"line_number":498,"context_line":"                \"physical_network\": \"physnet4\","},{"line_number":499,"context_line":"                \"managed\": \"yes\","},{"line_number":500,"context_line":"            },"},{"line_number":501,"context_line":"        ]"},{"line_number":502,"context_line":"        pci_info \u003d fakelibvirt.HostPCIDevicesInfo(num_pfs\u003d1, num_vfs\u003d1)"},{"line_number":503,"context_line":"        self._run_create_server_test("},{"line_number":504,"context_line":"            pci_info,"},{"line_number":505,"context_line":"            expected_managed\u003d\"yes\","},{"line_number":506,"context_line":"            device_spec\u003ddevice_spec,"},{"line_number":507,"context_line":"            libvirt_version\u003dversionutils.convert_version_to_int("},{"line_number":508,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_LIBVIRT_VERSION"},{"line_number":509,"context_line":"            ),"},{"line_number":510,"context_line":"            qemu_version\u003dversionutils.convert_version_to_int("},{"line_number":511,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_QEMU_VERSION"},{"line_number":512,"context_line":"            ),"},{"line_number":513,"context_line":"        )"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def test_create_server_with_VF_and_managed_set_to_no(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"c8036935_22997aac","line":512,"range":{"start_line":499,"start_character":0,"end_line":512,"end_character":14},"updated":"2025-02-27 14:58:30.000000000","message":"As this test case does not user live-migratable devs it does not need the min libvirt version. You might want to change this to test with live-migratable instead of managed flag","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                \"vendor_id\": fakelibvirt.PCI_VEND_ID,"},{"line_number":497,"context_line":"                \"product_id\": fakelibvirt.VF_PROD_ID,"},{"line_number":498,"context_line":"                \"physical_network\": \"physnet4\","},{"line_number":499,"context_line":"                \"managed\": \"yes\","},{"line_number":500,"context_line":"            },"},{"line_number":501,"context_line":"        ]"},{"line_number":502,"context_line":"        pci_info \u003d fakelibvirt.HostPCIDevicesInfo(num_pfs\u003d1, num_vfs\u003d1)"},{"line_number":503,"context_line":"        self._run_create_server_test("},{"line_number":504,"context_line":"            pci_info,"},{"line_number":505,"context_line":"            expected_managed\u003d\"yes\","},{"line_number":506,"context_line":"            device_spec\u003ddevice_spec,"},{"line_number":507,"context_line":"            libvirt_version\u003dversionutils.convert_version_to_int("},{"line_number":508,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_LIBVIRT_VERSION"},{"line_number":509,"context_line":"            ),"},{"line_number":510,"context_line":"            qemu_version\u003dversionutils.convert_version_to_int("},{"line_number":511,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_QEMU_VERSION"},{"line_number":512,"context_line":"            ),"},{"line_number":513,"context_line":"        )"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def test_create_server_with_VF_and_managed_set_to_no(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"0a63ec74_e9174467","line":512,"range":{"start_line":499,"start_character":0,"end_line":512,"end_character":14},"in_reply_to":"c8036935_22997aac","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":496,"context_line":"                \"vendor_id\": fakelibvirt.PCI_VEND_ID,"},{"line_number":497,"context_line":"                \"product_id\": fakelibvirt.VF_PROD_ID,"},{"line_number":498,"context_line":"                \"physical_network\": \"physnet4\","},{"line_number":499,"context_line":"                \"managed\": \"yes\","},{"line_number":500,"context_line":"            },"},{"line_number":501,"context_line":"        ]"},{"line_number":502,"context_line":"        pci_info \u003d fakelibvirt.HostPCIDevicesInfo(num_pfs\u003d1, num_vfs\u003d1)"},{"line_number":503,"context_line":"        self._run_create_server_test("},{"line_number":504,"context_line":"            pci_info,"},{"line_number":505,"context_line":"            expected_managed\u003d\"yes\","},{"line_number":506,"context_line":"            device_spec\u003ddevice_spec,"},{"line_number":507,"context_line":"            libvirt_version\u003dversionutils.convert_version_to_int("},{"line_number":508,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_LIBVIRT_VERSION"},{"line_number":509,"context_line":"            ),"},{"line_number":510,"context_line":"            qemu_version\u003dversionutils.convert_version_to_int("},{"line_number":511,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_QEMU_VERSION"},{"line_number":512,"context_line":"            ),"},{"line_number":513,"context_line":"        )"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def test_create_server_with_VF_and_managed_set_to_no(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"2c6cfe3a_42184b0a","line":512,"range":{"start_line":499,"start_character":0,"end_line":512,"end_character":14},"in_reply_to":"c8036935_22997aac","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":536,"context_line":"            ),"},{"line_number":537,"context_line":"            qemu_version\u003dversionutils.convert_version_to_int("},{"line_number":538,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_QEMU_VERSION"},{"line_number":539,"context_line":"            ),"},{"line_number":540,"context_line":"        )"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def test_create_server_with_VF_and_managed_not_set(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fd12403b_d0b8873b","line":539,"updated":"2025-02-27 14:58:30.000000000","message":"ditto","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":536,"context_line":"            ),"},{"line_number":537,"context_line":"            qemu_version\u003dversionutils.convert_version_to_int("},{"line_number":538,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_QEMU_VERSION"},{"line_number":539,"context_line":"            ),"},{"line_number":540,"context_line":"        )"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def test_create_server_with_VF_and_managed_not_set(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5596d370_7f2b8a64","line":539,"in_reply_to":"fd12403b_d0b8873b","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":536,"context_line":"            ),"},{"line_number":537,"context_line":"            qemu_version\u003dversionutils.convert_version_to_int("},{"line_number":538,"context_line":"                driver.MIN_VFIO_PCI_VARIANT_QEMU_VERSION"},{"line_number":539,"context_line":"            ),"},{"line_number":540,"context_line":"        )"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"    def test_create_server_with_VF_and_managed_not_set(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"d914e3eb_03d8b002","line":539,"in_reply_to":"fd12403b_d0b8873b","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":761,"context_line":"        self.assertEqual(500, ex.response.status_code)"},{"line_number":762,"context_line":"        self.assertIn(\u0027NoValidHost\u0027, str(ex))"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"    def test_live_migrate_server_with_VF_01(self):"},{"line_number":765,"context_line":"        \"\"\"Live migrate an instance with a PCI VF."},{"line_number":766,"context_line":"        This should now work with the correct version of libvirt and qemu"},{"line_number":767,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"50bbe587_ecbae505","line":764,"updated":"2025-02-27 14:58:30.000000000","message":"test_live_migrate_server_with_VF_success","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":761,"context_line":"        self.assertEqual(500, ex.response.status_code)"},{"line_number":762,"context_line":"        self.assertIn(\u0027NoValidHost\u0027, str(ex))"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"    def test_live_migrate_server_with_VF_01(self):"},{"line_number":765,"context_line":"        \"\"\"Live migrate an instance with a PCI VF."},{"line_number":766,"context_line":"        This should now work with the correct version of libvirt and qemu"},{"line_number":767,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"db2f96ce_1d00e8f1","line":764,"in_reply_to":"50bbe587_ecbae505","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":787,"context_line":""},{"line_number":788,"context_line":"        self._live_migrate_server(PCI_DEVICE_SPEC, PCI_ALIAS)"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def test_live_migrate_server_with_VF_02(self):"},{"line_number":791,"context_line":"        \"\"\"Live migrate an instance with a non migratable PCI VF."},{"line_number":792,"context_line":"        We should fail to create the instance because we request a"},{"line_number":793,"context_line":"        live migratable PCI device and there is only a non live migratable one."}],"source_content_type":"text/x-python","patch_set":5,"id":"7ef713f5_fb1de5e7","line":790,"updated":"2025-02-27 14:58:30.000000000","message":"test_server_create_fails_no_live_migratable_device","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":787,"context_line":""},{"line_number":788,"context_line":"        self._live_migrate_server(PCI_DEVICE_SPEC, PCI_ALIAS)"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def test_live_migrate_server_with_VF_02(self):"},{"line_number":791,"context_line":"        \"\"\"Live migrate an instance with a non migratable PCI VF."},{"line_number":792,"context_line":"        We should fail to create the instance because we request a"},{"line_number":793,"context_line":"        live migratable PCI device and there is only a non live migratable one."}],"source_content_type":"text/x-python","patch_set":5,"id":"04ec3fbb_f02cbcf4","line":790,"in_reply_to":"7ef713f5_fb1de5e7","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":821,"context_line":"            PCI_ALIAS,"},{"line_number":822,"context_line":"        )"},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"    def test_live_migrate_server_with_VF_03(self):"},{"line_number":825,"context_line":"        \"\"\"Live migrate an instance with a non migratable PCI VF."},{"line_number":826,"context_line":"        We should manage to create the instance but fail to live migrate it."},{"line_number":827,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"d58199d4_a7ab7ed4","line":824,"updated":"2025-02-27 14:58:30.000000000","message":"test_live_migrate_server_with_VF_fails_non_live_migratable_dev","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":821,"context_line":"            PCI_ALIAS,"},{"line_number":822,"context_line":"        )"},{"line_number":823,"context_line":""},{"line_number":824,"context_line":"    def test_live_migrate_server_with_VF_03(self):"},{"line_number":825,"context_line":"        \"\"\"Live migrate an instance with a non migratable PCI VF."},{"line_number":826,"context_line":"        We should manage to create the instance but fail to live migrate it."},{"line_number":827,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"30fac986_de4fadff","line":824,"in_reply_to":"d58199d4_a7ab7ed4","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":852,"context_line":"            PCI_DEVICE_SPEC,"},{"line_number":853,"context_line":"            PCI_ALIAS,"},{"line_number":854,"context_line":"        )"},{"line_number":855,"context_line":"        self.assertEqual(500, exc.response.status_code)"},{"line_number":856,"context_line":"        self.assertIn(\u0027NoValidHost\u0027, str(exc))"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def test_live_migrate_server_with_VF_04(self):"},{"line_number":859,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."}],"source_content_type":"text/x-python","patch_set":5,"id":"b54277cc_a86c3c8a","line":856,"range":{"start_line":855,"start_character":0,"end_line":856,"end_character":46},"updated":"2025-02-27 14:58:30.000000000","message":"it is a pretty weak signal as NoValidHost could mean failing the scheduling during create as well","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":852,"context_line":"            PCI_DEVICE_SPEC,"},{"line_number":853,"context_line":"            PCI_ALIAS,"},{"line_number":854,"context_line":"        )"},{"line_number":855,"context_line":"        self.assertEqual(500, exc.response.status_code)"},{"line_number":856,"context_line":"        self.assertIn(\u0027NoValidHost\u0027, str(exc))"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def test_live_migrate_server_with_VF_04(self):"},{"line_number":859,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."}],"source_content_type":"text/x-python","patch_set":5,"id":"3cfda72e_d8153547","line":856,"range":{"start_line":855,"start_character":0,"end_line":856,"end_character":46},"in_reply_to":"b54277cc_a86c3c8a","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":855,"context_line":"        self.assertEqual(500, exc.response.status_code)"},{"line_number":856,"context_line":"        self.assertIn(\u0027NoValidHost\u0027, str(exc))"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def test_live_migrate_server_with_VF_04(self):"},{"line_number":859,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":860,"context_line":"        We requested a non live migratable PCI device and there is only a live"},{"line_number":861,"context_line":"        migratable one."}],"source_content_type":"text/x-python","patch_set":5,"id":"0fe78a63_ba75834b","line":858,"updated":"2025-02-27 14:58:30.000000000","message":"test_server_create_fails_only_live_migratable_device","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":855,"context_line":"        self.assertEqual(500, exc.response.status_code)"},{"line_number":856,"context_line":"        self.assertIn(\u0027NoValidHost\u0027, str(exc))"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def test_live_migrate_server_with_VF_04(self):"},{"line_number":859,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":860,"context_line":"        We requested a non live migratable PCI device and there is only a live"},{"line_number":861,"context_line":"        migratable one."}],"source_content_type":"text/x-python","patch_set":5,"id":"17452bd1_e988e164","line":858,"in_reply_to":"0fe78a63_ba75834b","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":923,"context_line":"        )"},{"line_number":924,"context_line":""},{"line_number":925,"context_line":"    def test_live_migrate_server_with_VF_06(self):"},{"line_number":926,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":927,"context_line":"        We requested a non live migratable PCI device and there is only a"},{"line_number":928,"context_line":"        device with live migratable not specified."},{"line_number":929,"context_line":"        \"\"\""},{"line_number":930,"context_line":""},{"line_number":931,"context_line":"        PCI_DEVICE_SPEC \u003d [jsonutils.dumps(x) for x in ("},{"line_number":932,"context_line":"            {"}],"source_content_type":"text/x-python","patch_set":5,"id":"06968d9e_af607844","line":929,"range":{"start_line":926,"start_character":0,"end_line":929,"end_character":11},"updated":"2025-02-27 14:58:30.000000000","message":"Does it fail during creation or during the migration? Right now its not possible to tell","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":923,"context_line":"        )"},{"line_number":924,"context_line":""},{"line_number":925,"context_line":"    def test_live_migrate_server_with_VF_06(self):"},{"line_number":926,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":927,"context_line":"        We requested a non live migratable PCI device and there is only a"},{"line_number":928,"context_line":"        device with live migratable not specified."},{"line_number":929,"context_line":"        \"\"\""},{"line_number":930,"context_line":""},{"line_number":931,"context_line":"        PCI_DEVICE_SPEC \u003d [jsonutils.dumps(x) for x in ("},{"line_number":932,"context_line":"            {"}],"source_content_type":"text/x-python","patch_set":5,"id":"dce08977_360f77e7","line":929,"range":{"start_line":926,"start_character":0,"end_line":929,"end_character":11},"in_reply_to":"06968d9e_af607844","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9dc5c5fbfac812f01317cf75f8b1aa4a214995f7","unresolved":true,"context_lines":[{"line_number":1057,"context_line":"        self.assertEqual(500, exc.response.status_code)"},{"line_number":1058,"context_line":"        self.assertIn(\u0027NoValidHost\u0027, str(exc))"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"    def test_live_migrate_server_with_VF_10(self):"},{"line_number":1061,"context_line":"        \"\"\"Live migrate an instance with 3 x PCI VF."},{"line_number":1062,"context_line":"        \"\"\""},{"line_number":1063,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f1de613_ff553118","line":1060,"updated":"2025-02-26 19:07:51.000000000","message":"It misses a couple of tests with multiple aliases.","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"dd8ac530e130e52302e4e197886064e3db289929","unresolved":true,"context_lines":[{"line_number":1057,"context_line":"        self.assertEqual(500, exc.response.status_code)"},{"line_number":1058,"context_line":"        self.assertIn(\u0027NoValidHost\u0027, str(exc))"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"    def test_live_migrate_server_with_VF_10(self):"},{"line_number":1061,"context_line":"        \"\"\"Live migrate an instance with 3 x PCI VF."},{"line_number":1062,"context_line":"        \"\"\""},{"line_number":1063,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"5e7ea352_f5a80040","line":1060,"in_reply_to":"9f1de613_ff553118","updated":"2025-02-27 10:12:19.000000000","message":"FYI about the reson, I wanted to test multiple aliases/devices on my real test env with A16.\nWhat I can see so far, nova is doing the correct things regarding the xml, unfortunately the driver seems to refuse multiple vGPU config.\n```\nerror: vmiop_log: (0x1): init_device_instance failed for inst 1 with error 1 (multiple vGPUs in a VM not supported)\n```\n\nI have done several config and I will ask vfio experts to know if this is normal.\nI\u0027ll keep you posted about the result.\n\nAnd I\u0027ll provide the coverage with functional test ASAP.","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":1125,"context_line":"        extra_spec \u003d {"},{"line_number":1126,"context_line":"            \"pci_passthrough:alias\": f\"{self.VFS_ALIAS_NAME}:{num_vfs}\""},{"line_number":1127,"context_line":"        }"},{"line_number":1128,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":1129,"context_line":"        server \u003d self._create_server(flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"        # now live migrate that server"},{"line_number":1132,"context_line":"        self._live_migrate(server, \"completed\")"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def _test_move_operation_with_neutron(self, move_operation,"},{"line_number":1135,"context_line":"                                          expect_fail\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":5,"id":"69ad435d_61aa33c7","line":1132,"range":{"start_line":1128,"start_character":0,"end_line":1132,"end_character":47},"updated":"2025-02-27 14:58:30.000000000","message":"* The negative test cases needs to be able to differentiate between which step failed, server creation or live migration. So maybe two helpers one that sets up the compute and starts a VM and one that does the live migration would be better as then the test case itself can encode which step fails.\n  * also in the negative cases we should assert that the dest host devices is not allocated\n  * the source host devices remaining to be allocated to the instance\n  * the instance is put back to ACTIVE state on the source\n\n* I think for the positive case we need to assert couple of things:\n  * the source host device is freed in the pci tracker\n  * the dest host device is allocated for the instance in the pci tracker\n  * the xml has pci addresses (I know you are trying this and I will try to help seeing why it is not working in functinal test)","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":1125,"context_line":"        extra_spec \u003d {"},{"line_number":1126,"context_line":"            \"pci_passthrough:alias\": f\"{self.VFS_ALIAS_NAME}:{num_vfs}\""},{"line_number":1127,"context_line":"        }"},{"line_number":1128,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":1129,"context_line":"        server \u003d self._create_server(flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"        # now live migrate that server"},{"line_number":1132,"context_line":"        self._live_migrate(server, \"completed\")"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def _test_move_operation_with_neutron(self, move_operation,"},{"line_number":1135,"context_line":"                                          expect_fail\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ea55bda_2f57fc9d","line":1132,"range":{"start_line":1128,"start_character":0,"end_line":1132,"end_character":47},"in_reply_to":"69ad435d_61aa33c7","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2efe4d1bade20fb439e3ec16fb3840ba7826b946","unresolved":true,"context_lines":[{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"        # now live migrate that server"},{"line_number":1132,"context_line":"        self._live_migrate(server, \"completed\")"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def _test_move_operation_with_neutron(self, move_operation,"},{"line_number":1135,"context_line":"                                          expect_fail\u003dFalse):"},{"line_number":1136,"context_line":"        # The purpose here is to force an observable PCI slot update when"}],"source_content_type":"text/x-python","patch_set":5,"id":"1551e1aa_ae6ae163","line":1133,"updated":"2025-02-27 14:58:30.000000000","message":"Besides testing with multiple aliases you mentined above, here we also have missing coverage for the case where the two computes are configured differently. E.g.\n* compute1 has a live migratable dev and the compute2 only have devs with no flag or with flag live-migratable: false. In this case a VM can be created on compute1 with live-migratable request, and then the migration is expected to fail due to pci scheduling does not find a matching device on the dest\n\n* a set of test cases where pci in placement is enabled and the assert are extended to look check that the placement allocation is correct.","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":true,"context_lines":[{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"        # now live migrate that server"},{"line_number":1132,"context_line":"        self._live_migrate(server, \"completed\")"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def _test_move_operation_with_neutron(self, move_operation,"},{"line_number":1135,"context_line":"                                          expect_fail\u003dFalse):"},{"line_number":1136,"context_line":"        # The purpose here is to force an observable PCI slot update when"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a8c6df2_e0727283","line":1133,"in_reply_to":"1551e1aa_ae6ae163","updated":"2025-03-02 23:48:39.000000000","message":"Still missing the placement ones.\nI\u0027m going to add them ASAP.","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4e0d5bb5a83b9cb3150eba0ba6e5144295299d6c","unresolved":false,"context_lines":[{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"        # now live migrate that server"},{"line_number":1132,"context_line":"        self._live_migrate(server, \"completed\")"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def _test_move_operation_with_neutron(self, move_operation,"},{"line_number":1135,"context_line":"                                          expect_fail\u003dFalse):"},{"line_number":1136,"context_line":"        # The purpose here is to force an observable PCI slot update when"}],"source_content_type":"text/x-python","patch_set":5,"id":"6785bd8c_9e651fda","line":1133,"in_reply_to":"3a8c6df2_e0727283","updated":"2025-03-03 20:23:02.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"1366faecc3849f4ab7fb6c15743544fe284c628c","unresolved":true,"context_lines":[{"line_number":1837,"context_line":"            self._evacuate_server(source_server)"},{"line_number":1838,"context_line":"        self._test_move_operation_with_neutron(move_operation)"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.driver.\u0027"},{"line_number":1841,"context_line":"        \u0027LibvirtDriver._detach_from_live_and_wait_for_event\u0027)"},{"line_number":1842,"context_line":"    def test_live_migrate_server_with_neutron(self, mock_detach):"},{"line_number":1843,"context_line":"        \"\"\"Live migrate an instance using a neutron-provisioned SR-IOV VIF."}],"source_content_type":"text/x-python","patch_set":7,"id":"52c61254_05ddd111","line":1840,"updated":"2025-03-03 09:36:55.000000000","message":"The modification of the fixture to handle hostdev caused this test to time out. I believe this is because the detach event cannot be received from the fake libvirt. So, I am mocking it as a workaround.","commit_id":"abf7fc743c6fd107dc58ec1596e03727783c0f74"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4e0d5bb5a83b9cb3150eba0ba6e5144295299d6c","unresolved":false,"context_lines":[{"line_number":1837,"context_line":"            self._evacuate_server(source_server)"},{"line_number":1838,"context_line":"        self._test_move_operation_with_neutron(move_operation)"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.driver.\u0027"},{"line_number":1841,"context_line":"        \u0027LibvirtDriver._detach_from_live_and_wait_for_event\u0027)"},{"line_number":1842,"context_line":"    def test_live_migrate_server_with_neutron(self, mock_detach):"},{"line_number":1843,"context_line":"        \"\"\"Live migrate an instance using a neutron-provisioned SR-IOV VIF."}],"source_content_type":"text/x-python","patch_set":7,"id":"22da869d_a513ab96","line":1840,"in_reply_to":"3297ce3b_995e7807","updated":"2025-03-03 20:23:02.000000000","message":"I created a new patch with only the fixture.\nHowever, this mock behavior cannot be added to the fixture because many unit tests rely on it for different side effects.\nSo, I have only mocked the migration part, similarly to unit tests.","commit_id":"abf7fc743c6fd107dc58ec1596e03727783c0f74"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"af60130f3566f0002bb0c7cffd17be1c883d3c40","unresolved":true,"context_lines":[{"line_number":1837,"context_line":"            self._evacuate_server(source_server)"},{"line_number":1838,"context_line":"        self._test_move_operation_with_neutron(move_operation)"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"    @mock.patch(\u0027nova.virt.libvirt.driver.\u0027"},{"line_number":1841,"context_line":"        \u0027LibvirtDriver._detach_from_live_and_wait_for_event\u0027)"},{"line_number":1842,"context_line":"    def test_live_migrate_server_with_neutron(self, mock_detach):"},{"line_number":1843,"context_line":"        \"\"\"Live migrate an instance using a neutron-provisioned SR-IOV VIF."}],"source_content_type":"text/x-python","patch_set":7,"id":"3297ce3b_995e7807","line":1840,"in_reply_to":"52c61254_05ddd111","updated":"2025-03-03 14:48:42.000000000","message":"Yeah I agree that this is the code that waits for the event from libvirt that the device is detached. The fixture never sends such event. Interestingly there are facilities there to send the VM lifecycle events, but I don\u0027t see them actually triggering during VM creation either.\n\nI also assume this is now happening as the XML has devices to detach. Before this patch the fixture did not store the hostdevs and therefore when the driver looked for devices to detach it decided that they are already gone so nothing to detach. Now the hostdevs are stored and returned by the fixture so the driver asks for a detach and waits for the event. \n\nI suggest to:\n* move the code that extends the fixture to a separate commit so we can better show that the neutron live migration change is not due to the sriov live migration series but only due to the fixture extension.\n* in the fixture mock nova.virt.libvirt.driver.AsyncDeviceEventsHandler.wait with a comment that the fixture does not emit libvirt events so the libvirt driver should not wait for such event in the functional test. This would be a lot clearer solution than mocking in individual tests cases.","commit_id":"abf7fc743c6fd107dc58ec1596e03727783c0f74"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":true,"context_lines":[{"line_number":574,"context_line":"            \"PCI device spec is configured for \""},{"line_number":575,"context_line":"            \"live_migratable but it\u0027s not supported by libvirt.\","},{"line_number":576,"context_line":"            str(exc),"},{"line_number":577,"context_line":"        )"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def test_create_server_with_PF(self):"},{"line_number":580,"context_line":"        \"\"\"Create a server with an SR-IOV PF-type PCI device.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"8137c6c7_e080cdd9","line":577,"updated":"2025-03-03 15:57:11.000000000","message":"Does this fails at starting the compute with a wrong config? If so then we would really only try to do the compute start and does not try to reuse the helper that does instance create as well.\ni.e.\n```python\n\n        self.flags(\n            device_spec\u003d[jsonutils.dumps(x) for x in device_spec],\n            group\u003d\"pci\",\n        )\n\n        # Try to start the compute with an old libvirt version while configured\n        # a dev_spec with live_migratable flag that requires newer libvirt\n        # version\n        exc \u003d self.assertRaises(\n            exception.InvalidConfiguration,\n            self.start_compute,\n            pci_info\u003dpci_info,\n            libvirt_version\u003dNone,\n            qemu_version\u003dNone,\n        )\n        self.assertIn(\n            \"PCI device spec is configured for \"\n            \"live_migratable but it\u0027s not supported by libvirt.\",\n            str(exc),\n        )\n```\n\nThis is a lot easier to read as it is clear what steps raises the error.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9d8037112a5cc121bf7028a5821767046e29ca17","unresolved":false,"context_lines":[{"line_number":574,"context_line":"            \"PCI device spec is configured for \""},{"line_number":575,"context_line":"            \"live_migratable but it\u0027s not supported by libvirt.\","},{"line_number":576,"context_line":"            str(exc),"},{"line_number":577,"context_line":"        )"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def test_create_server_with_PF(self):"},{"line_number":580,"context_line":"        \"\"\"Create a server with an SR-IOV PF-type PCI device.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"294a06b7_a965f716","line":577,"in_reply_to":"8137c6c7_e080cdd9","updated":"2025-03-12 13:22:04.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":true,"context_lines":[{"line_number":722,"context_line":"        \"\"\"Live migrate an instance with a PCI VF."},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"        This should fail because it\u0027s not possible to live migrate an instance"},{"line_number":725,"context_line":"        with a PCI passthrough device, even if it\u0027s a SR-IOV VF. Until we have"},{"line_number":726,"context_line":"        the correct version of qemu and libvirt."},{"line_number":727,"context_line":"        \"\"\""},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        # start two compute services"},{"line_number":730,"context_line":"        self.start_compute("}],"source_content_type":"text/x-python","patch_set":8,"id":"4c9c5ecc_8ca38744","line":727,"range":{"start_line":725,"start_character":64,"end_line":727,"end_character":0},"updated":"2025-03-03 15:57:11.000000000","message":"nit: Until we have the correct version of qemu and libvirt and the device is marked live_migratable: yes in the device_spec.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9d8037112a5cc121bf7028a5821767046e29ca17","unresolved":false,"context_lines":[{"line_number":722,"context_line":"        \"\"\"Live migrate an instance with a PCI VF."},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"        This should fail because it\u0027s not possible to live migrate an instance"},{"line_number":725,"context_line":"        with a PCI passthrough device, even if it\u0027s a SR-IOV VF. Until we have"},{"line_number":726,"context_line":"        the correct version of qemu and libvirt."},{"line_number":727,"context_line":"        \"\"\""},{"line_number":728,"context_line":""},{"line_number":729,"context_line":"        # start two compute services"},{"line_number":730,"context_line":"        self.start_compute("}],"source_content_type":"text/x-python","patch_set":8,"id":"5c7d4349_e162d61d","line":727,"range":{"start_line":725,"start_character":64,"end_line":727,"end_character":0},"in_reply_to":"4c9c5ecc_8ca38744","updated":"2025-03-12 13:22:04.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":true,"context_lines":[{"line_number":774,"context_line":"                    \"live_migratable\": \"yes\","},{"line_number":775,"context_line":"                },"},{"line_number":776,"context_line":"            ],"},{"line_number":777,"context_line":"            \"qty\": [1],"},{"line_number":778,"context_line":"        }"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        server \u003d self._create_lm_server(PCI_DEVICE_SPEC, PCI_ALIAS)"}],"source_content_type":"text/x-python","patch_set":8,"id":"54d6e22f_0f85da14","line":777,"updated":"2025-03-03 15:57:11.000000000","message":"I\u0027m not super keen on mixing pure nova config data i.e. an alias with some test specific structure i.e qty and the alias key here. Let\u0027s be explicit that this test uses a flavor with VFS_ALIAS_NAME:1 extra spec and either pass the flavor or pass the extra spec to the helper function.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9d8037112a5cc121bf7028a5821767046e29ca17","unresolved":true,"context_lines":[{"line_number":774,"context_line":"                    \"live_migratable\": \"yes\","},{"line_number":775,"context_line":"                },"},{"line_number":776,"context_line":"            ],"},{"line_number":777,"context_line":"            \"qty\": [1],"},{"line_number":778,"context_line":"        }"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        server \u003d self._create_lm_server(PCI_DEVICE_SPEC, PCI_ALIAS)"}],"source_content_type":"text/x-python","patch_set":8,"id":"84db462d_d889505d","line":777,"in_reply_to":"54d6e22f_0f85da14","updated":"2025-03-12 13:22:04.000000000","message":"I have simplified the structure.\nI would rather not pass the extra_spec, as there could be discrepancies between the alias definition and the aliases.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":true,"context_lines":[{"line_number":1426,"context_line":"            group\u003d\u0027pci\u0027"},{"line_number":1427,"context_line":"        )"},{"line_number":1428,"context_line":""},{"line_number":1429,"context_line":"        flavor_req \u003d \",\".join(["},{"line_number":1430,"context_line":"            f\"{alias[\u0027alias\u0027][index][\u0027name\u0027]}:{alias[\u0027qty\u0027][index]}\""},{"line_number":1431,"context_line":"            for index in range(0, len(alias[\"alias\"]))"},{"line_number":1432,"context_line":"        ])"},{"line_number":1433,"context_line":""},{"line_number":1434,"context_line":"        self.comp0 \u003d self.start_compute("},{"line_number":1435,"context_line":"            hostname\u003d\"test_compute0\","}],"source_content_type":"text/x-python","patch_set":8,"id":"58dd51fa_66ed2491","line":1432,"range":{"start_line":1429,"start_character":0,"end_line":1432,"end_character":10},"updated":"2025-03-03 15:57:11.000000000","message":"this is complicated. just pass the extra spec we expect to be in the flavor explicitly from the test cases.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9d8037112a5cc121bf7028a5821767046e29ca17","unresolved":false,"context_lines":[{"line_number":1426,"context_line":"            group\u003d\u0027pci\u0027"},{"line_number":1427,"context_line":"        )"},{"line_number":1428,"context_line":""},{"line_number":1429,"context_line":"        flavor_req \u003d \",\".join(["},{"line_number":1430,"context_line":"            f\"{alias[\u0027alias\u0027][index][\u0027name\u0027]}:{alias[\u0027qty\u0027][index]}\""},{"line_number":1431,"context_line":"            for index in range(0, len(alias[\"alias\"]))"},{"line_number":1432,"context_line":"        ])"},{"line_number":1433,"context_line":""},{"line_number":1434,"context_line":"        self.comp0 \u003d self.start_compute("},{"line_number":1435,"context_line":"            hostname\u003d\"test_compute0\","}],"source_content_type":"text/x-python","patch_set":8,"id":"b526c833_e3c31a47","line":1432,"range":{"start_line":1429,"start_character":0,"end_line":1432,"end_character":10},"in_reply_to":"58dd51fa_66ed2491","updated":"2025-03-12 13:22:04.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":true,"context_lines":[{"line_number":1446,"context_line":""},{"line_number":1447,"context_line":"        # Create a server here to ensure it goes to first compute."},{"line_number":1448,"context_line":"        extra_spec \u003d {"},{"line_number":1449,"context_line":"            \"pci_passthrough:alias\": f\"{flavor_req}\""},{"line_number":1450,"context_line":"        }"},{"line_number":1451,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":1452,"context_line":"        server \u003d self._create_server(flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"a76cf678_15eb7baa","line":1449,"range":{"start_line":1449,"start_character":37,"end_line":1449,"end_character":52},"updated":"2025-03-03 15:57:11.000000000","message":"let the caller passes this in directly to make the test case more readable","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9d8037112a5cc121bf7028a5821767046e29ca17","unresolved":false,"context_lines":[{"line_number":1446,"context_line":""},{"line_number":1447,"context_line":"        # Create a server here to ensure it goes to first compute."},{"line_number":1448,"context_line":"        extra_spec \u003d {"},{"line_number":1449,"context_line":"            \"pci_passthrough:alias\": f\"{flavor_req}\""},{"line_number":1450,"context_line":"        }"},{"line_number":1451,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":1452,"context_line":"        server \u003d self._create_server(flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"79c3a812_6fe37788","line":1449,"range":{"start_line":1449,"start_character":37,"end_line":1449,"end_character":52},"in_reply_to":"a76cf678_15eb7baa","updated":"2025-03-12 13:22:04.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":true,"context_lines":[{"line_number":1463,"context_line":"                num_pfs\u003dnum_pfs, num_vfs\u003dnum_vfs,"},{"line_number":1464,"context_line":"                product_ids\u003dproduct_ids, bus\u003d0x82"},{"line_number":1465,"context_line":"            ),"},{"line_number":1466,"context_line":"        )"},{"line_number":1467,"context_line":""},{"line_number":1468,"context_line":"        return server"},{"line_number":1469,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"88aea0d3_90ee0f40","line":1466,"updated":"2025-03-03 15:57:11.000000000","message":"I know why are you starting the second compute after the VM is booted (to make sure the VM is on the first compute), but i) this is really not obvious from the code ii) we have ways to boot a server to a host without this trick. a) _create_server() has a host kwargs, or b) you can turn on our test only weigher `self.useFixture(nova_fixtures.HostNameWeigherFixture())` with a bit of setup to prefer the first compute. I suggest option a) as that is very easy to read.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":true,"context_lines":[{"line_number":1484,"context_line":""},{"line_number":1485,"context_line":"        return addresses"},{"line_number":1486,"context_line":""},{"line_number":1487,"context_line":"    def _assertCompareHostdevs(self, xml_src, xml_dst):"},{"line_number":1488,"context_line":"        src_addresses \u003d self._get_hostdev_addresses(xml_src)"},{"line_number":1489,"context_line":"        dst_addresses \u003d self._get_hostdev_addresses(xml_dst)"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"aa6948fd_a3e5755b","line":1487,"updated":"2025-03-03 15:57:11.000000000","message":"nit: def _assertDeviceAddressesMapped()","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9d8037112a5cc121bf7028a5821767046e29ca17","unresolved":false,"context_lines":[{"line_number":1484,"context_line":""},{"line_number":1485,"context_line":"        return addresses"},{"line_number":1486,"context_line":""},{"line_number":1487,"context_line":"    def _assertCompareHostdevs(self, xml_src, xml_dst):"},{"line_number":1488,"context_line":"        src_addresses \u003d self._get_hostdev_addresses(xml_src)"},{"line_number":1489,"context_line":"        dst_addresses \u003d self._get_hostdev_addresses(xml_dst)"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"a87b16e8_63580f32","line":1487,"in_reply_to":"aa6948fd_a3e5755b","updated":"2025-03-12 13:22:04.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33aedcb155e6d343144635103e41b5a65be0243e","unresolved":true,"context_lines":[{"line_number":1490,"context_line":""},{"line_number":1491,"context_line":"        self.assertEqual(len(src_addresses), len(dst_addresses))"},{"line_number":1492,"context_line":""},{"line_number":1493,"context_line":"        for src_addr in src_addresses:"},{"line_number":1494,"context_line":"            # Switch bus to destination one."},{"line_number":1495,"context_line":"            src_addr[\"bus\"] \u003d \"0x82\""},{"line_number":1496,"context_line":"            self.assertIn(src_addr, dst_addresses)"},{"line_number":1497,"context_line":""},{"line_number":1498,"context_line":"    def _test_move_operation_with_neutron(self, move_operation,"},{"line_number":1499,"context_line":"                                          expect_fail\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":8,"id":"f34efd9a_28075dfe","line":1496,"range":{"start_line":1493,"start_character":0,"end_line":1496,"end_character":50},"updated":"2025-03-03 15:57:11.000000000","message":"Yeah this is half of what we want to prove here. I.e. that each address is updated to use available addresses from the dst host. \n\nThe other half is that \n* if we requested two aliases A1 and A2 and therefore the XML has two devices D1 (fulfills A1) and D2 (fulfills A2)\n* and then we live migrate to the destination where A1 can be fulfilled by D4 and A2 can be fulfilled by D3 then the new XML not just has D3 and D4 in it, but also the device D1 is replaced with device D4 and not D3. This is to guarantee that our code did not mixed up the mapping between different type of decvices.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3d6c70a131d58c5d30b2ff07cd1e934b3e6d4d14","unresolved":true,"context_lines":[{"line_number":1490,"context_line":""},{"line_number":1491,"context_line":"        self.assertEqual(len(src_addresses), len(dst_addresses))"},{"line_number":1492,"context_line":""},{"line_number":1493,"context_line":"        for src_addr in src_addresses:"},{"line_number":1494,"context_line":"            # Switch bus to destination one."},{"line_number":1495,"context_line":"            src_addr[\"bus\"] \u003d \"0x82\""},{"line_number":1496,"context_line":"            self.assertIn(src_addr, dst_addresses)"},{"line_number":1497,"context_line":""},{"line_number":1498,"context_line":"    def _test_move_operation_with_neutron(self, move_operation,"},{"line_number":1499,"context_line":"                                          expect_fail\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":8,"id":"e026974b_42953981","line":1496,"range":{"start_line":1493,"start_character":0,"end_line":1496,"end_character":50},"in_reply_to":"f34efd9a_28075dfe","updated":"2025-03-11 15:30:30.000000000","message":"as we discussed in our call this need work in the libvirt fixture to generate the guest PCI addresses into the XML not just the host address. Then based on that addresses the comparison can be enhanced here. \n\nLet me be a bit more specific about the case when this is useful. Assume that you have an XML on the source host:\n```xml\n\u003chostdev mode\u003d\u0027subsystem\u0027 type\u003d\u0027pci\u0027 managed\u003d\u0027yes\u0027\u003e\n    \u003csource\u003e\n      \u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x81\u0027 slot\u003d\u00270x01\u0027 function\u003d\u00270x3\u0027/\u003e\n    \u003c/source\u003e\n    \u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x42\u0027 slot\u003d\u00270x01\u0027 function\u003d\u00270x0\u0027/\u003e\n\u003c/hostdev\u003e\n\u003chostdev mode\u003d\u0027subsystem\u0027 type\u003d\u0027pci\u0027 managed\u003d\u0027yes\u0027\u003e\n    \u003csource\u003e\n      \u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x81\u0027 slot\u003d\u00270x02\u0027 function\u003d\u00270x1\u0027/\u003e\n    \u003c/source\u003e\n    \u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x43\u0027 slot\u003d\u00270x01\u0027 function\u003d\u00270x0\u0027/\u003e\n\u003c/hostdev\u003e\n```\nAnd assume the VM uses the device 0x42 (representing 0x81:0x01.0x3 from the host) to run an AI model, while using 0x43 (representing 0x81:0x02.0x1 from the host) to mine bitcoin.\n\nThen the VM is live migrated to the dest where the two host devices are allocated based on availability and matching spec (vendor/product id or resource class). \n* 0x81:0x01.0x3 from the source is mapped to 0x82:0x01.0x3 on the dest\n* 0x81:0x02.0x1 from the source is mapped to 0x82:0x02.0x1 on the dest\n\nThen nova generates the following destination XML:\n```xml\n\u003chostdev mode\u003d\u0027subsystem\u0027 type\u003d\u0027pci\u0027 managed\u003d\u0027yes\u0027\u003e\n    \u003csource\u003e\n      \u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x82\u0027 slot\u003d\u00270x02\u0027 function\u003d\u00270x1\u0027/\u003e\n    \u003c/source\u003e\n    \u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x42\u0027 slot\u003d\u00270x01\u0027 function\u003d\u00270x0\u0027/\u003e\n\u003c/hostdev\u003e\n\u003chostdev mode\u003d\u0027subsystem\u0027 type\u003d\u0027pci\u0027 managed\u003d\u0027yes\u0027\u003e\n    \u003csource\u003e\n      \u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x82\u0027 slot\u003d\u00270x01\u0027 function\u003d\u00270x3\u0027/\u003e\n    \u003c/source\u003e\n    \u003caddress domain\u003d\u00270x0000\u0027 bus\u003d\u00270x43\u0027 slot\u003d\u00270x01\u0027 function\u003d\u00270x0\u0027/\u003e\n\u003c/hostdev\u003e\n```\n\nThe current assert would pass as both dest devices are in the XML, but the applications running in the guest would fail as during the live migration suddenly the AI model is moved from guest device 0x42 to 0x43 and the bitcoin miner moved from 0x43 to 0x42. This shows that simply asserting that expected dest addresses are in the XML in not enough the mapping of them to the guest device also needed. \n\n(We know that the impl generating the XML works as there we have a higher level connecting id, the InstancePCIRequest.request_id to connect the source and dest devs. This id is not visible in the XML hence the guest PCI address is the closest thing we can use to check the validity)","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"081920b0d8f9d054e1d98afd5c82fe18a71fc7e0","unresolved":true,"context_lines":[{"line_number":787,"context_line":"        self.assertPCIDeviceCounts(self.comp1, total\u003d1, free\u003d0)"},{"line_number":788,"context_line":"        self._assertCompareHostdevs(src_xml, dst_xml)"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def test_live_migrate_VF_fails_lm_requested_no_lm_dev(self):"},{"line_number":791,"context_line":"        \"\"\"Live migrate an instance with a non migratable PCI VF."},{"line_number":792,"context_line":"        We should fail to create the instance because we request a"},{"line_number":793,"context_line":"        live migratable PCI device and there is only a non live migratable one."}],"source_content_type":"text/x-python","patch_set":9,"id":"c84e864b_3b3e1de2","line":790,"range":{"start_line":790,"start_character":8,"end_line":790,"end_character":57},"updated":"2025-03-04 18:04:38.000000000","message":"test_create_fails_lm_requested_no_lm_dev","commit_id":"fd656f394375231de9beb54087e2ecb910060045"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"081920b0d8f9d054e1d98afd5c82fe18a71fc7e0","unresolved":true,"context_lines":[{"line_number":869,"context_line":"        self.assertPCIDeviceCounts(self.comp1, total\u003d1, free\u003d1)"},{"line_number":870,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def test_live_migrate_VF_fails_non_lm_reqeusted_only_lm_dev(self):"},{"line_number":873,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":874,"context_line":"        We requested a non live migratable PCI device and there is only a live"},{"line_number":875,"context_line":"        migratable one. Instance creation should fail."}],"source_content_type":"text/x-python","patch_set":9,"id":"6f76f4ca_3fbfad3b","line":872,"range":{"start_line":872,"start_character":8,"end_line":872,"end_character":63},"updated":"2025-03-04 18:04:38.000000000","message":"test_create_fails_lm_not_requested_only_lm_dev","commit_id":"fd656f394375231de9beb54087e2ecb910060045"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"081920b0d8f9d054e1d98afd5c82fe18a71fc7e0","unresolved":true,"context_lines":[{"line_number":870,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def test_live_migrate_VF_fails_non_lm_reqeusted_only_lm_dev(self):"},{"line_number":873,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":874,"context_line":"        We requested a non live migratable PCI device and there is only a live"},{"line_number":875,"context_line":"        migratable one. Instance creation should fail."},{"line_number":876,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"f063883d_58ba4d12","line":873,"range":{"start_line":873,"start_character":10,"end_line":873,"end_character":66},"updated":"2025-03-04 18:04:38.000000000","message":"this is not true","commit_id":"fd656f394375231de9beb54087e2ecb910060045"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9d8037112a5cc121bf7028a5821767046e29ca17","unresolved":false,"context_lines":[{"line_number":870,"context_line":"        self._wait_for_state_change(server, \u0027ACTIVE\u0027)"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def test_live_migrate_VF_fails_non_lm_reqeusted_only_lm_dev(self):"},{"line_number":873,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":874,"context_line":"        We requested a non live migratable PCI device and there is only a live"},{"line_number":875,"context_line":"        migratable one. Instance creation should fail."},{"line_number":876,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"6ee19183_c401b30b","line":873,"range":{"start_line":873,"start_character":10,"end_line":873,"end_character":66},"in_reply_to":"f063883d_58ba4d12","updated":"2025-03-12 13:22:04.000000000","message":"Done","commit_id":"fd656f394375231de9beb54087e2ecb910060045"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"081920b0d8f9d054e1d98afd5c82fe18a71fc7e0","unresolved":true,"context_lines":[{"line_number":908,"context_line":"        self.assertPCIDeviceCounts(self.comp0, total\u003d1, free\u003d1)"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"    def test_live_migrate_VF_fails_lm_requested_dev_unspecified(self):"},{"line_number":911,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":912,"context_line":"        We requested a live migratable PCI device and there is only a"},{"line_number":913,"context_line":"        device with live migratable not specified. Instance creation should"},{"line_number":914,"context_line":"        fail."}],"source_content_type":"text/x-python","patch_set":9,"id":"04776e32_b9f0ba4b","line":911,"range":{"start_line":911,"start_character":0,"end_line":911,"end_character":66},"updated":"2025-03-04 18:04:38.000000000","message":"not true it fails at create","commit_id":"fd656f394375231de9beb54087e2ecb910060045"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9d8037112a5cc121bf7028a5821767046e29ca17","unresolved":false,"context_lines":[{"line_number":908,"context_line":"        self.assertPCIDeviceCounts(self.comp0, total\u003d1, free\u003d1)"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"    def test_live_migrate_VF_fails_lm_requested_dev_unspecified(self):"},{"line_number":911,"context_line":"        \"\"\"Live migrate an instance with a live migratable PCI VF."},{"line_number":912,"context_line":"        We requested a live migratable PCI device and there is only a"},{"line_number":913,"context_line":"        device with live migratable not specified. Instance creation should"},{"line_number":914,"context_line":"        fail."}],"source_content_type":"text/x-python","patch_set":9,"id":"2c4930f6_2dddf7de","line":911,"range":{"start_line":911,"start_character":0,"end_line":911,"end_character":66},"in_reply_to":"04776e32_b9f0ba4b","updated":"2025-03-12 13:22:04.000000000","message":"Done","commit_id":"fd656f394375231de9beb54087e2ecb910060045"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"008e6a57515ab1c4971fe04b37f5f628ca893b4d","unresolved":true,"context_lines":[{"line_number":914,"context_line":"        self._register_all_undefined_instance_details()"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"    def _check_pci_whitelist(self):"},{"line_number":917,"context_line":""},{"line_number":918,"context_line":"        need_specific_version \u003d False"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        if CONF.pci.device_spec:"}],"source_content_type":"text/x-python","patch_set":3,"id":"629f9e94_f7ba3d0c","line":917,"updated":"2025-02-24 18:00:46.000000000","message":"I need to get back to this once this moves fully this patch form the managed series.","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f73b2ecb9f791f318270f97808907ee2e2076d44","unresolved":false,"context_lines":[{"line_number":914,"context_line":"        self._register_all_undefined_instance_details()"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"    def _check_pci_whitelist(self):"},{"line_number":917,"context_line":""},{"line_number":918,"context_line":"        need_specific_version \u003d False"},{"line_number":919,"context_line":""},{"line_number":920,"context_line":"        if CONF.pci.device_spec:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9e5e2625_27ae34c6","line":917,"in_reply_to":"629f9e94_f7ba3d0c","updated":"2025-02-27 13:54:44.000000000","message":"Done","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f73b2ecb9f791f318270f97808907ee2e2076d44","unresolved":true,"context_lines":[{"line_number":905,"context_line":""},{"line_number":906,"context_line":"        self._check_vtpm_support()"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        # Even if we already checked the whitelist at startup, this driver"},{"line_number":909,"context_line":"        # needs to check specific hypervisor versions"},{"line_number":910,"context_line":"        self._check_pci_whitelist()"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"        # Set REGISTER_IMAGE_PROPERTY_DEFAULTS in the instance system_metadata"},{"line_number":913,"context_line":"        # to default values for properties that have not already been set."}],"source_content_type":"text/x-python","patch_set":5,"id":"cab9da17_dbf3f9a4","line":910,"range":{"start_line":908,"start_character":0,"end_line":910,"end_character":35},"updated":"2025-02-27 13:54:44.000000000","message":"yeah it is unfortunate that a new enough libvirt support the live-migratable feature but does not support the discoverability of such feature. So we use configuration instead of discovering which device is live-migratable but then we need to make sure that such configuration is not added against an old libvirt. This can go away once we can discover live-migratability via libvirt.","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":905,"context_line":""},{"line_number":906,"context_line":"        self._check_vtpm_support()"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        # Even if we already checked the whitelist at startup, this driver"},{"line_number":909,"context_line":"        # needs to check specific hypervisor versions"},{"line_number":910,"context_line":"        self._check_pci_whitelist()"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"        # Set REGISTER_IMAGE_PROPERTY_DEFAULTS in the instance system_metadata"},{"line_number":913,"context_line":"        # to default values for properties that have not already been set."}],"source_content_type":"text/x-python","patch_set":5,"id":"fe502ec7_ef6bd018","line":910,"range":{"start_line":908,"start_character":0,"end_line":910,"end_character":35},"in_reply_to":"cab9da17_dbf3f9a4","updated":"2025-03-02 23:48:39.000000000","message":"Acknowledged","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f73b2ecb9f791f318270f97808907ee2e2076d44","unresolved":true,"context_lines":[{"line_number":923,"context_line":"                if spec.tags.get(\"live_migratable\"):"},{"line_number":924,"context_line":"                    need_specific_version \u003d True"},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"        if need_specific_version:"},{"line_number":927,"context_line":"            if self._host.has_min_version("},{"line_number":928,"context_line":"                lv_ver\u003dMIN_VFIO_PCI_VARIANT_LIBVIRT_VERSION,"},{"line_number":929,"context_line":"                hv_ver\u003dMIN_VFIO_PCI_VARIANT_QEMU_VERSION,"},{"line_number":930,"context_line":"                hv_type\u003dhost.HV_DRIVER_QEMU,"},{"line_number":931,"context_line":"            ):"},{"line_number":932,"context_line":"                return"},{"line_number":933,"context_line":"            else:"},{"line_number":934,"context_line":"                msg \u003d _("},{"line_number":935,"context_line":"                    \"PCI device spec is configured for \""},{"line_number":936,"context_line":"                    \"live_migratable but it\u0027s not supported by libvirt.\""},{"line_number":937,"context_line":"                )"},{"line_number":938,"context_line":"                raise exception.InvalidConfiguration(msg)"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    def _update_host_specific_capabilities(self) -\u003e None:"},{"line_number":941,"context_line":"        \"\"\"Update driver capabilities based on capabilities of the host.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"88e5fc40_2625878c","line":938,"range":{"start_line":926,"start_character":0,"end_line":938,"end_character":57},"updated":"2025-02-27 13:54:44.000000000","message":"this can be a bit simpler\n```\nif need_specific_version and not self._host.has_min_version(...):\n    raise ...\n```","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":923,"context_line":"                if spec.tags.get(\"live_migratable\"):"},{"line_number":924,"context_line":"                    need_specific_version \u003d True"},{"line_number":925,"context_line":""},{"line_number":926,"context_line":"        if need_specific_version:"},{"line_number":927,"context_line":"            if self._host.has_min_version("},{"line_number":928,"context_line":"                lv_ver\u003dMIN_VFIO_PCI_VARIANT_LIBVIRT_VERSION,"},{"line_number":929,"context_line":"                hv_ver\u003dMIN_VFIO_PCI_VARIANT_QEMU_VERSION,"},{"line_number":930,"context_line":"                hv_type\u003dhost.HV_DRIVER_QEMU,"},{"line_number":931,"context_line":"            ):"},{"line_number":932,"context_line":"                return"},{"line_number":933,"context_line":"            else:"},{"line_number":934,"context_line":"                msg \u003d _("},{"line_number":935,"context_line":"                    \"PCI device spec is configured for \""},{"line_number":936,"context_line":"                    \"live_migratable but it\u0027s not supported by libvirt.\""},{"line_number":937,"context_line":"                )"},{"line_number":938,"context_line":"                raise exception.InvalidConfiguration(msg)"},{"line_number":939,"context_line":""},{"line_number":940,"context_line":"    def _update_host_specific_capabilities(self) -\u003e None:"},{"line_number":941,"context_line":"        \"\"\"Update driver capabilities based on capabilities of the host.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"61da5e4e_d1d0945f","line":938,"range":{"start_line":926,"start_character":0,"end_line":938,"end_character":57},"in_reply_to":"88e5fc40_2625878c","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"45b183a4021eb9b93065bf66e9b917d53a2f2941","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"# Minimum versions supporting vfio-pci variant driver."},{"line_number":271,"context_line":"MIN_VFIO_PCI_VARIANT_LIBVIRT_VERSION \u003d (10, 0, 0)"},{"line_number":272,"context_line":"MIN_VFIO_PCI_VARIANT_QEMU_VERSION \u003d (8, 2, 2)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"REGISTER_IMAGE_PROPERTY_DEFAULTS \u003d ["},{"line_number":275,"context_line":"    \u0027hw_machine_type\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"b98f75fc_5e7296a6","line":272,"updated":"2025-03-04 10:11:49.000000000","message":"correct versions","commit_id":"fd656f394375231de9beb54087e2ecb910060045"}],"nova/virt/libvirt/migration.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"008e6a57515ab1c4971fe04b37f5f628ca893b4d","unresolved":true,"context_lines":[{"line_number":164,"context_line":"            function \u003d address_tag.get(\u0027function\u0027, 0)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            pci_values \u003d {"},{"line_number":167,"context_line":"                \"domain\": domain,"},{"line_number":168,"context_line":"                \"bus\": bus,"},{"line_number":169,"context_line":"                \"slot\": slot,"},{"line_number":170,"context_line":"                \"function\": function,"},{"line_number":171,"context_line":"            }"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"            if not all("},{"line_number":174,"context_line":"                value.startswith(\"0x\") for value in pci_values.values()"},{"line_number":175,"context_line":"            ):"},{"line_number":176,"context_line":"                raise exception.NovaException("},{"line_number":177,"context_line":"                    \"Address is malformed, missing the \u00270x\u0027 \""},{"line_number":178,"context_line":"                    f\"prefix: {pci_values}\""},{"line_number":179,"context_line":"                )"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"            pci_values \u003d {key: value[2:] for key, value in pci_values.items()}"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"            domain, bus, slot, function \u003d pci_values.values()"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"            pci_addr \u003d nova.pci.utils.get_pci_address("},{"line_number":186,"context_line":"                domain, bus, slot, function"},{"line_number":187,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":3,"id":"b8b57890_aabea365","line":184,"range":{"start_line":167,"start_character":1,"end_line":184,"end_character":0},"updated":"2025-02-24 18:00:46.000000000","message":"Is this only cutting of the \"Ox\" from the address fields, can we move this to a helper? or just use removeprefix()?","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"35298cfb054cab56366f9b0e33bc793993715d04","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            function \u003d address_tag.get(\u0027function\u0027, 0)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            pci_values \u003d {"},{"line_number":167,"context_line":"                \"domain\": domain,"},{"line_number":168,"context_line":"                \"bus\": bus,"},{"line_number":169,"context_line":"                \"slot\": slot,"},{"line_number":170,"context_line":"                \"function\": function,"},{"line_number":171,"context_line":"            }"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"            if not all("},{"line_number":174,"context_line":"                value.startswith(\"0x\") for value in pci_values.values()"},{"line_number":175,"context_line":"            ):"},{"line_number":176,"context_line":"                raise exception.NovaException("},{"line_number":177,"context_line":"                    \"Address is malformed, missing the \u00270x\u0027 \""},{"line_number":178,"context_line":"                    f\"prefix: {pci_values}\""},{"line_number":179,"context_line":"                )"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"            pci_values \u003d {key: value[2:] for key, value in pci_values.items()}"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"            domain, bus, slot, function \u003d pci_values.values()"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"            pci_addr \u003d nova.pci.utils.get_pci_address("},{"line_number":186,"context_line":"                domain, bus, slot, function"},{"line_number":187,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":3,"id":"fae9a48f_976c7a6a","line":184,"range":{"start_line":167,"start_character":1,"end_line":184,"end_character":0},"in_reply_to":"b8b57890_aabea365","updated":"2025-02-26 18:50:11.000000000","message":"Done","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"008e6a57515ab1c4971fe04b37f5f628ca893b4d","unresolved":true,"context_lines":[{"line_number":191,"context_line":"            if pci_addr not in pci_dev_map_src_dst:"},{"line_number":192,"context_line":"                raise exception.NovaException("},{"line_number":193,"context_line":"                    \u0027Unable to find the destination PCI address \u0027"},{"line_number":194,"context_line":"                    f\u0027to use for this source PCI address: {pci_addr}\u0027)"},{"line_number":195,"context_line":"            if pci_addr in pci_dev_map_src_dst:"},{"line_number":196,"context_line":"                (domain, bus, slot, function) \u003d nova.pci.utils.parse_address("},{"line_number":197,"context_line":"                    pci_dev_map_src_dst[pci_addr]"}],"source_content_type":"text/x-python","patch_set":3,"id":"58fd16b7_52fecc07","line":194,"updated":"2025-02-24 18:00:46.000000000","message":"might worth including the whole mapping dict so that during troubleshooting we can see if this was the only missing mapping or there we no mapping for any of the source devices.","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"35298cfb054cab56366f9b0e33bc793993715d04","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            if pci_addr not in pci_dev_map_src_dst:"},{"line_number":192,"context_line":"                raise exception.NovaException("},{"line_number":193,"context_line":"                    \u0027Unable to find the destination PCI address \u0027"},{"line_number":194,"context_line":"                    f\u0027to use for this source PCI address: {pci_addr}\u0027)"},{"line_number":195,"context_line":"            if pci_addr in pci_dev_map_src_dst:"},{"line_number":196,"context_line":"                (domain, bus, slot, function) \u003d nova.pci.utils.parse_address("},{"line_number":197,"context_line":"                    pci_dev_map_src_dst[pci_addr]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1c8e8d7b_19039f29","line":194,"in_reply_to":"58fd16b7_52fecc07","updated":"2025-02-26 18:50:11.000000000","message":"Done","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"008e6a57515ab1c4971fe04b37f5f628ca893b4d","unresolved":true,"context_lines":[{"line_number":192,"context_line":"                raise exception.NovaException("},{"line_number":193,"context_line":"                    \u0027Unable to find the destination PCI address \u0027"},{"line_number":194,"context_line":"                    f\u0027to use for this source PCI address: {pci_addr}\u0027)"},{"line_number":195,"context_line":"            if pci_addr in pci_dev_map_src_dst:"},{"line_number":196,"context_line":"                (domain, bus, slot, function) \u003d nova.pci.utils.parse_address("},{"line_number":197,"context_line":"                    pci_dev_map_src_dst[pci_addr]"},{"line_number":198,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":3,"id":"6650769a_f200ade3","line":195,"updated":"2025-02-24 18:00:46.000000000","message":"at this point this condition is always true due to the condition above. Either transform this to an else block, or drop the if and assume the previous if as the guard condition, or just do pci_dev_map_src_dst[pci_addr] in a try block and if you get Key error translate it to NovaException","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"35298cfb054cab56366f9b0e33bc793993715d04","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                raise exception.NovaException("},{"line_number":193,"context_line":"                    \u0027Unable to find the destination PCI address \u0027"},{"line_number":194,"context_line":"                    f\u0027to use for this source PCI address: {pci_addr}\u0027)"},{"line_number":195,"context_line":"            if pci_addr in pci_dev_map_src_dst:"},{"line_number":196,"context_line":"                (domain, bus, slot, function) \u003d nova.pci.utils.parse_address("},{"line_number":197,"context_line":"                    pci_dev_map_src_dst[pci_addr]"},{"line_number":198,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ca773d5_6dec0cae","line":195,"in_reply_to":"6650769a_f200ade3","updated":"2025-02-26 18:50:11.000000000","message":"Done","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"008e6a57515ab1c4971fe04b37f5f628ca893b4d","unresolved":true,"context_lines":[{"line_number":201,"context_line":"                address_tag.set(\u0027slot\u0027, \u00270x\u0027 + slot)"},{"line_number":202,"context_line":"                address_tag.set(\u0027function\u0027, \u00270x\u0027 + function)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    LOG.debug(\u0027_update_pci_xml output xml\u003d%s\u0027,"},{"line_number":205,"context_line":"              etree.tostring(xml_doc, encoding\u003d\u0027unicode\u0027, pretty_print\u003dTrue))"},{"line_number":206,"context_line":"    return xml_doc"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3e1e4b33_c2bb96fe","line":204,"updated":"2025-02-24 18:00:46.000000000","message":"Wondering if we already have a central place logging the resulted xml already so this will just generate repetition in the log.","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"35298cfb054cab56366f9b0e33bc793993715d04","unresolved":true,"context_lines":[{"line_number":201,"context_line":"                address_tag.set(\u0027slot\u0027, \u00270x\u0027 + slot)"},{"line_number":202,"context_line":"                address_tag.set(\u0027function\u0027, \u00270x\u0027 + function)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    LOG.debug(\u0027_update_pci_xml output xml\u003d%s\u0027,"},{"line_number":205,"context_line":"              etree.tostring(xml_doc, encoding\u003d\u0027unicode\u0027, pretty_print\u003dTrue))"},{"line_number":206,"context_line":"    return xml_doc"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"49b4d99f_53e7487c","line":204,"in_reply_to":"3e1e4b33_c2bb96fe","updated":"2025-02-26 18:50:11.000000000","message":"tbh it is inspired by the _update_mdev_xml method above, so that\u0027s the reason why it is here.\n\nSo should I remove it ?","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f73b2ecb9f791f318270f97808907ee2e2076d44","unresolved":true,"context_lines":[{"line_number":201,"context_line":"                address_tag.set(\u0027slot\u0027, \u00270x\u0027 + slot)"},{"line_number":202,"context_line":"                address_tag.set(\u0027function\u0027, \u00270x\u0027 + function)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    LOG.debug(\u0027_update_pci_xml output xml\u003d%s\u0027,"},{"line_number":205,"context_line":"              etree.tostring(xml_doc, encoding\u003d\u0027unicode\u0027, pretty_print\u003dTrue))"},{"line_number":206,"context_line":"    return xml_doc"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"58d3cca7_8dd8ac72","line":204,"in_reply_to":"49b4d99f_53e7487c","updated":"2025-02-27 13:54:44.000000000","message":"do you have a paste with debug logs from the full live migration sequence? Based on that we could decide if this is creating repetition in the log or not.","commit_id":"4d3a7bb9d5181f239b7d78c4effe5276687191d3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f73b2ecb9f791f318270f97808907ee2e2076d44","unresolved":true,"context_lines":[{"line_number":157,"context_line":"    for hostdev in xml_doc.findall(\u0027./devices/hostdev\u0027):"},{"line_number":158,"context_line":"        # domain\u003d\"0x0000\" bus\u003d\"0x25\" slot\u003d\"0x00\" function\u003d\"0x4\""},{"line_number":159,"context_line":"        if hostdev.get(\u0027type\u0027) \u003d\u003d \u0027pci\u0027:"},{"line_number":160,"context_line":"            address_tag \u003d hostdev.find(\u0027source/address\u0027)"},{"line_number":161,"context_line":"            domain \u003d address_tag.get(\u0027domain\u0027, 0)"},{"line_number":162,"context_line":"            bus \u003d address_tag.get(\u0027bus\u0027, 0)"},{"line_number":163,"context_line":"            slot \u003d address_tag.get(\u0027slot\u0027, 0)"},{"line_number":164,"context_line":"            function \u003d address_tag.get(\u0027function\u0027, 0)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            pci_values \u003d {"},{"line_number":167,"context_line":"                \"domain\": domain,"},{"line_number":168,"context_line":"                \"bus\": bus,"},{"line_number":169,"context_line":"                \"slot\": slot,"},{"line_number":170,"context_line":"                \"function\": function,"},{"line_number":171,"context_line":"            }"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"            if not all("},{"line_number":174,"context_line":"                value.startswith(\"0x\") for value in pci_values.values()"},{"line_number":175,"context_line":"            ):"},{"line_number":176,"context_line":"                raise exception.NovaException("},{"line_number":177,"context_line":"                    \"Address is malformed, missing the \u00270x\u0027 \""},{"line_number":178,"context_line":"                    f\"prefix: {pci_values}\""},{"line_number":179,"context_line":"                )"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"            pci_values \u003d {"},{"line_number":182,"context_line":"                key: value.removeprefix(\"0x\")"},{"line_number":183,"context_line":"                for key, value in pci_values.items()"},{"line_number":184,"context_line":"            }"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"            domain, bus, slot, function \u003d pci_values.values()"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"            pci_addr \u003d nova.pci.utils.get_pci_address("},{"line_number":189,"context_line":"                domain, bus, slot, function"}],"source_content_type":"text/x-python","patch_set":5,"id":"6fc97b06_b2583879","line":186,"range":{"start_line":160,"start_character":0,"end_line":186,"end_character":61},"updated":"2025-02-27 13:54:44.000000000","message":"```python\ndef cut_0x(value: str):\n  if not value.startwith(\u00270x\u0027):\n      raise ...\n      \n  return value.removeprefix(\u00270x\u0027)\n      \n...\n            domain \u003d cut_0x(address_tag.get(\u0027domain\u0027, 0))\n            bus \u003d cut_0x(address_tag.get(\u0027bus\u0027, 0))\n            slot \u003d cut_0x(address_tag.get(\u0027slot\u0027, 0))\n            function \u003d cut_0x(address_tag.get(\u0027function\u0027, 0))\n            \n\n```\nthen you don\u0027t have to pack and unpack the fields.","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    for hostdev in xml_doc.findall(\u0027./devices/hostdev\u0027):"},{"line_number":158,"context_line":"        # domain\u003d\"0x0000\" bus\u003d\"0x25\" slot\u003d\"0x00\" function\u003d\"0x4\""},{"line_number":159,"context_line":"        if hostdev.get(\u0027type\u0027) \u003d\u003d \u0027pci\u0027:"},{"line_number":160,"context_line":"            address_tag \u003d hostdev.find(\u0027source/address\u0027)"},{"line_number":161,"context_line":"            domain \u003d address_tag.get(\u0027domain\u0027, 0)"},{"line_number":162,"context_line":"            bus \u003d address_tag.get(\u0027bus\u0027, 0)"},{"line_number":163,"context_line":"            slot \u003d address_tag.get(\u0027slot\u0027, 0)"},{"line_number":164,"context_line":"            function \u003d address_tag.get(\u0027function\u0027, 0)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            pci_values \u003d {"},{"line_number":167,"context_line":"                \"domain\": domain,"},{"line_number":168,"context_line":"                \"bus\": bus,"},{"line_number":169,"context_line":"                \"slot\": slot,"},{"line_number":170,"context_line":"                \"function\": function,"},{"line_number":171,"context_line":"            }"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"            if not all("},{"line_number":174,"context_line":"                value.startswith(\"0x\") for value in pci_values.values()"},{"line_number":175,"context_line":"            ):"},{"line_number":176,"context_line":"                raise exception.NovaException("},{"line_number":177,"context_line":"                    \"Address is malformed, missing the \u00270x\u0027 \""},{"line_number":178,"context_line":"                    f\"prefix: {pci_values}\""},{"line_number":179,"context_line":"                )"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"            pci_values \u003d {"},{"line_number":182,"context_line":"                key: value.removeprefix(\"0x\")"},{"line_number":183,"context_line":"                for key, value in pci_values.items()"},{"line_number":184,"context_line":"            }"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"            domain, bus, slot, function \u003d pci_values.values()"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"            pci_addr \u003d nova.pci.utils.get_pci_address("},{"line_number":189,"context_line":"                domain, bus, slot, function"}],"source_content_type":"text/x-python","patch_set":5,"id":"5ff81fe4_d8b5702f","line":186,"range":{"start_line":160,"start_character":0,"end_line":186,"end_character":61},"in_reply_to":"6fc97b06_b2583879","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"aecd692b565d121fbd719ee792074bd014f63fdc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f45838d4ee7cdbc4107b4d14da027152ee07c441","unresolved":true,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def get_updated_guest_xml(instance, guest, migrate_data, get_volume_config,"},{"line_number":57,"context_line":"                          get_vif_config\u003dNone, new_resources\u003dNone):"},{"line_number":58,"context_line":"    xml_doc \u003d etree.fromstring(guest.get_xml_desc(dump_migratable\u003dTrue))"},{"line_number":59,"context_line":"    xml_doc \u003d _update_graphics_xml(xml_doc, migrate_data)"},{"line_number":60,"context_line":"    xml_doc \u003d _update_serial_xml(xml_doc, migrate_data)"},{"line_number":61,"context_line":"    xml_doc \u003d _update_volume_xml("}],"source_content_type":"text/x-python","patch_set":6,"id":"f6167c7a_54faee67","line":58,"updated":"2025-02-28 12:05:27.000000000","message":"re issues validating this change in the test: the live migration in the functional test env reaches this point and the XML that got here is not the real source XML but some minimal XML therefore the translations below are not really happening.","commit_id":"47922135b1a0b54f636f1eb02cb1e0bc1a5edb5c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def get_updated_guest_xml(instance, guest, migrate_data, get_volume_config,"},{"line_number":57,"context_line":"                          get_vif_config\u003dNone, new_resources\u003dNone):"},{"line_number":58,"context_line":"    xml_doc \u003d etree.fromstring(guest.get_xml_desc(dump_migratable\u003dTrue))"},{"line_number":59,"context_line":"    xml_doc \u003d _update_graphics_xml(xml_doc, migrate_data)"},{"line_number":60,"context_line":"    xml_doc \u003d _update_serial_xml(xml_doc, migrate_data)"},{"line_number":61,"context_line":"    xml_doc \u003d _update_volume_xml("}],"source_content_type":"text/x-python","patch_set":6,"id":"78af28ac_d9946257","line":58,"in_reply_to":"ae79621a_e989ed0d","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"47922135b1a0b54f636f1eb02cb1e0bc1a5edb5c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"253b305fe6ab56775feb8bac8fa7c3ec9c753df1","unresolved":true,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def get_updated_guest_xml(instance, guest, migrate_data, get_volume_config,"},{"line_number":57,"context_line":"                          get_vif_config\u003dNone, new_resources\u003dNone):"},{"line_number":58,"context_line":"    xml_doc \u003d etree.fromstring(guest.get_xml_desc(dump_migratable\u003dTrue))"},{"line_number":59,"context_line":"    xml_doc \u003d _update_graphics_xml(xml_doc, migrate_data)"},{"line_number":60,"context_line":"    xml_doc \u003d _update_serial_xml(xml_doc, migrate_data)"},{"line_number":61,"context_line":"    xml_doc \u003d _update_volume_xml("}],"source_content_type":"text/x-python","patch_set":6,"id":"ae79621a_e989ed0d","line":58,"in_reply_to":"f6167c7a_54faee67","updated":"2025-02-28 12:39:28.000000000","message":"The libvirt fixture does not store hostdev pieces, it ignores them: \nhttps://github.com/openstack/nova/blob/a933c7fbab79a306c9fd3b385b222c832e247037/nova/tests/fixtures/libvirt.py#L1245-L1255\n\nThis is the commit when we added the mdev handling to the fixture https://github.com/openstack/nova/commit/a76eefed62db96fe51ef40e3209c187af3eb9834\n\nSo in general the libvirt fixture is good for catching the XML at creation and asserting that nova passed a full correct XML. But then when nova reads back that XML from the fixture it gets an XML back without the hostdevs as the fixture does not store them. This is why you cannot see the proper XML during live migration even at the starting stage.\n\nI would say this is a good opportunity to extend the fixture, similarly how we did it for mdevs when mdev support was added to nova.","commit_id":"47922135b1a0b54f636f1eb02cb1e0bc1a5edb5c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0b0be16cbe76e3443664574a2bb34edb3eb2b49a","unresolved":true,"context_lines":[{"line_number":90,"context_line":"        xml_doc \u003d _update_mdev_xml(xml_doc, migrate_data.target_mdevs)"},{"line_number":91,"context_line":"    if ("},{"line_number":92,"context_line":"        \"pci_dev_map_src_dst\" in migrate_data and"},{"line_number":93,"context_line":"        len(migrate_data.pci_dev_map_src_dst) \u003e 0"},{"line_number":94,"context_line":"    ):"},{"line_number":95,"context_line":"        xml_doc \u003d _update_pci_dev_xml("},{"line_number":96,"context_line":"            xml_doc, migrate_data.pci_dev_map_src_dst"}],"source_content_type":"text/x-python","patch_set":6,"id":"4a3d2e24_ec35282b","line":93,"updated":"2025-02-28 11:20:48.000000000","message":"I don\u0027t think we need this length check. The pci_dev_map_src_dst is only {} when there are no InstancePCIRequest ovos from the flavor. But if that is true then _update_pci_dev_xml should not find any hostdevs in the XML to replace either as none was requested in the first place.","commit_id":"47922135b1a0b54f636f1eb02cb1e0bc1a5edb5c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"1366faecc3849f4ab7fb6c15743544fe284c628c","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        xml_doc \u003d _update_mdev_xml(xml_doc, migrate_data.target_mdevs)"},{"line_number":91,"context_line":"    if ("},{"line_number":92,"context_line":"        \"pci_dev_map_src_dst\" in migrate_data and"},{"line_number":93,"context_line":"        len(migrate_data.pci_dev_map_src_dst) \u003e 0"},{"line_number":94,"context_line":"    ):"},{"line_number":95,"context_line":"        xml_doc \u003d _update_pci_dev_xml("},{"line_number":96,"context_line":"            xml_doc, migrate_data.pci_dev_map_src_dst"}],"source_content_type":"text/x-python","patch_set":6,"id":"69e143fe_8914cce9","line":93,"in_reply_to":"4a3d2e24_ec35282b","updated":"2025-03-03 09:36:55.000000000","message":"Done","commit_id":"47922135b1a0b54f636f1eb02cb1e0bc1a5edb5c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0b0be16cbe76e3443664574a2bb34edb3eb2b49a","unresolved":true,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"def _update_pci_dev_xml(xml_doc, pci_dev_map_src_dst):"},{"line_number":161,"context_line":"    for hostdev in xml_doc.findall(\u0027./devices/hostdev\u0027):"},{"line_number":162,"context_line":"        # domain\u003d\"0x0000\" bus\u003d\"0x25\" slot\u003d\"0x00\" function\u003d\"0x4\""},{"line_number":163,"context_line":"        if hostdev.get(\u0027type\u0027) \u003d\u003d \u0027pci\u0027:"},{"line_number":164,"context_line":"            address_tag \u003d hostdev.find(\u0027source/address\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"efb3cc76_1444b337","line":161,"updated":"2025-02-28 11:20:48.000000000","message":"I realized that this code works based on hostdevs in the XML, however a direct_physical neutron port also results in a hostdev in the XML afaik. So until we unify the vif and flavor codepath this logic needs to be inverted. Do not iterate all hostdevs (as some are not mappable to flavor based device) but iterate the src devices from the mapping, and for each dev find the dev in the XML and replace it based on the dest device from the mapping.","commit_id":"47922135b1a0b54f636f1eb02cb1e0bc1a5edb5c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"aa96fd24dda31306d9ea5ddbb60af2858bf1727e","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"def _update_pci_dev_xml(xml_doc, pci_dev_map_src_dst):"},{"line_number":161,"context_line":"    for hostdev in xml_doc.findall(\u0027./devices/hostdev\u0027):"},{"line_number":162,"context_line":"        # domain\u003d\"0x0000\" bus\u003d\"0x25\" slot\u003d\"0x00\" function\u003d\"0x4\""},{"line_number":163,"context_line":"        if hostdev.get(\u0027type\u0027) \u003d\u003d \u0027pci\u0027:"},{"line_number":164,"context_line":"            address_tag \u003d hostdev.find(\u0027source/address\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"8ea14cab_b2af41c4","line":161,"in_reply_to":"efb3cc76_1444b337","updated":"2025-03-02 23:48:39.000000000","message":"Done","commit_id":"47922135b1a0b54f636f1eb02cb1e0bc1a5edb5c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a31b56b62879696f56a1e6fbc65a277aa500b32","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    return xml_doc"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"def _get_pci_address_fields_with_suffix(addr):"},{"line_number":174,"context_line":"    (domain, bus, slot, func) \u003d nova.pci.utils.get_pci_address_fields(addr)"},{"line_number":175,"context_line":"    return (f\"0x{domain}\", f\"0x{bus}\", f\"0x{slot}\", f\"0x{func}\")"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"4f220dda_aabecd79","line":173,"updated":"2025-03-03 13:45:40.000000000","message":"0x is a prefix not a suffix here, but I guess it is OK to call this _get_pci_address_fields simply","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4e0d5bb5a83b9cb3150eba0ba6e5144295299d6c","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    return xml_doc"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"def _get_pci_address_fields_with_suffix(addr):"},{"line_number":174,"context_line":"    (domain, bus, slot, func) \u003d nova.pci.utils.get_pci_address_fields(addr)"},{"line_number":175,"context_line":"    return (f\"0x{domain}\", f\"0x{bus}\", f\"0x{slot}\", f\"0x{func}\")"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"2a9293ed_35e7c150","line":173,"in_reply_to":"4f220dda_aabecd79","updated":"2025-03-03 20:23:02.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a31b56b62879696f56a1e6fbc65a277aa500b32","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        if address_tag is None:"},{"line_number":188,"context_line":"            continue"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        if _address_matches("},{"line_number":191,"context_line":"            address_tag, src_domain, src_bus, src_slot, src_function"},{"line_number":192,"context_line":"        ):"},{"line_number":193,"context_line":"            _set_address_fields("},{"line_number":194,"context_line":"                address_tag, dst_domain, dst_bus, dst_slot, dst_function"},{"line_number":195,"context_line":"            )"},{"line_number":196,"context_line":"            return True"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    return False"},{"line_number":199,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"8df36bf7_cf26a136","line":196,"range":{"start_line":190,"start_character":0,"end_line":196,"end_character":23},"updated":"2025-03-03 13:45:40.000000000","message":"this replaces the first match, but that is OK as we can assume that a single host PCI device can only be mentioned in the XML as source device once.","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a31b56b62879696f56a1e6fbc65a277aa500b32","unresolved":true,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"def _address_matches(address_tag, domain, bus, slot, function):"},{"line_number":202,"context_line":"    return ("},{"line_number":203,"context_line":"        address_tag.get(\u0027domain\u0027, \u00270\u0027) \u003d\u003d domain and"},{"line_number":204,"context_line":"        address_tag.get(\u0027bus\u0027, \u00270\u0027) \u003d\u003d bus and"},{"line_number":205,"context_line":"        address_tag.get(\u0027slot\u0027, \u00270\u0027) \u003d\u003d slot and"},{"line_number":206,"context_line":"        address_tag.get(\u0027function\u0027, \u00270\u0027) \u003d\u003d function"},{"line_number":207,"context_line":"    )"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"4bc30995_5826425b","line":206,"range":{"start_line":203,"start_character":0,"end_line":206,"end_character":52},"updated":"2025-03-03 13:45:40.000000000","message":"you don\u0027t need the \u00270\u0027 as a default value, get will return None and that will never match with the input value as that is something \u00270x....\u0027","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4e0d5bb5a83b9cb3150eba0ba6e5144295299d6c","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"def _address_matches(address_tag, domain, bus, slot, function):"},{"line_number":202,"context_line":"    return ("},{"line_number":203,"context_line":"        address_tag.get(\u0027domain\u0027, \u00270\u0027) \u003d\u003d domain and"},{"line_number":204,"context_line":"        address_tag.get(\u0027bus\u0027, \u00270\u0027) \u003d\u003d bus and"},{"line_number":205,"context_line":"        address_tag.get(\u0027slot\u0027, \u00270\u0027) \u003d\u003d slot and"},{"line_number":206,"context_line":"        address_tag.get(\u0027function\u0027, \u00270\u0027) \u003d\u003d function"},{"line_number":207,"context_line":"    )"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1440def7_1b210d50","line":206,"range":{"start_line":203,"start_character":0,"end_line":206,"end_character":52},"in_reply_to":"4bc30995_5826425b","updated":"2025-03-03 20:23:02.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a31b56b62879696f56a1e6fbc65a277aa500b32","unresolved":true,"context_lines":[{"line_number":219,"context_line":"        xml_doc, encoding\u003d\"unicode\", pretty_print\u003dTrue"},{"line_number":220,"context_line":"    ).strip()"},{"line_number":221,"context_line":"    raise exception.NovaException("},{"line_number":222,"context_line":"        \u0027Unable to find the hostdev to use for this source PCI \u0027"},{"line_number":223,"context_line":"        f\u0027address: {src_addr} in the xml: {xml}\u0027"},{"line_number":224,"context_line":"    )"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"0dbe0a1c_6bcf149b","line":222,"range":{"start_line":222,"start_character":39,"end_line":222,"end_character":42},"updated":"2025-03-03 13:45:40.000000000","message":"nit: replace","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"4e0d5bb5a83b9cb3150eba0ba6e5144295299d6c","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        xml_doc, encoding\u003d\"unicode\", pretty_print\u003dTrue"},{"line_number":220,"context_line":"    ).strip()"},{"line_number":221,"context_line":"    raise exception.NovaException("},{"line_number":222,"context_line":"        \u0027Unable to find the hostdev to use for this source PCI \u0027"},{"line_number":223,"context_line":"        f\u0027address: {src_addr} in the xml: {xml}\u0027"},{"line_number":224,"context_line":"    )"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1eecd9f9_ed6bafb7","line":222,"range":{"start_line":222,"start_character":39,"end_line":222,"end_character":42},"in_reply_to":"0dbe0a1c_6bcf149b","updated":"2025-03-03 20:23:02.000000000","message":"Done","commit_id":"467158d6288dc20c1cdf8bf48b55151c70ed4713"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"45b183a4021eb9b93065bf66e9b917d53a2f2941","unresolved":true,"context_lines":[{"line_number":16,"context_line":"\"\"\"Utility methods to manage guests migration"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from collections import deque"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from lxml import etree"}],"source_content_type":"text/x-python","patch_set":9,"id":"98f05ea2_557d4c36","side":"PARENT","line":19,"updated":"2025-03-04 10:11:49.000000000","message":"hmmm, not necessary change","commit_id":"b227efd967f3617d41ce07b500857d313ff86186"}]}
