)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"366cd498_29beb146","updated":"2025-02-24 17:34:07.000000000","message":"couple of things","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c5a09667eff827c2679506d129fc66265cb2066d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"6be24f02_12ddb583","updated":"2025-02-27 13:37:40.000000000","message":"So other than the pool filtering long form wondering I don\u0027t have problem with this patch any more.","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"da752608f25e5a4857a251dc1918442490129495","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"56b4ccf3_7a096e11","updated":"2025-02-27 18:09:24.000000000","message":"given the already approved +2s in the bottom patches, I\u0027m happy to say that series will have a Feature Freeze exception until Tuesday.","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3e471ac884602597ecb9dd9c17d567f7182fb045","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a0ec9d4c_6fabc018","in_reply_to":"45b3dd7c_8bb83fc2","updated":"2025-02-27 19:46:49.000000000","message":"* im not trilled","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"330c5ea52662273d3185669c184b24166584d16e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"45b3dd7c_8bb83fc2","in_reply_to":"56b4ccf3_7a096e11","updated":"2025-02-27 19:45:10.000000000","message":"im not tried with that idea but we can see how it goes.\n\nlookign at the serise for mor or less the first tiem today there are some issues with it that need to be adressed.","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"debc3c651e9488fad2396ee3a2afd84d707d953d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"f9cc3e22_8ab0ad07","updated":"2025-03-04 18:08:26.000000000","message":"I\u0027m approving the patch. As we agreed with Sean on the gmeet yesterday that their comments are non blocking here.","commit_id":"099859ecf0c08b3467f9629833f164e8284616aa"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9d5b5a719b57bbc57f8dc0bd89f7fe9da0e93255","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e086a83e_9a0d14d4","updated":"2025-03-06 15:06:57.000000000","message":"added on more follow up request inline.","commit_id":"099859ecf0c08b3467f9629833f164e8284616aa"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b4c8a0a3cb18e044711218c69fd9f1c08c18168c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"13b4bffc_3b54f35e","updated":"2025-03-03 12:07:43.000000000","message":"ill push my partil comment but i didnt get around do doing a fully review again","commit_id":"099859ecf0c08b3467f9629833f164e8284616aa"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9e9398025a0fc0a5b4bc2564c0ba58b2dcaa608e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"88dc8fac_77dbf909","updated":"2025-03-04 10:09:14.000000000","message":"maybe I forgot something, but I found no holding issues, so definitely +2 for this.","commit_id":"099859ecf0c08b3467f9629833f164e8284616aa"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"68ed330154e7922b35d6ba362bcf864d56bc8a57","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"867a0b06_2b8e2744","updated":"2025-03-10 10:11:26.000000000","message":"recheck dependent patch merged","commit_id":"099859ecf0c08b3467f9629833f164e8284616aa"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"08352dcef83f73874e1d0c9f04e38202ed660f93","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"f1239ffc_6e393a86","updated":"2025-03-05 08:11:19.000000000","message":"recheck requeued as parent is rechecked","commit_id":"099859ecf0c08b3467f9629833f164e8284616aa"}],"nova/conductor/tasks/live_migrate.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":true,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        At the moment support only if:"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"            1. Instance contains VIF related PCI requests."},{"line_number":233,"context_line":"            2. Neutron supports multiple port binding extension."},{"line_number":234,"context_line":"            3. Src and Dest host support VIF related PCI allocations."},{"line_number":235,"context_line":"            4. Instance contains live-migratable PCI devices."},{"line_number":236,"context_line":"        \"\"\""},{"line_number":237,"context_line":"        if self.instance.pci_requests is None or not len("},{"line_number":238,"context_line":"                self.instance.pci_requests.requests):"}],"source_content_type":"text/x-python","patch_set":3,"id":"74267cc8_96e31497","line":235,"range":{"start_line":232,"start_character":0,"end_line":235,"end_character":61},"updated":"2025-02-24 17:34:07.000000000","message":"It is actually two main cases not 4. I would say instead:\nAt the moment support only if:\n\na) Instance contains flavor based PCI requests configured with live_migratabel tag specified\n\nb) Instance contains neutron port related PCI request and:\n   * Neutron supports multiple port binding extension.\n   * Src and Dest host support VIF related PCI allocations","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"710796c38846de88e60c179b4653f09992b40fd9","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        At the moment support only if:"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"            1. Instance contains VIF related PCI requests."},{"line_number":233,"context_line":"            2. Neutron supports multiple port binding extension."},{"line_number":234,"context_line":"            3. Src and Dest host support VIF related PCI allocations."},{"line_number":235,"context_line":"            4. Instance contains live-migratable PCI devices."},{"line_number":236,"context_line":"        \"\"\""},{"line_number":237,"context_line":"        if self.instance.pci_requests is None or not len("},{"line_number":238,"context_line":"                self.instance.pci_requests.requests):"}],"source_content_type":"text/x-python","patch_set":3,"id":"93250ef8_325253cf","line":235,"range":{"start_line":232,"start_character":0,"end_line":235,"end_character":61},"in_reply_to":"74267cc8_96e31497","updated":"2025-02-26 18:50:05.000000000","message":"Done","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":true,"context_lines":[{"line_number":246,"context_line":"                    \"spec\" not in pci_request or"},{"line_number":247,"context_line":"                    pci_request.spec is None or"},{"line_number":248,"context_line":"                    not all("},{"line_number":249,"context_line":"                        spec.get(\"live_migratable\") \u003d\u003d \"true\""},{"line_number":250,"context_line":"                        for spec in pci_request.spec"},{"line_number":251,"context_line":"                    )"},{"line_number":252,"context_line":"                ):"}],"source_content_type":"text/x-python","patch_set":3,"id":"42ff64c0_b46b0a6c","line":249,"updated":"2025-02-24 17:34:07.000000000","message":"I would add a code comment here that this also means that any pre Epoxy instance using a device that would be technically live migratable will be rejected as pre Epoxy InstancePCIRequests never have live_migratable flag set.","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"710796c38846de88e60c179b4653f09992b40fd9","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                    \"spec\" not in pci_request or"},{"line_number":247,"context_line":"                    pci_request.spec is None or"},{"line_number":248,"context_line":"                    not all("},{"line_number":249,"context_line":"                        spec.get(\"live_migratable\") \u003d\u003d \"true\""},{"line_number":250,"context_line":"                        for spec in pci_request.spec"},{"line_number":251,"context_line":"                    )"},{"line_number":252,"context_line":"                ):"}],"source_content_type":"text/x-python","patch_set":3,"id":"f9ed2792_31ee731f","line":249,"in_reply_to":"42ff64c0_b46b0a6c","updated":"2025-02-26 18:50:05.000000000","message":"Done","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":true,"context_lines":[{"line_number":256,"context_line":"                        \"live-migratable devices.\""},{"line_number":257,"context_line":"                    )"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"                devs \u003d self.instance.get_pci_devices("},{"line_number":260,"context_line":"                    request_id\u003dpci_request.request_id"},{"line_number":261,"context_line":"                )"},{"line_number":262,"context_line":"                if not all("},{"line_number":263,"context_line":"                    ["},{"line_number":264,"context_line":"                        dev.extra_info.get(\"live_migratable\") \u003d\u003d \"true\""},{"line_number":265,"context_line":"                        for dev in devs"},{"line_number":266,"context_line":"                    ]"},{"line_number":267,"context_line":"                ):"},{"line_number":268,"context_line":"                    # Allow only migratable devices for flavor-based ones."},{"line_number":269,"context_line":"                    raise exception.MigrationPreCheckError("},{"line_number":270,"context_line":"                        reason\u003d\"non live-migratable related PCI devices for \""}],"source_content_type":"text/x-python","patch_set":3,"id":"4677805b_f7ade958","line":267,"range":{"start_line":259,"start_character":1,"end_line":267,"end_character":18},"updated":"2025-02-24 17:34:07.000000000","message":"why do we need this check? If all the flavor based requests have the live_migratable flag set then we can be sure that the scheduler only selected devices that are also marked as live_migratable. Do I miss something?","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"710796c38846de88e60c179b4653f09992b40fd9","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                        \"live-migratable devices.\""},{"line_number":257,"context_line":"                    )"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"                devs \u003d self.instance.get_pci_devices("},{"line_number":260,"context_line":"                    request_id\u003dpci_request.request_id"},{"line_number":261,"context_line":"                )"},{"line_number":262,"context_line":"                if not all("},{"line_number":263,"context_line":"                    ["},{"line_number":264,"context_line":"                        dev.extra_info.get(\"live_migratable\") \u003d\u003d \"true\""},{"line_number":265,"context_line":"                        for dev in devs"},{"line_number":266,"context_line":"                    ]"},{"line_number":267,"context_line":"                ):"},{"line_number":268,"context_line":"                    # Allow only migratable devices for flavor-based ones."},{"line_number":269,"context_line":"                    raise exception.MigrationPreCheckError("},{"line_number":270,"context_line":"                        reason\u003d\"non live-migratable related PCI devices for \""}],"source_content_type":"text/x-python","patch_set":3,"id":"aab1cc3c_12f6a3c2","line":267,"range":{"start_line":259,"start_character":1,"end_line":267,"end_character":18},"in_reply_to":"4677805b_f7ade958","updated":"2025-02-26 18:50:05.000000000","message":"You are right. This is a redundant check.\nI have removed it.","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":true,"context_lines":[{"line_number":277,"context_line":"            # Since we only have flavor-based PCI requests, we don\u0027t need to"},{"line_number":278,"context_line":"            # check VIF specifics below."},{"line_number":279,"context_line":"            return"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        # All PCI requests are VIF related, now check neutron,"},{"line_number":282,"context_line":"        # source and destination compute nodes."},{"line_number":283,"context_line":"        if not self.network_api.has_port_binding_extension(self.context):"}],"source_content_type":"text/x-python","patch_set":3,"id":"59523400_a98e8b8c","line":280,"updated":"2025-02-24 17:34:07.000000000","message":"I would move some of the above logic to InstancePCIRequest(s) ovo. \n\nI.e deciding if a InstancePCIRequest is live migratable can be a method on the InstancePCIRequest ovo. \n\nAlso flavor_only can be replaced with a method on InstancePCIRequests ovo (I would do a positive instead of a negative so something like instance.pci_requests.neutron_requests().","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"710796c38846de88e60c179b4653f09992b40fd9","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            # Since we only have flavor-based PCI requests, we don\u0027t need to"},{"line_number":278,"context_line":"            # check VIF specifics below."},{"line_number":279,"context_line":"            return"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        # All PCI requests are VIF related, now check neutron,"},{"line_number":282,"context_line":"        # source and destination compute nodes."},{"line_number":283,"context_line":"        if not self.network_api.has_port_binding_extension(self.context):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9650bb3a_881ab352","line":280,"in_reply_to":"59523400_a98e8b8c","updated":"2025-02-26 18:50:05.000000000","message":"Done","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"eaf72c29857acb1c16aaaca39fa954591188e550","unresolved":true,"context_lines":[{"line_number":252,"context_line":"                    raise exception.MigrationPreCheckError("},{"line_number":253,"context_line":"                        reason\u003d\"This request does not explicitly request \""},{"line_number":254,"context_line":"                        \"live-migratable devices.\""},{"line_number":255,"context_line":"                    )"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if not self.instance.pci_requests.neutron_requests():"},{"line_number":258,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"0c807ef0_ac8b5677","line":255,"updated":"2025-02-27 19:43:58.000000000","message":"by the way when i said in other comment we shoud check if the alis is migrable in the api\n\nthis is techniallythe latest point wehre we shoudl be doign the live migratableity check but i think this is quite late and we should acutlly be doing it \nhere \nhttps://github.com/openstack/nova/blob/8f57fa7359d57e186fc6b75424b4900dc63c564f/nova/compute/api.py#L5561-L5617\n\nat that point we have access to the instance and alias and as a result we can determin if the live migration should be allow before we ever  get to this conductor task\n\nthat way we never reach the migratin task state and can reject the migration request with a 409 conflict really early.","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"76482f28d9a22c3e48847adad02f1926e45e1e65","unresolved":true,"context_lines":[{"line_number":252,"context_line":"                    raise exception.MigrationPreCheckError("},{"line_number":253,"context_line":"                        reason\u003d\"This request does not explicitly request \""},{"line_number":254,"context_line":"                        \"live-migratable devices.\""},{"line_number":255,"context_line":"                    )"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if not self.instance.pci_requests.neutron_requests():"},{"line_number":258,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"cff4bdca_356366eb","line":255,"in_reply_to":"0c807ef0_ac8b5677","updated":"2025-02-28 09:59:50.000000000","message":"This is following the pattern of the existing live migration pre-checks for the vif based case. So from code structure perspective I like to have it here. If we want an earlier check then we should also consider that for the vif based case as well. \n\nI more and more think we need a follow up feature in Flamingo where we work on refactoring the two separate code path (flavor based and vif based) into one single code path. That follow up feature could be a good place to reconsider what kind of unified early check we can / want in the api.","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"63660ac7470eb497d6d2eb0f0670a28408b5033d","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                    raise exception.MigrationPreCheckError("},{"line_number":253,"context_line":"                        reason\u003d\"This request does not explicitly request \""},{"line_number":254,"context_line":"                        \"live-migratable devices.\""},{"line_number":255,"context_line":"                    )"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if not self.instance.pci_requests.neutron_requests():"},{"line_number":258,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"f528dbea_acfcbaf7","line":255,"in_reply_to":"b35005dc_d6c57f25","updated":"2025-03-04 12:29:35.000000000","message":"We discussed this yesterday after the team call on gmeet. Paraphrasing Sean: The API check would only needed if we want to tight this feature to a minimum compute service version. Fortunately the current code works without a service version check as i) live migratable flag can only be present in the existing VM if the source compute is new enough ii) the scheduler will only select destination host with live migratable flags present so the dest compute is also new enough. So if there is a live migratable VM with a selected dest then we know that both the source and the dest compute is new enough.\n\nBased on this I think we don\u0027t need the API check.","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9e9398025a0fc0a5b4bc2564c0ba58b2dcaa608e","unresolved":true,"context_lines":[{"line_number":252,"context_line":"                    raise exception.MigrationPreCheckError("},{"line_number":253,"context_line":"                        reason\u003d\"This request does not explicitly request \""},{"line_number":254,"context_line":"                        \"live-migratable devices.\""},{"line_number":255,"context_line":"                    )"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if not self.instance.pci_requests.neutron_requests():"},{"line_number":258,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"b35005dc_d6c57f25","line":255,"in_reply_to":"cc9c4682_ef7b030d","updated":"2025-03-04 10:09:14.000000000","message":"I still need to understand why we would need to check that by the API but sure we can discuss this on the Flamingo release 😊","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b4c8a0a3cb18e044711218c69fd9f1c08c18168c","unresolved":true,"context_lines":[{"line_number":252,"context_line":"                    raise exception.MigrationPreCheckError("},{"line_number":253,"context_line":"                        reason\u003d\"This request does not explicitly request \""},{"line_number":254,"context_line":"                        \"live-migratable devices.\""},{"line_number":255,"context_line":"                    )"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if not self.instance.pci_requests.neutron_requests():"},{"line_number":258,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"cc9c4682_ef7b030d","line":255,"in_reply_to":"cff4bdca_356366eb","updated":"2025-03-03 12:07:43.000000000","message":"the neutorn sriov live migration change had different upgrade requirements agreed in its spec.\n\nspecifically we decided to support using the feature when only the souce and dest compute nodes were upgraded rather than requiring the cloud is fully upgraded.\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/train/implemented/libvirt-neutron-sriov-livemigration.html#upgrade-impact\n\nas a result we moved all the checks to the conductor since we would have to do per node check in the conductor anyway. we could have check the souce host compute service version in the api but choose not to.\n\nwe nolonger supprot compute that are below the min version for this fucntioanlty so it would not make sense to add a check in the api at this point for sriov live migraiton.\n\nfor the current spec we require resize to be performed which will ensure that only host that have instance with livemaigatable can be selected.\nhttps://specs.openstack.org/openstack/nova-specs/specs/2025.1/approved/migrate-vfio-devices-using-kernel-variant-drivers.html#upgrade-impact\n\nas such we do not need to explciy check the souce/dest version as you can only live migrate form upgrade hsot to other upgraded hosts.\nsince there is no host specific check required it can be doen in the api purly based on the alias.\n\nif we want to keep it here that fine, as i said this is the latest possibel place we can do this check but the semantic idffernice is with the conductor based approch the admin will see the migration failed and will ahve to check the migration details async rather then gettign an imediate 400 or 409 when they attemepted to do the migration.\n\ni guess im ok to defer if we add an earlier check to a follow up.\n\nspeaking of which the approves spec explitly states that we will do follow up work to combine the two code paths\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/2025.1/approved/migrate-vfio-devices-using-kernel-variant-drivers.html#live-migration-modifications\n\n```\nHowever, this change will:\n    Be implemented in a separate patch to allow the base case to land first.\n    Ensure that such NICs are properly live migrated using the new code path.\n```\n\ni consider that to be part of the requirement for this feature ot be considered complete and expect that @rene.ribaud@gmail.com will continue working on it next cycle.\n\nthe consession to doing it as a follow up patch was added because originally i did not want to proceed with the live migration enablement if the neutron direct ports were not done as part of the scope fo the spec. its phased that way to allow incremental progress rather then blocking any of the serise form merging until that is doen.\n\ni guess we can include dicussing the api level check in the follow up sepc for next cycle ?","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9d5b5a719b57bbc57f8dc0bd89f7fe9da0e93255","unresolved":true,"context_lines":[{"line_number":78,"context_line":"        self._held_allocations \u003d None"},{"line_number":79,"context_line":"        self.network_api \u003d neutron.API()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _execute(self):"},{"line_number":82,"context_line":"        self._check_instance_is_active()"},{"line_number":83,"context_line":"        self._check_instance_has_no_numa()"},{"line_number":84,"context_line":"        self._check_host_is_up(self.source)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self._source_cn, self._held_allocations \u003d ("},{"line_number":87,"context_line":"            # NOTE(danms): This may raise various exceptions, which will"},{"line_number":88,"context_line":"            # propagate to the API and cause a 500. This is what we"}],"source_content_type":"text/x-python","patch_set":7,"id":"8ef5c8ee_70d24a99","line":85,"range":{"start_line":81,"start_character":0,"end_line":85,"end_character":0},"updated":"2025-03-06 15:06:57.000000000","message":"we can move the pci request live migratable pre-check here as it does not depend on the target host so we don\u0027t have to select destination first and then run the check.","commit_id":"099859ecf0c08b3467f9629833f164e8284616aa"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9e9398025a0fc0a5b4bc2564c0ba58b2dcaa608e","unresolved":false,"context_lines":[{"line_number":501,"context_line":"        # need to generate request groups from InstancePCIRequests."},{"line_number":502,"context_line":"        # This will append new RequestGroup objects to the"},{"line_number":503,"context_line":"        # request_spec.requested_resources list if needed"},{"line_number":504,"context_line":"        request_spec.generate_request_groups_from_pci_requests()"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"        scheduler_utils.setup_instance_group(self.context, request_spec)"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"b03c3dd6_048aab04","line":504,"updated":"2025-03-04 10:09:14.000000000","message":"++","commit_id":"099859ecf0c08b3467f9629833f164e8284616aa"}],"nova/objects/instance_pci_requests.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b4c8a0a3cb18e044711218c69fd9f1c08c18168c","unresolved":true,"context_lines":[{"line_number":72,"context_line":"            \"spec\" in self and"},{"line_number":73,"context_line":"            self.spec is not None and"},{"line_number":74,"context_line":"            all("},{"line_number":75,"context_line":"                spec.get(\"live_migratable\") \u003d\u003d \"true\" for spec in self.spec"},{"line_number":76,"context_line":"            )"},{"line_number":77,"context_line":"        )"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"89e0f825_ca58fb89","line":75,"range":{"start_line":75,"start_character":16,"end_line":75,"end_character":53},"updated":"2025-03-03 12:07:43.000000000","message":"nit: i would prefer if we used strutils.bool_from_string here instead. that more future proof and cleaner IMO\n```suggestion\n                strutils.bool_from_string(spec.get(\"live_migratable\")) for spec in self.spec\n```","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9e9398025a0fc0a5b4bc2564c0ba58b2dcaa608e","unresolved":true,"context_lines":[{"line_number":72,"context_line":"            \"spec\" in self and"},{"line_number":73,"context_line":"            self.spec is not None and"},{"line_number":74,"context_line":"            all("},{"line_number":75,"context_line":"                spec.get(\"live_migratable\") \u003d\u003d \"true\" for spec in self.spec"},{"line_number":76,"context_line":"            )"},{"line_number":77,"context_line":"        )"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ddcebe1d_7f46e621","line":75,"range":{"start_line":75,"start_character":16,"end_line":75,"end_character":53},"in_reply_to":"89e0f825_ca58fb89","updated":"2025-03-04 10:09:14.000000000","message":"can be in a FUP.","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"63660ac7470eb497d6d2eb0f0670a28408b5033d","unresolved":true,"context_lines":[{"line_number":72,"context_line":"            \"spec\" in self and"},{"line_number":73,"context_line":"            self.spec is not None and"},{"line_number":74,"context_line":"            all("},{"line_number":75,"context_line":"                spec.get(\"live_migratable\") \u003d\u003d \"true\" for spec in self.spec"},{"line_number":76,"context_line":"            )"},{"line_number":77,"context_line":"        )"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"63a1b5e2_34de8cdc","line":75,"range":{"start_line":75,"start_character":16,"end_line":75,"end_character":53},"in_reply_to":"ddcebe1d_7f46e621","updated":"2025-03-04 12:29:35.000000000","message":"that will return a bool instead of an str, but at the end the value is persisted as str and compared as str in the stats.py. So if this code returns a bool it will work due to bool -\u003e str coercion in the ovo field, but it will make the reader of the code here assume that we store and compare this value as a boolean later, which would not be true. So I think we should be explicitly use str here.","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"}],"nova/pci/request.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":true,"context_lines":[{"line_number":115,"context_line":"        },"},{"line_number":116,"context_line":"        \"live_migratable\": {"},{"line_number":117,"context_line":"            \"type\": \"string\","},{"line_number":118,"context_line":"            \"pattern\": \"(?i)^(0|1|f|false|n|no|off|on|t|true|y|yes)$\","},{"line_number":119,"context_line":"        },"},{"line_number":120,"context_line":"    },"},{"line_number":121,"context_line":"    \"required\": [\"name\"],"}],"source_content_type":"text/x-python","patch_set":3,"id":"44a55e23_18926814","line":118,"updated":"2025-02-24 17:34:07.000000000","message":"I\u0027m wondering if it is a good idea to duplicate the regex pattern from the bool_from_string() impl here. This means if that util starts allowing new values (maybe \"igen\" / \"nem\" ;)) then we would need to modify the pattern here as well. I would rather keep this just a string, we apply the input validation and normalization a bit later anyhow.","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"710796c38846de88e60c179b4653f09992b40fd9","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        },"},{"line_number":116,"context_line":"        \"live_migratable\": {"},{"line_number":117,"context_line":"            \"type\": \"string\","},{"line_number":118,"context_line":"            \"pattern\": \"(?i)^(0|1|f|false|n|no|off|on|t|true|y|yes)$\","},{"line_number":119,"context_line":"        },"},{"line_number":120,"context_line":"    },"},{"line_number":121,"context_line":"    \"required\": [\"name\"],"}],"source_content_type":"text/x-python","patch_set":3,"id":"76940bb6_85947730","line":118,"in_reply_to":"44a55e23_18926814","updated":"2025-02-26 18:50:05.000000000","message":"Done","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b4c8a0a3cb18e044711218c69fd9f1c08c18168c","unresolved":true,"context_lines":[{"line_number":154,"context_line":"                    \"true\""},{"line_number":155,"context_line":"                    if strutils.bool_from_string(live_migratable, strict\u003dTrue)"},{"line_number":156,"context_line":"                    else \"false\""},{"line_number":157,"context_line":"                )"},{"line_number":158,"context_line":"                spec[\u0027live_migratable\u0027] \u003d live_migratable"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"            if name not in aliases:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a89b263_0897b819","line":157,"updated":"2025-03-03 12:07:43.000000000","message":"i may be misremembering but im prett sure we have sommetned that we shoudl do something like this instead\n\n\n```\nstrutils.bool_from_string\nif live_migratable is not None:\n    live_migratable \u003d str(strutils.bool_from_string(live_migratable))\n```","commit_id":"ef1ed5379c8355ee619b8f7bebcaa580ea265712"}],"nova/pci/stats.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":true,"context_lines":[{"line_number":631,"context_line":"            #  we don\u0027t provide the ones that support them."},{"line_number":632,"context_line":"            #  We want to exclude the devices that don\u0027t have this value yet."},{"line_number":633,"context_line":"            pools \u003d [pool for pool in pools if pool.get(\"live_migratable\") and"},{"line_number":634,"context_line":"                     pool[\u0027live_migratable\u0027] \u003d\u003d \u0027false\u0027]"},{"line_number":635,"context_line":"        return pools"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"    def _filter_pools("}],"source_content_type":"text/x-python","patch_set":3,"id":"f081609c_5791bcc2","line":634,"updated":"2025-02-24 17:34:07.000000000","message":"I guess there is an implied case when the request has no live_migratable flag set and therefore we allow both migratable and non migratable devices. But in that case we don\u0027t need to filter anything hence the case has no code. If you agree with this then please add a code comment about this here.","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"710796c38846de88e60c179b4653f09992b40fd9","unresolved":false,"context_lines":[{"line_number":631,"context_line":"            #  we don\u0027t provide the ones that support them."},{"line_number":632,"context_line":"            #  We want to exclude the devices that don\u0027t have this value yet."},{"line_number":633,"context_line":"            pools \u003d [pool for pool in pools if pool.get(\"live_migratable\") and"},{"line_number":634,"context_line":"                     pool[\u0027live_migratable\u0027] \u003d\u003d \u0027false\u0027]"},{"line_number":635,"context_line":"        return pools"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"    def _filter_pools("}],"source_content_type":"text/x-python","patch_set":3,"id":"dc052d43_b8d5532f","line":634,"in_reply_to":"f081609c_5791bcc2","updated":"2025-02-26 18:50:05.000000000","message":"Done","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":true,"context_lines":[{"line_number":632,"context_line":"            #  We want to exclude the devices that don\u0027t have this value yet."},{"line_number":633,"context_line":"            pools \u003d [pool for pool in pools if pool.get(\"live_migratable\") and"},{"line_number":634,"context_line":"                     pool[\u0027live_migratable\u0027] \u003d\u003d \u0027false\u0027]"},{"line_number":635,"context_line":"        return pools"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"    def _filter_pools("},{"line_number":638,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7212b255_fdfa318a","line":635,"updated":"2025-02-24 17:34:07.000000000","message":"Thinking out loud: having an InstancePCIRequest with multiple specs does not seem to happen a that would require a single InstancePCIRequest to point to to pci aliases. In case of neutron backed requests a single port also has a single spec. I guess we never have more than one spec per request but it would be nice to i) validated this assumption and if true ii) codify it.\n\nHowever if the above assumption is not correct then I have to ask the question what happens in this code when we have a request with one two specs with different live_migratable value? Why we can ignore that case fully?","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"9e9398025a0fc0a5b4bc2564c0ba58b2dcaa608e","unresolved":true,"context_lines":[{"line_number":632,"context_line":"            #  We want to exclude the devices that don\u0027t have this value yet."},{"line_number":633,"context_line":"            pools \u003d [pool for pool in pools if pool.get(\"live_migratable\") and"},{"line_number":634,"context_line":"                     pool[\u0027live_migratable\u0027] \u003d\u003d \u0027false\u0027]"},{"line_number":635,"context_line":"        return pools"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"    def _filter_pools("},{"line_number":638,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7c72b3bb_458515f7","line":635,"in_reply_to":"08d6981d_30b96d49","updated":"2025-03-04 10:09:14.000000000","message":"Seems to me that multiple specs for the same pci requests looks to me maybe a caveat that we could document, but this shouldn\u0027t hold this series.","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"710796c38846de88e60c179b4653f09992b40fd9","unresolved":true,"context_lines":[{"line_number":632,"context_line":"            #  We want to exclude the devices that don\u0027t have this value yet."},{"line_number":633,"context_line":"            pools \u003d [pool for pool in pools if pool.get(\"live_migratable\") and"},{"line_number":634,"context_line":"                     pool[\u0027live_migratable\u0027] \u003d\u003d \u0027false\u0027]"},{"line_number":635,"context_line":"        return pools"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"    def _filter_pools("},{"line_number":638,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"b0b215e1_9dede02f","line":635,"in_reply_to":"7212b255_fdfa318a","updated":"2025-02-26 18:50:05.000000000","message":"\"InstancePCIRequest with multiple specs does not seem to happen \" I have the same feeling.\n\nAnd tbh, I struggled to understand why InstancePCIRequest.spec is a fields.ListOfDictOfNullableStringsField().\n\nI have \"concluded\" that it was probably defined like that for future usage.\nBut I\u0027m absolutely not sure about that.","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"63660ac7470eb497d6d2eb0f0670a28408b5033d","unresolved":true,"context_lines":[{"line_number":632,"context_line":"            #  We want to exclude the devices that don\u0027t have this value yet."},{"line_number":633,"context_line":"            pools \u003d [pool for pool in pools if pool.get(\"live_migratable\") and"},{"line_number":634,"context_line":"                     pool[\u0027live_migratable\u0027] \u003d\u003d \u0027false\u0027]"},{"line_number":635,"context_line":"        return pools"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"    def _filter_pools("},{"line_number":638,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"98cf3055_e22b5d84","line":635,"in_reply_to":"7c72b3bb_458515f7","updated":"2025-03-04 12:29:35.000000000","message":"Yeah this would be something to mention in the doc that there might be dragons.","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"76e8cce15f23da5762acb98d4918b5e5c7f37540","unresolved":true,"context_lines":[{"line_number":632,"context_line":"            #  We want to exclude the devices that don\u0027t have this value yet."},{"line_number":633,"context_line":"            pools \u003d [pool for pool in pools if pool.get(\"live_migratable\") and"},{"line_number":634,"context_line":"                     pool[\u0027live_migratable\u0027] \u003d\u003d \u0027false\u0027]"},{"line_number":635,"context_line":"        return pools"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"    def _filter_pools("},{"line_number":638,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"08d6981d_30b96d49","line":635,"in_reply_to":"a8326fcc_2d7d01d9","updated":"2025-02-27 13:26:20.000000000","message":"@smooney@redhat.com There is difference between having two InstancePCIRequest objects for an instance as you have two pci aliases in the flavor or having an InstancePCIRequest object with count \u003e1 as the flavor asks for multiple devices form the same alias, from the case I\u0027m interested in, where you have two specs in a single InstancePCIRequest object (regardless of count). So far I assumed that the latter is only possible by the object model but it is unused.\n\n* InstancePCIRequest.spec field is defined as a ListOfDict: https://github.com/openstack/nova/blob/8f57fa7359d57e186fc6b75424b4900dc63c564f/nova/objects/instance_pci_requests.py#L38 \n\n* when we create that from the pci alias then the docs says a single named alias can have multiple spec dicts https://github.com/openstack/nova/blob/8f57fa7359d57e186fc6b75424b4900dc63c564f/nova/pci/request.py#L125-L126\n\n* and indeed the code handles having the same alias name used in multiple pci alias config options: https://github.com/openstack/nova/blob/8f57fa7359d57e186fc6b75424b4900dc63c564f/nova/pci/request.py#L147-L157\n\nSo I was wrong. And we have to go back to the question:\n\n\u003e However if the above assumption is not correct then I have to ask the question what happens in this code when we have a request with two specs with different live_migratable value? Why we can ignore that case fully?\n\nBased on the above code we can very well have a single InstancePCIRequest with multiple specs attached (regardless of count). These specs are expressing OR relationship for the params of the given request as far as I understand the intention.\n\nThe linked code ensures that the specs within a single request cannot differ in dev_type and numa_affinity policy. I think we have to consider, do we need to extend that to not allow different live_migratable flag either.\n\nexample config:\n```ini\n[pci]\n# note that it uses the same alias name with two different specification:\nalias \u003d { \"name\": \"strange\", \"product_id\":\"10c9\", \"vendor_id\":\"8086\", \"device_type\":\"type-PF\", \"live_migratable\": \"true\"}\nalias \u003d { \"name\": \"strange\", \"product_id\":\"10c9\", \"vendor_id\":\"8086\", \"device_type\":\"type-PF\", \"live_migratable\": \"false\"}\n```\n\nThis is accepted by nova (if pci in placement is not enabled, see side notes). But I\u0027m not sure the request would be filtered properly.\n\n---\n\nSide notes:\n1. for completeness neutron port based InstancePCIRequests always have exactly one spec per request according to https://github.com/openstack/nova/blob/8f57fa7359d57e186fc6b75424b4900dc63c564f/nova/network/neutron.py#L2464-L2466\n\n2. pci in placement code hit this before. I just found https://github.com/openstack/nova/blob/8f57fa7359d57e186fc6b75424b4900dc63c564f/nova/objects/request_spec.py#L504-L528 which prevents having multiple specs per request (and actually causing a not nice HTTP 500 when nova configured so)","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3ec43b0b06de991203362cb039e0fc96b19e1319","unresolved":true,"context_lines":[{"line_number":632,"context_line":"            #  We want to exclude the devices that don\u0027t have this value yet."},{"line_number":633,"context_line":"            pools \u003d [pool for pool in pools if pool.get(\"live_migratable\") and"},{"line_number":634,"context_line":"                     pool[\u0027live_migratable\u0027] \u003d\u003d \u0027false\u0027]"},{"line_number":635,"context_line":"        return pools"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"    def _filter_pools("},{"line_number":638,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"a8326fcc_2d7d01d9","line":635,"in_reply_to":"b0b215e1_9dede02f","updated":"2025-02-27 02:12:37.000000000","message":"i would need to reload context.\n\nfor neturon its one pci request per prot\n\nfor the falvor you cna as for 2 of one aliase and 3 of annother in a single flavor.\n\nnow i belive we modifed how some fo this works as part of pci in placement so that we could split each device into a seperate request group\n\nthe way this isused in the schduler is we constuct the poos for the pci_status summeries aviable to the schduler.\n\nthere we take a copy of the info and then try and allocate each pci request object form the copy of the pools.\n\nin the past, before pci in placement i belile it was posisbe to have multipe devices in a single request but dont think that is the case anymore.\n\nit possibel to have a flavor that request one live migratable device and one non live migatbale device. but in that case\nwe would never get her as we  should reject the migation in the api.\n\nthe api has acess to the ailais and the flvor so it can and should validate that live migration is only allowed if all alias refenced by the flavor are migratable.","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"}],"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":"3f0f5577dca8969cebacfe8a689e4143fba855c7","unresolved":true,"context_lines":[{"line_number":5272,"context_line":"                    {"},{"line_number":5273,"context_line":"                        \"vendor_id\": \"1377\","},{"line_number":5274,"context_line":"                        \"product_id\": \"0047\","},{"line_number":5275,"context_line":"                        \"live_migratable\": \"true\","},{"line_number":5276,"context_line":"                    }"},{"line_number":5277,"context_line":"                ],"},{"line_number":5278,"context_line":"            ),"}],"source_content_type":"text/x-python","patch_set":3,"id":"9d7238d9_404f06fd","line":5275,"updated":"2025-02-24 17:34:07.000000000","message":"this diff feels like out of place. Could you make sure the original patch introduced this value already uses the normalized value in the test code?","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"710796c38846de88e60c179b4653f09992b40fd9","unresolved":false,"context_lines":[{"line_number":5272,"context_line":"                    {"},{"line_number":5273,"context_line":"                        \"vendor_id\": \"1377\","},{"line_number":5274,"context_line":"                        \"product_id\": \"0047\","},{"line_number":5275,"context_line":"                        \"live_migratable\": \"true\","},{"line_number":5276,"context_line":"                    }"},{"line_number":5277,"context_line":"                ],"},{"line_number":5278,"context_line":"            ),"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffde8422_8a0750f7","line":5275,"in_reply_to":"9d7238d9_404f06fd","updated":"2025-02-26 18:50:05.000000000","message":"Done","commit_id":"1a10340bb3e4cc363ad2853938ee03b3190afcce"}]}
