)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"dfd1c3dd12ad538e38be97d3a048d16b2be3334f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9a47f287_c18ae8b3","updated":"2025-09-03 07:14:54.000000000","message":"In addition to the human operator controlled sync script, there is also periodic maintenance happening in the server at runtime [0].  Is the same code used in both places and do these changes address those as well?\n\nI wonder if the topic of the change should be set to `bug/2027742` so that it becomes apparent that this change goes in hand with [1].\n\n0: https://github.com/openstack/neutron/blob/8066aebe97255b01043fe6086792ad37cbc0f494/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py#L170-L241\n1: https://review.opendev.org/c/openstack/neutron/+/907489","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"3ce6721a78f4493ed6dd2c2a25de928531a2d63d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"f4a8ca0f_030a7469","updated":"2025-09-08 11:12:40.000000000","message":"Thank you for the review @fnordahl@ubuntu.com. I think the biggest think to address here is the part about the `maintenance.py`.","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"84324c38ef6b9b2b8cf3c4f4c16dcf6b576f022e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c8459ff1_5c96fb74","in_reply_to":"728a47d1_8bcebb91","updated":"2025-09-08 21:15:30.000000000","message":"The maintenance script was addressed in the latest update. I didn\u0027t want to bloat the commit message more that it already is, but since analyzed it, I might as well share why each maintenance method either was or was not updated.\n\nHarmless methods (unchanged):\n* `update_lrouter_ports_ext_ids_name_prefix` - Already filters router ports by external_ids\n* `check_global_dhcp_opts` - Iterates only over Neutron subnets\n* `check_redirect_type_router_gateway_ports` - Iterates only over Neutron ports \n* `check_provider_distributed_ports` - Iterates only over Neutron ports\n* `check_fdb_aging_settings` - Iterates only over Neutron networks\n* `update_mac_aging_settings` - Updates NB_Global table\n* `check_router_default_route_empty_dst_ip` - Already filters by external_ids\n* `check_fair_meter_consistency` - Only creates Meters\n* `cleanup_old_hash_ring_nodes` - Cleans up entries only in the Neutron DB\n* `configure_nb_global` - Updates NB_Global table\n* `update_router_distributed_flag` - Updates entries only in the Neutron DB\n* `update_nat_floating_ip_with_gateway_port_reference` - Uses function that already filters external LRs and LRPs\n* `remove_invalid_gateway_chassis_from_unbound_lrp` - Already filters by external_ids\n* `check_network_broadcast_arps_to_all_routers` - Iterates only over Neutron Networks\n* `update_router_static_routes` - Uses function that already filters external LRs \n* `set_fip_distributed_flag` - Updates NB_Global table\n* `set_ovn_owned_dns_option` - Already Filters by external_id\n* `update_qos_fip_rule_priority` - Already filters by external_id\n\nMeddling methods (changed):\n* `check_for_igmp_snoop_support`\n* `check_for_ha_chassis_group`\n* `set_network_type`\n\nMeddling methods (unchanged):\n* `check_localnet_port_has_learn_fdb` - This method operates over all LSPs of type `localnet`. However there are no `external_ids` on localnet ports, so I didn\u0027t find a way to distinguish which are owned by neutron and which are not. I guess we\u0027ll have to accept that Neutron sets FDB learning option for all localnet ports.","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"3ce6721a78f4493ed6dd2c2a25de928531a2d63d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"728a47d1_8bcebb91","in_reply_to":"9a47f287_c18ae8b3","updated":"2025-09-08 11:12:40.000000000","message":"I think that your point about the `maintenance.py` is valid. While it is not directly mentioned in the spec for the Coexistence, and it doesn\u0027t look like it would remove OVN resources, it can still tamper with them. For example, function `check_localnet_port_has_learn_fdb`[2] would alter options on LSPs regardless of whether Neutron owns them or not.\nUnfortunately, there doesn\u0027t seem to be a common interface that the maintenance script uses to talk to the OVN, so it will have to be fixed manually for each method.\n\n\n[2] https://opendev.org/openstack/neutron/src/commit/b211df91019ac95be8516748c6209f90826806e4/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py#L632","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"fb2ef4a63b87171a60e08dc8d04063f555948978","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"43febd35_d782aeb2","updated":"2025-09-10 08:08:19.000000000","message":"Thank you for the review Brian. The usage of \u0027constants\u0027 should\u0027ve been a no-brainer. My bad.\nAll your comments should be addressed.","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"f3eff49556dec604298fd60c930fa75a0ff34be0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0b9db867_9e0a6b40","updated":"2025-09-10 15:46:51.000000000","message":"Thanks for another round Brian. Your comments should be addressed in the latest version.","commit_id":"6d77c4dd25e827ba01775d8065c3c63955eae953"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42bf0fcfb73079253ce1dd7597e42791dbdc0cc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"f5deb791_cac7a390","updated":"2025-09-22 20:50:40.000000000","message":"To my surprise the db_sync already considers only objects that have the external_ids set 😊\n\nI left one question, maybe we could leave a TODO there if it\u0027s not addressed in this patch. Otherwise LGTM","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"fcab3e8e60986fd90cf7fe437d849ac12e5a7f2e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ccaf3115_b3a164ab","updated":"2025-09-25 00:25:09.000000000","message":"Let\u0027s see if Kuba is good with this.","commit_id":"ff57491a976e0a8b4945f7dd55096370c744c76a"}],"neutron/common/ovn/constants.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"10a07781949784b99cfdb31f29f1817fcc9cd11c","unresolved":true,"context_lines":[{"line_number":57,"context_line":"OVN_LRSR_EXT_ID_KEY \u003d \u0027neutron:is_static_route\u0027"},{"line_number":58,"context_line":"OVN_FIP_DISTRIBUTED_KEY \u003d \u0027neutron:fip-distributed\u0027"},{"line_number":59,"context_line":"OVN_ADDRESS_GROUP_ID_KEY \u003d \u0027neutron:address_group_id\u0027"},{"line_number":60,"context_line":"DEVICE_OWNER_NEUTRON_PREFIX \u003d \u0027neutron:\u0027"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"MIGRATING_ATTR \u003d \u0027migrating_to\u0027"},{"line_number":63,"context_line":"OVN_ROUTER_PORT_OPTION_KEYS \u003d [\u0027router-port\u0027, \u0027nat-addresses\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"d0e91c2f_8b7e37d3","line":60,"updated":"2025-09-10 14:54:46.000000000","message":"This is already defined in neutron-lib, we should not redefine it here","commit_id":"6d77c4dd25e827ba01775d8065c3c63955eae953"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"f3eff49556dec604298fd60c930fa75a0ff34be0","unresolved":false,"context_lines":[{"line_number":57,"context_line":"OVN_LRSR_EXT_ID_KEY \u003d \u0027neutron:is_static_route\u0027"},{"line_number":58,"context_line":"OVN_FIP_DISTRIBUTED_KEY \u003d \u0027neutron:fip-distributed\u0027"},{"line_number":59,"context_line":"OVN_ADDRESS_GROUP_ID_KEY \u003d \u0027neutron:address_group_id\u0027"},{"line_number":60,"context_line":"DEVICE_OWNER_NEUTRON_PREFIX \u003d \u0027neutron:\u0027"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"MIGRATING_ATTR \u003d \u0027migrating_to\u0027"},{"line_number":63,"context_line":"OVN_ROUTER_PORT_OPTION_KEYS \u003d [\u0027router-port\u0027, \u0027nat-addresses\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"a9dfc9d4_05645186","line":60,"in_reply_to":"d0e91c2f_8b7e37d3","updated":"2025-09-10 15:46:51.000000000","message":"Oh, I was grep-ing only project files, that\u0027s why I missed it. Sorry for the churn.","commit_id":"6d77c4dd25e827ba01775d8065c3c63955eae953"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py":[{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"dfd1c3dd12ad538e38be97d3a048d16b2be3334f","unresolved":true,"context_lines":[{"line_number":341,"context_line":"                continue"},{"line_number":342,"context_line":"            lrports \u003d {}"},{"line_number":343,"context_line":"            for lrport in getattr(lrouter, \u0027ports\u0027, []):"},{"line_number":344,"context_line":"                if ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY in lrport.external_ids:"},{"line_number":345,"context_line":"                    lrports[lrport.name.replace(\u0027lrp-\u0027, \u0027\u0027)] \u003d lrport.networks"},{"line_number":346,"context_line":"            sroutes \u003d []"},{"line_number":347,"context_line":"            for sroute in getattr(lrouter, \u0027static_routes\u0027, []):"}],"source_content_type":"text/x-python","patch_set":2,"id":"619f446d_25c03528","line":344,"updated":"2025-09-03 07:14:54.000000000","message":"You can add if statements to Dict comprehensions for filtering, so what is the reasoning behind refactoring it to a for loop?","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"84324c38ef6b9b2b8cf3c4f4c16dcf6b576f022e","unresolved":true,"context_lines":[{"line_number":341,"context_line":"                continue"},{"line_number":342,"context_line":"            lrports \u003d {}"},{"line_number":343,"context_line":"            for lrport in getattr(lrouter, \u0027ports\u0027, []):"},{"line_number":344,"context_line":"                if ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY in lrport.external_ids:"},{"line_number":345,"context_line":"                    lrports[lrport.name.replace(\u0027lrp-\u0027, \u0027\u0027)] \u003d lrport.networks"},{"line_number":346,"context_line":"            sroutes \u003d []"},{"line_number":347,"context_line":"            for sroute in getattr(lrouter, \u0027static_routes\u0027, []):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3b4a2a3d_95d5537c","line":344,"in_reply_to":"1ddae0b4_cc8be8ad","updated":"2025-09-08 21:15:30.000000000","message":"I actually went ahead and changed it to dict comprehension (for both `lrports` and `sroutes`)","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"3ce6721a78f4493ed6dd2c2a25de928531a2d63d","unresolved":true,"context_lines":[{"line_number":341,"context_line":"                continue"},{"line_number":342,"context_line":"            lrports \u003d {}"},{"line_number":343,"context_line":"            for lrport in getattr(lrouter, \u0027ports\u0027, []):"},{"line_number":344,"context_line":"                if ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY in lrport.external_ids:"},{"line_number":345,"context_line":"                    lrports[lrport.name.replace(\u0027lrp-\u0027, \u0027\u0027)] \u003d lrport.networks"},{"line_number":346,"context_line":"            sroutes \u003d []"},{"line_number":347,"context_line":"            for sroute in getattr(lrouter, \u0027static_routes\u0027, []):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ddae0b4_cc8be8ad","line":344,"in_reply_to":"619f446d_25c03528","updated":"2025-09-08 11:12:40.000000000","message":"I\u0027m big fan of comprehensions, but I do tend to fall back to the for-loops if the complexity of the comprehensions makes me split it across multiple lines. In this case the comprehensions would look like:\n```\nlrports \u003d {lrport.name.replace(\u0027lrp-\u0027, \u0027\u0027): lrport.networks\n           for lrport in getattr(lrouter, \u0027ports\u0027, [])\n           if ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY in lrport.external_ids}\n```\nWhich, imo, doesn\u0027t add much readability compared to the regular for loop. There may be some minor performance improvements to dict comprehensions, but I haven\u0027t tested whether they are worth considering.\nAdditionally, the approach with full for-loop follows the pattern used for looking up switch ports [0].\n\nAll that being said, I don\u0027t have strong opinion on this. If you\u0027d prefer dict comprehension, I\u0027ll update it.\n\n[0] https://opendev.org/openstack/neutron/src/branch/master/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py#L308-L316","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"dfd1c3dd12ad538e38be97d3a048d16b2be3334f","unresolved":true,"context_lines":[{"line_number":345,"context_line":"                    lrports[lrport.name.replace(\u0027lrp-\u0027, \u0027\u0027)] \u003d lrport.networks"},{"line_number":346,"context_line":"            sroutes \u003d []"},{"line_number":347,"context_line":"            for sroute in getattr(lrouter, \u0027static_routes\u0027, []):"},{"line_number":348,"context_line":"                if any(e_id.startswith(\"neutron:\")"},{"line_number":349,"context_line":"                       for e_id in sroute.external_ids):"},{"line_number":350,"context_line":"                    sroutes.append("},{"line_number":351,"context_line":"                        {"}],"source_content_type":"text/x-python","patch_set":2,"id":"1eca51ac_e4a28543","line":348,"updated":"2025-09-03 07:14:54.000000000","message":"You can add if statements to List comprehensions for filtering, so what is the reasoning behind refactoring it to a for loop?","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"3ce6721a78f4493ed6dd2c2a25de928531a2d63d","unresolved":true,"context_lines":[{"line_number":345,"context_line":"                    lrports[lrport.name.replace(\u0027lrp-\u0027, \u0027\u0027)] \u003d lrport.networks"},{"line_number":346,"context_line":"            sroutes \u003d []"},{"line_number":347,"context_line":"            for sroute in getattr(lrouter, \u0027static_routes\u0027, []):"},{"line_number":348,"context_line":"                if any(e_id.startswith(\"neutron:\")"},{"line_number":349,"context_line":"                       for e_id in sroute.external_ids):"},{"line_number":350,"context_line":"                    sroutes.append("},{"line_number":351,"context_line":"                        {"}],"source_content_type":"text/x-python","patch_set":2,"id":"68617f15_4c6feaf9","line":348,"in_reply_to":"1eca51ac_e4a28543","updated":"2025-09-08 11:12:40.000000000","message":"Please see my reply to your previous comment. We can keep the conversation there and apply the result to both instances.","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"615236c462f0363494d86aa0800a84a6d874c123","unresolved":true,"context_lines":[{"line_number":347,"context_line":"            sroutes \u003d ["},{"line_number":348,"context_line":"                {\u0027destination\u0027: route.ip_prefix, \u0027nexthop\u0027: route.nexthop}"},{"line_number":349,"context_line":"                for route in getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":350,"context_line":"                if any(eid.startswith(\u0027neutron:\u0027)"},{"line_number":351,"context_line":"                       for eid in route.external_ids)"},{"line_number":352,"context_line":"            ]"},{"line_number":353,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3e35bd8b_54039843","line":350,"range":{"start_line":350,"start_character":38,"end_line":350,"end_character":48},"updated":"2025-09-09 16:50:53.000000000","message":"Can use constants.DEVICE_OWNER_NEUTRON_PREFIX","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"fb2ef4a63b87171a60e08dc8d04063f555948978","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            sroutes \u003d ["},{"line_number":348,"context_line":"                {\u0027destination\u0027: route.ip_prefix, \u0027nexthop\u0027: route.nexthop}"},{"line_number":349,"context_line":"                for route in getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":350,"context_line":"                if any(eid.startswith(\u0027neutron:\u0027)"},{"line_number":351,"context_line":"                       for eid in route.external_ids)"},{"line_number":352,"context_line":"            ]"},{"line_number":353,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"298f4d86_8f7ba3c7","line":350,"range":{"start_line":350,"start_character":38,"end_line":350,"end_character":48},"in_reply_to":"3e35bd8b_54039843","updated":"2025-09-10 08:08:19.000000000","message":"Done","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"10a07781949784b99cfdb31f29f1817fcc9cd11c","unresolved":true,"context_lines":[{"line_number":347,"context_line":"            sroutes \u003d ["},{"line_number":348,"context_line":"                {\u0027destination\u0027: route.ip_prefix, \u0027nexthop\u0027: route.nexthop}"},{"line_number":349,"context_line":"                for route in getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":350,"context_line":"                if any(eid.startswith(ovn_const.DEVICE_OWNER_NEUTRON_PREFIX)"},{"line_number":351,"context_line":"                       for eid in route.external_ids)"},{"line_number":352,"context_line":"            ]"},{"line_number":353,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"cd8b36f2_9551ef08","line":350,"range":{"start_line":350,"start_character":38,"end_line":350,"end_character":47},"updated":"2025-09-10 14:54:46.000000000","message":"s/constants so it uses the neutron-lib one","commit_id":"6d77c4dd25e827ba01775d8065c3c63955eae953"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"f3eff49556dec604298fd60c930fa75a0ff34be0","unresolved":false,"context_lines":[{"line_number":347,"context_line":"            sroutes \u003d ["},{"line_number":348,"context_line":"                {\u0027destination\u0027: route.ip_prefix, \u0027nexthop\u0027: route.nexthop}"},{"line_number":349,"context_line":"                for route in getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":350,"context_line":"                if any(eid.startswith(ovn_const.DEVICE_OWNER_NEUTRON_PREFIX)"},{"line_number":351,"context_line":"                       for eid in route.external_ids)"},{"line_number":352,"context_line":"            ]"},{"line_number":353,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"74c5aac9_f0cebe6b","line":350,"range":{"start_line":350,"start_character":38,"end_line":350,"end_character":47},"in_reply_to":"cd8b36f2_9551ef08","updated":"2025-09-10 15:46:51.000000000","message":"Done","commit_id":"6d77c4dd25e827ba01775d8065c3c63955eae953"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py":[{"author":{"_account_id":13686,"name":"Frode Nordahl","email":"fnordahl@ubuntu.com","username":"fnordahl"},"change_message_id":"dfd1c3dd12ad538e38be97d3a048d16b2be3334f","unresolved":true,"context_lines":[{"line_number":207,"context_line":"        for pg in port_groups:"},{"line_number":208,"context_line":"            # Default neutron \"drop pg\" does NOT have any external IDs, but"},{"line_number":209,"context_line":"            # we still want to manage it, so we match it on its name."},{"line_number":210,"context_line":"            if ovn_const.OVN_SG_EXT_ID_KEY in pg.external_ids or \\"},{"line_number":211,"context_line":"                    pg.name \u003d\u003d ovn_const.OVN_DROP_PORT_GROUP_NAME:"},{"line_number":212,"context_line":"                ovn_pgs.add(pg.name)"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"db556bce_321f7212","line":210,"updated":"2025-09-03 07:14:54.000000000","message":"`\\` is an abomination for the day when there is absolutely no other option.\n\nEnclose the expression in parens (`()`) instead.","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"84324c38ef6b9b2b8cf3c4f4c16dcf6b576f022e","unresolved":true,"context_lines":[{"line_number":207,"context_line":"        for pg in port_groups:"},{"line_number":208,"context_line":"            # Default neutron \"drop pg\" does NOT have any external IDs, but"},{"line_number":209,"context_line":"            # we still want to manage it, so we match it on its name."},{"line_number":210,"context_line":"            if ovn_const.OVN_SG_EXT_ID_KEY in pg.external_ids or \\"},{"line_number":211,"context_line":"                    pg.name \u003d\u003d ovn_const.OVN_DROP_PORT_GROUP_NAME:"},{"line_number":212,"context_line":"                ovn_pgs.add(pg.name)"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"a2119969_2e61af35","line":210,"in_reply_to":"86199a86_e4b7cb31","updated":"2025-09-08 21:15:30.000000000","message":"Fixed","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"3ce6721a78f4493ed6dd2c2a25de928531a2d63d","unresolved":true,"context_lines":[{"line_number":207,"context_line":"        for pg in port_groups:"},{"line_number":208,"context_line":"            # Default neutron \"drop pg\" does NOT have any external IDs, but"},{"line_number":209,"context_line":"            # we still want to manage it, so we match it on its name."},{"line_number":210,"context_line":"            if ovn_const.OVN_SG_EXT_ID_KEY in pg.external_ids or \\"},{"line_number":211,"context_line":"                    pg.name \u003d\u003d ovn_const.OVN_DROP_PORT_GROUP_NAME:"},{"line_number":212,"context_line":"                ovn_pgs.add(pg.name)"},{"line_number":213,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"86199a86_e4b7cb31","line":210,"in_reply_to":"db556bce_321f7212","updated":"2025-09-08 11:12:40.000000000","message":"Will do.","commit_id":"a3c72664c8e0be64658c93a9c4a72fa635c3ba97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42bf0fcfb73079253ce1dd7597e42791dbdc0cc0","unresolved":true,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        ovn_pgs \u003d set()"},{"line_number":206,"context_line":"        port_groups \u003d self.ovn_api.db_list_rows(\u0027Port_Group\u0027).execute() or []"},{"line_number":207,"context_line":"        for pg in port_groups:"},{"line_number":208,"context_line":"            # Default neutron \"drop pg\" does NOT have any external IDs, but"},{"line_number":209,"context_line":"            # we still want to manage it, so we match it on its name."},{"line_number":210,"context_line":"            if (ovn_const.OVN_SG_EXT_ID_KEY in pg.external_ids or"},{"line_number":211,"context_line":"                    pg.name \u003d\u003d ovn_const.OVN_DROP_PORT_GROUP_NAME):"},{"line_number":212,"context_line":"                ovn_pgs.add(pg.name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ca7c0f8b_306c63d5","line":209,"range":{"start_line":207,"start_character":0,"end_line":209,"end_character":69},"updated":"2025-09-22 20:50:40.000000000","message":"Maybe we could add the external_id there instead to be consistent with other port groups ?","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8b1a1806d269b97e1e40dd39a79356201656b7ee","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        ovn_pgs \u003d set()"},{"line_number":206,"context_line":"        port_groups \u003d self.ovn_api.db_list_rows(\u0027Port_Group\u0027).execute() or []"},{"line_number":207,"context_line":"        for pg in port_groups:"},{"line_number":208,"context_line":"            # Default neutron \"drop pg\" does NOT have any external IDs, but"},{"line_number":209,"context_line":"            # we still want to manage it, so we match it on its name."},{"line_number":210,"context_line":"            if (ovn_const.OVN_SG_EXT_ID_KEY in pg.external_ids or"},{"line_number":211,"context_line":"                    pg.name \u003d\u003d ovn_const.OVN_DROP_PORT_GROUP_NAME):"},{"line_number":212,"context_line":"                ovn_pgs.add(pg.name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7b5bf49f_8ba25edb","line":209,"range":{"start_line":207,"start_character":0,"end_line":209,"end_character":69},"in_reply_to":"50f7c7b1_cf8945ed","updated":"2025-09-25 12:47:34.000000000","message":"Thanks, I originally thought we could set the ID to some constant string - to avoid complexity here. But it would just add complexity elsewhere, so this is good too.","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"0fd54736880e6fdf9ae53354723b3f6f8f82b9d1","unresolved":true,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        ovn_pgs \u003d set()"},{"line_number":206,"context_line":"        port_groups \u003d self.ovn_api.db_list_rows(\u0027Port_Group\u0027).execute() or []"},{"line_number":207,"context_line":"        for pg in port_groups:"},{"line_number":208,"context_line":"            # Default neutron \"drop pg\" does NOT have any external IDs, but"},{"line_number":209,"context_line":"            # we still want to manage it, so we match it on its name."},{"line_number":210,"context_line":"            if (ovn_const.OVN_SG_EXT_ID_KEY in pg.external_ids or"},{"line_number":211,"context_line":"                    pg.name \u003d\u003d ovn_const.OVN_DROP_PORT_GROUP_NAME):"},{"line_number":212,"context_line":"                ovn_pgs.add(pg.name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"50f7c7b1_cf8945ed","line":209,"range":{"start_line":207,"start_character":0,"end_line":209,"end_character":69},"in_reply_to":"ca7c0f8b_306c63d5","updated":"2025-09-24 11:15:05.000000000","message":"Other Port_Groups have `neutron:security_group_id` external_id, linking them to a specific Neutron Security Group [0]. I\u0027m not sure if there is a Security Group that relates to the `defalt_pg_drop`, it seems that it\u0027s handled as a special case in other parts of the code as well [1]. Do you have suggestion about what external_id could we set for this Port_Group?\n\nIn any case I believe that this should be handled in separate change, as it goes a bit out of scope for this one. I\u0027m happy to take it on, and I have half-open LP bug for it, I just wasn\u0027t sure what external_id to propose.\n\n[0] https://opendev.org/openstack/neutron/src/commit/acc9fa29223ba30dc932fb8bb91870870e917c00/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py#L2604\n[1] https://opendev.org/openstack/neutron/src/commit/c3fe49a17b449f7aaf52e7f3c4b594a9305c6e14/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py#L203","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"}],"neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovn_db_sync.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"615236c462f0363494d86aa0800a84a6d874c123","unresolved":true,"context_lines":[{"line_number":1363,"context_line":"                sroutes \u003d getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":1364,"context_line":"                plugin_routes \u003d []"},{"line_number":1365,"context_line":"                for sroute in sroutes:"},{"line_number":1366,"context_line":"                    if any(e_id.startswith(\"neutron:\")"},{"line_number":1367,"context_line":"                           for e_id in sroute.external_ids):"},{"line_number":1368,"context_line":"                        plugin_routes.append(sroute.ip_prefix + sroute.nexthop)"},{"line_number":1369,"context_line":"                nats \u003d getattr(lrouter, \u0027nat\u0027, [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"bca55042_e00950a1","line":1366,"range":{"start_line":1366,"start_character":43,"end_line":1366,"end_character":53},"updated":"2025-09-09 16:50:53.000000000","message":"Same comment as other file","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"fb2ef4a63b87171a60e08dc8d04063f555948978","unresolved":false,"context_lines":[{"line_number":1363,"context_line":"                sroutes \u003d getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":1364,"context_line":"                plugin_routes \u003d []"},{"line_number":1365,"context_line":"                for sroute in sroutes:"},{"line_number":1366,"context_line":"                    if any(e_id.startswith(\"neutron:\")"},{"line_number":1367,"context_line":"                           for e_id in sroute.external_ids):"},{"line_number":1368,"context_line":"                        plugin_routes.append(sroute.ip_prefix + sroute.nexthop)"},{"line_number":1369,"context_line":"                nats \u003d getattr(lrouter, \u0027nat\u0027, [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"a30dae17_2dae0065","line":1366,"range":{"start_line":1366,"start_character":43,"end_line":1366,"end_character":53},"in_reply_to":"bca55042_e00950a1","updated":"2025-09-10 08:08:19.000000000","message":"Done","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"615236c462f0363494d86aa0800a84a6d874c123","unresolved":true,"context_lines":[{"line_number":1398,"context_line":"                sroutes \u003d getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":1399,"context_line":"                monitor_routes \u003d []"},{"line_number":1400,"context_line":"                for sroute in sroutes:"},{"line_number":1401,"context_line":"                    if any(e_id.startswith(\"neutron:\")"},{"line_number":1402,"context_line":"                           for e_id in sroute.external_ids):"},{"line_number":1403,"context_line":"                        monitor_routes.append(sroute.ip_prefix + sroute.nexthop)"},{"line_number":1404,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5027c724_1d297ecd","line":1401,"range":{"start_line":1401,"start_character":43,"end_line":1401,"end_character":53},"updated":"2025-09-09 16:50:53.000000000","message":"Same comment","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"fb2ef4a63b87171a60e08dc8d04063f555948978","unresolved":false,"context_lines":[{"line_number":1398,"context_line":"                sroutes \u003d getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":1399,"context_line":"                monitor_routes \u003d []"},{"line_number":1400,"context_line":"                for sroute in sroutes:"},{"line_number":1401,"context_line":"                    if any(e_id.startswith(\"neutron:\")"},{"line_number":1402,"context_line":"                           for e_id in sroute.external_ids):"},{"line_number":1403,"context_line":"                        monitor_routes.append(sroute.ip_prefix + sroute.nexthop)"},{"line_number":1404,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9549d885_b60dd686","line":1401,"range":{"start_line":1401,"start_character":43,"end_line":1401,"end_character":53},"in_reply_to":"5027c724_1d297ecd","updated":"2025-09-10 08:08:19.000000000","message":"Done","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"615236c462f0363494d86aa0800a84a6d874c123","unresolved":true,"context_lines":[{"line_number":1560,"context_line":"        mn_pgs \u003d []"},{"line_number":1561,"context_line":"        for row in self.nb_api.tables[\u0027Port_Group\u0027].rows.values():"},{"line_number":1562,"context_line":"            if ovn_const.OVN_SG_EXT_ID_KEY in row.external_ids or \\"},{"line_number":1563,"context_line":"                    row.name \u003d\u003d ovn_const.OVN_DROP_PORT_GROUP_NAME:"},{"line_number":1564,"context_line":"                mn_pgs.append(getattr(row, \u0027name\u0027, \u0027\u0027))"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"        if should_match:"}],"source_content_type":"text/x-python","patch_set":3,"id":"d70d934e_a5bf1c96","line":1563,"updated":"2025-09-09 16:50:53.000000000","message":"nit: can you use () around these statements and drop the \\ ?","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"fb2ef4a63b87171a60e08dc8d04063f555948978","unresolved":false,"context_lines":[{"line_number":1560,"context_line":"        mn_pgs \u003d []"},{"line_number":1561,"context_line":"        for row in self.nb_api.tables[\u0027Port_Group\u0027].rows.values():"},{"line_number":1562,"context_line":"            if ovn_const.OVN_SG_EXT_ID_KEY in row.external_ids or \\"},{"line_number":1563,"context_line":"                    row.name \u003d\u003d ovn_const.OVN_DROP_PORT_GROUP_NAME:"},{"line_number":1564,"context_line":"                mn_pgs.append(getattr(row, \u0027name\u0027, \u0027\u0027))"},{"line_number":1565,"context_line":""},{"line_number":1566,"context_line":"        if should_match:"}],"source_content_type":"text/x-python","patch_set":3,"id":"f1494500_029ff9bd","line":1563,"in_reply_to":"d70d934e_a5bf1c96","updated":"2025-09-10 08:08:19.000000000","message":"Done","commit_id":"e82ff7727367a6689af0534cf691073537e1d177"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42bf0fcfb73079253ce1dd7597e42791dbdc0cc0","unresolved":true,"context_lines":[{"line_number":672,"context_line":"                                          \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":673,"context_line":"        self.create_lrouter_ports.append((\u0027lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":674,"context_line":"                                          \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":675,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":676,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":677,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":678,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":5,"id":"a921ba56_f16e4429","line":675,"updated":"2025-09-22 20:50:40.000000000","message":"We do not run pep8 on tests files but this is over 79 chars.","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"0fd54736880e6fdf9ae53354723b3f6f8f82b9d1","unresolved":true,"context_lines":[{"line_number":672,"context_line":"                                          \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":673,"context_line":"        self.create_lrouter_ports.append((\u0027lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":674,"context_line":"                                          \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":675,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":676,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":677,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":678,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":5,"id":"f493da1c_5f020a8d","line":675,"in_reply_to":"a921ba56_f16e4429","updated":"2025-09-24 11:15:05.000000000","message":"Apologies, I didn\u0027t realize that `tox -e pep8` doesn\u0027t check tests. Offending lines have been shortened.","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8b1a1806d269b97e1e40dd39a79356201656b7ee","unresolved":false,"context_lines":[{"line_number":672,"context_line":"                                          \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":673,"context_line":"        self.create_lrouter_ports.append((\u0027lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":674,"context_line":"                                          \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":675,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":676,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":677,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":678,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":5,"id":"23eecd73_ff337d09","line":675,"in_reply_to":"f493da1c_5f020a8d","updated":"2025-09-25 12:47:34.000000000","message":"Done","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42bf0fcfb73079253ce1dd7597e42791dbdc0cc0","unresolved":true,"context_lines":[{"line_number":674,"context_line":"                                          \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":675,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":676,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":677,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":678,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":679,"context_line":"        self.delete_lrouters.append(\u0027neutron-\u0027 + r2[\u0027id\u0027])"},{"line_number":680,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"641a86ab_fe5d2953","line":677,"updated":"2025-09-22 20:50:40.000000000","message":"ditto","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"0fd54736880e6fdf9ae53354723b3f6f8f82b9d1","unresolved":false,"context_lines":[{"line_number":674,"context_line":"                                          \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":675,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":676,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":677,"context_line":"        self.create_ext_lrouter_ports.append((\u0027ext-lrp-\u0027 + uuidutils.generate_uuid(),"},{"line_number":678,"context_line":"                                              \u0027neutron-\u0027 + r1[\u0027id\u0027]))"},{"line_number":679,"context_line":"        self.delete_lrouters.append(\u0027neutron-\u0027 + r2[\u0027id\u0027])"},{"line_number":680,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"a366921f_d2697fc8","line":677,"in_reply_to":"641a86ab_fe5d2953","updated":"2025-09-24 11:15:05.000000000","message":"Done","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42bf0fcfb73079253ce1dd7597e42791dbdc0cc0","unresolved":true,"context_lines":[{"line_number":830,"context_line":"                                                     ip_prefix\u003dip_prefix,"},{"line_number":831,"context_line":"                                                     nexthop\u003dnexthop,"},{"line_number":832,"context_line":"                                                     **columns))"},{"line_number":833,"context_line":"            for lrouter_name, ip_prefix, nexthop in self.create_ext_lrouter_routes:"},{"line_number":834,"context_line":"                txn.add(self.nb_api.add_static_route(lrouter_name,"},{"line_number":835,"context_line":"                                                     ip_prefix\u003dip_prefix,"},{"line_number":836,"context_line":"                                                     nexthop\u003dnexthop))"}],"source_content_type":"text/x-python","patch_set":5,"id":"c567f5e3_04eda574","line":833,"updated":"2025-09-22 20:50:40.000000000","message":"ditto","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"0fd54736880e6fdf9ae53354723b3f6f8f82b9d1","unresolved":false,"context_lines":[{"line_number":830,"context_line":"                                                     ip_prefix\u003dip_prefix,"},{"line_number":831,"context_line":"                                                     nexthop\u003dnexthop,"},{"line_number":832,"context_line":"                                                     **columns))"},{"line_number":833,"context_line":"            for lrouter_name, ip_prefix, nexthop in self.create_ext_lrouter_routes:"},{"line_number":834,"context_line":"                txn.add(self.nb_api.add_static_route(lrouter_name,"},{"line_number":835,"context_line":"                                                     ip_prefix\u003dip_prefix,"},{"line_number":836,"context_line":"                                                     nexthop\u003dnexthop))"}],"source_content_type":"text/x-python","patch_set":5,"id":"b7370034_b4be4d8a","line":833,"in_reply_to":"c567f5e3_04eda574","updated":"2025-09-24 11:15:05.000000000","message":"Done","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42bf0fcfb73079253ce1dd7597e42791dbdc0cc0","unresolved":true,"context_lines":[{"line_number":1363,"context_line":"                sroutes \u003d getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":1364,"context_line":"                plugin_routes \u003d []"},{"line_number":1365,"context_line":"                for sroute in sroutes:"},{"line_number":1366,"context_line":"                    if any(e_id.startswith(constants.DEVICE_OWNER_NEUTRON_PREFIX)"},{"line_number":1367,"context_line":"                           for e_id in sroute.external_ids):"},{"line_number":1368,"context_line":"                        plugin_routes.append(sroute.ip_prefix + sroute.nexthop)"},{"line_number":1369,"context_line":"                nats \u003d getattr(lrouter, \u0027nat\u0027, [])"}],"source_content_type":"text/x-python","patch_set":5,"id":"acb063bb_63bb5b4d","line":1366,"updated":"2025-09-22 20:50:40.000000000","message":"ditto","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"0fd54736880e6fdf9ae53354723b3f6f8f82b9d1","unresolved":false,"context_lines":[{"line_number":1363,"context_line":"                sroutes \u003d getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":1364,"context_line":"                plugin_routes \u003d []"},{"line_number":1365,"context_line":"                for sroute in sroutes:"},{"line_number":1366,"context_line":"                    if any(e_id.startswith(constants.DEVICE_OWNER_NEUTRON_PREFIX)"},{"line_number":1367,"context_line":"                           for e_id in sroute.external_ids):"},{"line_number":1368,"context_line":"                        plugin_routes.append(sroute.ip_prefix + sroute.nexthop)"},{"line_number":1369,"context_line":"                nats \u003d getattr(lrouter, \u0027nat\u0027, [])"}],"source_content_type":"text/x-python","patch_set":5,"id":"2107dd1c_a5755a74","line":1366,"in_reply_to":"acb063bb_63bb5b4d","updated":"2025-09-24 11:15:05.000000000","message":"Done","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42bf0fcfb73079253ce1dd7597e42791dbdc0cc0","unresolved":true,"context_lines":[{"line_number":1398,"context_line":"                sroutes \u003d getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":1399,"context_line":"                monitor_routes \u003d []"},{"line_number":1400,"context_line":"                for sroute in sroutes:"},{"line_number":1401,"context_line":"                    if any(e_id.startswith(constants.DEVICE_OWNER_NEUTRON_PREFIX)"},{"line_number":1402,"context_line":"                           for e_id in sroute.external_ids):"},{"line_number":1403,"context_line":"                        monitor_routes.append(sroute.ip_prefix + sroute.nexthop)"},{"line_number":1404,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"80b64f6f_9380f544","line":1401,"updated":"2025-09-22 20:50:40.000000000","message":"ditto","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"},{"author":{"_account_id":32288,"name":"Martin Kalcok","email":"martin.kalcok@canonical.com","username":"martin.kalcok"},"change_message_id":"0fd54736880e6fdf9ae53354723b3f6f8f82b9d1","unresolved":false,"context_lines":[{"line_number":1398,"context_line":"                sroutes \u003d getattr(lrouter, \u0027static_routes\u0027, [])"},{"line_number":1399,"context_line":"                monitor_routes \u003d []"},{"line_number":1400,"context_line":"                for sroute in sroutes:"},{"line_number":1401,"context_line":"                    if any(e_id.startswith(constants.DEVICE_OWNER_NEUTRON_PREFIX)"},{"line_number":1402,"context_line":"                           for e_id in sroute.external_ids):"},{"line_number":1403,"context_line":"                        monitor_routes.append(sroute.ip_prefix + sroute.nexthop)"},{"line_number":1404,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"8fe9921d_fa3bc5f2","line":1401,"in_reply_to":"80b64f6f_9380f544","updated":"2025-09-24 11:15:05.000000000","message":"Done","commit_id":"046a80178cdda8a64f6495094a27ee4b617032bc"}]}
