)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"a785844973bfdae3ea6dce733a41444e4f9c8d96","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"405b937b_c1ed97f5","updated":"2026-05-20 06:15:09.000000000","message":"recheck functional and pep8 jobs fixed","commit_id":"bfccba85bb1a790400596cb31f23fb2b27410b9d"}],"neutron/agent/ovn/extensions/evpn/__init__.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"de72bcf83461505bfb953fb14c226d5a51dc9acd","unresolved":true,"context_lines":[{"line_number":29,"context_line":"class EVPNAgentExtension(ovn_ext_mgr.OVNAgentExtension):"},{"line_number":30,"context_line":"    def __init__(self):"},{"line_number":31,"context_line":"        super().__init__()"},{"line_number":32,"context_line":"        self._evpn_fsm \u003d fsm.EvpnFSM(self)"},{"line_number":33,"context_line":"        self.nl_dispatcher \u003d None"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"e5c8aae1_a2d7fd48","line":32,"updated":"2026-05-12 18:54:17.000000000","message":"Do we need to reference it? Can we created it right before the handler?","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"37a39982df9acdd088fc8d92470472e3ae8f2bef","unresolved":false,"context_lines":[{"line_number":29,"context_line":"class EVPNAgentExtension(ovn_ext_mgr.OVNAgentExtension):"},{"line_number":30,"context_line":"    def __init__(self):"},{"line_number":31,"context_line":"        super().__init__()"},{"line_number":32,"context_line":"        self._evpn_fsm \u003d fsm.EvpnFSM(self)"},{"line_number":33,"context_line":"        self.nl_dispatcher \u003d None"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def start(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"0c09b9c5_2b0594d5","line":32,"in_reply_to":"e5c8aae1_a2d7fd48","updated":"2026-05-15 03:55:35.000000000","message":"Done","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"}],"neutron/agent/ovn/extensions/evpn/constants.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"de72bcf83461505bfb953fb14c226d5a51dc9acd","unresolved":true,"context_lines":[{"line_number":17,"context_line":"EVPN_LINK_KIND_VRF \u003d \u0027vrf\u0027"},{"line_number":18,"context_line":"EVPN_RTM_NEWLINK \u003d \u0027RTM_NEWLINK\u0027"},{"line_number":19,"context_line":"EVPN_RTM_DELLINK \u003d \u0027RTM_DELLINK\u0027"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bdf617bc_e0002550","side":"PARENT","line":20,"updated":"2026-05-12 18:54:17.000000000","message":"nit: unrelated","commit_id":"5879bc1155b49ce0d593b336004c9a70036468e9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":17,"context_line":"EVPN_LINK_KIND_VRF \u003d \u0027vrf\u0027"},{"line_number":18,"context_line":"EVPN_RTM_NEWLINK \u003d \u0027RTM_NEWLINK\u0027"},{"line_number":19,"context_line":"EVPN_RTM_DELLINK \u003d \u0027RTM_DELLINK\u0027"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"4205151b_6c2b628a","side":"PARENT","line":20,"in_reply_to":"bdf617bc_e0002550","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"5879bc1155b49ce0d593b336004c9a70036468e9"}],"neutron/agent/ovn/extensions/evpn/fsm.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"2ee8e9acbea67868f6b904d9b89ea5d18040cf69","unresolved":true,"context_lines":[{"line_number":28,"context_line":"    DESTROY \u003d \u0027destroy\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self, vni, mac, vrf):"},{"line_number":31,"context_line":"        self.vni \u003d vni  # VNI value"},{"line_number":32,"context_line":"        self.mac \u003d mac  # EVPN router MAC from rmac"},{"line_number":33,"context_line":"        self.vrf \u003d vrf  # VRF name"},{"line_number":34,"context_line":"        self._state \u003d self.INIT"}],"source_content_type":"text/x-python","patch_set":1,"id":"bb3b3686_4a16aec3","line":31,"range":{"start_line":31,"start_character":22,"end_line":31,"end_character":35},"updated":"2026-05-05 19:47:58.000000000","message":"I\u0027d remove these comments as they do not bring any new knowledge to the variable name.","commit_id":"2429410d0ed3b67430544029e275954be567d629"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"a996e783984b67ca6be22cccd7939e54a9471429","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    DESTROY \u003d \u0027destroy\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def __init__(self, vni, mac, vrf):"},{"line_number":31,"context_line":"        self.vni \u003d vni  # VNI value"},{"line_number":32,"context_line":"        self.mac \u003d mac  # EVPN router MAC from rmac"},{"line_number":33,"context_line":"        self.vrf \u003d vrf  # VRF name"},{"line_number":34,"context_line":"        self._state \u003d self.INIT"}],"source_content_type":"text/x-python","patch_set":1,"id":"aefab39b_bcb1b4b8","line":31,"range":{"start_line":31,"start_character":22,"end_line":31,"end_character":35},"in_reply_to":"bb3b3686_4a16aec3","updated":"2026-05-07 20:12:08.000000000","message":"Done","commit_id":"2429410d0ed3b67430544029e275954be567d629"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"2ee8e9acbea67868f6b904d9b89ea5d18040cf69","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        LOG.info(\"EVPN VNI %d: %s -\u003e %s\", self.vni, old, value)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class EvpnFSM:"},{"line_number":48,"context_line":"    \"\"\"Finite State Machine for EVPN instances."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    Manages one Evpn instance per VNI.  Event sources"}],"source_content_type":"text/x-python","patch_set":1,"id":"e8bddec4_11b642fc","line":47,"updated":"2026-05-05 19:47:58.000000000","message":"We need to keep in mind the agent can be restarted or come up at any time which makes the FSM quite hard as it always considers INIT being the starting point, which may not be true.","commit_id":"2429410d0ed3b67430544029e275954be567d629"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"dbdcee273fe1c925ff196d6b53f83958337fbaa3","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        LOG.info(\"EVPN VNI %d: %s -\u003e %s\", self.vni, old, value)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class EvpnFSM:"},{"line_number":48,"context_line":"    \"\"\"Finite State Machine for EVPN instances."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    Manages one Evpn instance per VNI.  Event sources"}],"source_content_type":"text/x-python","patch_set":1,"id":"d23ba424_440a0932","line":47,"in_reply_to":"e8bddec4_11b642fc","updated":"2026-05-07 20:05:43.000000000","message":"When the agent restarts, netlink messages are replayed and EVPN instances are rebuilt.  The same thing should be done for port_binding objects when we develop that code.","commit_id":"2429410d0ed3b67430544029e275954be567d629"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"2ee8e9acbea67868f6b904d9b89ea5d18040cf69","unresolved":true,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def port_binding_create(self, vni, mac):"},{"line_number":77,"context_line":"        \"\"\"Called by PortBindingLrpEvpnEvent on creation.\"\"\""},{"line_number":78,"context_line":"        evpn \u003d self.instances.get(vni)"},{"line_number":79,"context_line":"        if evpn is None:"},{"line_number":80,"context_line":"            evpn \u003d Evpn(vni, mac, None)"},{"line_number":81,"context_line":"            self.instances[vni] \u003d evpn"},{"line_number":82,"context_line":"            LOG.info(\"EVPN created: VNI %d, MAC %s\", evpn.vni, evpn.mac)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f7c63f86_823b0fcd","line":79,"range":{"start_line":78,"start_character":0,"end_line":79,"end_character":24},"updated":"2026-05-05 19:47:58.000000000","message":"The following construct repeats and it\u0027s more a C-like pattern but it is actually a Python anti-pattern:\n```\n   value \u003d dict.get(key)\n   if value:\n      do_something(value)\n```\nthe Pythonic way would be\n```\n   try:\n      do_something(dict[key])\n   except KeyError:\n      LOG.warning(\"We\u0027re attempting to work with unknown %s\", key)\n```","commit_id":"2429410d0ed3b67430544029e275954be567d629"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"dbdcee273fe1c925ff196d6b53f83958337fbaa3","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def port_binding_create(self, vni, mac):"},{"line_number":77,"context_line":"        \"\"\"Called by PortBindingLrpEvpnEvent on creation.\"\"\""},{"line_number":78,"context_line":"        evpn \u003d self.instances.get(vni)"},{"line_number":79,"context_line":"        if evpn is None:"},{"line_number":80,"context_line":"            evpn \u003d Evpn(vni, mac, None)"},{"line_number":81,"context_line":"            self.instances[vni] \u003d evpn"},{"line_number":82,"context_line":"            LOG.info(\"EVPN created: VNI %d, MAC %s\", evpn.vni, evpn.mac)"}],"source_content_type":"text/x-python","patch_set":1,"id":"57a8cae6_fc4d5d84","line":79,"range":{"start_line":78,"start_character":0,"end_line":79,"end_character":24},"in_reply_to":"f7c63f86_823b0fcd","updated":"2026-05-07 20:05:43.000000000","message":"Done","commit_id":"2429410d0ed3b67430544029e275954be567d629"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"de72bcf83461505bfb953fb14c226d5a51dc9acd","unresolved":true,"context_lines":[{"line_number":36,"context_line":"        self.vrf \u003d vrf"},{"line_number":37,"context_line":"        self._state \u003d self.INIT"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def state(self):"},{"line_number":41,"context_line":"        return self._state"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @state.setter"},{"line_number":44,"context_line":"    def state(self, value):"},{"line_number":45,"context_line":"        old \u003d self._state"},{"line_number":46,"context_line":"        self._state \u003d value"},{"line_number":47,"context_line":"        LOG.info(\"EVPN VNI %d: %s -\u003e %s\", self.vni, old, value)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class EvpnFSM:"}],"source_content_type":"text/x-python","patch_set":4,"id":"794f941c_9d62119a","line":47,"range":{"start_line":39,"start_character":0,"end_line":47,"end_character":63},"updated":"2026-05-12 18:54:17.000000000","message":"Do we need it just for the logging? We can just log on L131 and we won\u0027t need to complicate the class with these getters/setters.","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"37a39982df9acdd088fc8d92470472e3ae8f2bef","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.vrf \u003d vrf"},{"line_number":37,"context_line":"        self._state \u003d self.INIT"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @property"},{"line_number":40,"context_line":"    def state(self):"},{"line_number":41,"context_line":"        return self._state"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @state.setter"},{"line_number":44,"context_line":"    def state(self, value):"},{"line_number":45,"context_line":"        old \u003d self._state"},{"line_number":46,"context_line":"        self._state \u003d value"},{"line_number":47,"context_line":"        LOG.info(\"EVPN VNI %d: %s -\u003e %s\", self.vni, old, value)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class EvpnFSM:"}],"source_content_type":"text/x-python","patch_set":4,"id":"0cbc4921_ec7a3515","line":47,"range":{"start_line":39,"start_character":0,"end_line":47,"end_character":63},"in_reply_to":"794f941c_9d62119a","updated":"2026-05-15 03:55:35.000000000","message":"Done","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"de72bcf83461505bfb953fb14c226d5a51dc9acd","unresolved":true,"context_lines":[{"line_number":62,"context_line":"    FSM_EVENT_VRF_DELETE \u003d \u0027vrf_delete\u0027"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __init__(self, evpn_agent):"},{"line_number":65,"context_line":"        self.evpn_agent \u003d evpn_agent"},{"line_number":66,"context_line":"        self.instances \u003d {}  # vni -\u003e Evpn"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _port_binding_create(self, evpn, context):"}],"source_content_type":"text/x-python","patch_set":4,"id":"8fd0b5f7_2a908b2b","line":65,"updated":"2026-05-12 18:54:17.000000000","message":"Is it used?","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"37a39982df9acdd088fc8d92470472e3ae8f2bef","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    FSM_EVENT_VRF_DELETE \u003d \u0027vrf_delete\u0027"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __init__(self, evpn_agent):"},{"line_number":65,"context_line":"        self.evpn_agent \u003d evpn_agent"},{"line_number":66,"context_line":"        self.instances \u003d {}  # vni -\u003e Evpn"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _port_binding_create(self, evpn, context):"}],"source_content_type":"text/x-python","patch_set":4,"id":"116d6daa_a48f8b1a","line":65,"in_reply_to":"8fd0b5f7_2a908b2b","updated":"2026-05-15 03:55:35.000000000","message":"removed.","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"de72bcf83461505bfb953fb14c226d5a51dc9acd","unresolved":true,"context_lines":[{"line_number":113,"context_line":"            (Evpn.DESTROY, _destroy),"},{"line_number":114,"context_line":"    }"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def advance(self, event, context):"},{"line_number":117,"context_line":"        \"\"\"Drive FSM state transition for a VNI in response to an event.\"\"\""},{"line_number":118,"context_line":"        with _FSM_LOCK:"},{"line_number":119,"context_line":"            vni \u003d context.get(\u0027vni\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"400a954d_4157643c","line":116,"range":{"start_line":116,"start_character":29,"end_line":116,"end_character":36},"updated":"2026-05-12 18:54:17.000000000","message":"This dynamic dict just shadows what\u0027s in it. Since the context is always just vni and mac, we can pass it directly here or use `Namedtuple`","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"37a39982df9acdd088fc8d92470472e3ae8f2bef","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            (Evpn.DESTROY, _destroy),"},{"line_number":114,"context_line":"    }"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def advance(self, event, context):"},{"line_number":117,"context_line":"        \"\"\"Drive FSM state transition for a VNI in response to an event.\"\"\""},{"line_number":118,"context_line":"        with _FSM_LOCK:"},{"line_number":119,"context_line":"            vni \u003d context.get(\u0027vni\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9936e47e_501625f6","line":116,"range":{"start_line":116,"start_character":29,"end_line":116,"end_character":36},"in_reply_to":"400a954d_4157643c","updated":"2026-05-15 03:55:35.000000000","message":"changed to use kwargs.","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"de72bcf83461505bfb953fb14c226d5a51dc9acd","unresolved":true,"context_lines":[{"line_number":116,"context_line":"    def advance(self, event, context):"},{"line_number":117,"context_line":"        \"\"\"Drive FSM state transition for a VNI in response to an event.\"\"\""},{"line_number":118,"context_line":"        with _FSM_LOCK:"},{"line_number":119,"context_line":"            vni \u003d context.get(\u0027vni\u0027)"},{"line_number":120,"context_line":"            if vni is None:"},{"line_number":121,"context_line":"                # This should not happen"},{"line_number":122,"context_line":"                LOG.warning(\"No EVPN VNI specified\")"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"            evpn \u003d self.instances.get(vni)"},{"line_number":125,"context_line":"            if evpn is None:"},{"line_number":126,"context_line":"                evpn \u003d Evpn(vni, context.get(\u0027mac\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7021ff7c_5ea81651","line":123,"range":{"start_line":119,"start_character":0,"end_line":123,"end_character":22},"updated":"2026-05-12 18:54:17.000000000","message":"We wouldn\u0027t need this if we passed vni and vrf as arguments.","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"37a39982df9acdd088fc8d92470472e3ae8f2bef","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def advance(self, event, context):"},{"line_number":117,"context_line":"        \"\"\"Drive FSM state transition for a VNI in response to an event.\"\"\""},{"line_number":118,"context_line":"        with _FSM_LOCK:"},{"line_number":119,"context_line":"            vni \u003d context.get(\u0027vni\u0027)"},{"line_number":120,"context_line":"            if vni is None:"},{"line_number":121,"context_line":"                # This should not happen"},{"line_number":122,"context_line":"                LOG.warning(\"No EVPN VNI specified\")"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"            evpn \u003d self.instances.get(vni)"},{"line_number":125,"context_line":"            if evpn is None:"},{"line_number":126,"context_line":"                evpn \u003d Evpn(vni, context.get(\u0027mac\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"30785d9a_9f08eafc","line":123,"range":{"start_line":119,"start_character":0,"end_line":123,"end_character":22},"in_reply_to":"7021ff7c_5ea81651","updated":"2026-05-15 03:55:35.000000000","message":"changed to use kwargs.","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"de72bcf83461505bfb953fb14c226d5a51dc9acd","unresolved":true,"context_lines":[{"line_number":121,"context_line":"                # This should not happen"},{"line_number":122,"context_line":"                LOG.warning(\"No EVPN VNI specified\")"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"            evpn \u003d self.instances.get(vni)"},{"line_number":125,"context_line":"            if evpn is None:"},{"line_number":126,"context_line":"                evpn \u003d Evpn(vni, context.get(\u0027mac\u0027),"},{"line_number":127,"context_line":"                            context.get(\u0027vrf\u0027))"},{"line_number":128,"context_line":"                self.instances[vni] \u003d evpn"},{"line_number":129,"context_line":"                LOG.info(\"EVPN created: VNI %d\", vni)"},{"line_number":130,"context_line":"            evpn.state, callback \u003d self.TRANSITIONS[(evpn.state, event)]"},{"line_number":131,"context_line":"            callback(self, evpn, context)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f43a584_8e04a169","line":129,"range":{"start_line":124,"start_character":0,"end_line":129,"end_character":53},"updated":"2026-05-12 18:54:17.000000000","message":"```\nevnp \u003d self.instances.setdefault(vni, Evpn(vni, mac, vrf)\n```","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"37a39982df9acdd088fc8d92470472e3ae8f2bef","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                # This should not happen"},{"line_number":122,"context_line":"                LOG.warning(\"No EVPN VNI specified\")"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"            evpn \u003d self.instances.get(vni)"},{"line_number":125,"context_line":"            if evpn is None:"},{"line_number":126,"context_line":"                evpn \u003d Evpn(vni, context.get(\u0027mac\u0027),"},{"line_number":127,"context_line":"                            context.get(\u0027vrf\u0027))"},{"line_number":128,"context_line":"                self.instances[vni] \u003d evpn"},{"line_number":129,"context_line":"                LOG.info(\"EVPN created: VNI %d\", vni)"},{"line_number":130,"context_line":"            evpn.state, callback \u003d self.TRANSITIONS[(evpn.state, event)]"},{"line_number":131,"context_line":"            callback(self, evpn, context)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ace78797_d6ecfc95","line":129,"range":{"start_line":124,"start_character":0,"end_line":129,"end_character":53},"in_reply_to":"3f43a584_8e04a169","updated":"2026-05-15 03:55:35.000000000","message":"Done","commit_id":"4af4d2f5a84ba91bd3a68ce76e5044dc28a47130"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"494ab10b7f20e1cb7214bcf6336dd4d4f238dc07","unresolved":true,"context_lines":[{"line_number":43,"context_line":"    \"\"\"Finite State Machine for EVPN instances."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    Manages one Evpn instance per VNI.  Event sources"},{"line_number":46,"context_line":"    (PortBindingLrpEvpnEvent, VrfHandler) call the public"},{"line_number":47,"context_line":"    methods; the FSM drives state transitions and triggers"},{"line_number":48,"context_line":"    provisioning actions."},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"100699cc_e1485f9d","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":28},"updated":"2026-05-15 20:11:34.000000000","message":"just asking, so the future `PortBindingLrpEvpnEvent` class will also accept the same instance of evpn_fsm?\n\nCurrently in evpn __init__.py we have\n```\n_evpn_fsm\u003dfsm.EvpnFSM()\nvrf_handler \u003d netlink_monitor.VrfHandler(self._evpn_fsm)\n# then nl_dispatcher is the trigger mechanism for the vrf_handler \n\n# so for the PortBinding will also have a handler, e.g.\npb_handler \u003d PortBinfingHandler(self._evpn_fsm) \n# where the PortBindingHandler will having something like this\nclass PortBindigEVPNport(row_event.RowEvent):\n   ...\n   def run(self, event, row, old):\n      self._evpn_fsm.advance(fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE, vni, lrp_mac\u003dmac)\n```\nis my general understanding correct?","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e4429675bd572559781bb1e7fddfda58c0576395","unresolved":true,"context_lines":[{"line_number":43,"context_line":"    \"\"\"Finite State Machine for EVPN instances."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    Manages one Evpn instance per VNI.  Event sources"},{"line_number":46,"context_line":"    (PortBindingLrpEvpnEvent, VrfHandler) call the public"},{"line_number":47,"context_line":"    methods; the FSM drives state transitions and triggers"},{"line_number":48,"context_line":"    provisioning actions."},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"832125e4_39125108","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":28},"in_reply_to":"100699cc_e1485f9d","updated":"2026-05-15 21:02:02.000000000","message":"exactly","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \"\"\"Finite State Machine for EVPN instances."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    Manages one Evpn instance per VNI.  Event sources"},{"line_number":46,"context_line":"    (PortBindingLrpEvpnEvent, VrfHandler) call the public"},{"line_number":47,"context_line":"    methods; the FSM drives state transitions and triggers"},{"line_number":48,"context_line":"    provisioning actions."},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"2c81d69f_a56bf145","line":46,"range":{"start_line":46,"start_character":5,"end_line":46,"end_character":28},"in_reply_to":"832125e4_39125108","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"5f4a89e4a1a8ace8c5cd225998d02937c677e2b6","unresolved":true,"context_lines":[{"line_number":60,"context_line":"        (Evpn.INIT, FSM_EVENT_PORT_BINDING_CREATE):"},{"line_number":61,"context_line":"            (Evpn.WAITING_FOR_VRF, \"_set_mac\"),"},{"line_number":62,"context_line":"        (Evpn.INIT, FSM_EVENT_VRF_CREATE):"},{"line_number":63,"context_line":"            (Evpn.WAITING_FOR_MAC, \"_set_vrf\"),"},{"line_number":64,"context_line":"        (Evpn.WAITING_FOR_VRF, FSM_EVENT_VRF_CREATE):"},{"line_number":65,"context_line":"            (Evpn.ADVERTISING, \"_set_vrf_and_advertise\"),"},{"line_number":66,"context_line":"        (Evpn.WAITING_FOR_MAC, FSM_EVENT_PORT_BINDING_CREATE):"}],"source_content_type":"text/x-python","patch_set":5,"id":"10b82ff9_fa35a53e","line":63,"range":{"start_line":63,"start_character":12,"end_line":63,"end_character":33},"updated":"2026-05-15 19:05:14.000000000","message":"I am not clear about this WAITING_FOR_MAC state. Which MAC? and why do we need to wait for one? \nAs far as I know. The only MAC that EVPN need to worry about is the MAC of the LRP bound to a chassis. That is because that MAC needs to be set on the linux interface handling VXLAN. The MAC of the LRP will come from a Port_Binding record","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"20560793925612019cbaf6b5cb29c0c1c5ced384","unresolved":true,"context_lines":[{"line_number":60,"context_line":"        (Evpn.INIT, FSM_EVENT_PORT_BINDING_CREATE):"},{"line_number":61,"context_line":"            (Evpn.WAITING_FOR_VRF, \"_set_mac\"),"},{"line_number":62,"context_line":"        (Evpn.INIT, FSM_EVENT_VRF_CREATE):"},{"line_number":63,"context_line":"            (Evpn.WAITING_FOR_MAC, \"_set_vrf\"),"},{"line_number":64,"context_line":"        (Evpn.WAITING_FOR_VRF, FSM_EVENT_VRF_CREATE):"},{"line_number":65,"context_line":"            (Evpn.ADVERTISING, \"_set_vrf_and_advertise\"),"},{"line_number":66,"context_line":"        (Evpn.WAITING_FOR_MAC, FSM_EVENT_PORT_BINDING_CREATE):"}],"source_content_type":"text/x-python","patch_set":5,"id":"d73862fc_9dcf8237","line":63,"range":{"start_line":63,"start_character":12,"end_line":63,"end_character":33},"in_reply_to":"10b82ff9_fa35a53e","updated":"2026-05-15 19:56:48.000000000","message":"Yes, my understanding is that it is the mac provided by the Port_Binding record that it is waiting for. i.e. we are waiting on the PB event.","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        (Evpn.INIT, FSM_EVENT_PORT_BINDING_CREATE):"},{"line_number":61,"context_line":"            (Evpn.WAITING_FOR_VRF, \"_set_mac\"),"},{"line_number":62,"context_line":"        (Evpn.INIT, FSM_EVENT_VRF_CREATE):"},{"line_number":63,"context_line":"            (Evpn.WAITING_FOR_MAC, \"_set_vrf\"),"},{"line_number":64,"context_line":"        (Evpn.WAITING_FOR_VRF, FSM_EVENT_VRF_CREATE):"},{"line_number":65,"context_line":"            (Evpn.ADVERTISING, \"_set_vrf_and_advertise\"),"},{"line_number":66,"context_line":"        (Evpn.WAITING_FOR_MAC, FSM_EVENT_PORT_BINDING_CREATE):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9cb611bf_506cfc9c","line":63,"range":{"start_line":63,"start_character":12,"end_line":63,"end_character":33},"in_reply_to":"d73862fc_9dcf8237","updated":"2026-05-18 02:13:40.000000000","message":"yes, that\u0027s what Terry said.","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"5f4a89e4a1a8ace8c5cd225998d02937c677e2b6","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    def __init__(self):"},{"line_number":79,"context_line":"        self.instances \u003d {}  # vni -\u003e Evpn"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _set_mac(self, evpn, **kwargs):"},{"line_number":82,"context_line":"        evpn.mac \u003d kwargs.get(\u0027mac\u0027)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _unset_mac(self, evpn, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ea173b3d_10600574","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":16},"updated":"2026-05-15 19:05:14.000000000","message":"`_set_mac` means setting LRP port mac on the linux vxlan interface(or SVD vlan interface)?","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def __init__(self):"},{"line_number":79,"context_line":"        self.instances \u003d {}  # vni -\u003e Evpn"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _set_mac(self, evpn, **kwargs):"},{"line_number":82,"context_line":"        evpn.mac \u003d kwargs.get(\u0027mac\u0027)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _unset_mac(self, evpn, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"4f6ff886_6479c9e8","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":16},"in_reply_to":"72816c57_0d6b0667","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4f78f966ccc14617940d5636dd8c14fe74a02c1c","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    def __init__(self):"},{"line_number":79,"context_line":"        self.instances \u003d {}  # vni -\u003e Evpn"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _set_mac(self, evpn, **kwargs):"},{"line_number":82,"context_line":"        evpn.mac \u003d kwargs.get(\u0027mac\u0027)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _unset_mac(self, evpn, **kwargs):"}],"source_content_type":"text/x-python","patch_set":5,"id":"72816c57_0d6b0667","line":81,"range":{"start_line":81,"start_character":8,"end_line":81,"end_character":16},"in_reply_to":"ea173b3d_10600574","updated":"2026-05-15 20:59:48.000000000","message":"it means set the PB mac to the Evpn instance that is the data carrier","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"48ad5d978f83b47122da6bf3da2bfcc96d714d00","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        self._set_mac(evpn, **kwargs)"},{"line_number":100,"context_line":"        LOG.debug(\"EVPN: VNI %d Create VLAN and update FRR \""},{"line_number":101,"context_line":"                 \"configuration to start advertising and learning\", evpn.vni)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _destroy(self, evpn, **kwargs):"},{"line_number":104,"context_line":"        LOG.debug(\"EVPN deleted: VNI %d\", evpn.vni)"},{"line_number":105,"context_line":"        self.instances.pop(evpn.vni)"}],"source_content_type":"text/x-python","patch_set":5,"id":"780fa540_74b8bfbf","line":102,"updated":"2026-05-15 21:07:50.000000000","message":"maybe we should add\n```\ndef advertise(self):\n    pass\n```\n\nas a placeholder for the FRR configurator execution, and then call it from the two methods that bundle setter and advertise.","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self._set_mac(evpn, **kwargs)"},{"line_number":100,"context_line":"        LOG.debug(\"EVPN: VNI %d Create VLAN and update FRR \""},{"line_number":101,"context_line":"                 \"configuration to start advertising and learning\", evpn.vni)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _destroy(self, evpn, **kwargs):"},{"line_number":104,"context_line":"        LOG.debug(\"EVPN deleted: VNI %d\", evpn.vni)"},{"line_number":105,"context_line":"        self.instances.pop(evpn.vni)"}],"source_content_type":"text/x-python","patch_set":5,"id":"a90cfb40_d85a8744","line":102,"in_reply_to":"780fa540_74b8bfbf","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"19e424575ce7ceb894ac3953856b8abfebad2d6b","unresolved":true,"context_lines":[{"line_number":107,"context_line":"    def advance(self, event, vni, **kwargs):"},{"line_number":108,"context_line":"        \"\"\"Drive FSM state transition for a VNI in response to an event.\"\"\""},{"line_number":109,"context_line":"        with _FSM_LOCK:"},{"line_number":110,"context_line":"            evpn \u003d self.instances.get(vni)"},{"line_number":111,"context_line":"            if evpn is None:"},{"line_number":112,"context_line":"                evpn \u003d self.instances.setdefault(vni, Evpn(vni))"},{"line_number":113,"context_line":"                LOG.debug(\"EVPN created: VNI %d\", vni)"},{"line_number":114,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"c6f6d748_8d33535d","line":111,"range":{"start_line":110,"start_character":0,"end_line":111,"end_character":28},"updated":"2026-05-15 13:51:34.000000000","message":"You should delete this","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    def advance(self, event, vni, **kwargs):"},{"line_number":108,"context_line":"        \"\"\"Drive FSM state transition for a VNI in response to an event.\"\"\""},{"line_number":109,"context_line":"        with _FSM_LOCK:"},{"line_number":110,"context_line":"            evpn \u003d self.instances.get(vni)"},{"line_number":111,"context_line":"            if evpn is None:"},{"line_number":112,"context_line":"                evpn \u003d self.instances.setdefault(vni, Evpn(vni))"},{"line_number":113,"context_line":"                LOG.debug(\"EVPN created: VNI %d\", vni)"},{"line_number":114,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5255864e_85c8d13b","line":111,"range":{"start_line":110,"start_character":0,"end_line":111,"end_character":28},"in_reply_to":"c6f6d748_8d33535d","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d41830d917f8d6b77eddbdea936bd8c9841ca90d","unresolved":true,"context_lines":[{"line_number":112,"context_line":"                evpn \u003d self.instances.setdefault(vni, Evpn(vni))"},{"line_number":113,"context_line":"                LOG.debug(\"EVPN created: VNI %d\", vni)"},{"line_number":114,"context_line":"            try:"},{"line_number":115,"context_line":"                old_state \u003d evpn.state"},{"line_number":116,"context_line":"                evpn.state, callback_name \u003d self.TRANSITIONS["},{"line_number":117,"context_line":"                    (evpn.state, event)]"},{"line_number":118,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"088ffb9c_9cd4280e","line":115,"range":{"start_line":115,"start_character":16,"end_line":115,"end_character":25},"updated":"2026-05-15 18:10:35.000000000","message":"nit: previous_state","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                evpn \u003d self.instances.setdefault(vni, Evpn(vni))"},{"line_number":113,"context_line":"                LOG.debug(\"EVPN created: VNI %d\", vni)"},{"line_number":114,"context_line":"            try:"},{"line_number":115,"context_line":"                old_state \u003d evpn.state"},{"line_number":116,"context_line":"                evpn.state, callback_name \u003d self.TRANSITIONS["},{"line_number":117,"context_line":"                    (evpn.state, event)]"},{"line_number":118,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"4d8dc88a_98c185c5","line":115,"range":{"start_line":115,"start_character":16,"end_line":115,"end_character":25},"in_reply_to":"088ffb9c_9cd4280e","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d41830d917f8d6b77eddbdea936bd8c9841ca90d","unresolved":true,"context_lines":[{"line_number":113,"context_line":"                LOG.debug(\"EVPN created: VNI %d\", vni)"},{"line_number":114,"context_line":"            try:"},{"line_number":115,"context_line":"                old_state \u003d evpn.state"},{"line_number":116,"context_line":"                evpn.state, callback_name \u003d self.TRANSITIONS["},{"line_number":117,"context_line":"                    (evpn.state, event)]"},{"line_number":118,"context_line":"            except KeyError:"},{"line_number":119,"context_line":"                raise evpn_exc.FSMIllegalTransition(\"This should not happen!\")"},{"line_number":120,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"6c0d83f9_58a504b7","line":117,"range":{"start_line":116,"start_character":0,"end_line":117,"end_character":40},"updated":"2026-05-15 18:10:35.000000000","message":"here the `evpn.state` will set the \"next_state\" to that evpn instance, but you have not called the callback function yet. What about if the callback function failed?","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"20560793925612019cbaf6b5cb29c0c1c5ced384","unresolved":true,"context_lines":[{"line_number":113,"context_line":"                LOG.debug(\"EVPN created: VNI %d\", vni)"},{"line_number":114,"context_line":"            try:"},{"line_number":115,"context_line":"                old_state \u003d evpn.state"},{"line_number":116,"context_line":"                evpn.state, callback_name \u003d self.TRANSITIONS["},{"line_number":117,"context_line":"                    (evpn.state, event)]"},{"line_number":118,"context_line":"            except KeyError:"},{"line_number":119,"context_line":"                raise evpn_exc.FSMIllegalTransition(\"This should not happen!\")"},{"line_number":120,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"af83cd21_21cbecda","line":117,"range":{"start_line":116,"start_character":0,"end_line":117,"end_character":40},"in_reply_to":"6c0d83f9_58a504b7","updated":"2026-05-15 19:56:48.000000000","message":"The next state in a FSM is usually determined by the current state and the input. My assumption would be that if the callback fails, either an exception is thrown, in which case whoever is advancing the state will handle what to do or the callback itself, if it has the necessary info could do so.","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                LOG.debug(\"EVPN created: VNI %d\", vni)"},{"line_number":114,"context_line":"            try:"},{"line_number":115,"context_line":"                old_state \u003d evpn.state"},{"line_number":116,"context_line":"                evpn.state, callback_name \u003d self.TRANSITIONS["},{"line_number":117,"context_line":"                    (evpn.state, event)]"},{"line_number":118,"context_line":"            except KeyError:"},{"line_number":119,"context_line":"                raise evpn_exc.FSMIllegalTransition(\"This should not happen!\")"},{"line_number":120,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"09610c25_27d8e314","line":117,"range":{"start_line":116,"start_character":0,"end_line":117,"end_character":40},"in_reply_to":"6c0d83f9_58a504b7","updated":"2026-05-18 02:13:40.000000000","message":"yes, what Terry said and Jakub said.\n\nAs a side note on an implementation detail when we get to it, but a transition could include another callback function to rollback, in addition to the existing callback function to act on the event.","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4f78f966ccc14617940d5636dd8c14fe74a02c1c","unresolved":true,"context_lines":[{"line_number":113,"context_line":"                LOG.debug(\"EVPN created: VNI %d\", vni)"},{"line_number":114,"context_line":"            try:"},{"line_number":115,"context_line":"                old_state \u003d evpn.state"},{"line_number":116,"context_line":"                evpn.state, callback_name \u003d self.TRANSITIONS["},{"line_number":117,"context_line":"                    (evpn.state, event)]"},{"line_number":118,"context_line":"            except KeyError:"},{"line_number":119,"context_line":"                raise evpn_exc.FSMIllegalTransition(\"This should not happen!\")"},{"line_number":120,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"26d07814_a0388bb6","line":117,"range":{"start_line":116,"start_character":0,"end_line":117,"end_character":40},"in_reply_to":"af83cd21_21cbecda","updated":"2026-05-15 20:59:48.000000000","message":"I agree with Terry. If the callback fails - it should be up to the caller that advanced. As the callback is a consequence of a state transition - the transition must happen.","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c10e8dc9c2273818224d73a3df4cc5c0b5374a47","unresolved":true,"context_lines":[{"line_number":116,"context_line":"                evpn.state, callback_name \u003d self.TRANSITIONS["},{"line_number":117,"context_line":"                    (evpn.state, event)]"},{"line_number":118,"context_line":"            except KeyError:"},{"line_number":119,"context_line":"                raise evpn_exc.FSMIllegalTransition(\"This should not happen!\")"},{"line_number":120,"context_line":"            try:"},{"line_number":121,"context_line":"                callback \u003d getattr(self, callback_name)"},{"line_number":122,"context_line":"            except AttributeError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"77b6384c_a86e0072","line":119,"updated":"2026-05-15 14:06:46.000000000","message":"maybe you could log more info about what was the current state and even which wasn\u0027t expected to happen. It may help with debugging in future maybe","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                evpn.state, callback_name \u003d self.TRANSITIONS["},{"line_number":117,"context_line":"                    (evpn.state, event)]"},{"line_number":118,"context_line":"            except KeyError:"},{"line_number":119,"context_line":"                raise evpn_exc.FSMIllegalTransition(\"This should not happen!\")"},{"line_number":120,"context_line":"            try:"},{"line_number":121,"context_line":"                callback \u003d getattr(self, callback_name)"},{"line_number":122,"context_line":"            except AttributeError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"597346d0_a46d4984","line":119,"in_reply_to":"77b6384c_a86e0072","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c10e8dc9c2273818224d73a3df4cc5c0b5374a47","unresolved":true,"context_lines":[{"line_number":121,"context_line":"                callback \u003d getattr(self, callback_name)"},{"line_number":122,"context_line":"            except AttributeError:"},{"line_number":123,"context_line":"                raise evpn_exc.FSMMissingTransitionCallback("},{"line_number":124,"context_line":"                    \"This should not happen!\")"},{"line_number":125,"context_line":"            LOG.info(\"EVPN VNI %d: %s -\u003e %s\", vni, old_state, evpn.state)"},{"line_number":126,"context_line":"            callback(evpn, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"c32eadda_3711a56a","line":124,"updated":"2026-05-15 14:06:46.000000000","message":"ditto","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                callback \u003d getattr(self, callback_name)"},{"line_number":122,"context_line":"            except AttributeError:"},{"line_number":123,"context_line":"                raise evpn_exc.FSMMissingTransitionCallback("},{"line_number":124,"context_line":"                    \"This should not happen!\")"},{"line_number":125,"context_line":"            LOG.info(\"EVPN VNI %d: %s -\u003e %s\", vni, old_state, evpn.state)"},{"line_number":126,"context_line":"            callback(evpn, **kwargs)"}],"source_content_type":"text/x-python","patch_set":5,"id":"c4dabb03_1b782ff7","line":124,"in_reply_to":"c32eadda_3711a56a","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"c71f041f473e48938112f5d721a6cac7e0d3ecd4","unresolved":true,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _set_vrf_up_and_advertise(self, evpn):"},{"line_number":101,"context_line":"        self._set_vrf_up(evpn)"},{"line_number":102,"context_line":"        LOG.debug(\"EVPN: VNI %d Create VLAN and update FRR \""},{"line_number":103,"context_line":"                 \"configuration to start advertising and learning\", evpn.vni)"},{"line_number":104,"context_line":"        self._advertise(evpn)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _set_mac_vni_and_advertise(self, evpn, mac, vni):"},{"line_number":107,"context_line":"        self._set_mac_vni(evpn, mac, vni)"},{"line_number":108,"context_line":"        LOG.debug(\"EVPN: VNI %d Create VLAN and update FRR \""},{"line_number":109,"context_line":"                 \"configuration to start advertising and learning\", evpn.vni)"},{"line_number":110,"context_line":"        self._advertise(evpn)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _destroy(self, evpn):"}],"source_content_type":"text/x-python","patch_set":6,"id":"b163b18c_3ece6e9e","line":109,"range":{"start_line":102,"start_character":0,"end_line":109,"end_character":77},"updated":"2026-05-18 08:40:44.000000000","message":"Considering both debug logs same here, don\u0027t we need to differentiate here? Is FRR configuration really updated in this _set_mac_vni_and_advertise case also, from spec doesn\u0027t seems so.","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"adf9ebed610fccce8baff2feb700513a447c9c14","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _set_vrf_up_and_advertise(self, evpn):"},{"line_number":101,"context_line":"        self._set_vrf_up(evpn)"},{"line_number":102,"context_line":"        LOG.debug(\"EVPN: VNI %d Create VLAN and update FRR \""},{"line_number":103,"context_line":"                 \"configuration to start advertising and learning\", evpn.vni)"},{"line_number":104,"context_line":"        self._advertise(evpn)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _set_mac_vni_and_advertise(self, evpn, mac, vni):"},{"line_number":107,"context_line":"        self._set_mac_vni(evpn, mac, vni)"},{"line_number":108,"context_line":"        LOG.debug(\"EVPN: VNI %d Create VLAN and update FRR \""},{"line_number":109,"context_line":"                 \"configuration to start advertising and learning\", evpn.vni)"},{"line_number":110,"context_line":"        self._advertise(evpn)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _destroy(self, evpn):"}],"source_content_type":"text/x-python","patch_set":6,"id":"b8636a82_85b5921f","line":109,"range":{"start_line":102,"start_character":0,"end_line":109,"end_character":77},"in_reply_to":"514204ee_b72f763c","updated":"2026-05-18 14:33:20.000000000","message":"Done","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"16b0f38d3edbc0788a71ea1dffae33e2ddb4c886","unresolved":true,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def _set_vrf_up_and_advertise(self, evpn):"},{"line_number":101,"context_line":"        self._set_vrf_up(evpn)"},{"line_number":102,"context_line":"        LOG.debug(\"EVPN: VNI %d Create VLAN and update FRR \""},{"line_number":103,"context_line":"                 \"configuration to start advertising and learning\", evpn.vni)"},{"line_number":104,"context_line":"        self._advertise(evpn)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _set_mac_vni_and_advertise(self, evpn, mac, vni):"},{"line_number":107,"context_line":"        self._set_mac_vni(evpn, mac, vni)"},{"line_number":108,"context_line":"        LOG.debug(\"EVPN: VNI %d Create VLAN and update FRR \""},{"line_number":109,"context_line":"                 \"configuration to start advertising and learning\", evpn.vni)"},{"line_number":110,"context_line":"        self._advertise(evpn)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _destroy(self, evpn):"}],"source_content_type":"text/x-python","patch_set":6,"id":"514204ee_b72f763c","line":109,"range":{"start_line":102,"start_character":0,"end_line":109,"end_character":77},"in_reply_to":"b163b18c_3ece6e9e","updated":"2026-05-18 12:49:19.000000000","message":"yes, once we have all data we need, the \"advertise\" piece should configure frr. The LOG message should be on L98","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"}],"neutron/agent/ovn/extensions/evpn/netlink_monitor.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"358b615dbb355d25b0ac9d9176ba095d60a74603","unresolved":true,"context_lines":[{"line_number":43,"context_line":"        link_kind \u003d msg.get_nested(\u0027IFLA_LINKINFO\u0027, \u0027IFLA_INFO_KIND\u0027)"},{"line_number":44,"context_line":"        return link_kind \u003d\u003d evpn_const.EVPN_LINK_KIND_VRF"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _is_evpn_vrf(self, ifname):"},{"line_number":47,"context_line":"        # EVPN VRF name has EVPN_VRF_NAME_LEN characters:"},{"line_number":48,"context_line":"        #   EVPN_VRF_PREFIX followed by"},{"line_number":49,"context_line":"        #   the first 12 characters of the logical router\u0027s UUID"}],"source_content_type":"text/x-python","patch_set":6,"id":"a1ec469a_c11e1b1b","line":46,"updated":"2026-05-18 13:09:48.000000000","message":"should be either a helper function or a static method","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"adf9ebed610fccce8baff2feb700513a447c9c14","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        link_kind \u003d msg.get_nested(\u0027IFLA_LINKINFO\u0027, \u0027IFLA_INFO_KIND\u0027)"},{"line_number":44,"context_line":"        return link_kind \u003d\u003d evpn_const.EVPN_LINK_KIND_VRF"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def _is_evpn_vrf(self, ifname):"},{"line_number":47,"context_line":"        # EVPN VRF name has EVPN_VRF_NAME_LEN characters:"},{"line_number":48,"context_line":"        #   EVPN_VRF_PREFIX followed by"},{"line_number":49,"context_line":"        #   the first 12 characters of the logical router\u0027s UUID"}],"source_content_type":"text/x-python","patch_set":6,"id":"86818188_eb63ea5c","line":46,"in_reply_to":"a1ec469a_c11e1b1b","updated":"2026-05-18 14:33:20.000000000","message":"Done","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"358b615dbb355d25b0ac9d9176ba095d60a74603","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        # EVPN VRF name has EVPN_VRF_NAME_LEN characters:"},{"line_number":48,"context_line":"        #   EVPN_VRF_PREFIX followed by"},{"line_number":49,"context_line":"        #   the first 12 characters of the logical router\u0027s UUID"},{"line_number":50,"context_line":"        return (ifname and"},{"line_number":51,"context_line":"                len(ifname) \u003d\u003d evpn_const.EVPN_VRF_NAME_LEN and"},{"line_number":52,"context_line":"                ifname.startswith(evpn_const.EVPN_VRF_PREFIX))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _parse_evpn_vrf(self, msg):"},{"line_number":55,"context_line":"        \"\"\"Parse EVPN VRF name from a netlink message.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"f1cb9f97_aa120fa4","line":52,"range":{"start_line":50,"start_character":0,"end_line":52,"end_character":62},"updated":"2026-05-18 13:09:48.000000000","message":"can we use a compiled regex here instead?","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"adf9ebed610fccce8baff2feb700513a447c9c14","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        # EVPN VRF name has EVPN_VRF_NAME_LEN characters:"},{"line_number":48,"context_line":"        #   EVPN_VRF_PREFIX followed by"},{"line_number":49,"context_line":"        #   the first 12 characters of the logical router\u0027s UUID"},{"line_number":50,"context_line":"        return (ifname and"},{"line_number":51,"context_line":"                len(ifname) \u003d\u003d evpn_const.EVPN_VRF_NAME_LEN and"},{"line_number":52,"context_line":"                ifname.startswith(evpn_const.EVPN_VRF_PREFIX))"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _parse_evpn_vrf(self, msg):"},{"line_number":55,"context_line":"        \"\"\"Parse EVPN VRF name from a netlink message.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"8ac096a9_0f5242da","line":52,"range":{"start_line":50,"start_character":0,"end_line":52,"end_character":62},"in_reply_to":"f1cb9f97_aa120fa4","updated":"2026-05-18 14:33:20.000000000","message":"Done","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"358b615dbb355d25b0ac9d9176ba095d60a74603","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        except (evpn_exc.UnknownMessage, evpn_exc.UnknownVrfMessage):"},{"line_number":96,"context_line":"            # This is not an EVPN VRF"},{"line_number":97,"context_line":"            return"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            self._known_vrfs.remove(evpnvrf)"},{"line_number":100,"context_line":"        except KeyError:"},{"line_number":101,"context_line":"            # VRF not previously tracked"},{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":"        LOG.debug(\"VRF deleted: %s\", evpnvrf)"},{"line_number":104,"context_line":"        self._evpn_fsm.advance(fsm.EvpnFSM.FSM_EVENT_VRF_DELETE, evpnvrf)"}],"source_content_type":"text/x-python","patch_set":6,"id":"4743087b_e231757e","line":102,"range":{"start_line":98,"start_character":0,"end_line":102,"end_character":18},"updated":"2026-05-18 13:09:48.000000000","message":"if we\u0027re not logging or doing anything, we can do `discard()`","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4422847aab118f176394b6fe0e22cad1da7b5bd2","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        except (evpn_exc.UnknownMessage, evpn_exc.UnknownVrfMessage):"},{"line_number":96,"context_line":"            # This is not an EVPN VRF"},{"line_number":97,"context_line":"            return"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            self._known_vrfs.remove(evpnvrf)"},{"line_number":100,"context_line":"        except KeyError:"},{"line_number":101,"context_line":"            # VRF not previously tracked"},{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":"        LOG.debug(\"VRF deleted: %s\", evpnvrf)"},{"line_number":104,"context_line":"        self._evpn_fsm.advance(fsm.EvpnFSM.FSM_EVENT_VRF_DELETE, evpnvrf)"}],"source_content_type":"text/x-python","patch_set":6,"id":"b55453cb_ed376a07","line":102,"range":{"start_line":98,"start_character":0,"end_line":102,"end_character":18},"in_reply_to":"4743087b_e231757e","updated":"2026-05-18 13:20:02.000000000","message":"brainfart, sorry :) this is ok","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"adf9ebed610fccce8baff2feb700513a447c9c14","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        except (evpn_exc.UnknownMessage, evpn_exc.UnknownVrfMessage):"},{"line_number":96,"context_line":"            # This is not an EVPN VRF"},{"line_number":97,"context_line":"            return"},{"line_number":98,"context_line":"        try:"},{"line_number":99,"context_line":"            self._known_vrfs.remove(evpnvrf)"},{"line_number":100,"context_line":"        except KeyError:"},{"line_number":101,"context_line":"            # VRF not previously tracked"},{"line_number":102,"context_line":"            return"},{"line_number":103,"context_line":"        LOG.debug(\"VRF deleted: %s\", evpnvrf)"},{"line_number":104,"context_line":"        self._evpn_fsm.advance(fsm.EvpnFSM.FSM_EVENT_VRF_DELETE, evpnvrf)"}],"source_content_type":"text/x-python","patch_set":6,"id":"92395ffb_d297671b","line":102,"range":{"start_line":98,"start_character":0,"end_line":102,"end_character":18},"in_reply_to":"b55453cb_ed376a07","updated":"2026-05-18 14:33:20.000000000","message":"Done","commit_id":"c1f5306a7a051cb2d583f0dbbb39e9555147ddc6"}],"neutron/tests/unit/agent/ovn/extensions/evpn/test_fsm.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"48ad5d978f83b47122da6bf3da2bfcc96d714d00","unresolved":true,"context_lines":[{"line_number":33,"context_line":"        self.evpn_fsm.advance("},{"line_number":34,"context_line":"            fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":35,"context_line":"            10, mac\u003d\u0027aa:bb:cc:dd:ee:ff\u0027)"},{"line_number":36,"context_line":"        evpn \u003d self.evpn_fsm.instances[10]"},{"line_number":37,"context_line":"        self.assertEqual(fsm.Evpn.ADVERTISING, evpn.state)"},{"line_number":38,"context_line":"        self.assertEqual(\u0027aa:bb:cc:dd:ee:ff\u0027, evpn.mac)"},{"line_number":39,"context_line":"        self.assertEqual(\u0027evpnvrf-10\u0027, evpn.vrf)"}],"source_content_type":"text/x-python","patch_set":5,"id":"b513470f_9cf57656","line":36,"range":{"start_line":36,"start_character":39,"end_line":36,"end_character":41},"updated":"2026-05-15 21:07:50.000000000","message":"nit: should be a constant","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.evpn_fsm.advance("},{"line_number":34,"context_line":"            fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"},{"line_number":35,"context_line":"            10, mac\u003d\u0027aa:bb:cc:dd:ee:ff\u0027)"},{"line_number":36,"context_line":"        evpn \u003d self.evpn_fsm.instances[10]"},{"line_number":37,"context_line":"        self.assertEqual(fsm.Evpn.ADVERTISING, evpn.state)"},{"line_number":38,"context_line":"        self.assertEqual(\u0027aa:bb:cc:dd:ee:ff\u0027, evpn.mac)"},{"line_number":39,"context_line":"        self.assertEqual(\u0027evpnvrf-10\u0027, evpn.vrf)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ced58c38_53a6e72f","line":36,"range":{"start_line":36,"start_character":39,"end_line":36,"end_character":41},"in_reply_to":"b513470f_9cf57656","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"48ad5d978f83b47122da6bf3da2bfcc96d714d00","unresolved":true,"context_lines":[{"line_number":37,"context_line":"        self.assertEqual(fsm.Evpn.ADVERTISING, evpn.state)"},{"line_number":38,"context_line":"        self.assertEqual(\u0027aa:bb:cc:dd:ee:ff\u0027, evpn.mac)"},{"line_number":39,"context_line":"        self.assertEqual(\u0027evpnvrf-10\u0027, evpn.vrf)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_port_binding_then_vrf_create(self):"},{"line_number":42,"context_line":"        self.evpn_fsm.advance("},{"line_number":43,"context_line":"            fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"c2a28de5_e2c18b2c","line":40,"updated":"2026-05-15 21:07:50.000000000","message":"with the `advertise()` method we can also make sure it gets called after we transitioned to the adverising state.","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ffa153541fa4ce4ab3c10e763572d704120d3c17","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        self.assertEqual(fsm.Evpn.ADVERTISING, evpn.state)"},{"line_number":38,"context_line":"        self.assertEqual(\u0027aa:bb:cc:dd:ee:ff\u0027, evpn.mac)"},{"line_number":39,"context_line":"        self.assertEqual(\u0027evpnvrf-10\u0027, evpn.vrf)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def test_port_binding_then_vrf_create(self):"},{"line_number":42,"context_line":"        self.evpn_fsm.advance("},{"line_number":43,"context_line":"            fsm.EvpnFSM.FSM_EVENT_PORT_BINDING_CREATE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"d05be21b_daa92e65","line":40,"in_reply_to":"c2a28de5_e2c18b2c","updated":"2026-05-18 02:13:40.000000000","message":"Done","commit_id":"81222ad8b55845132cd724c6ecd2aad7df74dab9"}]}
