)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8bef11edfce4692ddbae508fa7319654972292af","unresolved":true,"context_lines":[{"line_number":7,"context_line":"Integrate FrrDriver into OVN Agent EVPN Extension"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch creates new FrrvtyshDriver adapter (FsmFrrVtyshDriver) which"},{"line_number":10,"context_line":"is adopted to operated with EVPM finite state machine(fsm), where vrf"},{"line_number":11,"context_line":"is handled by the fsm. It also adopts to fact that FSM only needs static"},{"line_number":12,"context_line":"bgp-router-id and asn for each instance."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a79af71_f941a9cb","line":10,"range":{"start_line":10,"start_character":28,"end_line":10,"end_character":32},"updated":"2026-06-09 08:25:33.000000000","message":"nitty nit: EVPN","commit_id":"f662183493258665ba089f2349a088db783f9705"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"9b15f5b85ea5b46c0150107ffb8ffb3a5462a522","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Integrate FrrDriver into OVN Agent EVPN Extension"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch creates new FrrvtyshDriver adapter (FsmFrrVtyshDriver) which"},{"line_number":10,"context_line":"is adopted to operated with EVPM finite state machine(fsm), where vrf"},{"line_number":11,"context_line":"is handled by the fsm. It also adopts to fact that FSM only needs static"},{"line_number":12,"context_line":"bgp-router-id and asn for each instance."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3011aaf8_88d59997","line":10,"range":{"start_line":10,"start_character":28,"end_line":10,"end_character":32},"in_reply_to":"9a79af71_f941a9cb","updated":"2026-06-10 02:30:07.000000000","message":"Done","commit_id":"f662183493258665ba089f2349a088db783f9705"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"59deb77606844ec9d456e0f28f718fa42780283c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"77928dda_1a66a50d","updated":"2026-06-10 07:08:44.000000000","message":"I only removed .swp file most likely added to the patch accidentally","commit_id":"7f986bb19940921c3b8ca48be0eebad0a20004a9"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"a96d41d7730f87d1510a3f39abb0171a996d29eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"dcdd4148_98d290be","in_reply_to":"77928dda_1a66a50d","updated":"2026-06-10 07:15:20.000000000","message":"my bad, while fixing merge conflicts somehow it got added.","commit_id":"7f986bb19940921c3b8ca48be0eebad0a20004a9"}],"neutron/agent/ovn/extensions/evpn/__init__.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d825647ba9e0425f436a92edcf6d175b89482d23","unresolved":true,"context_lines":[{"line_number":83,"context_line":"            peer_interface\u003dCONF.ovn_evpn.bgp_local_interface,"},{"line_number":84,"context_line":"            vrf_handler\u003dNoopFrrVrfHandler())"},{"line_number":85,"context_line":"        self._evpn_fsm \u003d fsm.EvpnFSM(self.svd, driver,"},{"line_number":86,"context_line":"                                     bgp_router_id\u003dlocal_ip)"},{"line_number":87,"context_line":"        vrf_handler \u003d netlink_monitor.VrfHandler(self._evpn_fsm)"},{"line_number":88,"context_line":"        self.nl_dispatcher \u003d nl_dispatcher.NetlinkDispatcher("},{"line_number":89,"context_line":"            rtnl.RTMGRP_LINK)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f71db368_cb6ba808","line":86,"range":{"start_line":86,"start_character":37,"end_line":86,"end_character":59},"updated":"2026-06-08 15:18:02.000000000","message":"Not the biggest fan of providing bfp router-id via `EvpnFSM.__init__` but this was the cleanest way how to pass down router-id into the FrrDriver inside the EVPN state machine.","commit_id":"d9c1359c15332d9434dd815c997632270a016e7a"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"dc99ea642d99fa38e7b3f0246bdb38844660304b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            peer_interface\u003dCONF.ovn_evpn.bgp_local_interface,"},{"line_number":84,"context_line":"            vrf_handler\u003dNoopFrrVrfHandler())"},{"line_number":85,"context_line":"        self._evpn_fsm \u003d fsm.EvpnFSM(self.svd, driver,"},{"line_number":86,"context_line":"                                     bgp_router_id\u003dlocal_ip)"},{"line_number":87,"context_line":"        vrf_handler \u003d netlink_monitor.VrfHandler(self._evpn_fsm)"},{"line_number":88,"context_line":"        self.nl_dispatcher \u003d nl_dispatcher.NetlinkDispatcher("},{"line_number":89,"context_line":"            rtnl.RTMGRP_LINK)"}],"source_content_type":"text/x-python","patch_set":1,"id":"0a65b04b_afe4854b","line":86,"range":{"start_line":86,"start_character":37,"end_line":86,"end_character":59},"in_reply_to":"f71db368_cb6ba808","updated":"2026-06-08 16:19:00.000000000","message":"I created a config dataclass in evpn/__init__.py and passes it to FSM.  FSM will need configurations to create the interfaces.  https://review.opendev.org/c/openstack/neutron/+/991099/15/neutron/agent/ovn/extensions/evpn/__init__.py\n\nThe config dataclass includes local_ip .","commit_id":"d9c1359c15332d9434dd815c997632270a016e7a"}],"neutron/agent/ovn/extensions/evpn/fsm.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"0484b5f545dd4ee3ba5b9c186fdcbbdb5299bfc3","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        self._unadvertise(evpn)"},{"line_number":105,"context_line":"        evpn.vrf_up \u003d False"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _build_frr_driver_config(self, evpn):"},{"line_number":108,"context_line":"        return interface.EVPNRouterConfig("},{"line_number":109,"context_line":"            asn\u003dcfg.CONF.ovn_evpn.bgp_as,"},{"line_number":110,"context_line":"            bgp_router_id\u003dself._bgp_router_id,"},{"line_number":111,"context_line":"            vrf_name\u003devpn.vrf,"},{"line_number":112,"context_line":"            vni\u003devpn.vni,"},{"line_number":113,"context_line":"        )"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _advertise(self, evpn):"},{"line_number":116,"context_line":"        LOG.debug(\"EVPN: advertising %s\", evpn)"}],"source_content_type":"text/x-python","patch_set":3,"id":"26560781_66981840","line":113,"range":{"start_line":107,"start_character":0,"end_line":113,"end_character":9},"updated":"2026-06-08 15:31:54.000000000","message":"This does not belong here. The FSM consumes the driver and this method is rather related to the driver itself and not FSM. It would make more sense to move the statically configured options to the frr driver and pass only the evpn object to it. That evpn object is an EVPN router abstraction while the rest is a node configuration.","commit_id":"20858fff9f2008b862f2692302bcd4fb306090e8"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"4be47777d3b3afe5db648e6b52f9b216d65e6124","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        self._unadvertise(evpn)"},{"line_number":105,"context_line":"        evpn.vrf_up \u003d False"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _build_frr_driver_config(self, evpn):"},{"line_number":108,"context_line":"        return interface.EVPNRouterConfig("},{"line_number":109,"context_line":"            asn\u003dcfg.CONF.ovn_evpn.bgp_as,"},{"line_number":110,"context_line":"            bgp_router_id\u003dself._bgp_router_id,"},{"line_number":111,"context_line":"            vrf_name\u003devpn.vrf,"},{"line_number":112,"context_line":"            vni\u003devpn.vni,"},{"line_number":113,"context_line":"        )"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _advertise(self, evpn):"},{"line_number":116,"context_line":"        LOG.debug(\"EVPN: advertising %s\", evpn)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3331b4b2_da276ac1","line":113,"range":{"start_line":107,"start_character":0,"end_line":113,"end_character":9},"in_reply_to":"26560781_66981840","updated":"2026-06-08 18:26:41.000000000","message":"Thanks, I think this is similar to the comment i made on __init__.\nSo what you are saying is that FrrDriver should accept `bgp_as` number along with `bgp_router_id` at `FrrDriver.__init__`?\nIf the answer is yes, then here is the reason I did not want to do it.\nThe FrrDriver is capable of creating multiple routers with different AS or bgp router-id. We just decided, that for this \"evpn feature\" we will only support one AS and one bgp router per node.\n\nOk maybe, I can create another class which would just add those static args\npseudo code\n```\nclass SingleASNFrrVtyshDriver(FrrVtyshDriver):\n    def __init__(self, bgp_router_id, asn):\n        super.__init__(bla, bla)\n\n    def create_evpn_router(vrf, vni):\n        super.create_evpn_router(self.asn, self.bgp_router_id, vrf, vni)\n    ...\n```\n    \nWDYT?","commit_id":"20858fff9f2008b862f2692302bcd4fb306090e8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"89d5e4bfe3a4b24fa73e3d2ddf3fe2e54fe702a9","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        self._unadvertise(evpn)"},{"line_number":105,"context_line":"        evpn.vrf_up \u003d False"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _build_frr_driver_config(self, evpn):"},{"line_number":108,"context_line":"        return interface.EVPNRouterConfig("},{"line_number":109,"context_line":"            asn\u003dcfg.CONF.ovn_evpn.bgp_as,"},{"line_number":110,"context_line":"            bgp_router_id\u003dself._bgp_router_id,"},{"line_number":111,"context_line":"            vrf_name\u003devpn.vrf,"},{"line_number":112,"context_line":"            vni\u003devpn.vni,"},{"line_number":113,"context_line":"        )"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _advertise(self, evpn):"},{"line_number":116,"context_line":"        LOG.debug(\"EVPN: advertising %s\", evpn)"}],"source_content_type":"text/x-python","patch_set":3,"id":"6fdd3874_03f02d9d","line":113,"range":{"start_line":107,"start_character":0,"end_line":113,"end_character":9},"in_reply_to":"3331b4b2_da276ac1","updated":"2026-06-08 18:44:26.000000000","message":"That seems reasonable to me. Just in general if there is anything that has \"frr\" in its name in this module, should be part of the `self._driver` instance.\n\nGiven that as of now we always set same AS and router-id, I\u0027d treat the split as YAGNI - as long as the driver code is well written and can be extended eventually. But not strong opinion there - having two drivers sounds good to me as well.","commit_id":"20858fff9f2008b862f2692302bcd4fb306090e8"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"4755da1cbf648f42e8c07d8e1cbe31fd2d072b9a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        self._unadvertise(evpn)"},{"line_number":105,"context_line":"        evpn.vrf_up \u003d False"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def _build_frr_driver_config(self, evpn):"},{"line_number":108,"context_line":"        return interface.EVPNRouterConfig("},{"line_number":109,"context_line":"            asn\u003dcfg.CONF.ovn_evpn.bgp_as,"},{"line_number":110,"context_line":"            bgp_router_id\u003dself._bgp_router_id,"},{"line_number":111,"context_line":"            vrf_name\u003devpn.vrf,"},{"line_number":112,"context_line":"            vni\u003devpn.vni,"},{"line_number":113,"context_line":"        )"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _advertise(self, evpn):"},{"line_number":116,"context_line":"        LOG.debug(\"EVPN: advertising %s\", evpn)"}],"source_content_type":"text/x-python","patch_set":3,"id":"8f47f862_85d14466","line":113,"range":{"start_line":107,"start_character":0,"end_line":113,"end_character":9},"in_reply_to":"6fdd3874_03f02d9d","updated":"2026-06-08 21:51:17.000000000","message":"See latest patch. In a nutshell,\nI created new adapter class which keeps static asn and bgp_router_id. Moved all \"fsm frr driver\" into the new file\nneutron/agent/ovn/extensions/evpn/fsm_frr_driver.py","commit_id":"20858fff9f2008b862f2692302bcd4fb306090e8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ace29ab62cf61e19e9c5284fb0ad12359fcbfd03","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        evpn.vrf_up \u003d False"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _advertise(self, evpn):"},{"line_number":104,"context_line":"        LOG.debug(\"EVPN: advertising %s\", evpn)"},{"line_number":105,"context_line":"        self._svd.add_vni(evpn.vni, evpn.vid, evpn.vrf, evpn.mac)"},{"line_number":106,"context_line":"        self._driver.create_router(evpn.vrf, evpn.vni)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"c0c14fa7_86ab597a","line":104,"updated":"2026-06-09 12:55:47.000000000","message":"It\u0027s better to log after all actions are done for cases where an error is swallowed by accident.","commit_id":"ca5933c179c7c81d51af1b42b8d41f1e8582e62b"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"9b15f5b85ea5b46c0150107ffb8ffb3a5462a522","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        evpn.vrf_up \u003d False"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _advertise(self, evpn):"},{"line_number":104,"context_line":"        LOG.debug(\"EVPN: advertising %s\", evpn)"},{"line_number":105,"context_line":"        self._svd.add_vni(evpn.vni, evpn.vid, evpn.vrf, evpn.mac)"},{"line_number":106,"context_line":"        self._driver.create_router(evpn.vrf, evpn.vni)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"73aff7dc_39ce74b5","line":104,"in_reply_to":"c0c14fa7_86ab597a","updated":"2026-06-10 02:30:07.000000000","message":"Done","commit_id":"ca5933c179c7c81d51af1b42b8d41f1e8582e62b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8bef11edfce4692ddbae508fa7319654972292af","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        evpn.vrf_up \u003d False"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _advertise(self, evpn):"},{"line_number":104,"context_line":"        LOG.debug(\"EVPN: advertising %s\", evpn)"},{"line_number":105,"context_line":"        self._svd.add_vni(evpn.vni, evpn.vid, evpn.vrf, evpn.mac)"},{"line_number":106,"context_line":"        self._driver.create_router(evpn.vrf, evpn.vni)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"e193b370_1aab11a3","line":104,"updated":"2026-06-09 08:25:33.000000000","message":"nice, I\u0027ve commented about that we should be more consistent with when we log those debug messages for advertizing and unadvertizing in one of the previous patches in the series. Now it is \"fixed\", thx a lot :)","commit_id":"f662183493258665ba089f2349a088db783f9705"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"9b15f5b85ea5b46c0150107ffb8ffb3a5462a522","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        evpn.vrf_up \u003d False"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def _advertise(self, evpn):"},{"line_number":104,"context_line":"        LOG.debug(\"EVPN: advertising %s\", evpn)"},{"line_number":105,"context_line":"        self._svd.add_vni(evpn.vni, evpn.vid, evpn.vrf, evpn.mac)"},{"line_number":106,"context_line":"        self._driver.create_router(evpn.vrf, evpn.vni)"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"752982a6_483ebd84","line":104,"in_reply_to":"e193b370_1aab11a3","updated":"2026-06-10 02:30:07.000000000","message":"Done","commit_id":"f662183493258665ba089f2349a088db783f9705"}],"neutron/conf/agent/ovn/evpn/config.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b863a6815554de7489b4995f76094fd751e14034","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":3,"id":"5e46335b_ba2a6d0c","line":1,"range":{"start_line":1,"start_character":26,"end_line":1,"end_character":29},"updated":"2026-06-08 15:31:18.000000000","message":"nit: LLC","commit_id":"20858fff9f2008b862f2692302bcd4fb306090e8"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"9b15f5b85ea5b46c0150107ffb8ffb3a5462a522","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, Inc."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":3,"id":"7be30a55_63f1f7e1","line":1,"range":{"start_line":1,"start_character":26,"end_line":1,"end_character":29},"in_reply_to":"5e46335b_ba2a6d0c","updated":"2026-06-10 02:30:07.000000000","message":"Done","commit_id":"20858fff9f2008b862f2692302bcd4fb306090e8"}]}
