)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aa528a0a56375b1ad06c2a6a6c2226c750863dc8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4d89b716_8dfd3225","updated":"2025-10-29 18:09:50.000000000","message":"recheck test the job again","commit_id":"64a0cd9a6df548d3c6459461210a1e99b2e1faa1"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"55a9121ad7d88a1d0e5aedd0c0dd63a46d855ac7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"cc5ef6a6_0cf907fc","updated":"2026-02-03 09:54:18.000000000","message":"test pass https://zuul.opendev.org/t/openstack/build/03f09977d686408ebe3b62649a0c688c","commit_id":"3c55c4aee7add83599ce850ca3d4d02490c70b34"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"6e48e7ae03eb141d1e5e3e8feb876958f74a20a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"8a9b3ad7_dc1e8f1e","updated":"2026-02-19 03:11:50.000000000","message":"Just few questions. Overall looks good to me","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"eb0f71a53bff51b2ea8b737863a4090dc564e74f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"deabec46_73818036","updated":"2026-02-19 22:02:23.000000000","message":"Thanks for the review 😊","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"ac3d81bfa2a009434d526aee617cf149e38ffdf7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"91112d7b_66f3c871","updated":"2026-02-16 13:51:15.000000000","message":"recheck","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"37819c68b30e88900af1763fbc6e5cb09d04f8aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"030dd8b3_5da10935","updated":"2026-02-18 02:25:44.000000000","message":"stopped at commands.py:ReconcileNeutronSwitchCommand. I need to resume tomorrow","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"}],"neutron/services/bgp/commands.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"37819c68b30e88900af1763fbc6e5cb09d04f8aa","unresolved":true,"context_lines":[{"line_number":36,"context_line":"    \"\"\"A wrapper around a command to run it and return the row result."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    This avoids using the self.result attribute but returns a custom row_result"},{"line_number":39,"context_line":"    instead. Imporant is that in case of a new row creation, the row_result"},{"line_number":40,"context_line":"    does not contain the same UUID that is stored in the DB after the commit."},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":"    cmd.run_idl(txn)"}],"source_content_type":"text/x-python","patch_set":15,"id":"5a95a3f5_ef321a12","line":39,"range":{"start_line":39,"start_character":13,"end_line":39,"end_character":21},"updated":"2026-02-18 02:25:44.000000000","message":"Important","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"6e48e7ae03eb141d1e5e3e8feb876958f74a20a2","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    def run_idl(self, txn):"},{"line_number":172,"context_line":"        super().run_idl(txn)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        CreateLspLocalnetCommand("},{"line_number":175,"context_line":"            self.api, self.switch, self.network_name,"},{"line_number":176,"context_line":"        ).run_idl(txn)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"class CreateLspLocalnetCommand(_LspAddCommand):"}],"source_content_type":"text/x-python","patch_set":15,"id":"f707494a_d115f2f3","line":176,"range":{"start_line":174,"start_character":0,"end_line":176,"end_character":22},"updated":"2026-02-19 03:11:50.000000000","message":"No issue, just checking. When the switch is deleted in `DeleteNeutronSwitchCommand` this lsp localnet port will get implicitly deleted by OVN. Correct?\n\nReason I am asking is because relation between these objects is set by `RELATED_RESOURCE_TAG` but we are not explicitly setting that on this localnet port.","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"eb0f71a53bff51b2ea8b737863a4090dc564e74f","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    def run_idl(self, txn):"},{"line_number":172,"context_line":"        super().run_idl(txn)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        CreateLspLocalnetCommand("},{"line_number":175,"context_line":"            self.api, self.switch, self.network_name,"},{"line_number":176,"context_line":"        ).run_idl(txn)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"class CreateLspLocalnetCommand(_LspAddCommand):"}],"source_content_type":"text/x-python","patch_set":15,"id":"ca9b270c_96b51265","line":176,"range":{"start_line":174,"start_character":0,"end_line":176,"end_character":22},"in_reply_to":"f707494a_d115f2f3","updated":"2026-02-19 22:02:23.000000000","message":"It\u0027s a good question - I haven\u0027t got to testing the deletion yet but the ctl commands do that but I don\u0027t know if it\u0027s the server side (I think it is but need to verify) or if the CLI is smart enough to query and delete.","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"37819c68b30e88900af1763fbc6e5cb09d04f8aa","unresolved":true,"context_lines":[{"line_number":229,"context_line":"                try:"},{"line_number":230,"context_line":"                    vlan_tag \u003d port.tag[0]"},{"line_number":231,"context_line":"                except IndexError:"},{"line_number":232,"context_line":"                    vlan_tag \u003d 0"},{"line_number":233,"context_line":"                return port.options[\u0027network_name\u0027], vlan_tag"},{"line_number":234,"context_line":"        raise ValueError("},{"line_number":235,"context_line":"            f\"No localnet port found for switch {self.n_switch.name}\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"b363e01a_bbae2357","line":232,"range":{"start_line":232,"start_character":20,"end_line":232,"end_character":32},"updated":"2026-02-18 02:25:44.000000000","message":"Would `None` be a more appropriate value here? Since 0 has special meaning in EEE 802.1Q as a \"priority-tagged frame\".\n\nAlthough I noticed that you are not really using that variable for anything at the moment","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"eb0f71a53bff51b2ea8b737863a4090dc564e74f","unresolved":true,"context_lines":[{"line_number":229,"context_line":"                try:"},{"line_number":230,"context_line":"                    vlan_tag \u003d port.tag[0]"},{"line_number":231,"context_line":"                except IndexError:"},{"line_number":232,"context_line":"                    vlan_tag \u003d 0"},{"line_number":233,"context_line":"                return port.options[\u0027network_name\u0027], vlan_tag"},{"line_number":234,"context_line":"        raise ValueError("},{"line_number":235,"context_line":"            f\"No localnet port found for switch {self.n_switch.name}\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"b0804c3b_628e2fce","line":232,"range":{"start_line":232,"start_character":20,"end_line":232,"end_character":32},"in_reply_to":"b363e01a_bbae2357","updated":"2026-02-19 22:02:23.000000000","message":"Good catch. If it\u0027s not used, it should not be here, it\u0027s a YAGNI.","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"}],"neutron/services/bgp/events.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"6e48e7ae03eb141d1e5e3e8feb876958f74a20a2","unresolved":true,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class GatewayIPRouteEvent(BGPResourceEvent):"},{"line_number":98,"context_line":"    TABLE \u003d \u0027Logical_Router_Static_Route\u0027"},{"line_number":99,"context_line":"    EVENTS \u003d (BGPChassisEvent.ROW_CREATE,)"},{"line_number":100,"context_line":"    RESOURCE \u003d constants.BGPReconcilerResource.GATEWAY_IP_ROUTE"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def match_fn(self, event, row, old):"}],"source_content_type":"text/x-python","patch_set":15,"id":"32d4b245_1f35e693","line":99,"range":{"start_line":99,"start_character":4,"end_line":99,"end_character":42},"updated":"2026-02-19 03:11:50.000000000","message":"Why not also when a static route is deleted? I guess we do not \"update\" static routes but just delete and create","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"eb0f71a53bff51b2ea8b737863a4090dc564e74f","unresolved":true,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class GatewayIPRouteEvent(BGPResourceEvent):"},{"line_number":98,"context_line":"    TABLE \u003d \u0027Logical_Router_Static_Route\u0027"},{"line_number":99,"context_line":"    EVENTS \u003d (BGPChassisEvent.ROW_CREATE,)"},{"line_number":100,"context_line":"    RESOURCE \u003d constants.BGPReconcilerResource.GATEWAY_IP_ROUTE"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def match_fn(self, event, row, old):"}],"source_content_type":"text/x-python","patch_set":15,"id":"f8f5c35d_2dca226d","line":99,"range":{"start_line":99,"start_character":4,"end_line":99,"end_character":42},"in_reply_to":"32d4b245_1f35e693","updated":"2026-02-19 22:02:23.000000000","message":"This whole gateway IP thing is clumsy. I\u0027ve re-done it by storing network-id to the DHCP Options [1] - and then taking it from the DHCP options - so instead of monitoring the static route we\u0027ll need to monitor the DHCP options - but yes, we\u0027ll need to monitor both CREATE and DELETE.\n\n[1] https://review.opendev.org/c/openstack/neutron/+/976692","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"}],"neutron/services/bgp/helpers.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"b88d4891b4855603655537af35b2933ed93a5765","unresolved":true,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import netaddr"},{"line_number":17,"context_line":"from oslo_log import log"},{"line_number":18,"context_line":"from neutron_lib import context"},{"line_number":19,"context_line":"from neutron_lib.plugins import directory"},{"line_number":20,"context_line":"from ovsdbapp.backend.ovs_idl import rowview"}],"source_content_type":"text/x-python","patch_set":8,"id":"c783c8e5_50b08dd6","line":17,"updated":"2025-10-31 20:58:10.000000000","message":"oslo import should go after the neutron_lib imports","commit_id":"b77343c1ee4da7a551af10af2f6c365b0b9ce747"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c05b24293cb087fb84ee1e5f749b5932da9f2d7d","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import netaddr"},{"line_number":17,"context_line":"from oslo_log import log"},{"line_number":18,"context_line":"from neutron_lib import context"},{"line_number":19,"context_line":"from neutron_lib.plugins import directory"},{"line_number":20,"context_line":"from ovsdbapp.backend.ovs_idl import rowview"}],"source_content_type":"text/x-python","patch_set":8,"id":"f73d94b5_a993b832","line":17,"in_reply_to":"c783c8e5_50b08dd6","updated":"2026-02-09 20:58:13.000000000","message":"Done","commit_id":"b77343c1ee4da7a551af10af2f6c365b0b9ce747"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"4cc37e8bec1e0e527fa4e8808602aff862a7a133","unresolved":true,"context_lines":[{"line_number":21,"context_line":"from oslo_log import log"},{"line_number":22,"context_line":"from ovsdbapp.backend.ovs_idl import rowview"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":25,"context_line":"from neutron.common.ovn import constants as ovn_const"},{"line_number":26,"context_line":"from neutron.conf.services import bgp as bgp_config"},{"line_number":27,"context_line":"from neutron.services.bgp import constants"}],"source_content_type":"text/x-python","patch_set":13,"id":"01190a7b_39c08d0a","line":24,"updated":"2026-02-05 13:36:41.000000000","message":"pep8 fails because ip_lib is not used in PS13","commit_id":"6bda4fdcb22ea9b2ebba7f7ebd64b6469b6ebddc"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"6e48e7ae03eb141d1e5e3e8feb876958f74a20a2","unresolved":true,"context_lines":[{"line_number":110,"context_line":"    # Get the network ID from the switch name, which is not ideal but the"},{"line_number":111,"context_line":"    # network ID does not seem to be stored elsewhere in the switch object."},{"line_number":112,"context_line":"    try:"},{"line_number":113,"context_line":"        return switch.name.split(\u0027neutron-\u0027, 1)[1]"},{"line_number":114,"context_line":"    except IndexError:"},{"line_number":115,"context_line":"        raise ValueError("},{"line_number":116,"context_line":"            f\"Switch {switch.name} does not contain a Neutron network ID \")"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf003f44_8cf6906d","line":113,"updated":"2026-02-19 03:11:50.000000000","message":"nit: you kinda have this helper function in ovn utils\nhttps://opendev.org/openstack/neutron/src/branch/master/neutron/common/ovn/utils.py#L954","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"eb0f71a53bff51b2ea8b737863a4090dc564e74f","unresolved":true,"context_lines":[{"line_number":110,"context_line":"    # Get the network ID from the switch name, which is not ideal but the"},{"line_number":111,"context_line":"    # network ID does not seem to be stored elsewhere in the switch object."},{"line_number":112,"context_line":"    try:"},{"line_number":113,"context_line":"        return switch.name.split(\u0027neutron-\u0027, 1)[1]"},{"line_number":114,"context_line":"    except IndexError:"},{"line_number":115,"context_line":"        raise ValueError("},{"line_number":116,"context_line":"            f\"Switch {switch.name} does not contain a Neutron network ID \")"}],"source_content_type":"text/x-python","patch_set":15,"id":"7d1577a3_d21c0edd","line":113,"in_reply_to":"bf003f44_8cf6906d","updated":"2026-02-19 22:02:23.000000000","message":"Thanks, I did not find that.\n\nOn the other hand - the function in utils doesn\u0027t fail if we provide a name that does not start with the \"neutron-\" prefix, requiring an extra check after each call or better wrapping the function around, doing the check in the wrapper.\n\nThat said, I\u0027d keep this helper here even though they are very alike. Alternatively we could replace the function in ovn.utils to fail if the name is not neutron-like but that may need some thorough testing and maybe error handling in current Neutron code.","commit_id":"e1cad6c8d21409ae34f6f21dcc7b1ae118d2ce98"}]}
