)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"d7194cf01da08626cbfb46189b00ba311871949e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"57af600c_63db54ee","updated":"2026-04-06 14:37:33.000000000","message":"recheck pep8 failure doesn\u0027t occur locally","commit_id":"4459f46e93b8eabe9f0dccb81bd95726408b5e18"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"12c6940c30b0e0a98347f50b3e56c67fe3455488","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"766544d3_c7404ac8","updated":"2026-06-29 23:37:54.000000000","message":"Thanks Slawek for the review. Please see my responses in line","commit_id":"0fcb370d8920500225325dcfa075a933e6711f0f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"859df544fd0bdd0f7e455a0fe6d83ebab16a0819","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"6bc73f5d_bd7c0063","updated":"2026-06-25 13:10:41.000000000","message":"recheck ML2/OVS driver job failure unrelated to change","commit_id":"0fcb370d8920500225325dcfa075a933e6711f0f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"7bd296b8ac2917739f1f2f7fc06e6aa0987c6a8a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"1bcab342_ff329d5a","updated":"2026-07-08 14:42:49.000000000","message":"recheck. Failures not related to change","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"091481b4e149dc536eab704dac14bdb0908900e1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"66ca13b7_3260d218","updated":"2026-09-03 13:10:03.000000000","message":"Just the one nit, will make sure Rodolfo has time to comment","commit_id":"a23ec772c14331f9617e1fa81066655023114d97"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a99957ff665e58ec4b66659450a97667469ab69f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"e2e0f711_14c5c9c0","updated":"2026-09-02 07:49:53.000000000","message":"as I see we are safe to go with this now, thanks for working on this feature","commit_id":"a23ec772c14331f9617e1fa81066655023114d97"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"bf0b0f110ace92cef66e2e1bf6af571d3495f64b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"49be0003_b7d23975","updated":"2026-09-08 18:34:09.000000000","message":"I had to rebase, so I addressed Brian\u0027s nit","commit_id":"073ec3acaf16b756ef0b5a4641af29df541356d7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"04da5b1cade809115b931a4f6b5a75e407ec6a8f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"552a263e_110a8b0a","updated":"2026-09-08 20:48:18.000000000","message":"recent pep8 change causing failures - https://review.opendev.org/c/openstack/neutron/+/1000648","commit_id":"073ec3acaf16b756ef0b5a4641af29df541356d7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"1d1c34043f8051051799abeb7308aa62a2987041","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"6f645e07_af10463f","updated":"2026-09-08 23:53:33.000000000","message":"recheck. neutron-ovn-tempest-ipv6-only-ovs-release job failed to build","commit_id":"559e50ac8a0849d6a43b4ddda844ad348583d2d3"}],"neutron/common/ovn/utils.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6d6aa6bc8c7bdc2bb61821eb93df44d1a036c0a0","unresolved":true,"context_lines":[{"line_number":300,"context_line":"        non_vlan \u003d ["},{"line_number":301,"context_line":"            s for s in net_segments"},{"line_number":302,"context_line":"            if (s.get(provider_net.NETWORK_TYPE) !\u003d"},{"line_number":303,"context_line":"                const.TYPE_VLAN)]"},{"line_number":304,"context_line":"        return len(non_vlan) \u003e 0"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    # Single-segment: flat provider-prefixed keys"}],"source_content_type":"text/x-python","patch_set":30,"id":"ac532940_5d7f03bb","line":303,"updated":"2026-06-26 09:04:43.000000000","message":"why you don\u0027t use here `is_vlan_segment()` function which you defined above?","commit_id":"0fcb370d8920500225325dcfa075a933e6711f0f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"12c6940c30b0e0a98347f50b3e56c67fe3455488","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        non_vlan \u003d ["},{"line_number":301,"context_line":"            s for s in net_segments"},{"line_number":302,"context_line":"            if (s.get(provider_net.NETWORK_TYPE) !\u003d"},{"line_number":303,"context_line":"                const.TYPE_VLAN)]"},{"line_number":304,"context_line":"        return len(non_vlan) \u003e 0"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    # Single-segment: flat provider-prefixed keys"}],"source_content_type":"text/x-python","patch_set":30,"id":"a06008ee_df03db60","line":303,"in_reply_to":"ac532940_5d7f03bb","updated":"2026-06-29 23:37:54.000000000","message":"Because it is two different things. The function is_vlan_segment receives as input a segment as returned by the segments plugin. It uses a definition like this (from https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/segment.py):\n\nNETWORK_TYPE \u003d \u0027network_type\u0027\n\nI use is_vlan_segment in the mechanism driver and the ovn client to process segments of this style.\n\nIn this function I am reading the segments off of a network\u0027s \u0027segments\u0027 attribute, which is a list. These segments are built using a definition like this (from https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/provider_net.py):\n\nNETWORK_TYPE \u003d \u0027provider:network_type\u0027\n\nThis function receives a network or reads a network, off of which it processes the segments","commit_id":"0fcb370d8920500225325dcfa075a933e6711f0f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6d6aa6bc8c7bdc2bb61821eb93df44d1a036c0a0","unresolved":true,"context_lines":[{"line_number":307,"context_line":"    net_type \u003d network.get(provider_net.NETWORK_TYPE)"},{"line_number":308,"context_line":"    if net_type is None:"},{"line_number":309,"context_line":"        return True"},{"line_number":310,"context_line":"    return net_type !\u003d const.TYPE_VLAN"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"def ovn_vhu_sockpath(sock_dir, port_id):"}],"source_content_type":"text/x-python","patch_set":30,"id":"20a23fe9_068e6a54","line":310,"updated":"2026-06-26 09:04:43.000000000","message":"ditto","commit_id":"0fcb370d8920500225325dcfa075a933e6711f0f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"12c6940c30b0e0a98347f50b3e56c67fe3455488","unresolved":false,"context_lines":[{"line_number":307,"context_line":"    net_type \u003d network.get(provider_net.NETWORK_TYPE)"},{"line_number":308,"context_line":"    if net_type is None:"},{"line_number":309,"context_line":"        return True"},{"line_number":310,"context_line":"    return net_type !\u003d const.TYPE_VLAN"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"def ovn_vhu_sockpath(sock_dir, port_id):"}],"source_content_type":"text/x-python","patch_set":30,"id":"e624d683_dd0684b9","line":310,"in_reply_to":"20a23fe9_068e6a54","updated":"2026-06-29 23:37:54.000000000","message":"Same explanation as above","commit_id":"0fcb370d8920500225325dcfa075a933e6711f0f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa294a7c03f0ee0e2e7558dd5e2ad3b082085594","unresolved":true,"context_lines":[{"line_number":304,"context_line":"    :param network: Network dict (avoids DB lookup)"},{"line_number":305,"context_line":"    :return: True if network needs its own logical switch"},{"line_number":306,"context_line":"    \"\"\""},{"line_number":307,"context_line":"    if not ovn_conf.is_logical_switch_per_vlan_segment_enabled():"},{"line_number":308,"context_line":"        return True"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    if not network:"}],"source_content_type":"text/x-python","patch_set":32,"id":"c8767c66_2d8c9844","line":307,"range":{"start_line":307,"start_character":4,"end_line":307,"end_character":65},"updated":"2026-07-20 10:15:43.000000000","message":"Why don\u0027t we detect the segments per host? Just checking `SegmentHostMapping`?","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"83f03cda095171991b52df5fcde13de5d503b4ad","unresolved":true,"context_lines":[{"line_number":304,"context_line":"    :param network: Network dict (avoids DB lookup)"},{"line_number":305,"context_line":"    :return: True if network needs its own logical switch"},{"line_number":306,"context_line":"    \"\"\""},{"line_number":307,"context_line":"    if not ovn_conf.is_logical_switch_per_vlan_segment_enabled():"},{"line_number":308,"context_line":"        return True"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"    if not network:"}],"source_content_type":"text/x-python","patch_set":32,"id":"7e154e24_5646c207","line":307,"range":{"start_line":307,"start_character":4,"end_line":307,"end_character":65},"in_reply_to":"c8767c66_2d8c9844","updated":"2026-08-10 21:32:21.000000000","message":"Since you don\u0027t provide any further suggestions as to how the SegmentHostMapping table could be used for this, I can only speculate what you had in mind.\n\nAre you suggesting that as soon as a second segment per host / network is detected in the SegmentHostMapping table, we would start associating segments to logical switches? If that\u0027s the case, let me remind you that we already have an implementation of routed networks in the ML2/OVN driver that is limited to one segment per host. It uses one logical switch for the entire network and the segment is represented by a localnet port in that switch that adds a vlan id to the packets. In the compute chassis there are no bridges per segment, just the bridge representing the localnet port associated to the physical interface. When a second (and subsequent) segments are detected, we would start associating segments to logical switches, handling the logical switch port creation during port binding (when we know the segment the port will be associated with) and we would require a specific bridge for the segment in the corresponding chassis, per the approved specification in [1]. How would we treat the segments and ports that were created during the one segment per host / network phase?\n\nOr are you suggesting that we get rid of the current one segment per host implementation and treat all the routed networks in the new way proposed by this series of patches? In that case, we wouldn\u0027t need to check the SegmentHostMapping table. There is no decision to be made. The problem with this approach is that we must assume that there are deployers out there happily using the current implementation and that don\u0027t have the need for more segments per host and segment. I don\u0027t think we should force them to migrate to the new implementation.\n\nFor the reasons explained above, I proposed the config option approach. With it, a deployer who wants to use the new style of routed networks under ML2/OVN commits to it from the start, for a specific deployment. No need to handle the coexistence of the old and new style. And there is no need to force anybody to migrate to the new style, if their needs are meet by the current implementation of routed networks.\n\n[1] https://specs.openstack.org/openstack/neutron-specs/specs/2026.1/multiple-segments-per-host-routed-net-ovn.html#proposed-change","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa294a7c03f0ee0e2e7558dd5e2ad3b082085594","unresolved":true,"context_lines":[{"line_number":324,"context_line":"        return len(non_vlan) \u003e 0"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # Single-segment: flat provider-prefixed keys"},{"line_number":327,"context_line":"    net_type \u003d network.get(provider_net.NETWORK_TYPE)"},{"line_number":328,"context_line":"    if net_type is None:"},{"line_number":329,"context_line":"        return True"},{"line_number":330,"context_line":"    return net_type !\u003d const.TYPE_VLAN"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"def ovn_vhu_sockpath(sock_dir, port_id):"}],"source_content_type":"text/x-python","patch_set":32,"id":"edff79fa_590b9186","line":330,"range":{"start_line":327,"start_character":4,"end_line":330,"end_character":38},"updated":"2026-07-20 10:15:43.000000000","message":"Couldn\u0027t this be just:\n`  return not is_vlan_segment(segment)`","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a99957ff665e58ec4b66659450a97667469ab69f","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        return len(non_vlan) \u003e 0"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # Single-segment: flat provider-prefixed keys"},{"line_number":327,"context_line":"    net_type \u003d network.get(provider_net.NETWORK_TYPE)"},{"line_number":328,"context_line":"    if net_type is None:"},{"line_number":329,"context_line":"        return True"},{"line_number":330,"context_line":"    return net_type !\u003d const.TYPE_VLAN"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"def ovn_vhu_sockpath(sock_dir, port_id):"}],"source_content_type":"text/x-python","patch_set":32,"id":"c462f942_09b1b862","line":330,"range":{"start_line":327,"start_character":4,"end_line":330,"end_character":38},"in_reply_to":"780fcba1_37babf42","updated":"2026-09-02 07:49:53.000000000","message":"+1","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"83f03cda095171991b52df5fcde13de5d503b4ad","unresolved":true,"context_lines":[{"line_number":324,"context_line":"        return len(non_vlan) \u003e 0"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # Single-segment: flat provider-prefixed keys"},{"line_number":327,"context_line":"    net_type \u003d network.get(provider_net.NETWORK_TYPE)"},{"line_number":328,"context_line":"    if net_type is None:"},{"line_number":329,"context_line":"        return True"},{"line_number":330,"context_line":"    return net_type !\u003d const.TYPE_VLAN"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"def ovn_vhu_sockpath(sock_dir, port_id):"}],"source_content_type":"text/x-python","patch_set":32,"id":"780fcba1_37babf42","line":330,"range":{"start_line":327,"start_character":4,"end_line":330,"end_character":38},"in_reply_to":"edff79fa_590b9186","updated":"2026-08-10 21:32:21.000000000","message":"No, because it is two different things. The function is_vlan_segment receives as input a segment as returned by the segments plugin. It uses a definition like this (from https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/segment.py):\n\nNETWORK_TYPE \u003d \u0027network_type\u0027\n\nI use is_vlan_segment in the mechanism driver and the ovn client to process segments of this style.\n\nIn this function I am reading the segments off of a network\u0027s \u0027segments\u0027 attribute, which is a list. These segments are built using a definition like this (from https://github.com/openstack/neutron-lib/blob/master/neutron_lib/api/definitions/provider_net.py):\n\nNETWORK_TYPE \u003d \u0027provider:network_type\u0027\n\nThis function receives a network or reads a network, off of which it processes the segments","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"091481b4e149dc536eab704dac14bdb0908900e1","unresolved":true,"context_lines":[{"line_number":317,"context_line":"    # Multi-segment: \u0027segments\u0027 key with provider-prefixed keys"},{"line_number":318,"context_line":"    net_segments \u003d network.get(\u0027segments\u0027)"},{"line_number":319,"context_line":"    if net_segments:"},{"line_number":320,"context_line":"        non_vlan \u003d ["},{"line_number":321,"context_line":"            s for s in net_segments"},{"line_number":322,"context_line":"            if (s.get(provider_net.NETWORK_TYPE) !\u003d"},{"line_number":323,"context_line":"                const.TYPE_VLAN)]"},{"line_number":324,"context_line":"        return len(non_vlan) \u003e 0"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # Single-segment: flat provider-prefixed keys"},{"line_number":327,"context_line":"    net_type \u003d network.get(provider_net.NETWORK_TYPE)"}],"source_content_type":"text/x-python","patch_set":34,"id":"c4addd24_a8ec258b","line":324,"range":{"start_line":320,"start_character":8,"end_line":324,"end_character":32},"updated":"2026-09-03 13:10:03.000000000","message":"nit: Could have used any() here, something like:\n\nreturn any(s for s in net_segments if s.get(provider_net.NETWORK_TYPE) !\u003d const.TYPE_VLAN)","commit_id":"a23ec772c14331f9617e1fa81066655023114d97"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"bf0b0f110ace92cef66e2e1bf6af571d3495f64b","unresolved":true,"context_lines":[{"line_number":317,"context_line":"    # Multi-segment: \u0027segments\u0027 key with provider-prefixed keys"},{"line_number":318,"context_line":"    net_segments \u003d network.get(\u0027segments\u0027)"},{"line_number":319,"context_line":"    if net_segments:"},{"line_number":320,"context_line":"        non_vlan \u003d ["},{"line_number":321,"context_line":"            s for s in net_segments"},{"line_number":322,"context_line":"            if (s.get(provider_net.NETWORK_TYPE) !\u003d"},{"line_number":323,"context_line":"                const.TYPE_VLAN)]"},{"line_number":324,"context_line":"        return len(non_vlan) \u003e 0"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # Single-segment: flat provider-prefixed keys"},{"line_number":327,"context_line":"    net_type \u003d network.get(provider_net.NETWORK_TYPE)"}],"source_content_type":"text/x-python","patch_set":34,"id":"6ed4fb84_b26b49c8","line":324,"range":{"start_line":320,"start_character":8,"end_line":324,"end_character":32},"in_reply_to":"c4addd24_a8ec258b","updated":"2026-09-08 18:34:09.000000000","message":"Done","commit_id":"a23ec772c14331f9617e1fa81066655023114d97"}],"neutron/db/ovn_revision_numbers_db.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"6d6aa6bc8c7bdc2bb61821eb93df44d1a036c0a0","unresolved":true,"context_lines":[{"line_number":217,"context_line":"    LOG.info(\u0027Successfully bumped revision number for resource \u0027"},{"line_number":218,"context_line":"             \u0027%(res_uuid)s (type: %(res_type)s) to %(rev_num)d\u0027,"},{"line_number":219,"context_line":"             {\u0027res_uuid\u0027: target_resource[\u0027id\u0027],"},{"line_number":220,"context_line":"              \u0027res_type\u0027: target_resource_type,"},{"line_number":221,"context_line":"              \u0027rev_num\u0027: revision_number})"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"358d9484_16745513","line":220,"updated":"2026-06-26 09:04:43.000000000","message":"nitty nit: maybe you can split this big patch in couple smaller ones, like for example this change IMHO may deserve own commit message with short explanation why it is needed. Wdyt?","commit_id":"0fcb370d8920500225325dcfa075a933e6711f0f"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"12c6940c30b0e0a98347f50b3e56c67fe3455488","unresolved":false,"context_lines":[{"line_number":217,"context_line":"    LOG.info(\u0027Successfully bumped revision number for resource \u0027"},{"line_number":218,"context_line":"             \u0027%(res_uuid)s (type: %(res_type)s) to %(rev_num)d\u0027,"},{"line_number":219,"context_line":"             {\u0027res_uuid\u0027: target_resource[\u0027id\u0027],"},{"line_number":220,"context_line":"              \u0027res_type\u0027: target_resource_type,"},{"line_number":221,"context_line":"              \u0027rev_num\u0027: revision_number})"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"486e6c82_6553ccda","line":220,"in_reply_to":"358d9484_16745513","updated":"2026-06-29 23:37:54.000000000","message":"You make a great point:\n\n- This change deserves its owns commit and explanation\n- Gives me a clean opportunity to split this big patch in two\n\nI\u0027ll implement your suggestion","commit_id":"0fcb370d8920500225325dcfa075a933e6711f0f"}],"neutron/objects/subnet.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa294a7c03f0ee0e2e7558dd5e2ad3b082085594","unresolved":true,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        if len(segment_ids) \u003e 1:"},{"line_number":387,"context_line":"            LOG.info(\"The network \u0027%s\u0027 has multiple segments, \""},{"line_number":388,"context_line":"                     \"this is currently supported by the OVS agent and the \""},{"line_number":389,"context_line":"                     \"ML2/OVN driver only.\","},{"line_number":390,"context_line":"                     network_id)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        return [subnet for subnet, _mapping in results]"}],"source_content_type":"text/x-python","patch_set":32,"id":"011b06c5_a40c0421","line":389,"range":{"start_line":388,"start_character":67,"end_line":389,"end_character":42},"updated":"2026-07-20 10:15:43.000000000","message":"But only if the config option is enabled","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"83f03cda095171991b52df5fcde13de5d503b4ad","unresolved":true,"context_lines":[{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        if len(segment_ids) \u003e 1:"},{"line_number":387,"context_line":"            LOG.info(\"The network \u0027%s\u0027 has multiple segments, \""},{"line_number":388,"context_line":"                     \"this is currently supported by the OVS agent and the \""},{"line_number":389,"context_line":"                     \"ML2/OVN driver only.\","},{"line_number":390,"context_line":"                     network_id)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        return [subnet for subnet, _mapping in results]"}],"source_content_type":"text/x-python","patch_set":32,"id":"ca0e20e4_16230664","line":389,"range":{"start_line":388,"start_character":67,"end_line":389,"end_character":42},"in_reply_to":"011b06c5_a40c0421","updated":"2026-08-10 21:32:21.000000000","message":"Done","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"}],"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":"aa294a7c03f0ee0e2e7558dd5e2ad3b082085594","unresolved":true,"context_lines":[{"line_number":1039,"context_line":"            self._ovn_client.create_port(context.plugin_context, port)"},{"line_number":1040,"context_line":"            self._notify_dhcp_updated(context.plugin_context, port[\u0027id\u0027])"},{"line_number":1041,"context_line":"        else:"},{"line_number":1042,"context_line":"            ovn_revision_numbers_db.bump_revision(context.plugin_context, port,"},{"line_number":1043,"context_line":"                                                  ovn_const.TYPE_PORTS)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"    def update_port_precommit(self, context):"},{"line_number":1046,"context_line":"        \"\"\"Update resources of a port."}],"source_content_type":"text/x-python","patch_set":32,"id":"56021b7c_d5afb6e1","line":1043,"range":{"start_line":1042,"start_character":12,"end_line":1043,"end_character":71},"updated":"2026-07-20 10:15:43.000000000","message":"Why do we need to bump the port that is not even created?","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a99957ff665e58ec4b66659450a97667469ab69f","unresolved":false,"context_lines":[{"line_number":1039,"context_line":"            self._ovn_client.create_port(context.plugin_context, port)"},{"line_number":1040,"context_line":"            self._notify_dhcp_updated(context.plugin_context, port[\u0027id\u0027])"},{"line_number":1041,"context_line":"        else:"},{"line_number":1042,"context_line":"            ovn_revision_numbers_db.bump_revision(context.plugin_context, port,"},{"line_number":1043,"context_line":"                                                  ovn_const.TYPE_PORTS)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"    def update_port_precommit(self, context):"},{"line_number":1046,"context_line":"        \"\"\"Update resources of a port."}],"source_content_type":"text/x-python","patch_set":32,"id":"b4d41d67_d587c08c","line":1043,"range":{"start_line":1042,"start_character":12,"end_line":1043,"end_character":71},"in_reply_to":"2e1c62fd_5eabcf57","updated":"2026-09-02 07:49:53.000000000","message":"thanks for the explanation, the above docstring can be extended later to make sure the logic you wrote in comment is visible for later maintainers, or visible if some OVN internal logic changes for example effecting this code also","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"83f03cda095171991b52df5fcde13de5d503b4ad","unresolved":true,"context_lines":[{"line_number":1039,"context_line":"            self._ovn_client.create_port(context.plugin_context, port)"},{"line_number":1040,"context_line":"            self._notify_dhcp_updated(context.plugin_context, port[\u0027id\u0027])"},{"line_number":1041,"context_line":"        else:"},{"line_number":1042,"context_line":"            ovn_revision_numbers_db.bump_revision(context.plugin_context, port,"},{"line_number":1043,"context_line":"                                                  ovn_const.TYPE_PORTS)"},{"line_number":1044,"context_line":""},{"line_number":1045,"context_line":"    def update_port_precommit(self, context):"},{"line_number":1046,"context_line":"        \"\"\"Update resources of a port."}],"source_content_type":"text/x-python","patch_set":32,"id":"2e1c62fd_5eabcf57","line":1043,"range":{"start_line":1042,"start_character":12,"end_line":1043,"end_character":71},"in_reply_to":"56021b7c_d5afb6e1","updated":"2026-08-10 21:32:21.000000000","message":"It is true that at this point, the corresponding logical switch port has not been created, because we don\u0027t know which logical switch it should be created on. We will know that when the port is bound and the corresponding segment has been determined. However, in my opinion, it is still desirable to make sure the ML2/OVN maintenance job doesn\u0027t create the logical switch port before we know the segment where the port is bound. If we don\u0027t bump the corresponding OVN revision number here, the maintenance job might get executed before the port is bound, it might detect a revision numbers  mismatch [1] and it might attempt to create the logical switch port [2]. In my opinion, it is better to be extra cautious here. In other words, we are signaling to the maintenance job that even if the logical switch port doesn\u0027t exist yet, that is consistent with the current status of the corresponding unbound Neutron port.\n\n[1] https://github.com/openstack/neutron/blob/8f6da0896f67801990bfa2535c958d96c2f60de5/neutron/db/ovn_revision_numbers_db.py#L229-L232\n[2] https://github.com/openstack/neutron/blob/8f6da0896f67801990bfa2535c958d96c2f60de5/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py#L325-L326","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa294a7c03f0ee0e2e7558dd5e2ad3b082085594","unresolved":true,"context_lines":[{"line_number":911,"context_line":"        network_id \u003d utils.get_neutron_name(ovn_network_name)"},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"        # For routed networks, use segment logical switch name"},{"line_number":914,"context_line":"        network_needs_lswitch_flag \u003d utils.network_needs_lswitch("},{"line_number":915,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":916,"context_line":"        if not network_needs_lswitch_flag:"},{"line_number":917,"context_line":"            port_segment_id \u003d ovn_port.external_ids.get("},{"line_number":918,"context_line":"                ovn_const.OVN_PORT_SEGMENT_EXT_ID_KEY)"}],"source_content_type":"text/x-python","patch_set":32,"id":"f3946a23_bc15baea","line":915,"range":{"start_line":914,"start_character":8,"end_line":915,"end_character":43},"updated":"2026-07-20 10:15:43.000000000","message":"Found by Claude: when a network is deleted, this method can be called too. But at this point, the network can be already gone in the Neutron DB. That would trigger `NetworkNotFound`","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"83f03cda095171991b52df5fcde13de5d503b4ad","unresolved":true,"context_lines":[{"line_number":911,"context_line":"        network_id \u003d utils.get_neutron_name(ovn_network_name)"},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"        # For routed networks, use segment logical switch name"},{"line_number":914,"context_line":"        network_needs_lswitch_flag \u003d utils.network_needs_lswitch("},{"line_number":915,"context_line":"            context, network_id\u003dnetwork_id)"},{"line_number":916,"context_line":"        if not network_needs_lswitch_flag:"},{"line_number":917,"context_line":"            port_segment_id \u003d ovn_port.external_ids.get("},{"line_number":918,"context_line":"                ovn_const.OVN_PORT_SEGMENT_EXT_ID_KEY)"}],"source_content_type":"text/x-python","patch_set":32,"id":"33d98c98_50f0d3a3","line":915,"range":{"start_line":914,"start_character":8,"end_line":915,"end_character":43},"in_reply_to":"f3946a23_bc15baea","updated":"2026-08-10 21:32:21.000000000","message":"Nice catch. The good news is that, after looking at this method again, I realized that the check in line 917 for OVN_PORT_SEGMENT_EXT_ID_KEY in the port\u0027s external_ids already tells us we are dealing with a VLAN-only routed network with logical switches representing segments. In other words, the call to utils.network_needs_lswitch is unnecessary, so I just removed it.","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa294a7c03f0ee0e2e7558dd5e2ad3b082085594","unresolved":true,"context_lines":[{"line_number":2292,"context_line":"            addresses\u003d[ovn_const.UNKNOWN_ADDR],"},{"line_number":2293,"context_line":"            external_ids\u003d{ovn_const.OVN_PHYSNET_EXT_ID_KEY: physnet},"},{"line_number":2294,"context_line":"            type\u003dovn_const.LSP_TYPE_LOCALNET,"},{"line_number":2295,"context_line":"            tag_request\u003dtag if network_needs_lswitch_flag else [],"},{"line_number":2296,"context_line":"            options\u003doptions))"},{"line_number":2297,"context_line":"        self._transaction(cmds, txn\u003dtxn)"},{"line_number":2298,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"561ffe84_a26067e2","line":2295,"range":{"start_line":2295,"start_character":30,"end_line":2295,"end_character":65},"updated":"2026-07-20 10:15:43.000000000","message":"Without the tag, this localnet port won\u0027t tag/untag the VLAN traffic. Am I missing something?","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"83f03cda095171991b52df5fcde13de5d503b4ad","unresolved":true,"context_lines":[{"line_number":2292,"context_line":"            addresses\u003d[ovn_const.UNKNOWN_ADDR],"},{"line_number":2293,"context_line":"            external_ids\u003d{ovn_const.OVN_PHYSNET_EXT_ID_KEY: physnet},"},{"line_number":2294,"context_line":"            type\u003dovn_const.LSP_TYPE_LOCALNET,"},{"line_number":2295,"context_line":"            tag_request\u003dtag if network_needs_lswitch_flag else [],"},{"line_number":2296,"context_line":"            options\u003doptions))"},{"line_number":2297,"context_line":"        self._transaction(cmds, txn\u003dtxn)"},{"line_number":2298,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"bc95fc06_712d4a51","line":2295,"range":{"start_line":2295,"start_character":30,"end_line":2295,"end_character":65},"in_reply_to":"561ffe84_a26067e2","updated":"2026-08-10 21:32:21.000000000","message":"Yes, you are missing the fact that, per the approved spec for this feature [1], each segment is now represented by an OVS bridge. There are a couple of patch ports linking the segment bridge to the external interface bridge. Let\u0027s say one of the segments has vlan-id 100 and that the external interface bridge is br-ex. Then the code in the OVN agent extension that is part of this implementation [2] is going to create the patch ports that would be created by the following commands:\n\nsudo ovs-vsctl add-br br-ex-100\nsudo ovs-vsctl \\\n\t-- add-port br-ex patch-ex-100 \\\n\t-- set interface patch-ex-100 type\u003dpatch options:peer\u003dpatch-100-ex \\\n\t-- add-port br-ex-100 patch-100-ex \\\n\t-- set interface patch-100-ex type\u003dpatch options:peer\u003dpatch-ex-100\nsudo ovs-vsctl set Port patch-ex-100 vlan_mode\u003daccess tag\u003d100\n\nPlease note that the vlan-id is now added and removed from the packets by the patch port on the physical interface bridge.\n\nIt is also important to mention that this all done in accordance to the guidance the OVN core team provided for this feature.\n\n[1] https://specs.openstack.org/openstack/neutron-specs/specs/2026.1/multiple-segments-per-host-routed-net-ovn.html#proposed-change\n[2] https://review.opendev.org/c/openstack/neutron/+/982018/21/neutron/agent/ovn/extensions/segment_bridge.py#286","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa294a7c03f0ee0e2e7558dd5e2ad3b082085594","unresolved":true,"context_lines":[{"line_number":2302,"context_line":"            # network creation (txn\u003dNone means called from"},{"line_number":2303,"context_line":"            # create_segment_provnet_port)"},{"line_number":2304,"context_line":"            if txn is None:"},{"line_number":2305,"context_line":"                db_rev.bump_revision("},{"line_number":2306,"context_line":"                    context, network, ovn_const.TYPE_NETWORKS,"},{"line_number":2307,"context_line":"                    dependent_resource\u003dsegment,"},{"line_number":2308,"context_line":"                    dependent_resource_type\u003dovn_const.TYPE_SEGMENTS)"},{"line_number":2309,"context_line":"            self.create_metadata_port(context, network, segment[\u0027id\u0027])"},{"line_number":2310,"context_line":""},{"line_number":2311,"context_line":"    def delete_provnet_port(self, network_id, segment, for_net_delete\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":32,"id":"af011c36_2138c049","line":2308,"range":{"start_line":2305,"start_character":16,"end_line":2308,"end_character":68},"updated":"2026-07-20 10:15:43.000000000","message":"I already mentioned this in the previous patch. IMO, this approach is more complicated than just updating the segments revision number when the network is updated. That would keep the segments resource at the same level as the others, instead of introducing a complex mechanism to deal with only one resource.","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"83f03cda095171991b52df5fcde13de5d503b4ad","unresolved":true,"context_lines":[{"line_number":2302,"context_line":"            # network creation (txn\u003dNone means called from"},{"line_number":2303,"context_line":"            # create_segment_provnet_port)"},{"line_number":2304,"context_line":"            if txn is None:"},{"line_number":2305,"context_line":"                db_rev.bump_revision("},{"line_number":2306,"context_line":"                    context, network, ovn_const.TYPE_NETWORKS,"},{"line_number":2307,"context_line":"                    dependent_resource\u003dsegment,"},{"line_number":2308,"context_line":"                    dependent_resource_type\u003dovn_const.TYPE_SEGMENTS)"},{"line_number":2309,"context_line":"            self.create_metadata_port(context, network, segment[\u0027id\u0027])"},{"line_number":2310,"context_line":""},{"line_number":2311,"context_line":"    def delete_provnet_port(self, network_id, segment, for_net_delete\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":32,"id":"c98c5f0c_dc036935","line":2308,"range":{"start_line":2305,"start_character":16,"end_line":2308,"end_character":68},"in_reply_to":"af011c36_2138c049","updated":"2026-08-10 21:32:21.000000000","message":"We settled this conversation in https://review.opendev.org/c/openstack/neutron/+/995608/comment/0d542367_421e5cf6/","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa294a7c03f0ee0e2e7558dd5e2ad3b082085594","unresolved":true,"context_lines":[{"line_number":2318,"context_line":"        if is_vlan_segment_deletion:"},{"line_number":2319,"context_line":"            # VLAN segments: Delete segment logical switch"},{"line_number":2320,"context_line":"            if not for_net_delete:"},{"line_number":2321,"context_line":"                metadata_port \u003d self._find_metadata_port(context, network_id,"},{"line_number":2322,"context_line":"                                                         segment[\u0027id\u0027])"},{"line_number":2323,"context_line":"                self._plugin.delete_port(context, metadata_port[\u0027id\u0027])"},{"line_number":2324,"context_line":"            segment_lswitch_name \u003d utils.ovn_name(segment[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":32,"id":"52fa2911_14dc9db1","line":2321,"range":{"start_line":2321,"start_character":16,"end_line":2321,"end_character":29},"updated":"2026-07-20 10:15:43.000000000","message":"This could be `None`","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"83f03cda095171991b52df5fcde13de5d503b4ad","unresolved":true,"context_lines":[{"line_number":2318,"context_line":"        if is_vlan_segment_deletion:"},{"line_number":2319,"context_line":"            # VLAN segments: Delete segment logical switch"},{"line_number":2320,"context_line":"            if not for_net_delete:"},{"line_number":2321,"context_line":"                metadata_port \u003d self._find_metadata_port(context, network_id,"},{"line_number":2322,"context_line":"                                                         segment[\u0027id\u0027])"},{"line_number":2323,"context_line":"                self._plugin.delete_port(context, metadata_port[\u0027id\u0027])"},{"line_number":2324,"context_line":"            segment_lswitch_name \u003d utils.ovn_name(segment[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":32,"id":"880fe693_334d4b84","line":2321,"range":{"start_line":2321,"start_character":16,"end_line":2321,"end_character":29},"in_reply_to":"52fa2911_14dc9db1","updated":"2026-08-10 21:32:21.000000000","message":"Done","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"0d3d92d571a4e584a315e22ebd06b47489a49456","unresolved":true,"context_lines":[{"line_number":2318,"context_line":"        if is_vlan_segment_deletion:"},{"line_number":2319,"context_line":"            # VLAN segments: Delete segment logical switch"},{"line_number":2320,"context_line":"            if not for_net_delete:"},{"line_number":2321,"context_line":"                metadata_port \u003d self._find_metadata_port(context, network_id,"},{"line_number":2322,"context_line":"                                                         segment[\u0027id\u0027])"},{"line_number":2323,"context_line":"                self._plugin.delete_port(context, metadata_port[\u0027id\u0027])"},{"line_number":2324,"context_line":"            segment_lswitch_name \u003d utils.ovn_name(segment[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":32,"id":"2de129f5_3028fa41","line":2321,"range":{"start_line":2321,"start_character":16,"end_line":2321,"end_character":29},"in_reply_to":"880fe693_334d4b84","updated":"2026-08-10 21:50:50.000000000","message":"Added a None guard for the self._plugin.delete_port call below","commit_id":"639305281e564f427b2c3c6b0913d6d07a916a75"}],"neutron/tests/unit/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovn_client.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9f77ff956d3c2313447444a1096f084b13c7ac03","unresolved":false,"context_lines":[{"line_number":757,"context_line":"        self._setup_delete_port_mocks(ovn_port, ls)"},{"line_number":758,"context_line":""},{"line_number":759,"context_line":"        ctx \u003d ncontext.Context()"},{"line_number":760,"context_line":"        self.ovn_client._delete_port(ctx, port_id)"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"        self.nb_idl.unset_lswitch_port_to_virtual_type.assert_called_once_with("},{"line_number":763,"context_line":"            \u0027virtual-port\u0027, port_id, if_exists\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":29,"id":"8c53f22a_f9de921d","line":760,"updated":"2026-06-16 01:35:52.000000000","message":"pep8: E1120: No value for argument \u0027check_rev_cmd\u0027 in method call (no-value-for-parameter)","commit_id":"9960188061901088660e0667806d88ca6d860554"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9f77ff956d3c2313447444a1096f084b13c7ac03","unresolved":false,"context_lines":[{"line_number":779,"context_line":"        self._setup_delete_port_mocks(ovn_port, ls)"},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        ctx \u003d ncontext.Context()"},{"line_number":782,"context_line":"        self.ovn_client._delete_port(ctx, port_id)"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"        self.nb_idl.unset_lswitch_port_to_virtual_type.assert_not_called()"},{"line_number":785,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"f868553c_168cfb5a","line":782,"updated":"2026-06-16 01:35:52.000000000","message":"pep8: E1120: No value for argument \u0027check_rev_cmd\u0027 in method call (no-value-for-parameter)","commit_id":"9960188061901088660e0667806d88ca6d860554"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9f77ff956d3c2313447444a1096f084b13c7ac03","unresolved":false,"context_lines":[{"line_number":796,"context_line":"        self._setup_delete_port_mocks(ovn_port, ls\u003dNone)"},{"line_number":797,"context_line":""},{"line_number":798,"context_line":"        ctx \u003d ncontext.Context()"},{"line_number":799,"context_line":"        self.ovn_client._delete_port(ctx, port_id)"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"        calls \u003d [c for c in self.nb_idl.lookup.call_args_list"},{"line_number":802,"context_line":"                 if c[0][0] \u003d\u003d \u0027Logical_Switch\u0027]"}],"source_content_type":"text/x-python","patch_set":29,"id":"4169c7b1_435b9208","line":799,"updated":"2026-06-16 01:35:52.000000000","message":"pep8: E1120: No value for argument \u0027check_rev_cmd\u0027 in method call (no-value-for-parameter)","commit_id":"9960188061901088660e0667806d88ca6d860554"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9f77ff956d3c2313447444a1096f084b13c7ac03","unresolved":false,"context_lines":[{"line_number":821,"context_line":"        self._setup_delete_port_mocks(ovn_port, ls)"},{"line_number":822,"context_line":""},{"line_number":823,"context_line":"        ctx \u003d ncontext.Context()"},{"line_number":824,"context_line":"        self.ovn_client._delete_port(ctx, port_id)"},{"line_number":825,"context_line":""},{"line_number":826,"context_line":"        self.nb_idl.unset_lswitch_port_to_virtual_type.assert_not_called()"},{"line_number":827,"context_line":"    # --- Multiple-segments-per-host tests ---"}],"source_content_type":"text/x-python","patch_set":29,"id":"08d47617_e6b5e15e","line":824,"updated":"2026-06-16 01:35:52.000000000","message":"pep8: E1120: No value for argument \u0027check_rev_cmd\u0027 in method call (no-value-for-parameter)","commit_id":"9960188061901088660e0667806d88ca6d860554"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"04da5b1cade809115b931a4f6b5a75e407ec6a8f","unresolved":true,"context_lines":[{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"        self.assertEqual({\u0027id\u0027: \u0027meta-port\u0027}, result)"},{"line_number":1230,"context_line":"        plugin.get_ports.assert_called_once_with("},{"line_number":1231,"context_line":"            ctx, filters\u003ddict("},{"line_number":1232,"context_line":"                network_id\u003d[\u0027fake-net-id\u0027],"},{"line_number":1233,"context_line":"                device_id\u003d[constants.OVN_METADATA_PREFIX + \u0027seg-1\u0027],"},{"line_number":1234,"context_line":"                device_owner\u003d[const.DEVICE_OWNER_DISTRIBUTED]),"}],"source_content_type":"text/x-python","patch_set":35,"id":"ef6ed195_08ee6dbd","line":1231,"range":{"start_line":1231,"start_character":25,"end_line":1231,"end_character":30},"updated":"2026-09-08 20:48:18.000000000","message":"this needs to be {} instead of dict()","commit_id":"073ec3acaf16b756ef0b5a4641af29df541356d7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6b54bff01512d7d94adf84b9c9c891ade7661778","unresolved":true,"context_lines":[{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"        self.assertEqual({\u0027id\u0027: \u0027meta-port\u0027}, result)"},{"line_number":1230,"context_line":"        plugin.get_ports.assert_called_once_with("},{"line_number":1231,"context_line":"            ctx, filters\u003ddict("},{"line_number":1232,"context_line":"                network_id\u003d[\u0027fake-net-id\u0027],"},{"line_number":1233,"context_line":"                device_id\u003d[constants.OVN_METADATA_PREFIX + \u0027seg-1\u0027],"},{"line_number":1234,"context_line":"                device_owner\u003d[const.DEVICE_OWNER_DISTRIBUTED]),"}],"source_content_type":"text/x-python","patch_set":35,"id":"b5a80ece_d888ca75","line":1231,"range":{"start_line":1231,"start_character":25,"end_line":1231,"end_character":30},"in_reply_to":"ef6ed195_08ee6dbd","updated":"2026-09-08 20:54:32.000000000","message":"Done","commit_id":"073ec3acaf16b756ef0b5a4641af29df541356d7"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"04da5b1cade809115b931a4f6b5a75e407ec6a8f","unresolved":true,"context_lines":[{"line_number":1246,"context_line":""},{"line_number":1247,"context_line":"        self.assertEqual({\u0027id\u0027: \u0027meta-port\u0027}, result)"},{"line_number":1248,"context_line":"        plugin.get_ports.assert_called_once_with("},{"line_number":1249,"context_line":"            ctx, filters\u003ddict("},{"line_number":1250,"context_line":"                network_id\u003d[\u0027fake-net-id\u0027],"},{"line_number":1251,"context_line":"                device_id\u003d[constants.OVN_METADATA_PREFIX + \u0027fake-net-id\u0027],"},{"line_number":1252,"context_line":"                device_owner\u003d[const.DEVICE_OWNER_DISTRIBUTED]),"}],"source_content_type":"text/x-python","patch_set":35,"id":"fce61f5b_6ea0c974","line":1249,"range":{"start_line":1249,"start_character":25,"end_line":1249,"end_character":29},"updated":"2026-09-08 20:48:18.000000000","message":"same","commit_id":"073ec3acaf16b756ef0b5a4641af29df541356d7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6b54bff01512d7d94adf84b9c9c891ade7661778","unresolved":true,"context_lines":[{"line_number":1246,"context_line":""},{"line_number":1247,"context_line":"        self.assertEqual({\u0027id\u0027: \u0027meta-port\u0027}, result)"},{"line_number":1248,"context_line":"        plugin.get_ports.assert_called_once_with("},{"line_number":1249,"context_line":"            ctx, filters\u003ddict("},{"line_number":1250,"context_line":"                network_id\u003d[\u0027fake-net-id\u0027],"},{"line_number":1251,"context_line":"                device_id\u003d[constants.OVN_METADATA_PREFIX + \u0027fake-net-id\u0027],"},{"line_number":1252,"context_line":"                device_owner\u003d[const.DEVICE_OWNER_DISTRIBUTED]),"}],"source_content_type":"text/x-python","patch_set":35,"id":"e94c2f84_b5bcf8bd","line":1249,"range":{"start_line":1249,"start_character":25,"end_line":1249,"end_character":29},"in_reply_to":"fce61f5b_6ea0c974","updated":"2026-09-08 20:54:32.000000000","message":"Done","commit_id":"073ec3acaf16b756ef0b5a4641af29df541356d7"}]}
