)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e4326671e61c8471722c0be763a1b47610f43a2a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d27f079c_1812e358","updated":"2025-02-24 12:43:30.000000000","message":"I have issues with the mapping logic","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d0dde422_5a59b1f6","updated":"2025-02-27 11:05:04.000000000","message":"I don\u0027t see any direct bug in the mapping logic now but I have a list of requests to clean things up both in the impl and in the test.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"43a499ecef6d2acb75630e7dd0f5231cd315d2c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9f38e9d4_33b1964f","updated":"2025-02-28 10:36:03.000000000","message":"thanks for the fixes it looks good to me now","commit_id":"f079f17214ed0e483be8a861279bc826410d89ce"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3a8945d9a254231ae2b3ca1863c235e344a11c31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"0bedbfbf_ccbc69b4","updated":"2025-03-04 09:19:48.000000000","message":"I have some nits but I don\u0027t want to hold this series.","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9152635019f34ef0cb7933cb411d0fa7196ba2c6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"98373c2f_28219d4c","updated":"2025-03-04 18:06:57.000000000","message":"all left open here can be fixed in follow ups later.","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dc5d598557eded160125fd3b20a37f42689225be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8bbcbd5e_efa98b3d","updated":"2025-03-05 08:10:44.000000000","message":"recheck multi cell job failed with a guest kernel panic","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e39a7511b54f0aa693156953f0bbfbe8068195af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9169702a_b117318f","updated":"2025-03-07 15:32:38.000000000","message":"recheck nova-next post-failure","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"}],"nova/compute/manager.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e4326671e61c8471722c0be763a1b47610f43a2a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"5e9a2ee0_e69fa37a","updated":"2025-02-24 12:43:30.000000000","message":"This change needs a good set of functional test cases to test the mapping logic of between devices.\n* single alias count\u003d1\n* multiple alias count\u003d1\n* single alias count \u003e 1\n* multiple alias count \u003e 1\n* multiple alias mixed some count\u003d1 some count \u003e 1\n\nIn the multiple alias cases the aliases should request different devices to see that the right \"type\" of devices are mapped to each other.","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"d45094698a5c113caed1888760e7e21c73fdaa2f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b8a457be_0d7f0d8c","in_reply_to":"5e9a2ee0_e69fa37a","updated":"2025-02-26 18:49:57.000000000","message":"Agree I, will add them in the latest patch.","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a924b220eb61684670058e6c1bab52777732321a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"87610c57_6cde3215","in_reply_to":"b8a457be_0d7f0d8c","updated":"2025-02-27 19:33:59.000000000","message":"yep i agree with that.\n\nwe also need to test multiple alsise where some are migratebael and some are not.","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e4326671e61c8471722c0be763a1b47610f43a2a","unresolved":true,"context_lines":[{"line_number":9057,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":9058,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":9059,"context_line":""},{"line_number":9060,"context_line":"            # Based on scheduler request and filter we know that we have"},{"line_number":9061,"context_line":"            # a dest instance with the correct number of live_migratable pci"},{"line_number":9062,"context_line":"            # devices (flavor_alias) + other pci devices (neutron_port)"},{"line_number":9063,"context_line":"            pci_reqs \u003d ["},{"line_number":9064,"context_line":"                pci_req"}],"source_content_type":"text/x-python","patch_set":2,"id":"e392ada2_d0c2e502","line":9061,"range":{"start_line":9060,"start_character":0,"end_line":9061,"end_character":76},"updated":"2025-02-24 12:43:30.000000000","message":"I think what we know here is that this compute (dest) has potentially enough live migratable pci devices based on the fact that the scheduler selected this host as destination.\n\nThe below claim code is the decisive one to move from \"potentially correct\" to \"known to be correct\" destination.","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"d45094698a5c113caed1888760e7e21c73fdaa2f","unresolved":false,"context_lines":[{"line_number":9057,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":9058,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":9059,"context_line":""},{"line_number":9060,"context_line":"            # Based on scheduler request and filter we know that we have"},{"line_number":9061,"context_line":"            # a dest instance with the correct number of live_migratable pci"},{"line_number":9062,"context_line":"            # devices (flavor_alias) + other pci devices (neutron_port)"},{"line_number":9063,"context_line":"            pci_reqs \u003d ["},{"line_number":9064,"context_line":"                pci_req"}],"source_content_type":"text/x-python","patch_set":2,"id":"bc6815a3_6081b5ee","line":9061,"range":{"start_line":9060,"start_character":0,"end_line":9061,"end_character":76},"in_reply_to":"e392ada2_d0c2e502","updated":"2025-02-26 18:49:57.000000000","message":"Done","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e4326671e61c8471722c0be763a1b47610f43a2a","unresolved":true,"context_lines":[{"line_number":9067,"context_line":"            ]"},{"line_number":9068,"context_line":""},{"line_number":9069,"context_line":"            if pci_reqs:"},{"line_number":9070,"context_line":"                # Create PCI requests and claim against PCI resource tracker"},{"line_number":9071,"context_line":"                # for out dest instance"},{"line_number":9072,"context_line":"                lm_pci_requests \u003d objects.InstancePCIRequests("},{"line_number":9073,"context_line":"                    requests\u003dpci_reqs,"},{"line_number":9074,"context_line":"                    instance_uuid\u003dinstance.uuid)"},{"line_number":9075,"context_line":"                claimed_lm_pci_devs \u003d self._claim_from_pci_reqs("},{"line_number":9076,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9077,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":2,"id":"58fae5cc_f6c26d7e","line":9074,"range":{"start_line":9070,"start_character":0,"end_line":9074,"end_character":48},"updated":"2025-02-24 12:43:30.000000000","message":"This is strange. I assume instance.pci_requests when iterated gives us InstancePCIRequest ovos so we don\u0027t have to wrap them here.","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"d45094698a5c113caed1888760e7e21c73fdaa2f","unresolved":true,"context_lines":[{"line_number":9067,"context_line":"            ]"},{"line_number":9068,"context_line":""},{"line_number":9069,"context_line":"            if pci_reqs:"},{"line_number":9070,"context_line":"                # Create PCI requests and claim against PCI resource tracker"},{"line_number":9071,"context_line":"                # for out dest instance"},{"line_number":9072,"context_line":"                lm_pci_requests \u003d objects.InstancePCIRequests("},{"line_number":9073,"context_line":"                    requests\u003dpci_reqs,"},{"line_number":9074,"context_line":"                    instance_uuid\u003dinstance.uuid)"},{"line_number":9075,"context_line":"                claimed_lm_pci_devs \u003d self._claim_from_pci_reqs("},{"line_number":9076,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9077,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":2,"id":"b8833e26_92aa26ec","line":9074,"range":{"start_line":9070,"start_character":0,"end_line":9074,"end_character":48},"in_reply_to":"58fae5cc_f6c26d7e","updated":"2025-02-26 18:49:57.000000000","message":"Line 9063 --\u003e pci_reqs is a \"bare\" list of InstancePCIRequest\nWe filtered the InstancePCIRequest with live_migratable\n\n```\n(Pdb) pci_reqs\n[InstancePCIRequest(alias_name\u003d\u0027a16_16a\u0027,count\u003d1,is_new\u003dFalse,numa_policy\u003d\u0027legacy\u0027,request_id\u003dc4f7a006-71cb-420c-9585-d6d151da828a,requester_id\u003dNone,spec\u003d[{dev_type\u003d\u0027type-VF\u0027,live_migratable\u003d\u0027true\u0027,resource_class\u003d\u0027CUSTOM_A16_16A\u0027,rp_uuids\u003d\u0027af69d93c-56f2-4d69-a959-cf78c956e8b6\u0027}])]\n\n \n```\n\n9072 --\u003e create a InstancePCIRequest(s) list wich is required by the self.rt.claim_pci_devices() method.\n\n```\n(Pdb) lm_pci_requests\nInstancePCIRequests(instance_uuid\u003d4d5155ed-04f2-44a8-8e2d-2327fb66c2af,requests\u003d[InstancePCIRequest])\n \n \n```","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":false,"context_lines":[{"line_number":9067,"context_line":"            ]"},{"line_number":9068,"context_line":""},{"line_number":9069,"context_line":"            if pci_reqs:"},{"line_number":9070,"context_line":"                # Create PCI requests and claim against PCI resource tracker"},{"line_number":9071,"context_line":"                # for out dest instance"},{"line_number":9072,"context_line":"                lm_pci_requests \u003d objects.InstancePCIRequests("},{"line_number":9073,"context_line":"                    requests\u003dpci_reqs,"},{"line_number":9074,"context_line":"                    instance_uuid\u003dinstance.uuid)"},{"line_number":9075,"context_line":"                claimed_lm_pci_devs \u003d self._claim_from_pci_reqs("},{"line_number":9076,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9077,"context_line":"                )"}],"source_content_type":"text/x-python","patch_set":2,"id":"de6fbf89_3a01368b","line":9074,"range":{"start_line":9070,"start_character":0,"end_line":9074,"end_character":48},"in_reply_to":"b8833e26_92aa26ec","updated":"2025-02-27 11:05:04.000000000","message":"ahh OK I see it now. That explains it. Thanks.","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e4326671e61c8471722c0be763a1b47610f43a2a","unresolved":true,"context_lines":[{"line_number":9096,"context_line":"                        list(map(lambda dev: dev.address, src_pci_devs)),"},{"line_number":9097,"context_line":"                        list(map(lambda dev: dev.address, claimed_lm_pci_devs))"},{"line_number":9098,"context_line":"                    )"},{"line_number":9099,"context_line":"                )"},{"line_number":9100,"context_line":""},{"line_number":9101,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"},{"line_number":9102,"context_line":"                # Create migrate_data vifs if not provided by driver."}],"source_content_type":"text/x-python","patch_set":2,"id":"b180dc38_c2cb185f","line":9099,"updated":"2025-02-24 12:43:30.000000000","message":"This code feels like using some kind of assumed ordering of pci requests, source pci devices and dest pci devices to map the source to the dest. That feels at least brittle, but very well possibly broken if you have multiple devices. There is a relationship between InstancePCIRequest and PCIDevice objects via the request_id field. So an allocated PCIDevice can be mapped back to the InstancePCIRequest or vice versa based on a request you can find which devices fulfilling it. \n\n```\nstack@aio-tmp:/opt/stack/nova$ mysql -e \u0027select status, request_id from nova_cell1.pci_devices where instance_uuid\u003d\"e891ab05-d96d-4ca8-903f-59665a213088\";\u0027\n+-----------+--------------------------------------+\n| status    | request_id                           |\n+-----------+--------------------------------------+\n| allocated | 4cfcae48-8448-44e9-9ad0-9d595c4687a1 |\n+-----------+--------------------------------------+\nstack@aio-tmp:/opt/stack/nova$ mysql -e \u0027select pci_requests from nova_cell1.instance_extra where instance_uuid\u003d\"e891ab05-d96d-4ca8-903f-59665a213088\"\u0027\n+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n| pci_requests                                                                                                                                                                                                                                                                                   |\n+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n| [{\"count\": 1, \"spec\": [{\"product_id\": \"10ca\", \"vendor_id\": \"8086\", \"dev_type\": \"type-VF\", \"rp_uuids\": \"c44245a6-0d0d-4251-8579-4af0883db914\"}], \"alias_name\": \"nic-vf\", \"is_new\": false, \"numa_policy\": \"legacy\", \"request_id\": \"4cfcae48-8448-44e9-9ad0-9d595c4687a1\", \"requester_id\": null}] |\n+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n```\n\n(The IntancePCIRequest.requester_id is empty for flavor based requests and holds the neutron port uuid for neutron based requests. There is a TODO somewhere in the code that if we want we can add the flavor id to as the requester_id if we wish but we don\u0027t need that here.)\n\nSo I think the proper mapping is the following:\n\nWe have a list of InstancePCIRequests in the instance. And there are devices allocated for those requests both on the source and on the dest. So we need to map the source device to the dest device based on the fact that they are requested by the same InstancePCIRequest.\n\nAs an InstancePCIRequest has a count 1..N it means that example for count\u003d2 a single request will have 2 PCIDevices on each host (source, and dest). Now within a single requests the devices considered equivalent (coming from the same alias) so therefore you can free to map that two pairs of devices in any order within that single request.","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"d45094698a5c113caed1888760e7e21c73fdaa2f","unresolved":false,"context_lines":[{"line_number":9096,"context_line":"                        list(map(lambda dev: dev.address, src_pci_devs)),"},{"line_number":9097,"context_line":"                        list(map(lambda dev: dev.address, claimed_lm_pci_devs))"},{"line_number":9098,"context_line":"                    )"},{"line_number":9099,"context_line":"                )"},{"line_number":9100,"context_line":""},{"line_number":9101,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"},{"line_number":9102,"context_line":"                # Create migrate_data vifs if not provided by driver."}],"source_content_type":"text/x-python","patch_set":2,"id":"027840cc_a49728fd","line":9099,"in_reply_to":"b180dc38_c2cb185f","updated":"2025-02-26 18:49:57.000000000","message":"Done","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":9082,"context_line":"                lm_pci_requests \u003d objects.InstancePCIRequests("},{"line_number":9083,"context_line":"                    requests\u003dpci_reqs,"},{"line_number":9084,"context_line":"                    instance_uuid\u003dinstance.uuid)"},{"line_number":9085,"context_line":"                claimed_lm_pci_devs \u003d self._claim_from_pci_reqs("},{"line_number":9086,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9087,"context_line":"                )"},{"line_number":9088,"context_line":""},{"line_number":9089,"context_line":"                pci_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9090,"context_line":"                    ctxt, instance.uuid"},{"line_number":9091,"context_line":"                )"},{"line_number":9092,"context_line":"                src_pci_devs \u003d ["},{"line_number":9093,"context_line":"                    pci_dev"},{"line_number":9094,"context_line":"                    for pci_dev in pci_devs"}],"source_content_type":"text/x-python","patch_set":3,"id":"6b3d0d26_c8d49566","line":9091,"range":{"start_line":9085,"start_character":0,"end_line":9091,"end_character":17},"updated":"2025-02-27 11:05:04.000000000","message":"The ordering of operations feels dangerous for me. We allocated devices for the instance at L9085 on the dest. Then asking for the devices allocated for the instance at L9089 and expecting that those are only the devices from the *source* and not from both the source and the dest. This probably works as the result of the claim is not saved in the DB yet. But moving the query before the claim would be a lot clearer for the reader why the query result in source dev only.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":9082,"context_line":"                lm_pci_requests \u003d objects.InstancePCIRequests("},{"line_number":9083,"context_line":"                    requests\u003dpci_reqs,"},{"line_number":9084,"context_line":"                    instance_uuid\u003dinstance.uuid)"},{"line_number":9085,"context_line":"                claimed_lm_pci_devs \u003d self._claim_from_pci_reqs("},{"line_number":9086,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9087,"context_line":"                )"},{"line_number":9088,"context_line":""},{"line_number":9089,"context_line":"                pci_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9090,"context_line":"                    ctxt, instance.uuid"},{"line_number":9091,"context_line":"                )"},{"line_number":9092,"context_line":"                src_pci_devs \u003d ["},{"line_number":9093,"context_line":"                    pci_dev"},{"line_number":9094,"context_line":"                    for pci_dev in pci_devs"}],"source_content_type":"text/x-python","patch_set":3,"id":"a012b6cd_ac335561","line":9091,"range":{"start_line":9085,"start_character":0,"end_line":9091,"end_character":17},"in_reply_to":"6b3d0d26_c8d49566","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a924b220eb61684670058e6c1bab52777732321a","unresolved":true,"context_lines":[{"line_number":9082,"context_line":"                lm_pci_requests \u003d objects.InstancePCIRequests("},{"line_number":9083,"context_line":"                    requests\u003dpci_reqs,"},{"line_number":9084,"context_line":"                    instance_uuid\u003dinstance.uuid)"},{"line_number":9085,"context_line":"                claimed_lm_pci_devs \u003d self._claim_from_pci_reqs("},{"line_number":9086,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9087,"context_line":"                )"},{"line_number":9088,"context_line":""},{"line_number":9089,"context_line":"                pci_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9090,"context_line":"                    ctxt, instance.uuid"},{"line_number":9091,"context_line":"                )"},{"line_number":9092,"context_line":"                src_pci_devs \u003d ["},{"line_number":9093,"context_line":"                    pci_dev"},{"line_number":9094,"context_line":"                    for pci_dev in pci_devs"}],"source_content_type":"text/x-python","patch_set":3,"id":"2376c6da_bbbd3e90","line":9091,"range":{"start_line":9085,"start_character":0,"end_line":9091,"end_character":17},"in_reply_to":"6b3d0d26_c8d49566","updated":"2025-02-27 19:33:59.000000000","message":"right it will work but its relying on the fact that claimed devices are reserved for the instence to use but currenlty allocated in the db\n\nget_by_instance_uuid only looks at the allocated devices.\nhttps://github.com/openstack/nova/blob/master/nova/db/main/api.py#L4722-L4727\n\nso while the code is correct it woudl clear if the ordering was reversd.\n\nhowever this entire logic is still incorrect because of possible neturon ports.\n\nwe need to fileter them to remove the once for neuton prot by removing any that are not corralted iwth the requests in pci_reqs \n\npci_request_ids \u003d {pci_req.request_id for pci_req in pci_reqs}\nby comparting pci_dev.request_id in\n\n\nsrc_pci_devs \u003d [\n                    pci_dev\n                    for pci_dev in pci_devs\n                    if pci_dev.request_id in pci_request_ids\n                ]","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ba005ba891660e24e6e76e02179b2ad9fa482dc9","unresolved":true,"context_lines":[{"line_number":9082,"context_line":"                lm_pci_requests \u003d objects.InstancePCIRequests("},{"line_number":9083,"context_line":"                    requests\u003dpci_reqs,"},{"line_number":9084,"context_line":"                    instance_uuid\u003dinstance.uuid)"},{"line_number":9085,"context_line":"                claimed_lm_pci_devs \u003d self._claim_from_pci_reqs("},{"line_number":9086,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9087,"context_line":"                )"},{"line_number":9088,"context_line":""},{"line_number":9089,"context_line":"                pci_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9090,"context_line":"                    ctxt, instance.uuid"},{"line_number":9091,"context_line":"                )"},{"line_number":9092,"context_line":"                src_pci_devs \u003d ["},{"line_number":9093,"context_line":"                    pci_dev"},{"line_number":9094,"context_line":"                    for pci_dev in pci_devs"}],"source_content_type":"text/x-python","patch_set":3,"id":"873dd1f8_908a72ea","line":9091,"range":{"start_line":9085,"start_character":0,"end_line":9091,"end_character":17},"in_reply_to":"a012b6cd_ac335561","updated":"2025-02-28 09:56:03.000000000","message":"I don\u0027t think we need to filter those explicitly the mapping logic iterates the devs based on ther reqest_id from the requests. As the requests are already filtered for the flavor, the mapping logic will not consider any non flavor based devs in the mapping.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":9086,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9087,"context_line":"                )"},{"line_number":9088,"context_line":""},{"line_number":9089,"context_line":"                pci_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9090,"context_line":"                    ctxt, instance.uuid"},{"line_number":9091,"context_line":"                )"},{"line_number":9092,"context_line":"                src_pci_devs \u003d ["},{"line_number":9093,"context_line":"                    pci_dev"},{"line_number":9094,"context_line":"                    for pci_dev in pci_devs"},{"line_number":9095,"context_line":"                    if pci_dev.extra_info[\"live_migratable\"]"},{"line_number":9096,"context_line":"                ]"},{"line_number":9097,"context_line":""},{"line_number":9098,"context_line":"                if len(src_pci_devs) !\u003d len(claimed_lm_pci_devs):"},{"line_number":9099,"context_line":"                    raise exception.LiveMigrationSrcDstMismatch("}],"source_content_type":"text/x-python","patch_set":3,"id":"471d73b8_1ecf97cf","line":9096,"range":{"start_line":9089,"start_character":0,"end_line":9096,"end_character":17},"updated":"2025-02-27 11:05:04.000000000","message":"I think in the current implementation nothing prevents the admin to mark a device in the dev_spec live-migratable and then consume it from a neutron port instead of from a flavor. Then this list will contain that dev. It probably does not cause a bug below as the mapping logic only search for the devs that are allocated to a req that is from the flavor.\n\nBut with the same logic not filtering for live-migratable here would also not cause any trouble in the mapping logic as only devices from the flavor reqs are mapped and those can always mappable via the req is, regardless of the other properties of the dev. (i.e. if for some bug we end up here with reqs for non live-migratable devs, then still the mapping would be correct).\n\nSo I suggest to drop this filtering from here.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":9086,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9087,"context_line":"                )"},{"line_number":9088,"context_line":""},{"line_number":9089,"context_line":"                pci_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9090,"context_line":"                    ctxt, instance.uuid"},{"line_number":9091,"context_line":"                )"},{"line_number":9092,"context_line":"                src_pci_devs \u003d ["},{"line_number":9093,"context_line":"                    pci_dev"},{"line_number":9094,"context_line":"                    for pci_dev in pci_devs"},{"line_number":9095,"context_line":"                    if pci_dev.extra_info[\"live_migratable\"]"},{"line_number":9096,"context_line":"                ]"},{"line_number":9097,"context_line":""},{"line_number":9098,"context_line":"                if len(src_pci_devs) !\u003d len(claimed_lm_pci_devs):"},{"line_number":9099,"context_line":"                    raise exception.LiveMigrationSrcDstMismatch("}],"source_content_type":"text/x-python","patch_set":3,"id":"a0592c7b_d3ef30e5","line":9096,"range":{"start_line":9089,"start_character":0,"end_line":9096,"end_character":17},"in_reply_to":"471d73b8_1ecf97cf","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a924b220eb61684670058e6c1bab52777732321a","unresolved":true,"context_lines":[{"line_number":9086,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9087,"context_line":"                )"},{"line_number":9088,"context_line":""},{"line_number":9089,"context_line":"                pci_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9090,"context_line":"                    ctxt, instance.uuid"},{"line_number":9091,"context_line":"                )"},{"line_number":9092,"context_line":"                src_pci_devs \u003d ["},{"line_number":9093,"context_line":"                    pci_dev"},{"line_number":9094,"context_line":"                    for pci_dev in pci_devs"},{"line_number":9095,"context_line":"                    if pci_dev.extra_info[\"live_migratable\"]"},{"line_number":9096,"context_line":"                ]"},{"line_number":9097,"context_line":""},{"line_number":9098,"context_line":"                if len(src_pci_devs) !\u003d len(claimed_lm_pci_devs):"},{"line_number":9099,"context_line":"                    raise exception.LiveMigrationSrcDstMismatch("}],"source_content_type":"text/x-python","patch_set":3,"id":"1eee0707_7a207e36","line":9096,"range":{"start_line":9089,"start_character":0,"end_line":9096,"end_character":17},"in_reply_to":"471d73b8_1ecf97cf","updated":"2025-02-27 19:33:59.000000000","message":"its perfectly valid for an admin to aplly live_migratable and phsyical_network in the same dev spec.\n\nmakign live migratio  us the new code path in that case was agreed to be a followup serise but it shoudl be able to use the hotplug live migration code path in thise series.\n\nbut this is not the correct way to filter for live migratble.\n\nwe need to check if all the alisas are live migratbale in the api before we ever get here.\n\nhere we can check again if we want too but we should have never got as far as here if there is a pci request form an alise that is not live migrable.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ba005ba891660e24e6e76e02179b2ad9fa482dc9","unresolved":true,"context_lines":[{"line_number":9086,"context_line":"                    ctxt, instance, lm_pci_requests"},{"line_number":9087,"context_line":"                )"},{"line_number":9088,"context_line":""},{"line_number":9089,"context_line":"                pci_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9090,"context_line":"                    ctxt, instance.uuid"},{"line_number":9091,"context_line":"                )"},{"line_number":9092,"context_line":"                src_pci_devs \u003d ["},{"line_number":9093,"context_line":"                    pci_dev"},{"line_number":9094,"context_line":"                    for pci_dev in pci_devs"},{"line_number":9095,"context_line":"                    if pci_dev.extra_info[\"live_migratable\"]"},{"line_number":9096,"context_line":"                ]"},{"line_number":9097,"context_line":""},{"line_number":9098,"context_line":"                if len(src_pci_devs) !\u003d len(claimed_lm_pci_devs):"},{"line_number":9099,"context_line":"                    raise exception.LiveMigrationSrcDstMismatch("}],"source_content_type":"text/x-python","patch_set":3,"id":"f75f3185_b20fa447","line":9096,"range":{"start_line":9089,"start_character":0,"end_line":9096,"end_character":17},"in_reply_to":"a0592c7b_d3ef30e5","updated":"2025-02-28 09:56:03.000000000","message":"\u003e we need to check if all the alisas are live migratbale in the api before we ever get here.\n\nyes, and it is already done in the live_migration task in the conductor. So I think this live_migratable filtering can be removed","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":9095,"context_line":"                    if pci_dev.extra_info[\"live_migratable\"]"},{"line_number":9096,"context_line":"                ]"},{"line_number":9097,"context_line":""},{"line_number":9098,"context_line":"                if len(src_pci_devs) !\u003d len(claimed_lm_pci_devs):"},{"line_number":9099,"context_line":"                    raise exception.LiveMigrationSrcDstMismatch("},{"line_number":9100,"context_line":"                        dev_src\u003dlen(src_pci_devs),"},{"line_number":9101,"context_line":"                        dev_dst\u003dlen(claimed_lm_pci_devs),"}],"source_content_type":"text/x-python","patch_set":3,"id":"e24bb187_f6e84015","line":9098,"updated":"2025-02-27 11:05:04.000000000","message":"this would be more readable if the claimed_lm_pci_devs name like `claimed_dst_devs` (the lm part seems to be not that important as on the src_pci_dev variable we did not included in the name)","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":9095,"context_line":"                    if pci_dev.extra_info[\"live_migratable\"]"},{"line_number":9096,"context_line":"                ]"},{"line_number":9097,"context_line":""},{"line_number":9098,"context_line":"                if len(src_pci_devs) !\u003d len(claimed_lm_pci_devs):"},{"line_number":9099,"context_line":"                    raise exception.LiveMigrationSrcDstMismatch("},{"line_number":9100,"context_line":"                        dev_src\u003dlen(src_pci_devs),"},{"line_number":9101,"context_line":"                        dev_dst\u003dlen(claimed_lm_pci_devs),"}],"source_content_type":"text/x-python","patch_set":3,"id":"098cd7ed_3a8bd94d","line":9098,"in_reply_to":"e24bb187_f6e84015","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":9102,"context_line":"                    )"},{"line_number":9103,"context_line":""},{"line_number":9104,"context_line":"                pci_dev_map_src_dst \u003d {}"},{"line_number":9105,"context_line":"                for req_id in (pci_req.request_id for pci_req in pci_reqs):"},{"line_number":9106,"context_line":"                    req_src_pci_addr \u003d ["},{"line_number":9107,"context_line":"                        dev.address"},{"line_number":9108,"context_line":"                        for dev in src_pci_devs"}],"source_content_type":"text/x-python","patch_set":3,"id":"68605151_012714fb","line":9105,"updated":"2025-02-27 11:05:04.000000000","message":"so this assumes that the request_id is unique across requests. That is a correct assumption as far as I know","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":9113,"context_line":"                        for dev in claimed_lm_pci_devs"},{"line_number":9114,"context_line":"                        if dev.request_id \u003d\u003d req_id"},{"line_number":9115,"context_line":"                    ]"},{"line_number":9116,"context_line":""},{"line_number":9117,"context_line":"                    pci_dev_map_src_dst.update(dict("},{"line_number":9118,"context_line":"                        zip(req_src_pci_addr, req_claimed_lm_pci_addr)"},{"line_number":9119,"context_line":"                    ))"},{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"                migrate_data.pci_dev_map_src_dst \u003d pci_dev_map_src_dst"},{"line_number":9122,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f29968f5_91039020","line":9119,"range":{"start_line":9116,"start_character":0,"end_line":9119,"end_character":22},"updated":"2025-02-27 11:05:04.000000000","message":"this is still depends on ordering, but now only depends on within the scope of the same InstancePCIRequest. The only case when multiple devices per compute is allocated for one request is when the req.count \u003e 1. But this means the allocated devices is interchangeable as they are matching to the same spec from the same InstancePCIRequest.\n\nSo this ordering dependency is OK.\n\nI suggest to document this in a comment.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":9113,"context_line":"                        for dev in claimed_lm_pci_devs"},{"line_number":9114,"context_line":"                        if dev.request_id \u003d\u003d req_id"},{"line_number":9115,"context_line":"                    ]"},{"line_number":9116,"context_line":""},{"line_number":9117,"context_line":"                    pci_dev_map_src_dst.update(dict("},{"line_number":9118,"context_line":"                        zip(req_src_pci_addr, req_claimed_lm_pci_addr)"},{"line_number":9119,"context_line":"                    ))"},{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"                migrate_data.pci_dev_map_src_dst \u003d pci_dev_map_src_dst"},{"line_number":9122,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"96753d7e_65cc9396","line":9119,"range":{"start_line":9116,"start_character":0,"end_line":9119,"end_character":22},"in_reply_to":"f29968f5_91039020","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":9118,"context_line":"                        zip(req_src_pci_addr, req_claimed_lm_pci_addr)"},{"line_number":9119,"context_line":"                    ))"},{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"                migrate_data.pci_dev_map_src_dst \u003d pci_dev_map_src_dst"},{"line_number":9122,"context_line":""},{"line_number":9123,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"},{"line_number":9124,"context_line":"                # Create migrate_data vifs if not provided by driver."}],"source_content_type":"text/x-python","patch_set":3,"id":"d09ab8f2_57dca380","line":9121,"updated":"2025-02-27 11:05:04.000000000","message":"This whole code addition feels like a good target to be placed to a separate function. When you pull this out you can translate the `if pci_req` to a guard to reduce nesting:\n```python\nif not pci_req:\n    return\n```","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":9118,"context_line":"                        zip(req_src_pci_addr, req_claimed_lm_pci_addr)"},{"line_number":9119,"context_line":"                    ))"},{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"                migrate_data.pci_dev_map_src_dst \u003d pci_dev_map_src_dst"},{"line_number":9122,"context_line":""},{"line_number":9123,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"},{"line_number":9124,"context_line":"                # Create migrate_data vifs if not provided by driver."}],"source_content_type":"text/x-python","patch_set":3,"id":"74703bdb_014db4f1","line":9121,"in_reply_to":"d09ab8f2_57dca380","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"                migrate_data.pci_dev_map_src_dst \u003d pci_dev_map_src_dst"},{"line_number":9122,"context_line":""},{"line_number":9123,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"},{"line_number":9124,"context_line":"                # Create migrate_data vifs if not provided by driver."},{"line_number":9125,"context_line":"                if \u0027vifs\u0027 not in migrate_data:"},{"line_number":9126,"context_line":"                    migrate_data.vifs \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"cf0b2127_350c2a98","line":9123,"updated":"2025-02-27 11:05:04.000000000","message":"When you move the above logic to a separate function This whole vif logic should also be in it own function. But that is definitely a separate refactor patch.\n\nIn general I think we should restructure these two allocation and mapping logic. Today the code is structured like this:\n\n* collect the interesting requests\n* allocate devs on the dest based on those requests\n* store the mapping of src : dest in the migration context\n\nThe middle step is basically the same for both the flavor and the vif case:\n```\n            dest_topo \u003d None\n            if instance.migration_context:\n                dest_topo \u003d instance.migration_context.new_numa_topology\n\n            claimed_pci_devs \u003d self.rt.claim_pci_devices(\n                ctxt, requests, dest_topo)\n```\n\nso we should not duplicate that logic. I even foresee that this logic can be called once, allocating the devices for all requests at once, instead of splitting the requests to two sets and allocating them separately. Only the 3rd step the mapping generation needs to work differently for different sources of the request. Or maybe not even that either. I feel like the mapping logic based on request_id should work for the neutron case too.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3a8945d9a254231ae2b3ca1863c235e344a11c31","unresolved":true,"context_lines":[{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"                migrate_data.pci_dev_map_src_dst \u003d pci_dev_map_src_dst"},{"line_number":9122,"context_line":""},{"line_number":9123,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"},{"line_number":9124,"context_line":"                # Create migrate_data vifs if not provided by driver."},{"line_number":9125,"context_line":"                if \u0027vifs\u0027 not in migrate_data:"},{"line_number":9126,"context_line":"                    migrate_data.vifs \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"5d710d91_7c6ee4f0","line":9123,"in_reply_to":"0b1ab6ec_70c293e6","updated":"2025-03-04 09:19:48.000000000","message":"well, if you look at the code, we only check the instance requests above using the flavor alias, and below we only check the VIFs, so it shouldn\u0027t be a problem as when looking at the VIF, we get the pci devices (which should be different from the GPU ones)","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"720c0c844dd2b5d2770fc4f7011d19db72573f82","unresolved":true,"context_lines":[{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"                migrate_data.pci_dev_map_src_dst \u003d pci_dev_map_src_dst"},{"line_number":9122,"context_line":""},{"line_number":9123,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"},{"line_number":9124,"context_line":"                # Create migrate_data vifs if not provided by driver."},{"line_number":9125,"context_line":"                if \u0027vifs\u0027 not in migrate_data:"},{"line_number":9126,"context_line":"                    migrate_data.vifs \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"179fdc4f_4fcf1186","line":9123,"in_reply_to":"5d710d91_7c6ee4f0","updated":"2025-03-04 12:22:25.000000000","message":"It is not a problem, it is an improvement suggestion for the next cycle. The two code paths was created independently but have very similar steps and logic. So we should refactor this eventually as a single code path to avoid spagettification.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a924b220eb61684670058e6c1bab52777732321a","unresolved":true,"context_lines":[{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"                migrate_data.pci_dev_map_src_dst \u003d pci_dev_map_src_dst"},{"line_number":9122,"context_line":""},{"line_number":9123,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"},{"line_number":9124,"context_line":"                # Create migrate_data vifs if not provided by driver."},{"line_number":9125,"context_line":"                if \u0027vifs\u0027 not in migrate_data:"},{"line_number":9126,"context_line":"                    migrate_data.vifs \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"0b1ab6ec_70c293e6","line":9123,"in_reply_to":"cf0b2127_350c2a98","updated":"2025-02-27 19:33:59.000000000","message":"i think i would prefer to have the pci logic after the vif logic by the way.\n\nthat feels like a less error prone odering in terms of possible bugs.\n\nand yes eventulaly we would do this once for all nova/neutron pci devices.\n\nwe can also have pci device form cyborg but that a whole other thing.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3a8945d9a254231ae2b3ca1863c235e344a11c31","unresolved":true,"context_lines":[{"line_number":9077,"context_line":"            ]"},{"line_number":9078,"context_line":""},{"line_number":9079,"context_line":"            migrate_data.pci_dev_map_src_dst \u003d self._flavor_based_pci_claim("},{"line_number":9080,"context_line":"                ctxt, instance, flavored_pci_reqs"},{"line_number":9081,"context_line":"            )"},{"line_number":9082,"context_line":""},{"line_number":9083,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fc31e15_5b126192","line":9080,"updated":"2025-03-04 09:19:48.000000000","message":"we could potentially get some exception here so we could check them, but that\u0027s not a problem for me for the moment.","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"720c0c844dd2b5d2770fc4f7011d19db72573f82","unresolved":true,"context_lines":[{"line_number":9077,"context_line":"            ]"},{"line_number":9078,"context_line":""},{"line_number":9079,"context_line":"            migrate_data.pci_dev_map_src_dst \u003d self._flavor_based_pci_claim("},{"line_number":9080,"context_line":"                ctxt, instance, flavored_pci_reqs"},{"line_number":9081,"context_line":"            )"},{"line_number":9082,"context_line":""},{"line_number":9083,"context_line":"            if self.network_api.has_port_binding_extension(ctxt):"}],"source_content_type":"text/x-python","patch_set":5,"id":"a1378e2a_aeabc93e","line":9080,"in_reply_to":"9fc31e15_5b126192","updated":"2025-03-04 12:22:25.000000000","message":"I think if claim raises that results in a NoValidHost error, which is OK to me. But we can try to have a test case for it.","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3a8945d9a254231ae2b3ca1863c235e344a11c31","unresolved":false,"context_lines":[{"line_number":9112,"context_line":"        # tracker for out dest instance"},{"line_number":9113,"context_line":"        pci_requests \u003d objects.InstancePCIRequests("},{"line_number":9114,"context_line":"            requests\u003dpci_requests,"},{"line_number":9115,"context_line":"            instance_uuid\u003dinstance.uuid)"},{"line_number":9116,"context_line":""},{"line_number":9117,"context_line":"        src_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9118,"context_line":"            ctxt, instance.uuid"}],"source_content_type":"text/x-python","patch_set":5,"id":"81787ab9_8d416906","line":9115,"updated":"2025-03-04 09:19:48.000000000","message":"we could have an empty list here","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3a8945d9a254231ae2b3ca1863c235e344a11c31","unresolved":false,"context_lines":[{"line_number":9116,"context_line":""},{"line_number":9117,"context_line":"        src_devs \u003d objects.PciDeviceList.get_by_instance_uuid("},{"line_number":9118,"context_line":"            ctxt, instance.uuid"},{"line_number":9119,"context_line":"        )"},{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"        claimed_dst_devs \u003d self._claim_from_pci_reqs("},{"line_number":9122,"context_line":"            ctxt, instance, pci_requests"}],"source_content_type":"text/x-python","patch_set":5,"id":"f86f789d_22360503","line":9119,"updated":"2025-03-04 09:19:48.000000000","message":"we could have an empty list here.","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3a8945d9a254231ae2b3ca1863c235e344a11c31","unresolved":false,"context_lines":[{"line_number":9120,"context_line":""},{"line_number":9121,"context_line":"        claimed_dst_devs \u003d self._claim_from_pci_reqs("},{"line_number":9122,"context_line":"            ctxt, instance, pci_requests"},{"line_number":9123,"context_line":"        )"},{"line_number":9124,"context_line":""},{"line_number":9125,"context_line":"        pci_dev_map_src_dst \u003d {}"},{"line_number":9126,"context_line":"        for req_id in ("}],"source_content_type":"text/x-python","patch_set":5,"id":"04059e18_12d7360d","line":9123,"updated":"2025-03-04 09:19:48.000000000","message":"... but here we could also have an empty list.","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3a8945d9a254231ae2b3ca1863c235e344a11c31","unresolved":false,"context_lines":[{"line_number":9125,"context_line":"        pci_dev_map_src_dst \u003d {}"},{"line_number":9126,"context_line":"        for req_id in ("},{"line_number":9127,"context_line":"            pci_req.request_id for pci_req in pci_requests.requests"},{"line_number":9128,"context_line":"        ):"},{"line_number":9129,"context_line":"            req_src_addr \u003d ["},{"line_number":9130,"context_line":"                dev.address"},{"line_number":9131,"context_line":"                for dev in src_devs"}],"source_content_type":"text/x-python","patch_set":5,"id":"a62cdbe6_a9b9b0d7","line":9128,"updated":"2025-03-04 09:19:48.000000000","message":"here, if we were not having any PCI requests, then it would be OK.","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"720c0c844dd2b5d2770fc4f7011d19db72573f82","unresolved":false,"context_lines":[{"line_number":9125,"context_line":"        pci_dev_map_src_dst \u003d {}"},{"line_number":9126,"context_line":"        for req_id in ("},{"line_number":9127,"context_line":"            pci_req.request_id for pci_req in pci_requests.requests"},{"line_number":9128,"context_line":"        ):"},{"line_number":9129,"context_line":"            req_src_addr \u003d ["},{"line_number":9130,"context_line":"                dev.address"},{"line_number":9131,"context_line":"                for dev in src_devs"}],"source_content_type":"text/x-python","patch_set":5,"id":"dfc4e8a0_b44997ea","line":9128,"in_reply_to":"a62cdbe6_a9b9b0d7","updated":"2025-03-04 12:22:25.000000000","message":"Yeah. I think the optimization is that if there are no pci_requests then looking up the source and dest devs is pointless as we know that this loop will do nothing. Hence the guard condition on the top shortcuts it to avoid DB load.","commit_id":"34f905a8e7eaf8bdd19ff5068aab876c08464439"}],"nova/exception.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e4326671e61c8471722c0be763a1b47610f43a2a","unresolved":true,"context_lines":[{"line_number":1813,"context_line":"class LiveMigrationSrcDstMismatch(NovaException):"},{"line_number":1814,"context_line":"    msg_fmt \u003d _(\u0027The number of PCI devices from the source \"%(dev_src)s\" does \u0027"},{"line_number":1815,"context_line":"                \u0027not match the number at the destination \"%(dev_dst)s\".\u0027)"},{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":""},{"line_number":1818,"context_line":"class UnshelveException(NovaException):"},{"line_number":1819,"context_line":"    msg_fmt \u003d _(\"Error during unshelve instance %(instance_id)s: %(reason)s\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"43a67d85_04398e98","line":1816,"updated":"2025-02-24 12:43:30.000000000","message":"That is strange, how that can happen? (other than during a live resize that we don\u0027t yet support in nova)","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"d45094698a5c113caed1888760e7e21c73fdaa2f","unresolved":true,"context_lines":[{"line_number":1813,"context_line":"class LiveMigrationSrcDstMismatch(NovaException):"},{"line_number":1814,"context_line":"    msg_fmt \u003d _(\u0027The number of PCI devices from the source \"%(dev_src)s\" does \u0027"},{"line_number":1815,"context_line":"                \u0027not match the number at the destination \"%(dev_dst)s\".\u0027)"},{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":""},{"line_number":1818,"context_line":"class UnshelveException(NovaException):"},{"line_number":1819,"context_line":"    msg_fmt \u003d _(\"Error during unshelve instance %(instance_id)s: %(reason)s\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"84bd89f9_ac865f1e","line":1816,"in_reply_to":"43a67d85_04398e98","updated":"2025-02-26 18:49:57.000000000","message":"I have added this check as a \"reflex\" because we are about to zip lists, so ensuring the lists have the same size.","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":1813,"context_line":"class LiveMigrationSrcDstMismatch(NovaException):"},{"line_number":1814,"context_line":"    msg_fmt \u003d _(\u0027The number of PCI devices from the source \"%(dev_src)s\" does \u0027"},{"line_number":1815,"context_line":"                \u0027not match the number at the destination \"%(dev_dst)s\".\u0027)"},{"line_number":1816,"context_line":""},{"line_number":1817,"context_line":""},{"line_number":1818,"context_line":"class UnshelveException(NovaException):"},{"line_number":1819,"context_line":"    msg_fmt \u003d _(\"Error during unshelve instance %(instance_id)s: %(reason)s\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"ee0e0598_c048a68e","line":1816,"in_reply_to":"84bd89f9_ac865f1e","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"a4e5ca618ba0bf233bfc14b169c7c1d9f8573409"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":5266,"context_line":"        mock_pci.requests \u003d ["},{"line_number":5267,"context_line":"            objects.InstancePCIRequest("},{"line_number":5268,"context_line":"                request_id\u003duuids.req0,"},{"line_number":5269,"context_line":"                requester_id\u003duuids.pci1,"},{"line_number":5270,"context_line":"                alias_name\u003d\"spec_alias\","},{"line_number":5271,"context_line":"                spec\u003d["},{"line_number":5272,"context_line":"                    {"}],"source_content_type":"text/x-python","patch_set":3,"id":"704eb634_4e502aac","line":5269,"updated":"2025-02-27 11:05:04.000000000","message":"this is misleading. If this supposed to be a request from flavor then this field should be None. If this is supposed to be from a port then it should have a port uuid. But you set the alias_name so it is from a flavor.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":5266,"context_line":"        mock_pci.requests \u003d ["},{"line_number":5267,"context_line":"            objects.InstancePCIRequest("},{"line_number":5268,"context_line":"                request_id\u003duuids.req0,"},{"line_number":5269,"context_line":"                requester_id\u003duuids.pci1,"},{"line_number":5270,"context_line":"                alias_name\u003d\"spec_alias\","},{"line_number":5271,"context_line":"                spec\u003d["},{"line_number":5272,"context_line":"                    {"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2be2b9_379f44fe","line":5269,"in_reply_to":"704eb634_4e502aac","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":5276,"context_line":"                    }"},{"line_number":5277,"context_line":"                ],"},{"line_number":5278,"context_line":"            ),"},{"line_number":5279,"context_line":"            objects.InstancePCIRequest("},{"line_number":5280,"context_line":"                request_id\u003duuids.req1,"},{"line_number":5281,"context_line":"                requester_id\u003duuids.pci2,"},{"line_number":5282,"context_line":"                alias_name\u003d\"spec_alias\","},{"line_number":5283,"context_line":"                spec\u003d["},{"line_number":5284,"context_line":"                    {"},{"line_number":5285,"context_line":"                        \"vendor_id\": \"1378\","}],"source_content_type":"text/x-python","patch_set":3,"id":"34f26c63_07b8e2a8","line":5282,"range":{"start_line":5279,"start_character":0,"end_line":5282,"end_character":40},"updated":"2025-02-27 11:05:04.000000000","message":"this is incorrect for two reasons:\n* the same alias name is used in the above request as well so this cannot have different request_id.\n* when a flavor requests an alias nova creates a single InstancePCIRequest from that alias.\n\nI think the possible valid cases here are:\n* two different alias resulting in two different InstancePCIRequest with different request_ids\n* single alias with count \u003e 1 resulting in a single InstancePCIRequest with a single request_id and the count field set to \u003e 1","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":5276,"context_line":"                    }"},{"line_number":5277,"context_line":"                ],"},{"line_number":5278,"context_line":"            ),"},{"line_number":5279,"context_line":"            objects.InstancePCIRequest("},{"line_number":5280,"context_line":"                request_id\u003duuids.req1,"},{"line_number":5281,"context_line":"                requester_id\u003duuids.pci2,"},{"line_number":5282,"context_line":"                alias_name\u003d\"spec_alias\","},{"line_number":5283,"context_line":"                spec\u003d["},{"line_number":5284,"context_line":"                    {"},{"line_number":5285,"context_line":"                        \"vendor_id\": \"1378\","}],"source_content_type":"text/x-python","patch_set":3,"id":"f9552e9b_24730072","line":5282,"range":{"start_line":5279,"start_character":0,"end_line":5282,"end_character":40},"in_reply_to":"34f26c63_07b8e2a8","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":5314,"context_line":"        fake_devs_dst \u003d objects.PciDeviceList("},{"line_number":5315,"context_line":"            objects\u003d["},{"line_number":5316,"context_line":"                objects.PciDevice("},{"line_number":5317,"context_line":"                    compute_node_id\u003d1,"},{"line_number":5318,"context_line":"                    address\u003d\"0000:05:00.2\","},{"line_number":5319,"context_line":"                    vendor_id\u003d\"1377\","},{"line_number":5320,"context_line":"                    product_id\u003d\"0047\","}],"source_content_type":"text/x-python","patch_set":3,"id":"ea1e1ec8_9c5ff05e","line":5317,"updated":"2025-02-27 11:05:04.000000000","message":"dest node should have a different compute_node_id than src node","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":5314,"context_line":"        fake_devs_dst \u003d objects.PciDeviceList("},{"line_number":5315,"context_line":"            objects\u003d["},{"line_number":5316,"context_line":"                objects.PciDevice("},{"line_number":5317,"context_line":"                    compute_node_id\u003d1,"},{"line_number":5318,"context_line":"                    address\u003d\"0000:05:00.2\","},{"line_number":5319,"context_line":"                    vendor_id\u003d\"1377\","},{"line_number":5320,"context_line":"                    product_id\u003d\"0047\","}],"source_content_type":"text/x-python","patch_set":3,"id":"b9ecb241_c9947711","line":5317,"in_reply_to":"ea1e1ec8_9c5ff05e","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":5322,"context_line":"                    request_id\u003duuids.req0,"},{"line_number":5323,"context_line":"                ),"},{"line_number":5324,"context_line":"                objects.PciDevice("},{"line_number":5325,"context_line":"                    compute_node_id\u003d1,"},{"line_number":5326,"context_line":"                    address\u003d\"0000:05:00.3\","},{"line_number":5327,"context_line":"                    vendor_id\u003d\"1378\","},{"line_number":5328,"context_line":"                    product_id\u003d\"0048\","}],"source_content_type":"text/x-python","patch_set":3,"id":"c1de85ea_3a9377db","line":5325,"updated":"2025-02-27 11:05:04.000000000","message":"ditto","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":5322,"context_line":"                    request_id\u003duuids.req0,"},{"line_number":5323,"context_line":"                ),"},{"line_number":5324,"context_line":"                objects.PciDevice("},{"line_number":5325,"context_line":"                    compute_node_id\u003d1,"},{"line_number":5326,"context_line":"                    address\u003d\"0000:05:00.3\","},{"line_number":5327,"context_line":"                    vendor_id\u003d\"1378\","},{"line_number":5328,"context_line":"                    product_id\u003d\"0048\","}],"source_content_type":"text/x-python","patch_set":3,"id":"9e8a6f85_55afd4de","line":5325,"in_reply_to":"c1de85ea_3a9377db","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":5337,"context_line":""},{"line_number":5338,"context_line":"        migrate_data \u003d self._test_check_can_live_migrate_destination()"},{"line_number":5339,"context_line":"        mock_rt.assert_called_once()"},{"line_number":5340,"context_line":"        self.assertIn(\u0027vifs\u0027, migrate_data)"},{"line_number":5341,"context_line":"        self.assertIsNotNone(migrate_data.vifs)"},{"line_number":5342,"context_line":"        self.assertIn(\u0027pci_dev_map_src_dst\u0027, migrate_data)"},{"line_number":5343,"context_line":"        self.assertIsNotNone(migrate_data.pci_dev_map_src_dst)"},{"line_number":5344,"context_line":"        # {\u00270000:04:00.2\u0027: \u00270000:05:00.2\u0027, \u00270000:04:00.3\u0027: \u00270000:05:00.3\u0027}"}],"source_content_type":"text/x-python","patch_set":3,"id":"546809bd_65ce0304","line":5341,"range":{"start_line":5340,"start_character":0,"end_line":5341,"end_character":47},"updated":"2025-02-27 11:05:04.000000000","message":"why does this test care about vifs?","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":5337,"context_line":""},{"line_number":5338,"context_line":"        migrate_data \u003d self._test_check_can_live_migrate_destination()"},{"line_number":5339,"context_line":"        mock_rt.assert_called_once()"},{"line_number":5340,"context_line":"        self.assertIn(\u0027vifs\u0027, migrate_data)"},{"line_number":5341,"context_line":"        self.assertIsNotNone(migrate_data.vifs)"},{"line_number":5342,"context_line":"        self.assertIn(\u0027pci_dev_map_src_dst\u0027, migrate_data)"},{"line_number":5343,"context_line":"        self.assertIsNotNone(migrate_data.pci_dev_map_src_dst)"},{"line_number":5344,"context_line":"        # {\u00270000:04:00.2\u0027: \u00270000:05:00.2\u0027, \u00270000:04:00.3\u0027: \u00270000:05:00.3\u0027}"}],"source_content_type":"text/x-python","patch_set":3,"id":"40bf1108_6ce51ccd","line":5341,"range":{"start_line":5340,"start_character":0,"end_line":5341,"end_character":47},"in_reply_to":"546809bd_65ce0304","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":5341,"context_line":"        self.assertIsNotNone(migrate_data.vifs)"},{"line_number":5342,"context_line":"        self.assertIn(\u0027pci_dev_map_src_dst\u0027, migrate_data)"},{"line_number":5343,"context_line":"        self.assertIsNotNone(migrate_data.pci_dev_map_src_dst)"},{"line_number":5344,"context_line":"        # {\u00270000:04:00.2\u0027: \u00270000:05:00.2\u0027, \u00270000:04:00.3\u0027: \u00270000:05:00.3\u0027}"},{"line_number":5345,"context_line":"        self.assertEqual("},{"line_number":5346,"context_line":"            {"},{"line_number":5347,"context_line":"                fake_devs_src[0].address: fake_devs_dst[0].address,"},{"line_number":5348,"context_line":"                fake_devs_src[1].address: fake_devs_dst[1].address,"},{"line_number":5349,"context_line":"            },"},{"line_number":5350,"context_line":"            migrate_data.pci_dev_map_src_dst,"},{"line_number":5351,"context_line":"        )"},{"line_number":5352,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"68ce0c58_18f65a07","line":5349,"range":{"start_line":5344,"start_character":0,"end_line":5349,"end_character":14},"updated":"2025-02-27 11:05:04.000000000","message":"this looks correct. However I suggest to mix the order up in the input as I feel this would pass even with the previous implementation that assumed ordering.\n\n\ne.g. set up the test in a way that the first dev on the source node needs to match with the second dev on the dest node.","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":5341,"context_line":"        self.assertIsNotNone(migrate_data.vifs)"},{"line_number":5342,"context_line":"        self.assertIn(\u0027pci_dev_map_src_dst\u0027, migrate_data)"},{"line_number":5343,"context_line":"        self.assertIsNotNone(migrate_data.pci_dev_map_src_dst)"},{"line_number":5344,"context_line":"        # {\u00270000:04:00.2\u0027: \u00270000:05:00.2\u0027, \u00270000:04:00.3\u0027: \u00270000:05:00.3\u0027}"},{"line_number":5345,"context_line":"        self.assertEqual("},{"line_number":5346,"context_line":"            {"},{"line_number":5347,"context_line":"                fake_devs_src[0].address: fake_devs_dst[0].address,"},{"line_number":5348,"context_line":"                fake_devs_src[1].address: fake_devs_dst[1].address,"},{"line_number":5349,"context_line":"            },"},{"line_number":5350,"context_line":"            migrate_data.pci_dev_map_src_dst,"},{"line_number":5351,"context_line":"        )"},{"line_number":5352,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e49c21fc_6c268e93","line":5349,"range":{"start_line":5344,"start_character":0,"end_line":5349,"end_character":14},"in_reply_to":"68ce0c58_18f65a07","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"83fad9e3b724c9dfc879d74b79cec81391e47d3e","unresolved":true,"context_lines":[{"line_number":5403,"context_line":""},{"line_number":5404,"context_line":"        self.assertEqual("},{"line_number":5405,"context_line":"            \u0027The number of PCI devices from the source \"0\" does not match the \u0027"},{"line_number":5406,"context_line":"            \u0027number at the destination \"1\".\u0027, str(exc))"},{"line_number":5407,"context_line":""},{"line_number":5408,"context_line":"    @mock.patch.object(objects.Instance, \u0027pci_requests\u0027)"},{"line_number":5409,"context_line":"    @mock.patch(\u0027nova.objects.InstanceGroup.get_by_instance_uuid\u0027, mock.Mock("}],"source_content_type":"text/x-python","patch_set":3,"id":"e6395ca0_8f0507f3","line":5406,"updated":"2025-02-27 11:05:04.000000000","message":"This can only happen if the claim code has a bug and allocated different number of devices on the dest than it was on the host even though it used the same InstancePCIRequests list. \n\nIf we assume that the claim can be broken then other edge cases needs to be covered as well e.g.:\n* the number of devices are equal but the request_id in the devices does not match up. I.e. on the source there are two devs d1(req1) d2(req2), but the claim allocates two devs as on the dest d3(req1) d4(req1).","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"351be6b077b42e419a9c6665150df0351c588f01","unresolved":false,"context_lines":[{"line_number":5403,"context_line":""},{"line_number":5404,"context_line":"        self.assertEqual("},{"line_number":5405,"context_line":"            \u0027The number of PCI devices from the source \"0\" does not match the \u0027"},{"line_number":5406,"context_line":"            \u0027number at the destination \"1\".\u0027, str(exc))"},{"line_number":5407,"context_line":""},{"line_number":5408,"context_line":"    @mock.patch.object(objects.Instance, \u0027pci_requests\u0027)"},{"line_number":5409,"context_line":"    @mock.patch(\u0027nova.objects.InstanceGroup.get_by_instance_uuid\u0027, mock.Mock("}],"source_content_type":"text/x-python","patch_set":3,"id":"999700d4_97f3adde","line":5406,"in_reply_to":"e6395ca0_8f0507f3","updated":"2025-02-27 19:43:46.000000000","message":"Done","commit_id":"4fbd1aa9cac27d7002fdc7758536023462214c8c"}]}
