)]}'
{"neutron/agent/l3/ha_router.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"37982893881391b7b520f2a45b6eb1f04c62926d","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        return port1_filtered \u003d\u003d port2_filtered"},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"    def external_gateway_added(self, ex_gw_port, interface_name):"},{"line_number":456,"context_line":"        link_up \u003d self.external_gateway_link_state()"},{"line_number":457,"context_line":"        self._plug_external_gateway(ex_gw_port, interface_name,"},{"line_number":458,"context_line":"                                    self.ns_name, link_up\u003dlink_up)"},{"line_number":459,"context_line":"        self._add_gateway_vip(ex_gw_port, interface_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1fa4df85_009a3c6d","line":456,"updated":"2020-02-27 11:37:37.000000000","message":"Both this patch and [1] are trying to handle the link state of the GW port. But IMO [1] implementation is cleaner: just plug the port in \"disabled\" state and once the ipv6 is disabled, \"enable\" the port.\n\n[1] implementation is very similar to port multibinding feature: plug disabled and then enable the port.\n\nWith [1] you don\u0027t need to check the status of the router (master/backup) and the backend implementation is delegated to linux.interface (and then to OVS), instead of doing L1 stuff in a L3 agent.\n\n\n[1] https://review.opendev.org/#/c/702856","commit_id":"91a8ba615dded5d6f6c6b14a6ef017e961648adf"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f0fd1f00c1ae6d76b51dec1f2541bf556041fc14","unresolved":false,"context_lines":[{"line_number":535,"context_line":"                         self.ex_gw_port and self.ex_gw_port[\u0027id\u0027])"},{"line_number":536,"context_line":"        if ex_gw_port_id:"},{"line_number":537,"context_line":"            interface_name \u003d self.get_external_device_name(ex_gw_port_id)"},{"line_number":538,"context_line":"            if interface_name:"},{"line_number":539,"context_line":"                ns_name \u003d self.get_gw_ns_name()"},{"line_number":540,"context_line":"                self.driver.set_link_status(interface_name, ns_name,"},{"line_number":541,"context_line":"                                            link_up\u003dlink_up)"}],"source_content_type":"text/x-python","patch_set":10,"id":"df33271e_e4ec54f5","line":538,"updated":"2020-03-20 18:39:05.000000000","message":"I don\u0027t think get_external_device_name() can ever return None so this check isn\u0027t necessary.","commit_id":"e4f6e0fb850b72c6f6e2e872148b3d469ae165bd"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"42b8ece48cf02eb078ba01b0dc84cba5dcef5b68","unresolved":false,"context_lines":[{"line_number":535,"context_line":"                         self.ex_gw_port and self.ex_gw_port[\u0027id\u0027])"},{"line_number":536,"context_line":"        if ex_gw_port_id:"},{"line_number":537,"context_line":"            interface_name \u003d self.get_external_device_name(ex_gw_port_id)"},{"line_number":538,"context_line":"            if interface_name:"},{"line_number":539,"context_line":"                ns_name \u003d self.get_gw_ns_name()"},{"line_number":540,"context_line":"                self.driver.set_link_status(interface_name, ns_name,"},{"line_number":541,"context_line":"                                            link_up\u003dlink_up)"}],"source_content_type":"text/x-python","patch_set":10,"id":"df33271e_00d79bef","line":538,"in_reply_to":"df33271e_e4ec54f5","updated":"2020-03-21 09:51:02.000000000","message":"Done","commit_id":"e4f6e0fb850b72c6f6e2e872148b3d469ae165bd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"358ceafb0723017bb0e8287277290411e666fe0c","unresolved":false,"context_lines":[{"line_number":520,"context_line":"                self.ha_state \u003d\u003d \u0027master\u0027):"},{"line_number":521,"context_line":"            super(HaRouter, self).enable_radvd(internal_ports)"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def external_gateway_link_state(self):"},{"line_number":524,"context_line":"        # Check HA router ha_state for its gateway port link state."},{"line_number":525,"context_line":"        # \u0027backup\u0027 instance will not link up the gateway port."},{"line_number":526,"context_line":"        return self.ha_state \u003d\u003d \u0027master\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_3c4aac26","line":523,"range":{"start_line":523,"start_character":8,"end_line":523,"end_character":35},"updated":"2020-03-24 12:06:03.000000000","message":"personally, as this returns bool value I would name it like \"external_gateway_link_up\" - then IMO True/False values have more sense. Or if You want to have name like it\u0027s now, lets return \"UP\"/\"DOWN\" from it.\nAnd also, maybe this can be class property?","commit_id":"45e1d315d826703321be504a16833d7f53b1b56b"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4551cd462fe8e014f428ee4406c1b74b2a71942","unresolved":false,"context_lines":[{"line_number":520,"context_line":"                self.ha_state \u003d\u003d \u0027master\u0027):"},{"line_number":521,"context_line":"            super(HaRouter, self).enable_radvd(internal_ports)"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"    def external_gateway_link_state(self):"},{"line_number":524,"context_line":"        # Check HA router ha_state for its gateway port link state."},{"line_number":525,"context_line":"        # \u0027backup\u0027 instance will not link up the gateway port."},{"line_number":526,"context_line":"        return self.ha_state \u003d\u003d \u0027master\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_f0886520","line":523,"range":{"start_line":523,"start_character":8,"end_line":523,"end_character":35},"in_reply_to":"df33271e_3c4aac26","updated":"2020-03-25 01:26:26.000000000","message":"Done","commit_id":"45e1d315d826703321be504a16833d7f53b1b56b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"358ceafb0723017bb0e8287277290411e666fe0c","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        # \u0027backup\u0027 instance will not link up the gateway port."},{"line_number":526,"context_line":"        return self.ha_state \u003d\u003d \u0027master\u0027"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def set_external_gw_port_link_status(self, link_up, set_gw\u003dFalse):"},{"line_number":529,"context_line":"        link_state \u003d \"up\" if link_up else \"down\""},{"line_number":530,"context_line":"        LOG.info(\u0027Set router %s gateway device link state to %s.\u0027,"},{"line_number":531,"context_line":"                 self.router_id, link_state)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_bc5fdce3","line":528,"range":{"start_line":528,"start_character":56,"end_line":528,"end_character":62},"updated":"2020-03-24 12:06:03.000000000","message":"what is exactly this \"set_gw\" parameter?","commit_id":"45e1d315d826703321be504a16833d7f53b1b56b"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4551cd462fe8e014f428ee4406c1b74b2a71942","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        # \u0027backup\u0027 instance will not link up the gateway port."},{"line_number":526,"context_line":"        return self.ha_state \u003d\u003d \u0027master\u0027"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def set_external_gw_port_link_status(self, link_up, set_gw\u003dFalse):"},{"line_number":529,"context_line":"        link_state \u003d \"up\" if link_up else \"down\""},{"line_number":530,"context_line":"        LOG.info(\u0027Set router %s gateway device link state to %s.\u0027,"},{"line_number":531,"context_line":"                 self.router_id, link_state)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_1099896d","line":528,"range":{"start_line":528,"start_character":56,"end_line":528,"end_character":62},"in_reply_to":"df33271e_bc5fdce3","updated":"2020-03-25 01:26:26.000000000","message":"Due to the \"link down\" state of a linux device, some routes、IPs may be lost from it. This is the action flag to add it back.","commit_id":"45e1d315d826703321be504a16833d7f53b1b56b"}],"neutron/agent/l3/keepalived_state_change.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8b6b9c57c62b4c7e6902755c6f9d4d879faa1552","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                # has this issue fixed since 1.2.20 but the version is not"},{"line_number":96,"context_line":"                # packaged in some distributions (RHEL/CentOS/Ubuntu Xenial)."},{"line_number":97,"context_line":"                # Remove this code once new keepalived versions are available."},{"line_number":98,"context_line":"                self.send_garp(event)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def handle_initial_state(self):"},{"line_number":101,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fa4df85_96f7c88b","line":98,"range":{"start_line":98,"start_character":16,"end_line":98,"end_character":37},"updated":"2020-03-07 02:05:10.000000000","message":"@Slawek these are other GARP actions for the IPs added to the None-ha port, aka qg-device. Plz see the original commit for detail: 4fdd89e94f778a6aa96151679de2ddcd0165717a.\nSo actually L3 HA will send GARPs at 3 periods:\n1. keepalived VRRP change to master immediately\n2. keepalived master dalay\n3. this send_garp(event)","commit_id":"8238e872b47fcb82c7b74ee1a3f2d3b96bde3c3a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f889dd26c45f390fd6c236af3823388933a4952f","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                # has this issue fixed since 1.2.20 but the version is not"},{"line_number":96,"context_line":"                # packaged in some distributions (RHEL/CentOS/Ubuntu Xenial)."},{"line_number":97,"context_line":"                # Remove this code once new keepalived versions are available."},{"line_number":98,"context_line":"                self.send_garp(event)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def handle_initial_state(self):"},{"line_number":101,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fa4df85_1d82e301","line":98,"range":{"start_line":98,"start_character":16,"end_line":98,"end_character":37},"in_reply_to":"1fa4df85_96f7c88b","updated":"2020-03-11 13:42:49.000000000","message":"\u003e @Slawek these are other GARP actions for the IPs added to the\n \u003e None-ha port, aka qg-device. Plz see the original commit for\n \u003e detail: 4fdd89e94f778a6aa96151679de2ddcd0165717a.\n \u003e So actually L3 HA will send GARPs at 3 periods:\n \u003e 1. keepalived VRRP change to master immediately\n\nAnd with Your patch this one will always fail, there is no way to make it working,\n\n \u003e 2. keepalived master dalay\n\nYes, if we will rely on this only, then it may be always potential race condition before L3 agent will actually bring interfaces UP and keepalived will send retry garp, \n\n \u003e 3. this send_garp(event)\n\nAccording to the comment there, it\u0027s only workaround for som e old bug in keepalived so probably we could even remove this code some day to make neutron-keepalived-state-change to be only monitor and to not do anything else.","commit_id":"8238e872b47fcb82c7b74ee1a3f2d3b96bde3c3a"}],"neutron/agent/linux/interface.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"358ceafb0723017bb0e8287277290411e666fe0c","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            LOG.warning(\"Interface driver cannot update MTU for ports\")"},{"line_number":302,"context_line":"            self._mtu_update_warn_logged \u003d True"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def set_link_status(self, device_name, namespace\u003dNone, link_up\u003dTrue):"},{"line_number":305,"context_line":"        ns_dev \u003d ip_lib.IPWrapper(namespace\u003dnamespace).device(device_name)"},{"line_number":306,"context_line":"        if not ns_dev.exists():"},{"line_number":307,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_1ce36807","line":304,"range":{"start_line":304,"start_character":59,"end_line":304,"end_character":71},"updated":"2020-03-24 12:06:03.000000000","message":"nitty nit: I would personally move this before \"namespace\" attribute and make it non optional. Now You can call it as\n\n    self.set_link_status(\"tap\")\n\nand that will be working fine but is not friendly for future readers of the code. Better would be to do always:\n\n    self.set_link_status(\"tap\", link_up\u003dTrue)\n\nor\n\n    self.set_link_status(\"tap\", link_up\u003dFalse)","commit_id":"45e1d315d826703321be504a16833d7f53b1b56b"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4551cd462fe8e014f428ee4406c1b74b2a71942","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            LOG.warning(\"Interface driver cannot update MTU for ports\")"},{"line_number":302,"context_line":"            self._mtu_update_warn_logged \u003d True"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def set_link_status(self, device_name, namespace\u003dNone, link_up\u003dTrue):"},{"line_number":305,"context_line":"        ns_dev \u003d ip_lib.IPWrapper(namespace\u003dnamespace).device(device_name)"},{"line_number":306,"context_line":"        if not ns_dev.exists():"},{"line_number":307,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_d005617c","line":304,"range":{"start_line":304,"start_character":59,"end_line":304,"end_character":71},"in_reply_to":"df33271e_1ce36807","updated":"2020-03-25 01:26:26.000000000","message":"Hmm, I have two rules:\n1. New param should be added to the tail of the list to aviod alerting too many callers due to the order of the params.\n2. For compatibility, default value should be added to new param to aviod changing the existing callers\u0027 behaviors","commit_id":"45e1d315d826703321be504a16833d7f53b1b56b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"358ceafb0723017bb0e8287277290411e666fe0c","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def set_link_status(self, device_name, namespace\u003dNone, link_up\u003dTrue):"},{"line_number":305,"context_line":"        ns_dev \u003d ip_lib.IPWrapper(namespace\u003dnamespace).device(device_name)"},{"line_number":306,"context_line":"        if not ns_dev.exists():"},{"line_number":307,"context_line":"            return"},{"line_number":308,"context_line":"        if link_up:"},{"line_number":309,"context_line":"            ns_dev.link.set_up()"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_3cf8ecc2","line":306,"updated":"2020-03-24 12:06:03.000000000","message":"Shouldn\u0027t we log some warning or at least debug message here?","commit_id":"45e1d315d826703321be504a16833d7f53b1b56b"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4551cd462fe8e014f428ee4406c1b74b2a71942","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def set_link_status(self, device_name, namespace\u003dNone, link_up\u003dTrue):"},{"line_number":305,"context_line":"        ns_dev \u003d ip_lib.IPWrapper(namespace\u003dnamespace).device(device_name)"},{"line_number":306,"context_line":"        if not ns_dev.exists():"},{"line_number":307,"context_line":"            return"},{"line_number":308,"context_line":"        if link_up:"},{"line_number":309,"context_line":"            ns_dev.link.set_up()"}],"source_content_type":"text/x-python","patch_set":11,"id":"df33271e_30c80d54","line":306,"in_reply_to":"df33271e_3cf8ecc2","updated":"2020-03-25 01:26:26.000000000","message":"Done","commit_id":"45e1d315d826703321be504a16833d7f53b1b56b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3b70b170ffc8965cadbdd91f8ec866423ed3697d","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    @abc.abstractmethod"},{"line_number":258,"context_line":"    def plug_new(self, network_id, port_id, device_name, mac_address,"},{"line_number":259,"context_line":"                 bridge\u003dNone, namespace\u003dNone, prefix\u003dNone, mtu\u003dNone,"},{"line_number":260,"context_line":"                 link_up\u003dTrue):"},{"line_number":261,"context_line":"        \"\"\"Plug in the interface only for new devices that don\u0027t exist yet.\"\"\""},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def plug(self, network_id, port_id, device_name, mac_address,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f4c43b2_f0065a86","line":260,"updated":"2020-04-17 17:37:03.000000000","message":"This is breaking networking-midonet","commit_id":"c52029c39aa824a67095fbbf9e59eff769d92587"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"d5941e23f87cb940072a2253d26c48e64479e663","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    @abc.abstractmethod"},{"line_number":258,"context_line":"    def plug_new(self, network_id, port_id, device_name, mac_address,"},{"line_number":259,"context_line":"                 bridge\u003dNone, namespace\u003dNone, prefix\u003dNone, mtu\u003dNone,"},{"line_number":260,"context_line":"                 link_up\u003dTrue):"},{"line_number":261,"context_line":"        \"\"\"Plug in the interface only for new devices that don\u0027t exist yet.\"\"\""},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def plug(self, network_id, port_id, device_name, mac_address,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f4c43b2_d184fd60","line":260,"in_reply_to":"3f4c43b2_f0065a86","updated":"2020-04-18 01:09:38.000000000","message":"Thank you Rodolfo, please file a new bug with some details, then we can continue the discuss and fix on that.","commit_id":"c52029c39aa824a67095fbbf9e59eff769d92587"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"14d9758337d89a30216da3c029c89aac8c8b83c5","unresolved":false,"context_lines":[{"line_number":304,"context_line":"    def set_link_status(self, device_name, namespace\u003dNone, link_up\u003dTrue):"},{"line_number":305,"context_line":"        ns_dev \u003d ip_lib.IPWrapper(namespace\u003dnamespace).device(device_name)"},{"line_number":306,"context_line":"        if not ns_dev.exists():"},{"line_number":307,"context_line":"            LOG.debug(\"Device %s may concurrently be deleted.\", device_name)"},{"line_number":308,"context_line":"            return"},{"line_number":309,"context_line":"        if link_up:"},{"line_number":310,"context_line":"            ns_dev.link.set_up()"}],"source_content_type":"text/x-python","patch_set":13,"id":"df33271e_63615112","line":307,"range":{"start_line":307,"start_character":33,"end_line":307,"end_character":60},"updated":"2020-04-03 20:41:44.000000000","message":"s/may have been concurrently deleted\n\nCan update when you add the tests.","commit_id":"c52029c39aa824a67095fbbf9e59eff769d92587"}]}
