)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"c6cf718490e672bfe66ccf51dc369abf54e0af17","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"07605085_649f2695","updated":"2025-10-22 18:21:20.000000000","message":"Just one nit otherwise looks good","commit_id":"5c27bdf6a7bba39f538332b57b06c3059c5e08af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"cad960a11279c2acbaddfa6cc254dd628d3db1a4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"0c697083_be084aae","updated":"2025-11-11 10:04:14.000000000","message":"recheck neutron-tempest-plugin-ovn","commit_id":"46c07147b9c8545ccf60ea35ac96fac355cb1a43"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3bdd362d00dbccb2119ce2a66f60eec602c53344","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"fe522208_90b2147c","updated":"2025-11-05 14:52:22.000000000","message":"recheck unrelated error, but reported: https://review.opendev.org/c/openstack/neutron/+/965783","commit_id":"46c07147b9c8545ccf60ea35ac96fac355cb1a43"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0b65463a62fc466434e851f6b3c1bfe98251b45b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"e428139d_7a26f25c","updated":"2025-11-17 07:01:49.000000000","message":"recheck neutron-functional","commit_id":"5cb800cff9cddea87dc4d79c1632aee253b98bff"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"c09fbc0ba81b87f9099bffa9eba6f2da56a698cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"c05f7fe7_bd1c1b69","updated":"2025-11-18 23:38:31.000000000","message":"lgtm, you can ignore my nit","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"54611818e8966ac023511fcfeb7b443040984ee5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"8fa032ea_a52e4863","updated":"2025-11-20 14:21:39.000000000","message":"Rebased on top of https://review.opendev.org/c/openstack/neutron/+/967813 to WA the ovsdbapp issue with the last release.","commit_id":"e94e7447aa621792b7c31d71d1c581d473128ec4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"de9707be7296016f173a71d9d7c3d37f719c7902","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"82a97264_a22626dd","updated":"2025-11-21 07:32:15.000000000","message":"recheck neutron-functional","commit_id":"e94e7447aa621792b7c31d71d1c581d473128ec4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e732fea9657e4d52e488043e307c11cb72484188","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"f5e65240_fc17cd3d","updated":"2025-11-21 10:43:38.000000000","message":"recheck neutron-functional","commit_id":"e94e7447aa621792b7c31d71d1c581d473128ec4"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f5a1a3e3362c20c1fb0880968688151c33722b2c","unresolved":true,"context_lines":[{"line_number":2328,"context_line":"    def unlink_network_ha_chassis_group(self, network_id):"},{"line_number":2329,"context_line":"        \"\"\"Unlink the network HCG to the router"},{"line_number":2330,"context_line":""},{"line_number":2331,"context_line":"        If the network has been"},{"line_number":2332,"context_line":""},{"line_number":2333,"context_line":"        \"\"\""},{"line_number":2334,"context_line":"        name \u003d utils.ovn_name(network_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9bc80409_9203c575","line":2331,"updated":"2025-10-21 20:40:01.000000000","message":"Missing end of sentence?","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"437f194ecd8ce627d2009e91efe1cbe3d4d7609d","unresolved":false,"context_lines":[{"line_number":2328,"context_line":"    def unlink_network_ha_chassis_group(self, network_id):"},{"line_number":2329,"context_line":"        \"\"\"Unlink the network HCG to the router"},{"line_number":2330,"context_line":""},{"line_number":2331,"context_line":"        If the network has been"},{"line_number":2332,"context_line":""},{"line_number":2333,"context_line":"        \"\"\""},{"line_number":2334,"context_line":"        name \u003d utils.ovn_name(network_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"180691d9_8fdb5af6","line":2331,"in_reply_to":"9bc80409_9203c575","updated":"2025-10-22 14:55:14.000000000","message":"Uffff I think I was phone called just in the middle of this description and then I forgot. Thanks!","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f5a1a3e3362c20c1fb0880968688151c33722b2c","unresolved":true,"context_lines":[{"line_number":2353,"context_line":"        if not gw_lrps:"},{"line_number":2354,"context_line":"            # The router has no GW ports. Remove the \"neutron:router_id\" tag"},{"line_number":2355,"context_line":"            # from the \"HA_Chassis_Group\" associated, if any."},{"line_number":2356,"context_line":"            return self.unlink_network_ha_chassis_group(network_id)"},{"line_number":2357,"context_line":""},{"line_number":2358,"context_line":"        # Retrieve all \"Gateway_Chassis\" and build the \"chassis_prio\""},{"line_number":2359,"context_line":"        # dictionary."}],"source_content_type":"text/x-python","patch_set":18,"id":"50fda0ba_5ca8cee4","line":2356,"updated":"2025-10-21 20:40:01.000000000","message":"nit: This always returns None since the caller doesn\u0027t return anything, for that reason seems should be on two separate lines","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"437f194ecd8ce627d2009e91efe1cbe3d4d7609d","unresolved":false,"context_lines":[{"line_number":2353,"context_line":"        if not gw_lrps:"},{"line_number":2354,"context_line":"            # The router has no GW ports. Remove the \"neutron:router_id\" tag"},{"line_number":2355,"context_line":"            # from the \"HA_Chassis_Group\" associated, if any."},{"line_number":2356,"context_line":"            return self.unlink_network_ha_chassis_group(network_id)"},{"line_number":2357,"context_line":""},{"line_number":2358,"context_line":"        # Retrieve all \"Gateway_Chassis\" and build the \"chassis_prio\""},{"line_number":2359,"context_line":"        # dictionary."}],"source_content_type":"text/x-python","patch_set":18,"id":"65a09284_4afcd9a1","line":2356,"in_reply_to":"50fda0ba_5ca8cee4","updated":"2025-10-22 14:55:14.000000000","message":"Done","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"c6cf718490e672bfe66ccf51dc369abf54e0af17","unresolved":true,"context_lines":[{"line_number":2330,"context_line":""},{"line_number":2331,"context_line":"        If the network (including all subnets) has been detached from the"},{"line_number":2332,"context_line":"        router, the \"HA_Chassis_Group\" in unlinked from the router by removing"},{"line_number":2333,"context_line":"        the router_id tag from the external_ids dictionary."},{"line_number":2334,"context_line":"        \"\"\""},{"line_number":2335,"context_line":"        name \u003d utils.ovn_name(network_id)"},{"line_number":2336,"context_line":"        hcg \u003d self._nb_idl.lookup(\u0027HA_Chassis_Group\u0027, name, default\u003dNone)"}],"source_content_type":"text/x-python","patch_set":19,"id":"0773f36a_14fe11ad","line":2333,"range":{"start_line":2333,"start_character":12,"end_line":2333,"end_character":21},"updated":"2025-10-22 18:21:20.000000000","message":"it\u0027s actually removing the network_id tag","commit_id":"5c27bdf6a7bba39f538332b57b06c3059c5e08af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a642c6f02139972634af54db3c9038d36f2593b3","unresolved":false,"context_lines":[{"line_number":2330,"context_line":""},{"line_number":2331,"context_line":"        If the network (including all subnets) has been detached from the"},{"line_number":2332,"context_line":"        router, the \"HA_Chassis_Group\" in unlinked from the router by removing"},{"line_number":2333,"context_line":"        the router_id tag from the external_ids dictionary."},{"line_number":2334,"context_line":"        \"\"\""},{"line_number":2335,"context_line":"        name \u003d utils.ovn_name(network_id)"},{"line_number":2336,"context_line":"        hcg \u003d self._nb_idl.lookup(\u0027HA_Chassis_Group\u0027, name, default\u003dNone)"}],"source_content_type":"text/x-python","patch_set":19,"id":"a632ae75_6ac1f032","line":2333,"range":{"start_line":2333,"start_character":12,"end_line":2333,"end_character":21},"in_reply_to":"0773f36a_14fe11ad","updated":"2025-10-23 14:25:25.000000000","message":"It is removing `OVN_ROUTER_ID_EXT_ID_KEY` (neutron:router_id)","commit_id":"5c27bdf6a7bba39f538332b57b06c3059c5e08af"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"e78c15dc56e4b7b33020dd0020ca53e6bedd5a9d","unresolved":false,"context_lines":[{"line_number":2330,"context_line":""},{"line_number":2331,"context_line":"        If the network (including all subnets) has been detached from the"},{"line_number":2332,"context_line":"        router, the \"HA_Chassis_Group\" in unlinked from the router by removing"},{"line_number":2333,"context_line":"        the router_id tag from the external_ids dictionary."},{"line_number":2334,"context_line":"        \"\"\""},{"line_number":2335,"context_line":"        name \u003d utils.ovn_name(network_id)"},{"line_number":2336,"context_line":"        hcg \u003d self._nb_idl.lookup(\u0027HA_Chassis_Group\u0027, name, default\u003dNone)"}],"source_content_type":"text/x-python","patch_set":19,"id":"80aa7adc_df98e8d2","line":2333,"range":{"start_line":2333,"start_character":12,"end_line":2333,"end_character":21},"in_reply_to":"a632ae75_6ac1f032","updated":"2025-10-23 14:49:46.000000000","message":"Doh, right I just just looked at the argument with the network_id in it.","commit_id":"5c27bdf6a7bba39f538332b57b06c3059c5e08af"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c676f3e551a97ba33b6d81ef6112d3c75a1b7eb5","unresolved":true,"context_lines":[{"line_number":1602,"context_line":"    def update_router_ha_chassis_group(self, context, router_id):"},{"line_number":1603,"context_line":"        \"\"\"If the router has GW, bind all external ports to the same GW chassis"},{"line_number":1604,"context_line":""},{"line_number":1605,"context_line":"        It a router receives or removes the gateway, this method checks all"},{"line_number":1606,"context_line":"        the connected internal ports and collects its networks. Then it updates"},{"line_number":1607,"context_line":"        each network, depending on the presence or not of the router gateway."},{"line_number":1608,"context_line":"        See LP#2125553."}],"source_content_type":"text/x-python","patch_set":25,"id":"50421ae0_beb18f5a","line":1605,"range":{"start_line":1605,"start_character":8,"end_line":1605,"end_character":11},"updated":"2025-11-18 20:45:21.000000000","message":"If?","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2e36184b9aa2f0709780b5dc0a21aada9b6a8288","unresolved":false,"context_lines":[{"line_number":1602,"context_line":"    def update_router_ha_chassis_group(self, context, router_id):"},{"line_number":1603,"context_line":"        \"\"\"If the router has GW, bind all external ports to the same GW chassis"},{"line_number":1604,"context_line":""},{"line_number":1605,"context_line":"        It a router receives or removes the gateway, this method checks all"},{"line_number":1606,"context_line":"        the connected internal ports and collects its networks. Then it updates"},{"line_number":1607,"context_line":"        each network, depending on the presence or not of the router gateway."},{"line_number":1608,"context_line":"        See LP#2125553."}],"source_content_type":"text/x-python","patch_set":25,"id":"286694ee_db85fe4c","line":1605,"range":{"start_line":1605,"start_character":8,"end_line":1605,"end_character":11},"in_reply_to":"50421ae0_beb18f5a","updated":"2025-11-19 08:01:32.000000000","message":"Done","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c676f3e551a97ba33b6d81ef6112d3c75a1b7eb5","unresolved":true,"context_lines":[{"line_number":2370,"context_line":"            ls \u003d self._nb_idl.lookup(\u0027Logical_Switch\u0027,"},{"line_number":2371,"context_line":"                                     utils.ovn_name(network_id))"},{"line_number":2372,"context_line":"            for lsp in (lsp for lsp in ls.ports if"},{"line_number":2373,"context_line":"                        lsp.type \u003d\u003d ovn_const.LSP_TYPE_EXTERNAL):"},{"line_number":2374,"context_line":"                # NOTE(ralonsoh): this is a protection check but all external"},{"line_number":2375,"context_line":"                # ports must have \"HA_Chassis_Group\". If the \"HA_Chassis_Group\""},{"line_number":2376,"context_line":"                # register is for this port only, remove it."}],"source_content_type":"text/x-python","patch_set":25,"id":"6cf1b27e_462a65fa","line":2373,"range":{"start_line":2373,"start_character":46,"end_line":2373,"end_character":63},"updated":"2025-11-18 20:45:21.000000000","message":"nit: would it more efficient to just do this `if` check inside the loop?","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2e36184b9aa2f0709780b5dc0a21aada9b6a8288","unresolved":false,"context_lines":[{"line_number":2370,"context_line":"            ls \u003d self._nb_idl.lookup(\u0027Logical_Switch\u0027,"},{"line_number":2371,"context_line":"                                     utils.ovn_name(network_id))"},{"line_number":2372,"context_line":"            for lsp in (lsp for lsp in ls.ports if"},{"line_number":2373,"context_line":"                        lsp.type \u003d\u003d ovn_const.LSP_TYPE_EXTERNAL):"},{"line_number":2374,"context_line":"                # NOTE(ralonsoh): this is a protection check but all external"},{"line_number":2375,"context_line":"                # ports must have \"HA_Chassis_Group\". If the \"HA_Chassis_Group\""},{"line_number":2376,"context_line":"                # register is for this port only, remove it."}],"source_content_type":"text/x-python","patch_set":25,"id":"9a5d2686_aee7dabd","line":2373,"range":{"start_line":2373,"start_character":46,"end_line":2373,"end_character":63},"in_reply_to":"6cf1b27e_462a65fa","updated":"2025-11-19 08:01:32.000000000","message":"According to Gemini, yes, the loop+if is slightly faster. However I really prefer the clarity of the generator and the lack of inner indentation.","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"}],"neutron/services/ovn_l3/ovsdb_monitor.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d21804da70dcd56cc9095f46fd450ce375b8f9e6","unresolved":true,"context_lines":[{"line_number":44,"context_line":"            # the case, do nothing."},{"line_number":45,"context_line":"            ls_name \u003d row.external_ids[ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY]"},{"line_number":46,"context_line":"            lr_name \u003d row.external_ids[ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY]"},{"line_number":47,"context_line":"            lr \u003d self.driver._nb_ovn.lookup(\u0027Logical_Router\u0027, lr_name)"},{"line_number":48,"context_line":"            for lrp in (lrp for lrp in lr.ports if lrp.name !\u003d row.name):"},{"line_number":49,"context_line":"                if (ls_name \u003d\u003d lrp.external_ids["},{"line_number":50,"context_line":"                        ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY]):"}],"source_content_type":"text/x-python","patch_set":15,"id":"70a26817_0acc56f1","line":47,"range":{"start_line":47,"start_character":12,"end_line":47,"end_character":70},"updated":"2025-10-17 10:02:19.000000000","message":"If the `Logical_Router` is being deleted, this will throw an exception. We need to consider the case where a router is deleted.\n\nIf the router is deleted, there could not be internal network interfaces attached, only GW ports. In any case, just for precaution, let\u0027s update the network `HA_Chassis_Group`, removing the router_id","commit_id":"4ba4c16730c61e6d50b23f6422b6352b36951b90"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d04eacea9d7f26d4b5d9314b0b3d712f33f44176","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            # the case, do nothing."},{"line_number":45,"context_line":"            ls_name \u003d row.external_ids[ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY]"},{"line_number":46,"context_line":"            lr_name \u003d row.external_ids[ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY]"},{"line_number":47,"context_line":"            lr \u003d self.driver._nb_ovn.lookup(\u0027Logical_Router\u0027, lr_name)"},{"line_number":48,"context_line":"            for lrp in (lrp for lrp in lr.ports if lrp.name !\u003d row.name):"},{"line_number":49,"context_line":"                if (ls_name \u003d\u003d lrp.external_ids["},{"line_number":50,"context_line":"                        ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY]):"}],"source_content_type":"text/x-python","patch_set":15,"id":"2e4a1da2_5b5662ec","line":47,"range":{"start_line":47,"start_character":12,"end_line":47,"end_character":70},"in_reply_to":"70a26817_0acc56f1","updated":"2025-10-20 10:07:05.000000000","message":"Done in PS16, including functional tests.","commit_id":"4ba4c16730c61e6d50b23f6422b6352b36951b90"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f5a1a3e3362c20c1fb0880968688151c33722b2c","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":18,"id":"6062596a_6dd49ab6","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2025-10-21 20:40:01.000000000","message":"s/2025 ?","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"437f194ecd8ce627d2009e91efe1cbe3d4d7609d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":18,"id":"3b71415d_5a2c40a8","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"in_reply_to":"6062596a_6dd49ab6","updated":"2025-10-22 14:55:14.000000000","message":"Bad copy paste...","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c676f3e551a97ba33b6d81ef6112d3c75a1b7eb5","unresolved":true,"context_lines":[{"line_number":35,"context_line":"        self.l3_plugin \u003d directory.get_plugin(constants.L3)"},{"line_number":36,"context_line":"        self.admin_context \u003d neutron_context.get_admin_context()"},{"line_number":37,"context_line":"        table \u003d \u0027Logical_Router_Port\u0027"},{"line_number":38,"context_line":"        events \u003d (self.ROW_CREATE, self.ROW_DELETE)"},{"line_number":39,"context_line":"        super().__init__(events, table, None)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def match_fn(self, event, row, old):"}],"source_content_type":"text/x-python","patch_set":25,"id":"87f0b1a0_e826813d","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":51},"updated":"2025-11-18 20:45:21.000000000","message":"Sorry, maybe it is my lack of understanding. But why not also `ROW_UPDATE`?","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2e36184b9aa2f0709780b5dc0a21aada9b6a8288","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        self.l3_plugin \u003d directory.get_plugin(constants.L3)"},{"line_number":36,"context_line":"        self.admin_context \u003d neutron_context.get_admin_context()"},{"line_number":37,"context_line":"        table \u003d \u0027Logical_Router_Port\u0027"},{"line_number":38,"context_line":"        events \u003d (self.ROW_CREATE, self.ROW_DELETE)"},{"line_number":39,"context_line":"        super().__init__(events, table, None)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def match_fn(self, event, row, old):"}],"source_content_type":"text/x-python","patch_set":25,"id":"873a86ac_249f72c8","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":51},"in_reply_to":"87f0b1a0_e826813d","updated":"2025-11-19 08:01:32.000000000","message":"A LRP is defined as GW in the creation event. That won\u0027t change during the life of the LRP. We only need the `GW/not-GW LRP` creation and deletion events, to know if a GW network or an internal network has been added or deleted.","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"c09fbc0ba81b87f9099bffa9eba6f2da56a698cb","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                if (ls_name \u003d\u003d lrp.external_ids["},{"line_number":50,"context_line":"                        ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY]):"},{"line_number":51,"context_line":"                    return False"},{"line_number":52,"context_line":"            return True"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        # event \u003d\u003d self.ROW_CREATE"},{"line_number":55,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":25,"id":"f98e6a7d_cb18322b","line":52,"updated":"2025-11-18 23:38:31.000000000","message":"nit: probably don\u0027t need this with below, but don\u0027t need to change","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2e36184b9aa2f0709780b5dc0a21aada9b6a8288","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                if (ls_name \u003d\u003d lrp.external_ids["},{"line_number":50,"context_line":"                        ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY]):"},{"line_number":51,"context_line":"                    return False"},{"line_number":52,"context_line":"            return True"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        # event \u003d\u003d self.ROW_CREATE"},{"line_number":55,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":25,"id":"4a86814f_f1e69b49","line":52,"in_reply_to":"f98e6a7d_cb18322b","updated":"2025-11-19 08:01:32.000000000","message":"Right, I was making this return explicit inside the ROW_DELETE event section.","commit_id":"bcfcbb0798eadb23d09be62a9f1b02138387258c"}],"neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovn_client.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f5a1a3e3362c20c1fb0880968688151c33722b2c","unresolved":true,"context_lines":[{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def test_update_router_ha_chassis_group(self):"},{"line_number":497,"context_line":"        # Create a router with multiple networks (internal, external). The"},{"line_number":498,"context_line":"        # method `update_network_ha_chassis_group` must be called for all"},{"line_number":499,"context_line":"        # internal networks."},{"line_number":500,"context_line":"        num_private_subnets \u003d 5"},{"line_number":501,"context_line":"        ovn_client \u003d self.mech_driver._ovn_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"67dcb4bc_2c79259b","line":498,"range":{"start_line":498,"start_character":18,"end_line":498,"end_character":49},"updated":"2025-10-21 20:40:01.000000000","message":"I think this comment should be link_network_ha_chassis_group according to below, and the test should be \"create\" not \"update\", right? Unless I was confused by the end of the test below.","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"437f194ecd8ce627d2009e91efe1cbe3d4d7609d","unresolved":false,"context_lines":[{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def test_update_router_ha_chassis_group(self):"},{"line_number":497,"context_line":"        # Create a router with multiple networks (internal, external). The"},{"line_number":498,"context_line":"        # method `update_network_ha_chassis_group` must be called for all"},{"line_number":499,"context_line":"        # internal networks."},{"line_number":500,"context_line":"        num_private_subnets \u003d 5"},{"line_number":501,"context_line":"        ovn_client \u003d self.mech_driver._ovn_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"324771df_8c5e8269","line":498,"range":{"start_line":498,"start_character":18,"end_line":498,"end_character":49},"in_reply_to":"67dcb4bc_2c79259b","updated":"2025-10-22 14:55:14.000000000","message":"Yes, the method checked is `link_network_ha_chassis_group`. The name maybe should be `test_update_ha_chassis_group_linked_to_router`.","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"}],"neutron/tests/functional/services/ovn_l3/test_ovsdb_monitor.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f5a1a3e3362c20c1fb0880968688151c33722b2c","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2020 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":18,"id":"f844f66c_5c3d6ab0","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"updated":"2025-10-21 20:40:01.000000000","message":"s/2025 ?","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"437f194ecd8ce627d2009e91efe1cbe3d4d7609d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2020 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":18,"id":"d4a295c4_eea44b1a","line":1,"range":{"start_line":1,"start_character":12,"end_line":1,"end_character":16},"in_reply_to":"f844f66c_5c3d6ab0","updated":"2025-10-22 14:55:14.000000000","message":"The same, I copy/pasted from other files.","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f5a1a3e3362c20c1fb0880968688151c33722b2c","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            mock_update_router.reset_mock()"},{"line_number":81,"context_line":"            self._remove_external_gateway_from_router("},{"line_number":82,"context_line":"                self.router_id, self.net_ext_id, external_gw_info\u003d{})"},{"line_number":83,"context_line":"            n_utils.wait_until_true(is_called, timeout\u003d10)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_add_private_network(self):"},{"line_number":86,"context_line":"        def is_called():"}],"source_content_type":"text/x-python","patch_set":18,"id":"0883b262_1dcc5667","line":83,"updated":"2025-10-21 20:40:01.000000000","message":"nit: this tests both add and delete, do we need the above test for add?","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"437f194ecd8ce627d2009e91efe1cbe3d4d7609d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            mock_update_router.reset_mock()"},{"line_number":81,"context_line":"            self._remove_external_gateway_from_router("},{"line_number":82,"context_line":"                self.router_id, self.net_ext_id, external_gw_info\u003d{})"},{"line_number":83,"context_line":"            n_utils.wait_until_true(is_called, timeout\u003d10)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_add_private_network(self):"},{"line_number":86,"context_line":"        def is_called():"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fa82c8f_18d32ad8","line":83,"in_reply_to":"0883b262_1dcc5667","updated":"2025-10-22 14:55:14.000000000","message":"Right, let\u0027s reduce the number of tests. This one does both and the method checked (`update_router_ha_chassis_group`) is the same in both.","commit_id":"9b1e73995f53c3b5c104e621a195b0d6d0870c64"}]}
