)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"050fadfce8e39fbbf1284b7a89d974c5ec25a55f","unresolved":true,"context_lines":[{"line_number":27,"context_line":"ovn-controller than has the change. If ovn-controller is down, the"},{"line_number":28,"context_line":"migration doesn\u0027t start."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"But nova normally waits for the event before libvirt attaches the tap"},{"line_number":31,"context_line":"interface. A separate change at nova is required to create the interface"},{"line_number":32,"context_line":"before, so additional_chassis is set before libvirt starts the migration"},{"line_number":33,"context_line":"and nova can waits for the interface."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[1] https://ihar.dev/posts/ovn-chassis-binding-walkthru/#multichassis-port-bindings"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ff8f6051_cd88963d","line":33,"range":{"start_line":30,"start_character":0,"end_line":33,"end_character":37},"updated":"2026-01-15 08:36:38.000000000","message":"Please add the depends-on patches:\n* https://review.opendev.org/c/openstack/os-vif/+/971231\n* https://review.opendev.org/c/openstack/nova/+/973149\n\nYou should also rebase this patch on top of https://review.opendev.org/c/openstack/neutron/+/972039","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"452635c4e026df35e38259ed6140583df0ee585e","unresolved":false,"context_lines":[{"line_number":27,"context_line":"ovn-controller than has the change. If ovn-controller is down, the"},{"line_number":28,"context_line":"migration doesn\u0027t start."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"But nova normally waits for the event before libvirt attaches the tap"},{"line_number":31,"context_line":"interface. A separate change at nova is required to create the interface"},{"line_number":32,"context_line":"before, so additional_chassis is set before libvirt starts the migration"},{"line_number":33,"context_line":"and nova can waits for the interface."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"[1] https://ihar.dev/posts/ovn-chassis-binding-walkthru/#multichassis-port-bindings"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"85ccc26f_378f11a9","line":33,"range":{"start_line":30,"start_character":0,"end_line":33,"end_character":37},"in_reply_to":"ff8f6051_cd88963d","updated":"2026-01-15 15:06:58.000000000","message":"Done","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0b25566505e5cee0d9abd22e5d8f4b52ffb8f694","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"This is based in the core OVN functionality [1][2]."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This patch requires Nova (os-vif) to create the TAP device *before* the"},{"line_number":24,"context_line":"VM is unpaused in the destination host. That requires Nova (nova-cpu)"},{"line_number":25,"context_line":"to create the TAP device and the Nova API to define the VM XML disabling"},{"line_number":26,"context_line":"the libvirt TAP device creation. These dependecies are the two"},{"line_number":27,"context_line":"depends-on patches addded."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"8b0e323d_794395d2","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":39},"updated":"2026-01-20 12:52:46.000000000","message":"so this is alwasy the case today\n\nits not that that tap is create after the vm is unpaused.\n\nwhen we live migrate libvirt created a paused vm on the dest to live miggrat into. before that happens libvirt (without the nova changs) will create the tap.\nFor small vms the tiem between it takes to copy the memory vs for ovn to isntall the flows can reult in the vm unpausing before ovn has completed installign the flows.\n\nthat wehere the packet loss is coming form.\n\nwithout the chagne neutorn is sendign a fake network-vif-plugged evnet in pre-live-mightion before the flows are isntall causign the race.\n\nafter the nova/os-vif changes the tap will be created in pre-live migrate before we ever start the migration and with this change neutorn will wait for the lsp to show up on the destination vswich and have a openflow port id assgined.","commit_id":"51638f702bd8639b749eaa7d5e5777e2172a8657"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"b3ebcbc79d078f91eecf2a07d2f503f29b572637","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"This is based in the core OVN functionality [1][2]."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This patch requires Nova (os-vif) to create the TAP device *before* the"},{"line_number":24,"context_line":"VM is unpaused in the destination host. That requires Nova (nova-cpu)"},{"line_number":25,"context_line":"to create the TAP device and the Nova API to define the VM XML disabling"},{"line_number":26,"context_line":"the libvirt TAP device creation. These dependecies are the two"},{"line_number":27,"context_line":"depends-on patches addded."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"c2bab4c5_e303bcbb","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":39},"in_reply_to":"8b0e323d_794395d2","updated":"2026-01-22 04:35:42.000000000","message":"Done","commit_id":"51638f702bd8639b749eaa7d5e5777e2172a8657"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"09e3051f2fd62a28233fbf5187b94075372f0118","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b378a42f_8499a00e","updated":"2026-01-13 12:02:24.000000000","message":"This patch depends on:\n* https://review.opendev.org/c/openstack/os-vif/+/971231\n* https://review.opendev.org/c/openstack/nova/+/973149\n\nAnd should be proposed on top of https://review.opendev.org/c/openstack/neutron/+/972039","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"138288265a6804d8b3e4bbcb962ca185514f9dd3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cc4f4126_532a2352","updated":"2025-08-08 15:32:38.000000000","message":"this is incomplete \n\nwe nee dto modify the ovn and ovs ml2 driver to pass a new flag in the vif binding detils to ask nova to create the tap \n\nThat shoudl be defiend as a constnat here\n\nhttps://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/portbindings.py#L48-L76\n\nand shoudl be added to the binding:vif_details dict\n\nnova can then be update to read that new flag and act acocrdingly.\n\nnova can pass the new flag to so-vif which will allow it to create the tap as needed.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":26832,"name":"Stefan Hoffmann","email":"stefan.hoffmann@cloudandheat.com","username":"shoffmann"},"change_message_id":"cc2e6af1dc578912e01af6ea8e8bc5f71d7f9e6e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4ce0885d_13e83ee1","in_reply_to":"99ecdc66_5e9bb1c4","updated":"2025-08-11 09:13:45.000000000","message":"I updated the rfe https://bugs.launchpad.net/neutron/+bug/2069718\n\nI\u0027m not sure if this works also for ovs ml2 driver, I guess, this is ovn only.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":26832,"name":"Stefan Hoffmann","email":"stefan.hoffmann@cloudandheat.com","username":"shoffmann"},"change_message_id":"aa0f00ea9df200c680c5c1799dd9e057c641abc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"99ecdc66_5e9bb1c4","in_reply_to":"cc4f4126_532a2352","updated":"2025-08-11 08:45:19.000000000","message":"I would add this to the rfe bug so we can do that for the actual implementation.\nAlso we can discuss, how that flag should be called.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"dea2a4277580fb297438de05d407ae94e8a2984f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"94910746_5a17d711","updated":"2026-01-16 14:47:07.000000000","message":"Few issues in the latest patch, will push the fix\nneed to still fake the event with ovs_create_tap\u003dFalse\nalso the new if/elif/else condition made it skip ovn_update_port for unbound vif type","commit_id":"51638f702bd8639b749eaa7d5e5777e2172a8657"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"1ab6122c882f5cc74d8817f6b47611d5078f7525","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"049351df_c3f7675c","updated":"2026-01-16 16:37:01.000000000","message":"also triggered test patch to cover both cases, lets also see the results once available","commit_id":"823fe60c75508c759cd26a4a3759b4247529813c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0b25566505e5cee0d9abd22e5d8f4b52ffb8f694","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a3d0f489_b7a02709","updated":"2026-01-20 12:52:46.000000000","message":"it took a few reading of the code but i think the logic is correct\n\nthe comments on the migration complete branch could be slightly clearer but i don\u0027t think there is a bug i woudl just clearly state this is skiping the event at the end of  live migrationat the start of the comment.","commit_id":"326f0fcbcc17aa4dd0bf7ed785aa9e401c738793"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"b3ebcbc79d078f91eecf2a07d2f503f29b572637","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e656653c_38b09590","in_reply_to":"a3d0f489_b7a02709","updated":"2026-01-22 04:35:42.000000000","message":"Ok added the comment for clarity.","commit_id":"326f0fcbcc17aa4dd0bf7ed785aa9e401c738793"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"71ef79a4f3e54c0d4a5a5478e15106c281a6edff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"69491def_84758499","updated":"2026-02-06 12:26:49.000000000","message":"thanks for the detailed code documentation and explanation","commit_id":"ee20f78e72438390ca5a07130ba0e58c771cb000"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"050fadfce8e39fbbf1284b7a89d974c5ec25a55f","unresolved":true,"context_lines":[{"line_number":1011,"context_line":"        original_port[\u0027network\u0027] \u003d context.network.current"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"        # NOTE(mjozefcz,shoffmann): Check if port is in migration state. If so"},{"line_number":1014,"context_line":"        # don\u0027t update the port status and skip \u0027fake\u0027 vif-interface-plugged"},{"line_number":1015,"context_line":"        # event. Instead we wait for event from southbound ovn-controller has"},{"line_number":1016,"context_line":"        # the update. This is needed to perform live-migration with"},{"line_number":1017,"context_line":"        # live_migration_wait_for_vif_plug\u003dTrue."},{"line_number":1018,"context_line":"        if (port[\u0027status\u0027] \u003d\u003d const.PORT_STATUS_DOWN and"}],"source_content_type":"text/x-python","patch_set":1,"id":"116e1645_ec90f6b0","line":1015,"range":{"start_line":1014,"start_character":39,"end_line":1015,"end_character":15},"updated":"2026-01-15 08:36:38.000000000","message":"That makes sense now but it won\u0027t in some releases without the current context. We can remove it and just explain that we\u0027ll wait for the Port_Binding change in the `additional_chassis` field.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"452635c4e026df35e38259ed6140583df0ee585e","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"        original_port[\u0027network\u0027] \u003d context.network.current"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"        # NOTE(mjozefcz,shoffmann): Check if port is in migration state. If so"},{"line_number":1014,"context_line":"        # don\u0027t update the port status and skip \u0027fake\u0027 vif-interface-plugged"},{"line_number":1015,"context_line":"        # event. Instead we wait for event from southbound ovn-controller has"},{"line_number":1016,"context_line":"        # the update. This is needed to perform live-migration with"},{"line_number":1017,"context_line":"        # live_migration_wait_for_vif_plug\u003dTrue."},{"line_number":1018,"context_line":"        if (port[\u0027status\u0027] \u003d\u003d const.PORT_STATUS_DOWN and"}],"source_content_type":"text/x-python","patch_set":1,"id":"4d6c507d_e60b95d5","line":1015,"range":{"start_line":1014,"start_character":39,"end_line":1015,"end_character":15},"in_reply_to":"116e1645_ec90f6b0","updated":"2026-01-15 15:06:58.000000000","message":"Done","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d86e92da44422a169082e6211bd4fa13774fb1e5","unresolved":true,"context_lines":[{"line_number":1019,"context_line":"            ovn_const.MIGRATING_ATTR in port[portbindings.PROFILE].keys() and"},{"line_number":1020,"context_line":"            port[portbindings.VIF_TYPE] in ("},{"line_number":1021,"context_line":"                 portbindings.VIF_TYPE_OVS,"},{"line_number":1022,"context_line":"                 portbindings.VIF_TYPE_VHOST_USER)):"},{"line_number":1023,"context_line":"            # The revision has been changed. In the meantime"},{"line_number":1024,"context_line":"            # port-update event already updated the OVN configuration,"},{"line_number":1025,"context_line":"            # So there is no need to update it again here. Anyway it"}],"source_content_type":"text/x-python","patch_set":1,"id":"a6b46732_56982dfa","line":1022,"range":{"start_line":1022,"start_character":30,"end_line":1022,"end_character":49},"updated":"2026-01-15 13:47:06.000000000","message":"I almost forget: this feature (https://review.opendev.org/c/openstack/os-vif/+/971231) is only for kernel OVS, not DPDK not HW offloaded ports.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d2f3c8416692a3830fa47aef4980afbfb8ca3625","unresolved":true,"context_lines":[{"line_number":1019,"context_line":"            ovn_const.MIGRATING_ATTR in port[portbindings.PROFILE].keys() and"},{"line_number":1020,"context_line":"            port[portbindings.VIF_TYPE] in ("},{"line_number":1021,"context_line":"                 portbindings.VIF_TYPE_OVS,"},{"line_number":1022,"context_line":"                 portbindings.VIF_TYPE_VHOST_USER)):"},{"line_number":1023,"context_line":"            # The revision has been changed. In the meantime"},{"line_number":1024,"context_line":"            # port-update event already updated the OVN configuration,"},{"line_number":1025,"context_line":"            # So there is no need to update it again here. Anyway it"}],"source_content_type":"text/x-python","patch_set":1,"id":"dd42e6e0_46992d70","line":1022,"range":{"start_line":1022,"start_character":30,"end_line":1022,"end_character":49},"in_reply_to":"a6b46732_56982dfa","updated":"2026-01-15 14:02:21.000000000","message":"for hardware offloaded ovs we are not imapcted by the bdowntime becuase we add teh the port representor netdev to ovs as the vms port so it will have a of-id assigned in pre-live-migrate the same as the tap.\n\nfor dpdk we cant create it any sooner.\n\nthis is why we shoudl avoid dependign on the openflow port id beign assigne din ovn and precompute the follows and sub in the value when its set.\n\nthat woudl need a change in ovn to accomplish.\n\nwe did the same change in ml2/ovs and the neutron ovs agent like 10 years ago.\n\nso without modifyign ovn to better support dpdk there si unfotuanly no way to adress this form the openstack side.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"452635c4e026df35e38259ed6140583df0ee585e","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"            ovn_const.MIGRATING_ATTR in port[portbindings.PROFILE].keys() and"},{"line_number":1020,"context_line":"            port[portbindings.VIF_TYPE] in ("},{"line_number":1021,"context_line":"                 portbindings.VIF_TYPE_OVS,"},{"line_number":1022,"context_line":"                 portbindings.VIF_TYPE_VHOST_USER)):"},{"line_number":1023,"context_line":"            # The revision has been changed. In the meantime"},{"line_number":1024,"context_line":"            # port-update event already updated the OVN configuration,"},{"line_number":1025,"context_line":"            # So there is no need to update it again here. Anyway it"}],"source_content_type":"text/x-python","patch_set":1,"id":"4de67ea4_f6f9e91b","line":1022,"range":{"start_line":1022,"start_character":30,"end_line":1022,"end_character":49},"in_reply_to":"dd42e6e0_46992d70","updated":"2026-01-15 15:06:58.000000000","message":"Done","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ba3b057657871300d460f02f98e29790ecc0585d","unresolved":true,"context_lines":[{"line_number":1045,"context_line":"            # TAP device has been created."},{"line_number":1046,"context_line":"            if (not ovn_conf.is_ovs_create_tap() or"},{"line_number":1047,"context_line":"                    port[portbindings.VIF_TYPE] \u003d\u003d"},{"line_number":1048,"context_line":"                    portbindings.VIF_TYPE_VHOST_USER):"},{"line_number":1049,"context_line":"                # The ``Port_Binding.additional_chassis`` will be populated."},{"line_number":1050,"context_line":"                # Update the port status from DOWN to UP in order to generate"},{"line_number":1051,"context_line":"                # a \"fake\" ``vif-interface-plugged`` event."}],"source_content_type":"text/x-python","patch_set":4,"id":"ecb563e7_a3709314","line":1048,"range":{"start_line":1048,"start_character":33,"end_line":1048,"end_character":52},"updated":"2026-01-16 16:25:24.000000000","message":"Here we could be missing other vif-types. I know originally (base PS) we where considering VIF_TYPE_OVS and VIF_TYPE_VHOST_USER only.\n\nIn this case, I would use another logic:\n```\n  if (not ovn_conf.is_ovs_create_tap() or\n          port[portbindings.VIF_TYPE] !\u003d portbindings.VIF_TYPE_OVS):\n```","commit_id":"823fe60c75508c759cd26a4a3759b4247529813c"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"df8241970e588e7c0e6918292f05ec0652f93cf8","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"            # TAP device has been created."},{"line_number":1046,"context_line":"            if (not ovn_conf.is_ovs_create_tap() or"},{"line_number":1047,"context_line":"                    port[portbindings.VIF_TYPE] \u003d\u003d"},{"line_number":1048,"context_line":"                    portbindings.VIF_TYPE_VHOST_USER):"},{"line_number":1049,"context_line":"                # The ``Port_Binding.additional_chassis`` will be populated."},{"line_number":1050,"context_line":"                # Update the port status from DOWN to UP in order to generate"},{"line_number":1051,"context_line":"                # a \"fake\" ``vif-interface-plugged`` event."}],"source_content_type":"text/x-python","patch_set":4,"id":"e5eef517_1872c094","line":1048,"range":{"start_line":1048,"start_character":33,"end_line":1048,"end_character":52},"in_reply_to":"93d00112_cc184431","updated":"2026-01-19 13:55:06.000000000","message":"Done","commit_id":"823fe60c75508c759cd26a4a3759b4247529813c"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"1ab6122c882f5cc74d8817f6b47611d5078f7525","unresolved":true,"context_lines":[{"line_number":1045,"context_line":"            # TAP device has been created."},{"line_number":1046,"context_line":"            if (not ovn_conf.is_ovs_create_tap() or"},{"line_number":1047,"context_line":"                    port[portbindings.VIF_TYPE] \u003d\u003d"},{"line_number":1048,"context_line":"                    portbindings.VIF_TYPE_VHOST_USER):"},{"line_number":1049,"context_line":"                # The ``Port_Binding.additional_chassis`` will be populated."},{"line_number":1050,"context_line":"                # Update the port status from DOWN to UP in order to generate"},{"line_number":1051,"context_line":"                # a \"fake\" ``vif-interface-plugged`` event."}],"source_content_type":"text/x-python","patch_set":4,"id":"93d00112_cc184431","line":1048,"range":{"start_line":1048,"start_character":33,"end_line":1048,"end_character":52},"in_reply_to":"ecb563e7_a3709314","updated":"2026-01-16 16:37:01.000000000","message":"i intentionally not used !\u003dOVS as originally the check here was only for VHOST_USER and OVS and with these series of patches we touching only OVS. Also with local tests i saw when vif type \u003d unbound in those cases also it skipped calling ovn_update_port and missing events.","commit_id":"823fe60c75508c759cd26a4a3759b4247529813c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ba3b057657871300d460f02f98e29790ecc0585d","unresolved":true,"context_lines":[{"line_number":1059,"context_line":"                # port-update event already updated the OVN configuration,"},{"line_number":1060,"context_line":"                # So there is no need to update it again here. Anyway it"},{"line_number":1061,"context_line":"                # will fail that OVN has port with bigger revision."},{"line_number":1062,"context_line":"                return"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        self._ovn_update_port(context.plugin_context, port, original_port,"},{"line_number":1065,"context_line":"                              retry_on_revision_mismatch\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"e455c6e2_df9508f3","line":1062,"range":{"start_line":1062,"start_character":16,"end_line":1062,"end_character":22},"updated":"2026-01-16 16:25:24.000000000","message":"IMPORTANT: I think you are missing a branch here, where vif_type\u003dovs and is_ovs_create_tap\u003dTrue. In this case we also need to return immediately. The port status will be updated by `PortBindingChassisUpdateEvent` now.","commit_id":"823fe60c75508c759cd26a4a3759b4247529813c"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"df8241970e588e7c0e6918292f05ec0652f93cf8","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                # port-update event already updated the OVN configuration,"},{"line_number":1060,"context_line":"                # So there is no need to update it again here. Anyway it"},{"line_number":1061,"context_line":"                # will fail that OVN has port with bigger revision."},{"line_number":1062,"context_line":"                return"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        self._ovn_update_port(context.plugin_context, port, original_port,"},{"line_number":1065,"context_line":"                              retry_on_revision_mismatch\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"f2d3b752_2ce3224a","line":1062,"range":{"start_line":1062,"start_character":16,"end_line":1062,"end_character":22},"in_reply_to":"2957db0f_801ed985","updated":"2026-01-19 13:55:06.000000000","message":"Done","commit_id":"823fe60c75508c759cd26a4a3759b4247529813c"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"1ab6122c882f5cc74d8817f6b47611d5078f7525","unresolved":true,"context_lines":[{"line_number":1059,"context_line":"                # port-update event already updated the OVN configuration,"},{"line_number":1060,"context_line":"                # So there is no need to update it again here. Anyway it"},{"line_number":1061,"context_line":"                # will fail that OVN has port with bigger revision."},{"line_number":1062,"context_line":"                return"},{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        self._ovn_update_port(context.plugin_context, port, original_port,"},{"line_number":1065,"context_line":"                              retry_on_revision_mismatch\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"2957db0f_801ed985","line":1062,"range":{"start_line":1062,"start_character":16,"end_line":1062,"end_character":22},"in_reply_to":"e455c6e2_df9508f3","updated":"2026-01-16 16:37:01.000000000","message":"in that case we want to get below _ovn_update_port called in order to set multi port bindings in LSP","commit_id":"823fe60c75508c759cd26a4a3759b4247529813c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b1a6d56f03317acb1eb51d47aacff087d3b50577","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"            # just return as we don\u0027t need to send any fake event and instead"},{"line_number":1048,"context_line":"            # Wait for PortBindingChassisUpdateEvent Southbound event which is"},{"line_number":1049,"context_line":"            # triggered when ``Port_Binding.additional_chassis`` is populated."},{"line_number":1050,"context_line":"            elif (ovn_conf.is_ovs_create_tap() and"},{"line_number":1051,"context_line":"                    port[portbindings.VIF_TYPE] \u003d\u003d portbindings.VIF_TYPE_OVS):"},{"line_number":1052,"context_line":"                return"},{"line_number":1053,"context_line":"            # NOTE(ykarel): For ovs_create_tap\u003dFalse or vif_type\u003dvhostuser"},{"line_number":1054,"context_line":"            # we create fake event instead of waiting for the Southbound event"},{"line_number":1055,"context_line":"            elif (not ovn_conf.is_ovs_create_tap() or"}],"source_content_type":"text/x-python","patch_set":5,"id":"46f76edd_6f697b90","line":1052,"range":{"start_line":1050,"start_character":12,"end_line":1052,"end_character":22},"updated":"2026-01-20 08:19:06.000000000","message":"+1","commit_id":"326f0fcbcc17aa4dd0bf7ed785aa9e401c738793"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0b25566505e5cee0d9abd22e5d8f4b52ffb8f694","unresolved":true,"context_lines":[{"line_number":1059,"context_line":"                # a \"fake\" ``vif-interface-plugged`` event."},{"line_number":1060,"context_line":"                LOG.info(\"Setting port %s status from DOWN to UP in order \""},{"line_number":1061,"context_line":"                         \"to emit vif-interface-plugged event.\","},{"line_number":1062,"context_line":"                         port[\u0027id\u0027])"},{"line_number":1063,"context_line":"                self._plugin.update_port_status(context.plugin_context,"},{"line_number":1064,"context_line":"                                                port[\u0027id\u0027],"},{"line_number":1065,"context_line":"                                                const.PORT_STATUS_ACTIVE)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba8feee8_dabe8e3b","line":1062,"updated":"2026-01-20 12:52:46.000000000","message":"so the ovs port cna still be created on the ovsdb and potentially on the southbond db but im guessign the reason we need to do this is ovn wont bind the port to the chassis untile after the port show up on the dataplane and is assinged and openflow prot id correct?\n\nfor dpdk there is no way to do that until qemu creates the socket and ovs can connect so unfortunetly this will be required unless we can eventually modify ovn to claim the port in the southbond db and bind the chassis for it without needing the dataplane port ot exsit.","commit_id":"326f0fcbcc17aa4dd0bf7ed785aa9e401c738793"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"b3ebcbc79d078f91eecf2a07d2f503f29b572637","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                # a \"fake\" ``vif-interface-plugged`` event."},{"line_number":1060,"context_line":"                LOG.info(\"Setting port %s status from DOWN to UP in order \""},{"line_number":1061,"context_line":"                         \"to emit vif-interface-plugged event.\","},{"line_number":1062,"context_line":"                         port[\u0027id\u0027])"},{"line_number":1063,"context_line":"                self._plugin.update_port_status(context.plugin_context,"},{"line_number":1064,"context_line":"                                                port[\u0027id\u0027],"},{"line_number":1065,"context_line":"                                                const.PORT_STATUS_ACTIVE)"}],"source_content_type":"text/x-python","patch_set":5,"id":"0dc02671_1d501d60","line":1062,"in_reply_to":"ba8feee8_dabe8e3b","updated":"2026-01-22 04:35:42.000000000","message":"@sean yes ovn will not claim the port on chassis(if is part of requested-chassis) until ofport(\u003e0), external-ids:iface-id are set","commit_id":"326f0fcbcc17aa4dd0bf7ed785aa9e401c738793"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py":[{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"66617baf32cb5a0edf92b68cdf42cd466b31eb2e","unresolved":true,"context_lines":[{"line_number":283,"context_line":"        # create the tap interface before starting libvirt migration. Else"},{"line_number":284,"context_line":"        # the additional_chassis is set at the point libvirt creates the VM on"},{"line_number":285,"context_line":"        # the destination hypervisor (which is directly before actuall libvirt"},{"line_number":286,"context_line":"        # migration. But by default nova doesn\u0027t wait for vif-plugged event,"},{"line_number":287,"context_line":"        # so it doesn\u0027t hurt, if we send it only at specific conditions."},{"line_number":288,"context_line":"        if (not (row.chassis and old_chassis) or row.chassis \u003d\u003d old_chassis) \\"},{"line_number":289,"context_line":"                and (not (row.additional_chassis and"},{"line_number":290,"context_line":"                     old_additional_chassis is not None) or"}],"source_content_type":"text/x-python","patch_set":1,"id":"10dec4ad_a876df08","line":287,"range":{"start_line":286,"start_character":21,"end_line":287,"end_character":72},"updated":"2026-01-12 05:07:05.000000000","message":"Can you describe more on this default nova behavior on when it doesn\u0027t wait for vi-plugged event?, because as i see live_migration_wait_for_vif_plug\u003dTrue by default.\nAlso i confirmed this in CI test https://review.opendev.org/c/openstack/neutron/+/972820 where it waits for vif plugged event during migration and fails as nova/os-vif changes still missing.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"408fa2d750c5397a25230dadadf1ac6fa76c8abc","unresolved":true,"context_lines":[{"line_number":283,"context_line":"        # create the tap interface before starting libvirt migration. Else"},{"line_number":284,"context_line":"        # the additional_chassis is set at the point libvirt creates the VM on"},{"line_number":285,"context_line":"        # the destination hypervisor (which is directly before actuall libvirt"},{"line_number":286,"context_line":"        # migration. But by default nova doesn\u0027t wait for vif-plugged event,"},{"line_number":287,"context_line":"        # so it doesn\u0027t hurt, if we send it only at specific conditions."},{"line_number":288,"context_line":"        if (not (row.chassis and old_chassis) or row.chassis \u003d\u003d old_chassis) \\"},{"line_number":289,"context_line":"                and (not (row.additional_chassis and"},{"line_number":290,"context_line":"                     old_additional_chassis is not None) or"}],"source_content_type":"text/x-python","patch_set":1,"id":"fbbaeeb2_c24fb263","line":287,"range":{"start_line":286,"start_character":21,"end_line":287,"end_character":72},"in_reply_to":"10dec4ad_a876df08","updated":"2026-01-12 13:54:43.000000000","message":"the issue isnt related ot nova waiting or not.\n\novn and neutron are not sending the event at the correct time\n\nthe requirement for sendign network-vif-plugged is that if the vm transmits a packet the network backid is configure so that it will be able to process the packet and route it correctly.\n\nthat means that ovn must have installed the oenflow flows.\nthis is why when ovn whas beign built we spent time dicussing why it was not ok for ovn to depend on the the of-port id being assinged to the prot on in the ovs dataplane.\n\nneutorn has been violated this contract since netowrkign ovn was created and sending the event at bind time so nova to make ovn live migration work at all had to sepcial case ovn and not wait for it.\n\nwe ripped out that hack about 2 years ago so nova is waiting again when it ovn.\nwe did that after neutron got suport for multple chasise on teh logical switch port since at that poitn neutron was intended to be sending the event only after the flows were installed. that is not what ovn is doing internally.\n\n\nanyway  nova is waiting for the event by default and we dont recommend disabling that in production.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"452635c4e026df35e38259ed6140583df0ee585e","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        # create the tap interface before starting libvirt migration. Else"},{"line_number":284,"context_line":"        # the additional_chassis is set at the point libvirt creates the VM on"},{"line_number":285,"context_line":"        # the destination hypervisor (which is directly before actuall libvirt"},{"line_number":286,"context_line":"        # migration. But by default nova doesn\u0027t wait for vif-plugged event,"},{"line_number":287,"context_line":"        # so it doesn\u0027t hurt, if we send it only at specific conditions."},{"line_number":288,"context_line":"        if (not (row.chassis and old_chassis) or row.chassis \u003d\u003d old_chassis) \\"},{"line_number":289,"context_line":"                and (not (row.additional_chassis and"},{"line_number":290,"context_line":"                     old_additional_chassis is not None) or"}],"source_content_type":"text/x-python","patch_set":1,"id":"ce96033c_95e7cc3f","line":287,"range":{"start_line":286,"start_character":21,"end_line":287,"end_character":72},"in_reply_to":"fbbaeeb2_c24fb263","updated":"2026-01-15 15:06:58.000000000","message":"Done","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"050fadfce8e39fbbf1284b7a89d974c5ec25a55f","unresolved":true,"context_lines":[{"line_number":285,"context_line":"        # the destination hypervisor (which is directly before actuall libvirt"},{"line_number":286,"context_line":"        # migration. But by default nova doesn\u0027t wait for vif-plugged event,"},{"line_number":287,"context_line":"        # so it doesn\u0027t hurt, if we send it only at specific conditions."},{"line_number":288,"context_line":"        if (not (row.chassis and old_chassis) or row.chassis \u003d\u003d old_chassis) \\"},{"line_number":289,"context_line":"                and (not (row.additional_chassis and"},{"line_number":290,"context_line":"                     old_additional_chassis is not None) or"},{"line_number":291,"context_line":"                     row.additional_chassis \u003d\u003d old_additional_chassis):"},{"line_number":292,"context_line":"            return False"},{"line_number":293,"context_line":"        if row.type \u003d\u003d ovn_const.OVN_CHASSIS_REDIRECT:"},{"line_number":294,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"ceb2cb3e_4102671c","line":291,"range":{"start_line":288,"start_character":8,"end_line":291,"end_character":71},"updated":"2026-01-15 08:36:38.000000000","message":"In shake of clarity, you should split this check.\n\nThe first one, the existing check. Is self explanatory.\n`if not (row.chassis and old_chassis) or row.chassis \u003d\u003d old_chassis`\n\nThe second check:\n`not (row.additional_chassis and\n    old_additional_chassis is not None) or\n    row.additional_chassis \u003d\u003d old_additional_chassis`\n\nFor this second check I have some comments:\n* It is easier to apply Morgan\u0027s Law to the first section there and write it like:\n`not row.additional_chassis or old_additional_chassis is None`\nIt could be useful to explain that if `old_additional_chassis is None`, it has been no change in the `additional_chassis` field.\n* The second section `row.additional_chassis \u003d\u003d old_additional_chassis` makes sense.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5554fae90a037d87ee87fe8635e2b1fec2e29b7e","unresolved":true,"context_lines":[{"line_number":285,"context_line":"        # the destination hypervisor (which is directly before actuall libvirt"},{"line_number":286,"context_line":"        # migration. But by default nova doesn\u0027t wait for vif-plugged event,"},{"line_number":287,"context_line":"        # so it doesn\u0027t hurt, if we send it only at specific conditions."},{"line_number":288,"context_line":"        if (not (row.chassis and old_chassis) or row.chassis \u003d\u003d old_chassis) \\"},{"line_number":289,"context_line":"                and (not (row.additional_chassis and"},{"line_number":290,"context_line":"                     old_additional_chassis is not None) or"},{"line_number":291,"context_line":"                     row.additional_chassis \u003d\u003d old_additional_chassis):"},{"line_number":292,"context_line":"            return False"},{"line_number":293,"context_line":"        if row.type \u003d\u003d ovn_const.OVN_CHASSIS_REDIRECT:"},{"line_number":294,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"fb8d53c0_48ed6d93","line":291,"range":{"start_line":288,"start_character":8,"end_line":291,"end_character":71},"in_reply_to":"8c3fd2ba_e3eff848","updated":"2026-01-15 15:15:43.000000000","message":"My bad: this check cannot be divided in two, it is needed that both and conditions match.","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"452635c4e026df35e38259ed6140583df0ee585e","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        # the destination hypervisor (which is directly before actuall libvirt"},{"line_number":286,"context_line":"        # migration. But by default nova doesn\u0027t wait for vif-plugged event,"},{"line_number":287,"context_line":"        # so it doesn\u0027t hurt, if we send it only at specific conditions."},{"line_number":288,"context_line":"        if (not (row.chassis and old_chassis) or row.chassis \u003d\u003d old_chassis) \\"},{"line_number":289,"context_line":"                and (not (row.additional_chassis and"},{"line_number":290,"context_line":"                     old_additional_chassis is not None) or"},{"line_number":291,"context_line":"                     row.additional_chassis \u003d\u003d old_additional_chassis):"},{"line_number":292,"context_line":"            return False"},{"line_number":293,"context_line":"        if row.type \u003d\u003d ovn_const.OVN_CHASSIS_REDIRECT:"},{"line_number":294,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"8c3fd2ba_e3eff848","line":291,"range":{"start_line":288,"start_character":8,"end_line":291,"end_character":71},"in_reply_to":"ceb2cb3e_4102671c","updated":"2026-01-15 15:06:58.000000000","message":"Done","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"17eabbf8471d14a3cd821f115f4ed19cb36eb981","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        # the destination hypervisor (which is directly before actuall libvirt"},{"line_number":286,"context_line":"        # migration. But by default nova doesn\u0027t wait for vif-plugged event,"},{"line_number":287,"context_line":"        # so it doesn\u0027t hurt, if we send it only at specific conditions."},{"line_number":288,"context_line":"        if (not (row.chassis and old_chassis) or row.chassis \u003d\u003d old_chassis) \\"},{"line_number":289,"context_line":"                and (not (row.additional_chassis and"},{"line_number":290,"context_line":"                     old_additional_chassis is not None) or"},{"line_number":291,"context_line":"                     row.additional_chassis \u003d\u003d old_additional_chassis):"},{"line_number":292,"context_line":"            return False"},{"line_number":293,"context_line":"        if row.type \u003d\u003d ovn_const.OVN_CHASSIS_REDIRECT:"},{"line_number":294,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"a2a85bd4_4abd1131","line":291,"range":{"start_line":288,"start_character":8,"end_line":291,"end_character":71},"in_reply_to":"fb8d53c0_48ed6d93","updated":"2026-01-15 15:21:04.000000000","message":"Done","commit_id":"6b1343ee3096e5e67fd39fffd48e4c66b333c89a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0b25566505e5cee0d9abd22e5d8f4b52ffb8f694","unresolved":true,"context_lines":[{"line_number":310,"context_line":"                        {\u0027port\u0027: row.logical_port, \u0027binding\u0027: row.uuid})"},{"line_number":311,"context_line":"            return False"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        if old_additional_chassis and row.additional_chassis \u003d\u003d []:"},{"line_number":314,"context_line":"            # This event has been issued during a LSP migration. First, the"},{"line_number":315,"context_line":"            # additional_chassis got set, so port is set up on destination"},{"line_number":316,"context_line":"            # -\u003e we send an event; now the Port_Binding is cleaned up, so"}],"source_content_type":"text/x-python","patch_set":5,"id":"c86701eb_c42e7b92","line":313,"range":{"start_line":313,"start_character":7,"end_line":313,"end_character":67},"updated":"2026-01-20 12:52:46.000000000","message":"shoudl this be \n\n\n\n```suggestion\n        if old_additional_chassis and row.additional_chassis !\u003d []:\n```\n\nrow is the new value? from the comment above on line 293 i was expecting the start fo a live migration to be represented by \n\n(old_additional_chassis \u003d\u003d [] and row.additional_chassis !\u003d [])\n\nand the end of a live migration by \n\n(old_additional_chassis \u003d\u003d [] and row.additional_chassis \u003d\u003d [])\n\nwhich woudl be the same as\n\n(not old_additional_chassis and not row.additional_chassis)\n\n\nanswering my own qustion i guess reading the comment below this is handleing the completion of the migration not the start and filtering out sending the event but you could make that clarer in the comment.","commit_id":"326f0fcbcc17aa4dd0bf7ed785aa9e401c738793"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"b3ebcbc79d078f91eecf2a07d2f503f29b572637","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                        {\u0027port\u0027: row.logical_port, \u0027binding\u0027: row.uuid})"},{"line_number":311,"context_line":"            return False"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        if old_additional_chassis and row.additional_chassis \u003d\u003d []:"},{"line_number":314,"context_line":"            # This event has been issued during a LSP migration. First, the"},{"line_number":315,"context_line":"            # additional_chassis got set, so port is set up on destination"},{"line_number":316,"context_line":"            # -\u003e we send an event; now the Port_Binding is cleaned up, so"}],"source_content_type":"text/x-python","patch_set":5,"id":"e243f890_fdd78341","line":313,"range":{"start_line":313,"start_character":7,"end_line":313,"end_character":67},"in_reply_to":"c86701eb_c42e7b92","updated":"2026-01-22 04:35:42.000000000","message":"yes row is the new value(in this case event is ROW_UPDATE so it tracks the diff part)\nRevised comment","commit_id":"326f0fcbcc17aa4dd0bf7ed785aa9e401c738793"}]}
