)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4d29a0264044551ac749dc268b784cd73f1ff666","unresolved":true,"context_lines":[{"line_number":15,"context_line":"INSERTs or notifying the user that a reconnection has happened."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Depends-On: https://review.opendev.org/c/openstack/ovsdbapp/+/989461"},{"line_number":18,"context_line":"Co-Authored-By: Claude Sonnet 4.6 (1M context) \u003cnoreply@anthropic.com\u003e"},{"line_number":19,"context_line":"Change-Id: I8ce11f9f671b7797fddfa762ec61c875a5b2e104"},{"line_number":20,"context_line":"Signed-off-by: Terry Wilson \u003ctwilson@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7da15924_9ca6fce4","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":14},"updated":"2026-05-21 07:19:05.000000000","message":"nit: OpenStack community accept \"Assisted-By\", not co-authored work by AI.","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5cf22a842a88798fd7c27880d63c7fe0e75b8a9a","unresolved":false,"context_lines":[{"line_number":15,"context_line":"INSERTs or notifying the user that a reconnection has happened."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Depends-On: https://review.opendev.org/c/openstack/ovsdbapp/+/989461"},{"line_number":18,"context_line":"Co-Authored-By: Claude Sonnet 4.6 (1M context) \u003cnoreply@anthropic.com\u003e"},{"line_number":19,"context_line":"Change-Id: I8ce11f9f671b7797fddfa762ec61c875a5b2e104"},{"line_number":20,"context_line":"Signed-off-by: Terry Wilson \u003ctwilson@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"8a358ce9_e62a4df8","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":14},"in_reply_to":"7da15924_9ca6fce4","updated":"2026-05-21 13:32:39.000000000","message":"Acknowledged","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"56a02d721b5bcd2ec7d28465810c87d15cc5f644","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"74d1765d_64bb9e03","updated":"2026-05-21 02:18:58.000000000","message":"The ovsdbapp Depends-On doesn\u0027t affect the neutron functional test and is currently required for the new delete event test to pass.","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bf536e8a2e47522fc6d87d9d3ba45c82753fe8f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b8bf5af0_8915d212","updated":"2026-05-26 18:50:04.000000000","message":"Putting -1 for visibility","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"d4afe3ffd2526037bcdf85d39e1465c5e45b00cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"1902870e_731fe46c","updated":"2026-06-01 08:13:23.000000000","message":"recheck ovs unrelated fail","commit_id":"72202190ae4eefb14410a9142301da7326e2e643"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"f940d2d8b045f3ce6bbfcb4b002b91b111c29c23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"6fc5b358_154d283f","updated":"2026-06-01 05:22:45.000000000","message":"recheck unrelated fail ovs multinode","commit_id":"72202190ae4eefb14410a9142301da7326e2e643"}],"neutron/agent/ovn/extensions/evpn/constants.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"EVPN_EXT_NAME \u003d \u0027EVPN agent extension\u0027"},{"line_number":17,"context_line":"EVPN_LRP_VRF_OPTION_KEY \u003d \u0027dynamic-routing-vrf-name\u0027"},{"line_number":18,"context_line":"EVPN_VRF_PREFIX \u003d \u0027vr\u0027"},{"line_number":19,"context_line":"EVPN_VRF_NAME_LEN \u003d 14"},{"line_number":20,"context_line":"EVPN_LINK_KIND_VRF \u003d \u0027vrf\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"24237476_5c9d45ff","line":17,"updated":"2026-05-21 18:43:30.000000000","message":"This is a common constant that we\u0027ll be setting on the router ports server-side. Should not be in agent specific constants module.","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"EVPN_EXT_NAME \u003d \u0027EVPN agent extension\u0027"},{"line_number":17,"context_line":"EVPN_LRP_VRF_OPTION_KEY \u003d \u0027dynamic-routing-vrf-name\u0027"},{"line_number":18,"context_line":"EVPN_VRF_PREFIX \u003d \u0027vr\u0027"},{"line_number":19,"context_line":"EVPN_VRF_NAME_LEN \u003d 14"},{"line_number":20,"context_line":"EVPN_LINK_KIND_VRF \u003d \u0027vrf\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"4e41cc57_963415b4","line":17,"in_reply_to":"24237476_5c9d45ff","updated":"2026-05-28 19:09:43.000000000","message":"Done","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"}],"neutron/agent/ovn/extensions/evpn/events.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4d29a0264044551ac749dc268b784cd73f1ff666","unresolved":true,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class PortBindingLrpEvpnCreateEvent(EVPNAgentEvent):"},{"line_number":50,"context_line":"    TABLE \u003d \u0027Port_Binding\u0027"},{"line_number":51,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_CREATE,)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def run(self, event, row, old):"},{"line_number":54,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f0365860_3f890461","line":51,"range":{"start_line":50,"start_character":4,"end_line":51,"end_character":41},"updated":"2026-05-21 07:19:05.000000000","message":"These 2 events will be triggered thousands of times when reconnecting. Is there a possibility to create a more precise filter? That could hang the SB DB for a while?","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5cf22a842a88798fd7c27880d63c7fe0e75b8a9a","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class PortBindingLrpEvpnCreateEvent(EVPNAgentEvent):"},{"line_number":50,"context_line":"    TABLE \u003d \u0027Port_Binding\u0027"},{"line_number":51,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_CREATE,)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def run(self, event, row, old):"},{"line_number":54,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d3c92c29_e2f54d5f","line":51,"range":{"start_line":50,"start_character":4,"end_line":51,"end_character":41},"in_reply_to":"f0365860_3f890461","updated":"2026-05-21 13:32:39.000000000","message":"It inherits the match_fn from the parent event.","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4d29a0264044551ac749dc268b784cd73f1ff666","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_CREATE,)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def run(self, event, row, old):"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            vni \u003d int(row.external_ids[svc_const.EVPN_LRP_VNI_EXT_ID_KEY])"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            LOG.error(\"Invalid VNI in Port_Binding %s\", row.logical_port)"},{"line_number":58,"context_line":"            return"},{"line_number":59,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":60,"context_line":"        mac \u003d row.external_ids[svc_const.EVPN_LRP_RMAC_EXT_ID_KEY]"},{"line_number":61,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c7e93c0c_2c5bc990","line":58,"range":{"start_line":54,"start_character":0,"end_line":58,"end_character":18},"updated":"2026-05-21 07:19:05.000000000","message":"Shouldn\u0027t this be part of the `match_fn` method?","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"620d5360f4d0e4443d0dafc1f9afa0fec15624d9","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_CREATE,)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def run(self, event, row, old):"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            vni \u003d int(row.external_ids[svc_const.EVPN_LRP_VNI_EXT_ID_KEY])"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            LOG.error(\"Invalid VNI in Port_Binding %s\", row.logical_port)"},{"line_number":58,"context_line":"            return"},{"line_number":59,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":60,"context_line":"        mac \u003d row.external_ids[svc_const.EVPN_LRP_RMAC_EXT_ID_KEY]"},{"line_number":61,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"60d6cde2_d2f28a6f","line":58,"range":{"start_line":54,"start_character":0,"end_line":58,"end_character":18},"in_reply_to":"74e7e075_71ac5337","updated":"2026-05-21 19:54:19.000000000","message":"Done","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5cf22a842a88798fd7c27880d63c7fe0e75b8a9a","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_CREATE,)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def run(self, event, row, old):"},{"line_number":54,"context_line":"        try:"},{"line_number":55,"context_line":"            vni \u003d int(row.external_ids[svc_const.EVPN_LRP_VNI_EXT_ID_KEY])"},{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            LOG.error(\"Invalid VNI in Port_Binding %s\", row.logical_port)"},{"line_number":58,"context_line":"            return"},{"line_number":59,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":60,"context_line":"        mac \u003d row.external_ids[svc_const.EVPN_LRP_RMAC_EXT_ID_KEY]"},{"line_number":61,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"74e7e075_71ac5337","line":58,"range":{"start_line":54,"start_character":0,"end_line":58,"end_character":18},"in_reply_to":"c7e93c0c_2c5bc990","updated":"2026-05-21 13:32:39.000000000","message":"Probably. The match_fn() is currently shared between the two methods, and technically the delete method doesn\u0027t really care if the vni is an integer (if for some reason some code changed it to a non-integer, we\u0027d still want to delete it and advance the state machine), but that would be a very weird bug. 🙂","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4d29a0264044551ac749dc268b784cd73f1ff666","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            LOG.error(\"Invalid VNI in Port_Binding %s\", row.logical_port)"},{"line_number":58,"context_line":"            return"},{"line_number":59,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":60,"context_line":"        mac \u003d row.external_ids[svc_const.EVPN_LRP_RMAC_EXT_ID_KEY]"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            self.fsm.advance(evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":63,"context_line":"                             vrf, mac\u003dmac, vni\u003dvni)"}],"source_content_type":"text/x-python","patch_set":1,"id":"62a375cd_a8d9156a","line":60,"range":{"start_line":59,"start_character":8,"end_line":60,"end_character":66},"updated":"2026-05-21 07:19:05.000000000","message":"just asking: we know for sure that, if we have `EVPN_LRP_VNI_EXT_ID_KEY` in the LRP.external_ids, the we\u0027ll have these two parameters, right?","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5cf22a842a88798fd7c27880d63c7fe0e75b8a9a","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        except ValueError:"},{"line_number":57,"context_line":"            LOG.error(\"Invalid VNI in Port_Binding %s\", row.logical_port)"},{"line_number":58,"context_line":"            return"},{"line_number":59,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":60,"context_line":"        mac \u003d row.external_ids[svc_const.EVPN_LRP_RMAC_EXT_ID_KEY]"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            self.fsm.advance(evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":63,"context_line":"                             vrf, mac\u003dmac, vni\u003dvni)"}],"source_content_type":"text/x-python","patch_set":1,"id":"15669446_3ee11b0c","line":60,"range":{"start_line":59,"start_character":8,"end_line":60,"end_character":66},"in_reply_to":"62a375cd_a8d9156a","updated":"2026-05-21 13:32:39.000000000","message":"If it passes the inherited match_fn() and gets to run, it definitely has it.","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4d29a0264044551ac749dc268b784cd73f1ff666","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_DELETE,)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def run(self, event, row, old):"},{"line_number":74,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":75,"context_line":"        try:"},{"line_number":76,"context_line":"            self.fsm.advance(evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_DELETE,"},{"line_number":77,"context_line":"                             vrf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"669e8a48_e53753aa","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":61},"updated":"2026-05-21 07:19:05.000000000","message":"You should first check if this port_binding has this key","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5cf22a842a88798fd7c27880d63c7fe0e75b8a9a","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_DELETE,)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def run(self, event, row, old):"},{"line_number":74,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":75,"context_line":"        try:"},{"line_number":76,"context_line":"            self.fsm.advance(evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_DELETE,"},{"line_number":77,"context_line":"                             vrf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"d091dba3_55a843eb","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":61},"in_reply_to":"669e8a48_e53753aa","updated":"2026-05-21 13:32:39.000000000","message":"It has to have the key, because it passed the match_fn()","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class EVPNAgentEvent(row_event.RowEvent):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, agent_api):"},{"line_number":30,"context_line":"        self.agent_api \u003d agent_api"}],"source_content_type":"text/x-python","patch_set":2,"id":"cd585d68_7041337f","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":20},"updated":"2026-05-21 18:43:30.000000000","message":"nit: Given the match_fn body, it already assumes a PortBinding event. Maybe we should have a EVPNAgentEvent-\u003eEVPNPortBindingEvent-\u003e Create or Delete event hierarchy","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class EVPNAgentEvent(row_event.RowEvent):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, agent_api):"},{"line_number":30,"context_line":"        self.agent_api \u003d agent_api"}],"source_content_type":"text/x-python","patch_set":2,"id":"d88fdb7b_9556452f","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":20},"in_reply_to":"cd585d68_7041337f","updated":"2026-05-28 19:09:43.000000000","message":"Acknowledged","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"7b9f01bb981da0571fb73c3bdb19b28ef9070174","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class EVPNAgentEvent(row_event.RowEvent):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def __init__(self, agent_api):"},{"line_number":30,"context_line":"        self.agent_api \u003d agent_api"}],"source_content_type":"text/x-python","patch_set":2,"id":"4b9e9ff1_d3b1b925","line":27,"range":{"start_line":27,"start_character":6,"end_line":27,"end_character":20},"in_reply_to":"d88fdb7b_9556452f","updated":"2026-05-30 04:04:09.000000000","message":"Sorry, forgot this got \"resolved\" with the ack and then missed it when going through unresolved stuff.","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"},{"line_number":45,"context_line":"    def fsm(self):"},{"line_number":46,"context_line":"        return self.evpn_agent._evpn_fsm"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class PortBindingLrpEvpnCreateEvent(EVPNAgentEvent):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9851c264_87dd9854","line":46,"range":{"start_line":46,"start_character":31,"end_line":46,"end_character":40},"updated":"2026-05-21 18:43:30.000000000","message":"if we\u0027re exposing the fsm outside of the extension then it should not be a \"private\" attribute.","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5d9d9bf479164969daf695e295ab3a512be54dae","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"},{"line_number":45,"context_line":"    def fsm(self):"},{"line_number":46,"context_line":"        return self.evpn_agent._evpn_fsm"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class PortBindingLrpEvpnCreateEvent(EVPNAgentEvent):"}],"source_content_type":"text/x-python","patch_set":2,"id":"b0dcd42c_77d7599d","line":46,"range":{"start_line":46,"start_character":31,"end_line":46,"end_character":40},"in_reply_to":"065753df_0a879367","updated":"2026-05-30 05:32:32.000000000","message":"I made a patch that allowed passing in instantiated events to the agent, so I could just pass the FSM and not the agent itself, which we don\u0027t really need. It simplifies things a little and it\u0027s always nice to be able to pass only what\u0027s needed. With that said, I can also see the argument that it is unneeded since you often have to store something on the agent for the the event in sb_idl_events() etc. to access it, and so it\u0027s easier to just pass the agent--but I do like limiting what is passed.","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"},{"line_number":45,"context_line":"    def fsm(self):"},{"line_number":46,"context_line":"        return self.evpn_agent._evpn_fsm"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class PortBindingLrpEvpnCreateEvent(EVPNAgentEvent):"}],"source_content_type":"text/x-python","patch_set":2,"id":"065753df_0a879367","line":46,"range":{"start_line":46,"start_character":31,"end_line":46,"end_character":40},"in_reply_to":"9851c264_87dd9854","updated":"2026-05-28 19:09:43.000000000","message":"Yeah. What I would really like is that we change the way Agent stores events. Instead of passing the class, I think we should pass instantiated events, so the signature can be whatever it needs to be and we could pass the FSM. Could probably check isinstance in the code that instantiates them to handle both classes and instantiated.","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"cb63bff201db97c2fc5cd05b4aa18e6cffa2604f","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"},{"line_number":45,"context_line":"    def fsm(self):"},{"line_number":46,"context_line":"        return self.evpn_agent._evpn_fsm"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"class PortBindingLrpEvpnCreateEvent(EVPNAgentEvent):"}],"source_content_type":"text/x-python","patch_set":2,"id":"11ef0c43_0a785f8f","line":46,"range":{"start_line":46,"start_character":31,"end_line":46,"end_character":40},"in_reply_to":"b0dcd42c_77d7599d","updated":"2026-06-02 13:26:51.000000000","message":"Done","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_CREATE,)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":54,"context_line":"        matched \u003d super().match_fn(event, row, old)"},{"line_number":55,"context_line":"        try:"},{"line_number":56,"context_line":"            int(row.external_ids[svc_const.EVPN_LRP_VNI_EXT_ID_KEY])"},{"line_number":57,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"75381b32_7183a0ec","line":54,"updated":"2026-05-21 18:43:30.000000000","message":"nit: I\u0027d prefer\n```\nif not super().match_fn():\n    return False\n```\nthe reason is that if our parent didn\u0027t match, there is no point in checking external_ids. Functionally it\u0027s equivalent but we can return earlier.","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    EVENTS \u003d (EVPNAgentEvent.ROW_CREATE,)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":54,"context_line":"        matched \u003d super().match_fn(event, row, old)"},{"line_number":55,"context_line":"        try:"},{"line_number":56,"context_line":"            int(row.external_ids[svc_const.EVPN_LRP_VNI_EXT_ID_KEY])"},{"line_number":57,"context_line":"        except ValueError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7cef4fab_a1574b2c","line":54,"in_reply_to":"75381b32_7183a0ec","updated":"2026-05-28 19:09:43.000000000","message":"Done","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"8e8629abbf4402220c6b4f6076d86314d8f112f5","unresolved":true,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def run(self, event, row, old):"},{"line_number":63,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":64,"context_line":"        mac \u003d row.external_ids[svc_const.EVPN_LRP_RMAC_EXT_ID_KEY]"},{"line_number":65,"context_line":"        vni \u003d int(row.external_ids[svc_const.EVPN_LRP_VNI_EXT_ID_KEY])"},{"line_number":66,"context_line":"        try:"},{"line_number":67,"context_line":"            self.fsm.advance(evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"}],"source_content_type":"text/x-python","patch_set":2,"id":"141aea58_2b2c7b09","line":64,"range":{"start_line":64,"start_character":14,"end_line":64,"end_character":66},"updated":"2026-05-21 20:05:29.000000000","message":"Is this necessary or can the MAC be retrieved from port_binding\u0027s \"mac\" column?","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def run(self, event, row, old):"},{"line_number":63,"context_line":"        vrf \u003d row.options[evpn_const.EVPN_LRP_VRF_OPTION_KEY]"},{"line_number":64,"context_line":"        mac \u003d row.external_ids[svc_const.EVPN_LRP_RMAC_EXT_ID_KEY]"},{"line_number":65,"context_line":"        vni \u003d int(row.external_ids[svc_const.EVPN_LRP_VNI_EXT_ID_KEY])"},{"line_number":66,"context_line":"        try:"},{"line_number":67,"context_line":"            self.fsm.advance(evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"}],"source_content_type":"text/x-python","patch_set":2,"id":"f6c74225_0999f330","line":64,"range":{"start_line":64,"start_character":14,"end_line":64,"end_character":66},"in_reply_to":"141aea58_2b2c7b09","updated":"2026-05-28 19:09:43.000000000","message":"Acknowledged","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"}],"neutron/services/evpn/constants.py":[{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"8e8629abbf4402220c6b4f6076d86314d8f112f5","unresolved":true,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"EVPN_LRP_VNI_EXT_ID_KEY \u003d \u0027vni\u0027"},{"line_number":17,"context_line":"EVPN_LRP_RMAC_EXT_ID_KEY \u003d \u0027rmac\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"2fc09957_edfe83ff","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":33},"updated":"2026-05-21 20:05:29.000000000","message":"Is this necessary or can the MAC be retrieved from port_binding\u0027s \"mac\" column?","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"EVPN_LRP_VNI_EXT_ID_KEY \u003d \u0027vni\u0027"},{"line_number":17,"context_line":"EVPN_LRP_RMAC_EXT_ID_KEY \u003d \u0027rmac\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"e2c3535c_d68eab8b","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":33},"in_reply_to":"2fc09957_edfe83ff","updated":"2026-05-28 19:09:43.000000000","message":"Done","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"}],"neutron/tests/functional/agent/ovn/extensions/evpn/test_events.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0c70a63c21aa3f70ba1e29df2b7bd54893d9c24","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        self._wait_for_advance()"},{"line_number":97,"context_line":"        self.mock_evpn_ext._evpn_fsm.advance.assert_called_once_with("},{"line_number":98,"context_line":"            evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":99,"context_line":"            vrf, mac\u003dmac, vni\u003dvni)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def test_create_event_not_triggered_without_vrf_option(self):"},{"line_number":102,"context_line":"        lr_name \u003d \u0027lr-no-evpn\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3bf865c7_fb009768","line":99,"updated":"2026-05-21 08:37:34.000000000","message":"this test looks for me more like unit test rather then functional","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"0c6c4da28a73d54256f4b49fa1e0c418e729c23e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self._wait_for_advance()"},{"line_number":97,"context_line":"        self.mock_evpn_ext._evpn_fsm.advance.assert_called_once_with("},{"line_number":98,"context_line":"            evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":99,"context_line":"            vrf, mac\u003dmac, vni\u003dvni)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def test_create_event_not_triggered_without_vrf_option(self):"},{"line_number":102,"context_line":"        lr_name \u003d \u0027lr-no-evpn\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"b599ee10_45abd786","line":99,"in_reply_to":"364a22f3_26261aa1","updated":"2026-05-21 13:52:14.000000000","message":"if that\u0027s the plan and you will update those tests later to be really \"functional\" tests, then I\u0027m fine with it","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5cf22a842a88798fd7c27880d63c7fe0e75b8a9a","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self._wait_for_advance()"},{"line_number":97,"context_line":"        self.mock_evpn_ext._evpn_fsm.advance.assert_called_once_with("},{"line_number":98,"context_line":"            evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":99,"context_line":"            vrf, mac\u003dmac, vni\u003dvni)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def test_create_event_not_triggered_without_vrf_option(self):"},{"line_number":102,"context_line":"        lr_name \u003d \u0027lr-no-evpn\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"364a22f3_26261aa1","line":99,"in_reply_to":"3bf865c7_fb009768","updated":"2026-05-21 13:32:39.000000000","message":"I basically refuse to write unit tests that involve OVSDB and Row objects. They\u0027re all mocks and terrible (see FakeOvsdbNbOvnIdl as an example). Also, the tests actually cover the behavior of ovn-northd copying data from an lrp to a port binding, etc. (it fails with older OVNs for example), so we catch if OVN breaks us too. Once the callbacks actually do something useful, we can test things other than advance being called.","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0c70a63c21aa3f70ba1e29df2b7bd54893d9c24","unresolved":true,"context_lines":[{"line_number":106,"context_line":"            txn.add(self.nb_api.lrp_add("},{"line_number":107,"context_line":"                lr_name, lrp_name, \u0027bb:bb:bb:bb:bb:bb\u0027, []))"},{"line_number":108,"context_line":"        with testtools.ExpectedException(AssertionError):"},{"line_number":109,"context_line":"            self._wait_for_advance(timeout\u003d2)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class PortBindingLrpEvpnDeleteEventTestCase(BaseEvpnEventsTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"42b6aa70_feece2f2","line":109,"updated":"2026-05-21 08:37:34.000000000","message":"this one also, shouldn\u0027t you maybe actually assert if changes which are supposed to be done by the callbacks defined in FSM did their job actually?","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            txn.add(self.nb_api.lrp_add("},{"line_number":107,"context_line":"                lr_name, lrp_name, \u0027bb:bb:bb:bb:bb:bb\u0027, []))"},{"line_number":108,"context_line":"        with testtools.ExpectedException(AssertionError):"},{"line_number":109,"context_line":"            self._wait_for_advance(timeout\u003d2)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class PortBindingLrpEvpnDeleteEventTestCase(BaseEvpnEventsTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"84880292_f1a46e69","line":109,"in_reply_to":"2ec64f15_dc28142a","updated":"2026-05-28 19:09:43.000000000","message":"Done","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5cf22a842a88798fd7c27880d63c7fe0e75b8a9a","unresolved":true,"context_lines":[{"line_number":106,"context_line":"            txn.add(self.nb_api.lrp_add("},{"line_number":107,"context_line":"                lr_name, lrp_name, \u0027bb:bb:bb:bb:bb:bb\u0027, []))"},{"line_number":108,"context_line":"        with testtools.ExpectedException(AssertionError):"},{"line_number":109,"context_line":"            self._wait_for_advance(timeout\u003d2)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class PortBindingLrpEvpnDeleteEventTestCase(BaseEvpnEventsTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"6259bf18_16dfe56c","line":109,"in_reply_to":"42b6aa70_feece2f2","updated":"2026-05-21 13:32:39.000000000","message":"Eventually, but I don\u0027t think those callbacks actually do anything yet. I can put in a TODO comment.","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"620d5360f4d0e4443d0dafc1f9afa0fec15624d9","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            txn.add(self.nb_api.lrp_add("},{"line_number":107,"context_line":"                lr_name, lrp_name, \u0027bb:bb:bb:bb:bb:bb\u0027, []))"},{"line_number":108,"context_line":"        with testtools.ExpectedException(AssertionError):"},{"line_number":109,"context_line":"            self._wait_for_advance(timeout\u003d2)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class PortBindingLrpEvpnDeleteEventTestCase(BaseEvpnEventsTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"45e0b9e6_47bb196a","line":109,"in_reply_to":"6259bf18_16dfe56c","updated":"2026-05-21 19:54:19.000000000","message":"Done","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":106,"context_line":"            txn.add(self.nb_api.lrp_add("},{"line_number":107,"context_line":"                lr_name, lrp_name, \u0027bb:bb:bb:bb:bb:bb\u0027, []))"},{"line_number":108,"context_line":"        with testtools.ExpectedException(AssertionError):"},{"line_number":109,"context_line":"            self._wait_for_advance(timeout\u003d2)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class PortBindingLrpEvpnDeleteEventTestCase(BaseEvpnEventsTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"807f9e70_21d64ac3","line":109,"in_reply_to":"6259bf18_16dfe56c","updated":"2026-05-21 18:43:30.000000000","message":"I\u0027d be fine asserting we call the right API of the fsm.","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"8e8629abbf4402220c6b4f6076d86314d8f112f5","unresolved":true,"context_lines":[{"line_number":106,"context_line":"            txn.add(self.nb_api.lrp_add("},{"line_number":107,"context_line":"                lr_name, lrp_name, \u0027bb:bb:bb:bb:bb:bb\u0027, []))"},{"line_number":108,"context_line":"        with testtools.ExpectedException(AssertionError):"},{"line_number":109,"context_line":"            self._wait_for_advance(timeout\u003d2)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class PortBindingLrpEvpnDeleteEventTestCase(BaseEvpnEventsTestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"2ec64f15_dc28142a","line":109,"in_reply_to":"807f9e70_21d64ac3","updated":"2026-05-21 20:05:29.000000000","message":"I think the callback() will store the mac and vni.  advance() itself will create the Evpn instance and advance the state to WAITING_FOR_VRF_UP.","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f0c70a63c21aa3f70ba1e29df2b7bd54893d9c24","unresolved":true,"context_lines":[{"line_number":122,"context_line":"        self._wait_for_advance()"},{"line_number":123,"context_line":"        self.mock_evpn_ext._evpn_fsm.advance.assert_called_once_with("},{"line_number":124,"context_line":"            evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_DELETE,"},{"line_number":125,"context_line":"            vrf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"36952401_c20da260","line":125,"updated":"2026-05-21 08:37:34.000000000","message":"ditto","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"5cf22a842a88798fd7c27880d63c7fe0e75b8a9a","unresolved":true,"context_lines":[{"line_number":122,"context_line":"        self._wait_for_advance()"},{"line_number":123,"context_line":"        self.mock_evpn_ext._evpn_fsm.advance.assert_called_once_with("},{"line_number":124,"context_line":"            evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_DELETE,"},{"line_number":125,"context_line":"            vrf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f816051_e527dea7","line":125,"in_reply_to":"36952401_c20da260","updated":"2026-05-21 13:32:39.000000000","message":"Also ditto. 🙂","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"620d5360f4d0e4443d0dafc1f9afa0fec15624d9","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self._wait_for_advance()"},{"line_number":123,"context_line":"        self.mock_evpn_ext._evpn_fsm.advance.assert_called_once_with("},{"line_number":124,"context_line":"            evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_DELETE,"},{"line_number":125,"context_line":"            vrf)"}],"source_content_type":"text/x-python","patch_set":1,"id":"0512645d_a6687c24","line":125,"in_reply_to":"7f816051_e527dea7","updated":"2026-05-21 19:54:19.000000000","message":"Done","commit_id":"f3e7e71240abb42378472d1725d473c4417be0ef"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":29,"context_line":"    \u0027Datapath_Binding\u0027, \u0027Encap\u0027, \u0027Port_Binding\u0027)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class BaseEvpnEventsTestCase(bgp_base.BaseBgpIDLTestCase):"},{"line_number":33,"context_line":"    schemas \u003d [\u0027OVN_Northbound\u0027, \u0027OVN_Southbound\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"d246ef51_6b96d4b3","line":32,"range":{"start_line":32,"start_character":38,"end_line":32,"end_character":56},"updated":"2026-05-21 18:43:30.000000000","message":"\u003c3","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \u0027Datapath_Binding\u0027, \u0027Encap\u0027, \u0027Port_Binding\u0027)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class BaseEvpnEventsTestCase(bgp_base.BaseBgpIDLTestCase):"},{"line_number":33,"context_line":"    schemas \u003d [\u0027OVN_Northbound\u0027, \u0027OVN_Southbound\u0027]"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6cf05e62_1276de45","line":32,"range":{"start_line":32,"start_character":38,"end_line":32,"end_character":56},"in_reply_to":"d246ef51_6b96d4b3","updated":"2026-05-28 19:09:43.000000000","message":"Done","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self):"},{"line_number":36,"context_line":"        bgp_ovn.OvnSbIdl.tables \u003d _OVN_SB_TABLES_WITH_PB"},{"line_number":37,"context_line":"        super().setUp()"},{"line_number":38,"context_line":"        bgp_ovn.OvnSbIdl.tables \u003d bgp_ovn.OVN_SB_TABLES"},{"line_number":39,"context_line":"        self.mock_evpn_ext \u003d mock.Mock()"},{"line_number":40,"context_line":"        self.agent_api \u003d {evpn_const.EVPN_EXT_NAME: self.mock_evpn_ext}"}],"source_content_type":"text/x-python","patch_set":2,"id":"932276a9_98e65fc0","line":37,"updated":"2026-05-21 18:43:30.000000000","message":"if this blows, the `bgp_ovn.OvnSbIdl.tables` remains set with wrong values for any other tests running in the same executor. Should be wrapped with try-finally","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def setUp(self):"},{"line_number":36,"context_line":"        bgp_ovn.OvnSbIdl.tables \u003d _OVN_SB_TABLES_WITH_PB"},{"line_number":37,"context_line":"        super().setUp()"},{"line_number":38,"context_line":"        bgp_ovn.OvnSbIdl.tables \u003d bgp_ovn.OVN_SB_TABLES"},{"line_number":39,"context_line":"        self.mock_evpn_ext \u003d mock.Mock()"},{"line_number":40,"context_line":"        self.agent_api \u003d {evpn_const.EVPN_EXT_NAME: self.mock_evpn_ext}"}],"source_content_type":"text/x-python","patch_set":2,"id":"eed2f152_50726262","line":37,"in_reply_to":"932276a9_98e65fc0","updated":"2026-05-28 19:09:43.000000000","message":"Done","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":100,"context_line":"            evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":101,"context_line":"            vrf, mac\u003dmac, vni\u003dvni)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def test_create_event_not_triggered_without_vrf_option(self):"},{"line_number":104,"context_line":"        lr_name \u003d \u0027lr-no-evpn\u0027"},{"line_number":105,"context_line":"        lrp_name \u003d \u0027lrp-no-evpn\u0027"},{"line_number":106,"context_line":"        with self.nb_api.transaction(check_error\u003dTrue) as txn:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f063507_673daa5e","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":65},"updated":"2026-05-21 18:43:30.000000000","message":"I\u0027d recommend a helper and cover all scenarios - missing vni, missing rmac in ext_ids and missing vrf in options.","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            evpn_fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":101,"context_line":"            vrf, mac\u003dmac, vni\u003dvni)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def test_create_event_not_triggered_without_vrf_option(self):"},{"line_number":104,"context_line":"        lr_name \u003d \u0027lr-no-evpn\u0027"},{"line_number":105,"context_line":"        lrp_name \u003d \u0027lrp-no-evpn\u0027"},{"line_number":106,"context_line":"        with self.nb_api.transaction(check_error\u003dTrue) as txn:"}],"source_content_type":"text/x-python","patch_set":2,"id":"89f91549_5464a18b","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":65},"in_reply_to":"5f063507_673daa5e","updated":"2026-05-28 19:09:43.000000000","message":"Since this is going to change to using row.mac, which is mandated by the schema I\u0027m going to drop that test. So that leaves vni and vrf","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[{"line_number":110,"context_line":"        # TODO(twilson) Replace when FSM callbacks are finished"},{"line_number":111,"context_line":"        with testtools.ExpectedException(AssertionError):"},{"line_number":112,"context_line":"            self._wait_for_advance(timeout\u003d2)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class PortBindingLrpEvpnDeleteEventTestCase(BaseEvpnEventsTestCase):"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"74ecf8f6_06f7923a","line":113,"updated":"2026-05-21 18:43:30.000000000","message":"I\u0027d put a test that assumes wrong state of the FSM and checks we do not blow the code here.","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # TODO(twilson) Replace when FSM callbacks are finished"},{"line_number":111,"context_line":"        with testtools.ExpectedException(AssertionError):"},{"line_number":112,"context_line":"            self._wait_for_advance(timeout\u003d2)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class PortBindingLrpEvpnDeleteEventTestCase(BaseEvpnEventsTestCase):"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"4be543d5_577e7c89","line":113,"in_reply_to":"74ecf8f6_06f7923a","updated":"2026-05-28 19:09:43.000000000","message":"Done","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"567a7f49decd74190274949c18d4fe723380788c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"fb0c8696_57ebf64d","line":130,"updated":"2026-05-21 18:43:30.000000000","message":"ditto","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d0ede3d3774dc0cb34f196b9d26d43143b8fd236","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"f329f06c_b5b1de94","line":130,"in_reply_to":"fb0c8696_57ebf64d","updated":"2026-05-28 19:09:43.000000000","message":"Done","commit_id":"b8e69c441a5b8a6f0ac75b7cf9bcdfbdee9a57f8"}]}
