)]}'
{"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"}],"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"}],"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":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":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":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":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"}]}
