)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8bab991eda2d3f20e15daa2f3cb85c38b9052eca","unresolved":false,"context_lines":[{"line_number":12,"context_line":"path that does not execute the operations that take place within"},{"line_number":13,"context_line":"the namespace that will be removed.  Operations that take place"},{"line_number":14,"context_line":"outside of those namespaces are still performed to ensure that"},{"line_number":15,"context_line":"no orphaned items result.  Functional tests have been updated to"},{"line_number":16,"context_line":"verify this behavior."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"[1] https://review.openstack.org/#/c/240971"},{"line_number":19,"context_line":"[2] conversation starting at http://goo.gl/bZgvqW"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"fa69d971_0bed7db6","line":16,"range":{"start_line":15,"start_character":27,"end_line":16,"end_character":21},"updated":"2016-01-06 06:42:19.000000000","message":"Should this need update? I don\u0027t see functional tests updated, except some comments.","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"2359e47234bb8b03bf4ba142cb393aaf77052b44","unresolved":false,"context_lines":[{"line_number":12,"context_line":"path that does not execute the operations that take place within"},{"line_number":13,"context_line":"the namespace that will be removed.  Operations that take place"},{"line_number":14,"context_line":"outside of those namespaces are still performed to ensure that"},{"line_number":15,"context_line":"no orphaned items result.  Functional tests have been updated to"},{"line_number":16,"context_line":"verify this behavior."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"[1] https://review.openstack.org/#/c/240971"},{"line_number":19,"context_line":"[2] conversation starting at http://goo.gl/bZgvqW"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"fa69d971_1c760cd7","line":16,"range":{"start_line":15,"start_character":27,"end_line":16,"end_character":21},"in_reply_to":"fa69d971_0bed7db6","updated":"2016-01-06 18:28:25.000000000","message":"yeah, it could use a clarity update","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"}],"neutron/agent/l3/dvr_edge_ha_router.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e84abaeb7715530659ca1b2baee9236e9c2501db","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self._create_snat_namespace()"},{"line_number":89,"context_line":"        super(DvrEdgeHaRouter, self).initialize(process_monitor)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def process(self, agent, delete\u003dFalse):"},{"line_number":92,"context_line":"        super(DvrEdgeHaRouter, self).process(agent)"},{"line_number":93,"context_line":"        if self.ha_port:"},{"line_number":94,"context_line":"            self.enable_keepalived()"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_22b03243","line":91,"range":{"start_line":91,"start_character":29,"end_line":91,"end_character":41},"updated":"2016-01-12 18:11:35.000000000","message":"Does this need to stick around?  I don\u0027t see any callers that still pass this and it was only left in this class and the next where it is ignored.","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"0b586d8591a5f6df54eaf492b7aa1ebfa87c2a00","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self._create_snat_namespace()"},{"line_number":89,"context_line":"        super(DvrEdgeHaRouter, self).initialize(process_monitor)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def process(self, agent, delete\u003dFalse):"},{"line_number":92,"context_line":"        super(DvrEdgeHaRouter, self).process(agent)"},{"line_number":93,"context_line":"        if self.ha_port:"},{"line_number":94,"context_line":"            self.enable_keepalived()"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_9c5e22e8","line":91,"range":{"start_line":91,"start_character":29,"end_line":91,"end_character":41},"in_reply_to":"da6ed579_22b03243","updated":"2016-01-12 18:45:52.000000000","message":"ugh, no it doesn\u0027t","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"}],"neutron/agent/l3/dvr_local_router.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e84abaeb7715530659ca1b2baee9236e9c2501db","unresolved":false,"context_lines":[{"line_number":455,"context_line":"                # configured"},{"line_number":456,"context_line":"                self.agent.process_router_add(self)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def process(self, agent, delete\u003dFalse):"},{"line_number":459,"context_line":"        ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":460,"context_line":"        if ex_gw_port:"},{"line_number":461,"context_line":"            self.fip_ns \u003d agent.get_fip_ns(ex_gw_port[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_22c5928d","line":458,"range":{"start_line":458,"start_character":29,"end_line":458,"end_character":41},"updated":"2016-01-12 18:11:35.000000000","message":"Ditto","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"0b586d8591a5f6df54eaf492b7aa1ebfa87c2a00","unresolved":false,"context_lines":[{"line_number":455,"context_line":"                # configured"},{"line_number":456,"context_line":"                self.agent.process_router_add(self)"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def process(self, agent, delete\u003dFalse):"},{"line_number":459,"context_line":"        ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":460,"context_line":"        if ex_gw_port:"},{"line_number":461,"context_line":"            self.fip_ns \u003d agent.get_fip_ns(ex_gw_port[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_3c1e160d","line":458,"range":{"start_line":458,"start_character":29,"end_line":458,"end_character":41},"in_reply_to":"da6ed579_22c5928d","updated":"2016-01-12 18:45:52.000000000","message":"and ditto on the no it doesn\u0027t","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"}],"neutron/agent/l3/dvr_router_base.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"24d1220f57693716af89bdb261a2928e7273dea2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.agent \u003d agent"},{"line_number":27,"context_line":"        self.host \u003d host"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def process(self, agent, delete\u003dFalse):"},{"line_number":30,"context_line":"        super(DvrRouterBase, self).process(agent)"},{"line_number":31,"context_line":"        # NOTE:  Keep a copy of the interfaces around for when they are removed"},{"line_number":32,"context_line":"        self.snat_ports \u003d self.get_snat_interfaces()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_3275bd97","line":29,"updated":"2015-12-04 20:10:13.000000000","message":"This makes the delete kwarg useless in this case. It also makes the signature of the child different from the parent, which is displeasing to the gods of inheritance patterns.\n\nFind a way to dump it.","commit_id":"a63a701112424246b4b911819d5fb187feec7619"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"acc55c7a735326d55a8f6580c113c526802b9899","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.agent \u003d agent"},{"line_number":27,"context_line":"        self.host \u003d host"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def process(self, agent, delete\u003dFalse):"},{"line_number":30,"context_line":"        super(DvrRouterBase, self).process(agent)"},{"line_number":31,"context_line":"        # NOTE:  Keep a copy of the interfaces around for when they are removed"},{"line_number":32,"context_line":"        self.snat_ports \u003d self.get_snat_interfaces()"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_34a03190","line":29,"in_reply_to":"7a740942_3275bd97","updated":"2015-12-06 19:38:43.000000000","message":"Kevin, this is legacy from the previous patch sets - I just flat out missed it in PS9 - It will go away in PS 10","commit_id":"a63a701112424246b4b911819d5fb187feec7619"}],"neutron/agent/l3/ha_router.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"24d1220f57693716af89bdb261a2928e7273dea2","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        self.ha_network_removed()"},{"line_number":386,"context_line":"        self.disable_keepalived()"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def process(self, agent, delete\u003dFalse):"},{"line_number":389,"context_line":"        super(HaRouter, self).process(agent)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        if self.ha_port:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_9247d14a","line":388,"updated":"2015-12-04 20:10:13.000000000","message":"same here","commit_id":"a63a701112424246b4b911819d5fb187feec7619"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"acc55c7a735326d55a8f6580c113c526802b9899","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        self.ha_network_removed()"},{"line_number":386,"context_line":"        self.disable_keepalived()"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def process(self, agent, delete\u003dFalse):"},{"line_number":389,"context_line":"        super(HaRouter, self).process(agent)"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        if self.ha_port:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_d4ae8d84","line":388,"in_reply_to":"7a740942_9247d14a","updated":"2015-12-06 19:38:43.000000000","message":"and my reply is the same - will go in PS 10","commit_id":"a63a701112424246b4b911819d5fb187feec7619"}],"neutron/agent/l3/router_info.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"40f3bcbb73e248676d13ea5b290572ed0d1b3d7a","unresolved":false,"context_lines":[{"line_number":653,"context_line":"        deleting the router.  It assumes that FIPs have been disassociated"},{"line_number":654,"context_line":"        and internal router ports have been removed."},{"line_number":655,"context_line":"        \"\"\""},{"line_number":656,"context_line":"        ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":657,"context_line":"        self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"    def process_external(self, agent):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a8ffd7b_235b6b30","line":656,"updated":"2015-11-30 20:50:46.000000000","message":"Now I\u0027m confused. You can\u0027t delete a router without first removing its gateway device. Why do we even need to call process_delete_external?","commit_id":"6a9efec2db0ab67a6bc9eb5a46fbf9a7d74ee96d"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"f3ec0efefe95a96637b871bc26a5eeb7c4549d4d","unresolved":false,"context_lines":[{"line_number":653,"context_line":"        deleting the router.  It assumes that FIPs have been disassociated"},{"line_number":654,"context_line":"        and internal router ports have been removed."},{"line_number":655,"context_line":"        \"\"\""},{"line_number":656,"context_line":"        ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":657,"context_line":"        self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"    def process_external(self, agent):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a8ffd7b_3ecffeb4","line":656,"in_reply_to":"9a8ffd7b_235b6b30","updated":"2015-11-30 21:18:40.000000000","message":"Assaf, it\u0027s quite possible that this could be completely skipped as well.  I was only focusing on the iptables operations (which were the long poles in the tent).   If I get a chance, I\u0027ll try pulling that step out and see how that changes things.","commit_id":"6a9efec2db0ab67a6bc9eb5a46fbf9a7d74ee96d"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"7d4817b0315673a2f59b92617e08b144b5dcf03b","unresolved":false,"context_lines":[{"line_number":653,"context_line":"        deleting the router.  It assumes that FIPs have been disassociated"},{"line_number":654,"context_line":"        and internal router ports have been removed."},{"line_number":655,"context_line":"        \"\"\""},{"line_number":656,"context_line":"        ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":657,"context_line":"        self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"    def process_external(self, agent):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a8ffd7b_99dcd147","line":656,"in_reply_to":"9a8ffd7b_3ecffeb4","updated":"2015-12-01 16:30:22.000000000","message":"Having tested removing the process_external call completely it does improve things by another 10-15%, so repurposing this patch...","commit_id":"6a9efec2db0ab67a6bc9eb5a46fbf9a7d74ee96d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"871b8cebca42d7cec11270b3790cb2a177e6731c","unresolved":false,"context_lines":[{"line_number":701,"context_line":"        LOG.debug(\"process router updates\")"},{"line_number":702,"context_line":"        self._process_internal_ports(agent.pd)"},{"line_number":703,"context_line":"        agent.pd.sync_router(self.router[\u0027id\u0027])"},{"line_number":704,"context_line":"        if not delete:"},{"line_number":705,"context_line":"            self.process_external(agent)"},{"line_number":706,"context_line":"        # Process static routes for router"},{"line_number":707,"context_line":"        self.routes_updated()"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a740942_1c256caa","line":704,"updated":"2015-12-03 22:56:32.000000000","message":"Summarizing the IRC discussion.  I don\u0027t think we can assume there is nothing to do on a router delete for fips.  I think we may need to send fip down notification.","commit_id":"181c7ad7dd90ab7240b20d3682d26bf6f5b18a9f"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"91fda817608689238f586493abc113da86e3bf8c","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        updated_ports \u003d self._get_updated_ports(self.internal_ports,"},{"line_number":381,"context_line":"                                                internal_ports)"},{"line_number":382,"context_line":"        return (existing_port_ids, current_port_ids, new_port_ids, new_ports,"},{"line_number":383,"context_line":"                old_ports, updated_ports, internal_ports)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    def _process_internal_ports(self, pd):"},{"line_number":386,"context_line":"        (existing_port_ids, current_port_ids, new_port_ids, new_ports,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_1a6a3b81","line":383,"updated":"2015-12-31 08:18:22.000000000","message":"new_port_ids seems no need to return.","commit_id":"227f2ac2e7824c975f69fbb8ba3a426839d4f5e5"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"12b7252accea678a2bb9af3b77d1b3c582a78924","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        updated_ports \u003d self._get_updated_ports(self.internal_ports,"},{"line_number":381,"context_line":"                                                internal_ports)"},{"line_number":382,"context_line":"        return (existing_port_ids, current_port_ids, new_port_ids, new_ports,"},{"line_number":383,"context_line":"                old_ports, updated_ports, internal_ports)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    def _process_internal_ports(self, pd):"},{"line_number":386,"context_line":"        (existing_port_ids, current_port_ids, new_port_ids, new_ports,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_ad7dacb2","line":383,"in_reply_to":"fa69d971_1a6a3b81","updated":"2016-01-04 21:13:27.000000000","message":"Done","commit_id":"227f2ac2e7824c975f69fbb8ba3a426839d4f5e5"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"91fda817608689238f586493abc113da86e3bf8c","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        # Check if there is any pd prefix update"},{"line_number":425,"context_line":"        for p in internal_ports:"},{"line_number":426,"context_line":"            if p[\u0027id\u0027] in (set(current_port_ids) \u0026 set(existing_port_ids)):"},{"line_number":427,"context_line":"                for subnet in p.get(\u0027subnets\u0027, []):"},{"line_number":428,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"},{"line_number":429,"context_line":"                        old_prefix \u003d pd.update_subnet(self.router_id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_ba4a0f82","line":426,"range":{"start_line":426,"start_character":26,"end_line":426,"end_character":73},"updated":"2015-12-31 08:18:22.000000000","message":"can you move this before L425? Or can you put it in _get_ports, and use a new return value to replace the two values ?","commit_id":"227f2ac2e7824c975f69fbb8ba3a426839d4f5e5"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"12b7252accea678a2bb9af3b77d1b3c582a78924","unresolved":false,"context_lines":[{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        # Check if there is any pd prefix update"},{"line_number":425,"context_line":"        for p in internal_ports:"},{"line_number":426,"context_line":"            if p[\u0027id\u0027] in (set(current_port_ids) \u0026 set(existing_port_ids)):"},{"line_number":427,"context_line":"                for subnet in p.get(\u0027subnets\u0027, []):"},{"line_number":428,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"},{"line_number":429,"context_line":"                        old_prefix \u003d pd.update_subnet(self.router_id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_ad028c09","line":426,"range":{"start_line":426,"start_character":26,"end_line":426,"end_character":73},"in_reply_to":"fa69d971_ba4a0f82","updated":"2016-01-04 21:13:27.000000000","message":"Since this code was not part of the original change [https://review.openstack.org/#/c/240971], it shouldn\u0027t be changed as part of this refactoring","commit_id":"227f2ac2e7824c975f69fbb8ba3a426839d4f5e5"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"91fda817608689238f586493abc113da86e3bf8c","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    def _gateway_ports_equal(port1, port2):"},{"line_number":561,"context_line":"        return port1 \u003d\u003d port2"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    def process_external_gateway_on_delete(self, ex_gw_port, pd):"},{"line_number":564,"context_line":"        # TODO(Carl) Refactor to clarify roles of ex_gw_port vs self.ex_gw_port"},{"line_number":565,"context_line":"        ex_gw_port_id \u003d (ex_gw_port and ex_gw_port[\u0027id\u0027] or"},{"line_number":566,"context_line":"                         self.ex_gw_port and self.ex_gw_port[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_fd55e1c5","line":563,"updated":"2015-12-31 08:18:22.000000000","message":"Where will this method be used?","commit_id":"227f2ac2e7824c975f69fbb8ba3a426839d4f5e5"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"12b7252accea678a2bb9af3b77d1b3c582a78924","unresolved":false,"context_lines":[{"line_number":560,"context_line":"    def _gateway_ports_equal(port1, port2):"},{"line_number":561,"context_line":"        return port1 \u003d\u003d port2"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    def process_external_gateway_on_delete(self, ex_gw_port, pd):"},{"line_number":564,"context_line":"        # TODO(Carl) Refactor to clarify roles of ex_gw_port vs self.ex_gw_port"},{"line_number":565,"context_line":"        ex_gw_port_id \u003d (ex_gw_port and ex_gw_port[\u0027id\u0027] or"},{"line_number":566,"context_line":"                         self.ex_gw_port and self.ex_gw_port[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_e864f2e5","line":563,"in_reply_to":"fa69d971_fd55e1c5","updated":"2016-01-04 21:13:27.000000000","message":"Yep, this can go away as part of this refactoring...","commit_id":"227f2ac2e7824c975f69fbb8ba3a426839d4f5e5"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"91fda817608689238f586493abc113da86e3bf8c","unresolved":false,"context_lines":[{"line_number":598,"context_line":"        gw_port \u003d self._router.get(\u0027gw_port\u0027)"},{"line_number":599,"context_line":"        self._handle_router_snat_rules(gw_port, interface_name)"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def _process_ext_router_devices(self, interface_name, pd):"},{"line_number":602,"context_line":"        existing_devices \u003d self._get_existing_devices()"},{"line_number":603,"context_line":"        stale_devs \u003d [dev for dev in existing_devices"},{"line_number":604,"context_line":"                      if dev.startswith(EXTERNAL_DEV_PREFIX)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_dd31fda3","line":601,"updated":"2015-12-31 08:18:22.000000000","message":"how about rename this to remove/cleanup_ext_router_devices ?","commit_id":"227f2ac2e7824c975f69fbb8ba3a426839d4f5e5"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"12b7252accea678a2bb9af3b77d1b3c582a78924","unresolved":false,"context_lines":[{"line_number":598,"context_line":"        gw_port \u003d self._router.get(\u0027gw_port\u0027)"},{"line_number":599,"context_line":"        self._handle_router_snat_rules(gw_port, interface_name)"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def _process_ext_router_devices(self, interface_name, pd):"},{"line_number":602,"context_line":"        existing_devices \u003d self._get_existing_devices()"},{"line_number":603,"context_line":"        stale_devs \u003d [dev for dev in existing_devices"},{"line_number":604,"context_line":"                      if dev.startswith(EXTERNAL_DEV_PREFIX)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa69d971_e8d95284","line":601,"in_reply_to":"fa69d971_dd31fda3","updated":"2016-01-04 21:13:27.000000000","message":"actually, it doesn\u0027t even really need to be here - the only place this is called is L595","commit_id":"227f2ac2e7824c975f69fbb8ba3a426839d4f5e5"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"d0fc5e268214ea7cfe363265580580e4dd38a90e","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        self._process_devices(pd, current_port_ids)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def _process_devices(self, pd, current_port_ids):"},{"line_number":446,"context_line":"        existing_devices \u003d self._get_existing_devices()"},{"line_number":447,"context_line":"        current_internal_devs \u003d set(n for n in existing_devices"},{"line_number":448,"context_line":"                                    if n.startswith(INTERNAL_DEV_PREFIX))"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_2468ebb8","line":445,"updated":"2016-01-05 03:07:40.000000000","message":"This method will do no more process but only cleanup for stale router interfaces, can you rename it for that?","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"2359e47234bb8b03bf4ba142cb393aaf77052b44","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        self._process_devices(pd, current_port_ids)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":"    def _process_devices(self, pd, current_port_ids):"},{"line_number":446,"context_line":"        existing_devices \u003d self._get_existing_devices()"},{"line_number":447,"context_line":"        current_internal_devs \u003d set(n for n in existing_devices"},{"line_number":448,"context_line":"                                    if n.startswith(INTERNAL_DEV_PREFIX))"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_dc4874b5","line":445,"in_reply_to":"fa69d971_2468ebb8","updated":"2016-01-06 18:28:25.000000000","message":"actually, it is only called here, so I\u0027ll just put the two blocks back together","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"d0fc5e268214ea7cfe363265580580e4dd38a90e","unresolved":false,"context_lines":[{"line_number":660,"context_line":"        try:"},{"line_number":661,"context_line":"            ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":662,"context_line":"            self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":663,"context_line":"            if not ex_gw_port:"},{"line_number":664,"context_line":"                return"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"            interface_name \u003d self.get_external_device_interface_name("}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_b7e5ef38","line":663,"updated":"2016-01-05 03:07:40.000000000","message":"Per L261, self.get_ex_gw_port() will return a None object, so it will directly return here, and make following code in this method not be processed.","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"2359e47234bb8b03bf4ba142cb393aaf77052b44","unresolved":false,"context_lines":[{"line_number":660,"context_line":"        try:"},{"line_number":661,"context_line":"            ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":662,"context_line":"            self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":663,"context_line":"            if not ex_gw_port:"},{"line_number":664,"context_line":"                return"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"            interface_name \u003d self.get_external_device_interface_name("}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_fc053845","line":663,"in_reply_to":"fa69d971_883df3de","updated":"2016-01-06 18:28:25.000000000","message":"First, this is putting the code back the way it was before the original change, so whether L663 should be there or not becomes the subject of a separate patch set.\n\nSecond, there is a subtle difference between _process_external and _process_external_on_delete, so this should remain as is.","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8bab991eda2d3f20e15daa2f3cb85c38b9052eca","unresolved":false,"context_lines":[{"line_number":660,"context_line":"        try:"},{"line_number":661,"context_line":"            ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":662,"context_line":"            self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":663,"context_line":"            if not ex_gw_port:"},{"line_number":664,"context_line":"                return"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"            interface_name \u003d self.get_external_device_interface_name("}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_883df3de","line":663,"in_reply_to":"fa69d971_b7e5ef38","updated":"2016-01-06 06:42:19.000000000","message":"+1 with ZongKai. IMO, _process_external_on_delete is not needed here. Just call self._process_external_gateway(None, agent.pd) at line 733 can do the same job.","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"8bab991eda2d3f20e15daa2f3cb85c38b9052eca","unresolved":false,"context_lines":[{"line_number":718,"context_line":""},{"line_number":719,"context_line":"    @common_utils.exception_logger()"},{"line_number":720,"context_line":"    def process_delete(self, agent):"},{"line_number":721,"context_line":"        \"\"\"Process updates to this router"},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        This method is the point where the agent requests that this router"},{"line_number":724,"context_line":"        be deleted. This is a separate code path from process in that it"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_4bc37589","line":721,"range":{"start_line":721,"start_character":19,"end_line":721,"end_character":26},"updated":"2016-01-06 06:42:19.000000000","message":"nit: s/updates/delete/g","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"2359e47234bb8b03bf4ba142cb393aaf77052b44","unresolved":false,"context_lines":[{"line_number":718,"context_line":""},{"line_number":719,"context_line":"    @common_utils.exception_logger()"},{"line_number":720,"context_line":"    def process_delete(self, agent):"},{"line_number":721,"context_line":"        \"\"\"Process updates to this router"},{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        This method is the point where the agent requests that this router"},{"line_number":724,"context_line":"        be deleted. This is a separate code path from process in that it"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_bc9260f4","line":721,"range":{"start_line":721,"start_character":19,"end_line":721,"end_character":26},"in_reply_to":"fa69d971_4bc37589","updated":"2016-01-06 18:28:25.000000000","message":"done, but with a slight change","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"d0fc5e268214ea7cfe363265580580e4dd38a90e","unresolved":false,"context_lines":[{"line_number":732,"context_line":"        agent.pd.sync_router(self.router[\u0027id\u0027])"},{"line_number":733,"context_line":"        self._process_external_on_delete(agent)"},{"line_number":734,"context_line":"        # Process static routes for router"},{"line_number":735,"context_line":"        self.routes_updated()"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    @common_utils.exception_logger()"},{"line_number":738,"context_line":"    def process(self, agent):"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_17f95bc7","line":735,"updated":"2016-01-05 03:07:40.000000000","message":"This router is going to be deleted, what will routes_updated do here?","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"2359e47234bb8b03bf4ba142cb393aaf77052b44","unresolved":false,"context_lines":[{"line_number":732,"context_line":"        agent.pd.sync_router(self.router[\u0027id\u0027])"},{"line_number":733,"context_line":"        self._process_external_on_delete(agent)"},{"line_number":734,"context_line":"        # Process static routes for router"},{"line_number":735,"context_line":"        self.routes_updated()"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    @common_utils.exception_logger()"},{"line_number":738,"context_line":"    def process(self, agent):"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa69d971_1cafec2a","line":735,"in_reply_to":"fa69d971_17f95bc7","updated":"2016-01-06 18:28:25.000000000","message":"if there are any side effects of updating routes, they will be handled properly.","commit_id":"90e1d0ebe59f242567111eca244e25e69ca1ada6"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e84abaeb7715530659ca1b2baee9236e9c2501db","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        self.router[\u0027gw_port\u0027] \u003d None"},{"line_number":262,"context_line":"        self.router[l3_constants.INTERFACE_KEY] \u003d []"},{"line_number":263,"context_line":"        self.router[l3_constants.FLOATINGIP_KEY] \u003d []"},{"line_number":264,"context_line":"        self.process_delete(agent)"},{"line_number":265,"context_line":"        self.disable_radvd()"},{"line_number":266,"context_line":"        self.router_namespace.delete()"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_2221124e","line":264,"range":{"start_line":264,"start_character":13,"end_line":264,"end_character":27},"updated":"2016-01-12 18:11:35.000000000","message":"I really think this is an easier pattern to understand and maintain.  But, I\u0027m willing to reconsider the delete parameter considering the code duplication.  There are other ways to reduce code duplication but might involve more refactoring than we want to get in to right now.","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"0b586d8591a5f6df54eaf492b7aa1ebfa87c2a00","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        self.router[\u0027gw_port\u0027] \u003d None"},{"line_number":262,"context_line":"        self.router[l3_constants.INTERFACE_KEY] \u003d []"},{"line_number":263,"context_line":"        self.router[l3_constants.FLOATINGIP_KEY] \u003d []"},{"line_number":264,"context_line":"        self.process_delete(agent)"},{"line_number":265,"context_line":"        self.disable_radvd()"},{"line_number":266,"context_line":"        self.router_namespace.delete()"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_1c96b24c","line":264,"range":{"start_line":264,"start_character":13,"end_line":264,"end_character":27},"in_reply_to":"da6ed579_2221124e","updated":"2016-01-12 18:45:52.000000000","message":"let\u0027s leave it this way for now then :)","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e84abaeb7715530659ca1b2baee9236e9c2501db","unresolved":false,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":"        # Process SNAT rules for external gateway"},{"line_number":585,"context_line":"        gw_port \u003d self._router.get(\u0027gw_port\u0027)"},{"line_number":586,"context_line":"        self._handle_router_snat_rules(gw_port, interface_name)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def external_gateway_nat_rules(self, ex_gw_ip, interface_name):"},{"line_number":589,"context_line":"        dont_snat_traffic_to_internal_ports_if_not_to_floating_ip \u003d ("}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_2d3b43d3","line":586,"range":{"start_line":586,"start_character":13,"end_line":586,"end_character":38},"updated":"2016-01-12 18:11:35.000000000","message":"I wonder if this should be moved out to the caller so that it can be skipped on delete.  It is wasted work too, no?","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"0b586d8591a5f6df54eaf492b7aa1ebfa87c2a00","unresolved":false,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":"        # Process SNAT rules for external gateway"},{"line_number":585,"context_line":"        gw_port \u003d self._router.get(\u0027gw_port\u0027)"},{"line_number":586,"context_line":"        self._handle_router_snat_rules(gw_port, interface_name)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def external_gateway_nat_rules(self, ex_gw_ip, interface_name):"},{"line_number":589,"context_line":"        dont_snat_traffic_to_internal_ports_if_not_to_floating_ip \u003d ("}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_1c40f2a4","line":586,"range":{"start_line":586,"start_character":13,"end_line":586,"end_character":38},"in_reply_to":"da6ed579_2d3b43d3","updated":"2016-01-12 18:45:52.000000000","message":"this patch set takes the approach of just removing the iptables apply (as that is where you pay the piper) but wanted to leave everything else alone to make sure we don\u0027t leave any orphans - I\u0027d really prefer to remove things like this in a follow on...","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e84abaeb7715530659ca1b2baee9236e9c2501db","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        fip_statuses \u003d {}"},{"line_number":651,"context_line":"        try:"},{"line_number":652,"context_line":"            ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":653,"context_line":"            self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":654,"context_line":"            if not ex_gw_port:"},{"line_number":655,"context_line":"                return"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_c236f602","line":653,"range":{"start_line":653,"start_character":17,"end_line":653,"end_character":42},"updated":"2016-01-12 18:11:35.000000000","message":"This is no longer under deferred apply.  But, there is a call to _handle_router_snat_rules buried in here.  Should that also be skipped somehow?  See L586.","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"0b586d8591a5f6df54eaf492b7aa1ebfa87c2a00","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        fip_statuses \u003d {}"},{"line_number":651,"context_line":"        try:"},{"line_number":652,"context_line":"            ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":653,"context_line":"            self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":654,"context_line":"            if not ex_gw_port:"},{"line_number":655,"context_line":"                return"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_dce57aa8","line":653,"range":{"start_line":653,"start_character":17,"end_line":653,"end_character":42},"in_reply_to":"da6ed579_c236f602","updated":"2016-01-12 18:45:52.000000000","message":"See my comment on L586 for why I\u0027d rather leave this here","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e84abaeb7715530659ca1b2baee9236e9c2501db","unresolved":false,"context_lines":[{"line_number":675,"context_line":"                    return"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"                # Process SNAT/DNAT rules and addresses for floating IPs"},{"line_number":678,"context_line":"                self.process_snat_dnat_for_fip()"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"            # Once NAT rules for floating IPs are safely in place"},{"line_number":681,"context_line":"            # configure their addresses on the external gateway port"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_ed4beb57","line":678,"range":{"start_line":678,"start_character":21,"end_line":678,"end_character":46},"updated":"2016-01-12 18:11:35.000000000","message":"This seems to be the main thing missing from the _delete version of this call.  (This and the defer_apply call)\n\nThere does seem to be just enough duplicated code to worry me a little.  However, I do like the removal of the \u0027delete\u0027 parameter.  I\u0027d rather try to find a way to remove code duplication locally rather than throwing the delete parameter up to the top caller like was done before this patch.\n\nThe way I can think of to do it is itself a little bit ugly but at least it would keep it local.  It is something like creating a contextlib.contextmanager method that would yield back to the caller to do the iptables stuff.  Both the process_external and the process_external_on_delete methods would call it.  The _delete version of the code would just pass.  I\u0027ll admit it isn\u0027t super either.","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"0b586d8591a5f6df54eaf492b7aa1ebfa87c2a00","unresolved":false,"context_lines":[{"line_number":675,"context_line":"                    return"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"                # Process SNAT/DNAT rules and addresses for floating IPs"},{"line_number":678,"context_line":"                self.process_snat_dnat_for_fip()"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":"            # Once NAT rules for floating IPs are safely in place"},{"line_number":681,"context_line":"            # configure their addresses on the external gateway port"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_9c63821a","line":678,"range":{"start_line":678,"start_character":21,"end_line":678,"end_character":46},"in_reply_to":"da6ed579_ed4beb57","updated":"2016-01-12 18:45:52.000000000","message":"I\u0027m open to exploring further optimizations in follow on patches","commit_id":"660c2aad3e65ea7885c36c4fd6978fc504ad3a60"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"a30f8fa3454645b74891d66830306aa64058e786","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        try:"},{"line_number":658,"context_line":"            ex_gw_port \u003d self.get_ex_gw_port()"},{"line_number":659,"context_line":"            self._process_external_gateway(ex_gw_port, agent.pd)"},{"line_number":660,"context_line":"            if not ex_gw_port:"},{"line_number":661,"context_line":"                return"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"            interface_name \u003d self.get_external_device_interface_name("}],"source_content_type":"text/x-python","patch_set":13,"id":"da6ed579_103bf3d2","line":660,"range":{"start_line":660,"start_character":29,"end_line":660,"end_character":30},"updated":"2016-01-12 20:06:26.000000000","message":"nit:Should this check be before #L659.\nMay be we need to add a patch to move it up.","commit_id":"a4093c335380287f6ff723ca0e5f703a81fe1e66"}],"neutron/tests/functional/agent/l3/framework.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"d685c86f9d0581d67d6a03bbd0ac37286ecf8cde","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        agent._process_added_router(router)"},{"line_number":279,"context_line":"        return agent.router_info[router[\u0027id\u0027]]"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def update_router(self, agent, router):"},{"line_number":282,"context_line":"        agent._process_updated_router(router)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _delete_router(self, agent, router_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_493d29ba","line":281,"updated":"2015-12-01 21:38:00.000000000","message":"Can you just call router.process() instead of defining this method? We do that in other places already.","commit_id":"d11edf16b53c6ba8a2819ee1ef215f7c3ae253f6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"3ac4dba4d995b31a4b6bb74bc7a38255f095cd3e","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        agent._process_added_router(router)"},{"line_number":279,"context_line":"        return agent.router_info[router[\u0027id\u0027]]"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def update_router(self, agent, router):"},{"line_number":282,"context_line":"        agent._process_updated_router(router)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _delete_router(self, agent, router_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_e9be5dfe","line":281,"in_reply_to":"9a8ffd7b_493d29ba","updated":"2015-12-01 21:41:14.000000000","message":"I tried, but I must have screwed it up because it wouldn\u0027t work locally, I\u0027ll give it another look-see tomorrow when my eyes are fresher","commit_id":"d11edf16b53c6ba8a2819ee1ef215f7c3ae253f6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"d0b7436920d3b4950c031969d7141f8a9a983b6a","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        agent._process_added_router(router)"},{"line_number":279,"context_line":"        return agent.router_info[router[\u0027id\u0027]]"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def update_router(self, agent, router):"},{"line_number":282,"context_line":"        agent._process_updated_router(router)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _delete_router(self, agent, router_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_9dc2f932","line":281,"in_reply_to":"9a8ffd7b_e9be5dfe","updated":"2015-12-03 14:53:58.000000000","message":"got it now - so removed","commit_id":"d11edf16b53c6ba8a2819ee1ef215f7c3ae253f6"}],"neutron/tests/functional/agent/l3/test_dvr_router.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"b8e0300a1e01b6b8e34739c3b307cb125d4f56e0","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        #before we can delete the router, we need to clear the gw_port and"},{"line_number":163,"context_line":"        #allow the agent to do the needed cleanup"},{"line_number":164,"context_line":"        router_info[\u0027gw_port\u0027] \u003d {}"},{"line_number":165,"context_line":"        self.update_router(self.agent, router_info)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        self._delete_router(self.agent, router.router_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_89e0f1fb","line":164,"updated":"2015-12-01 21:43:50.000000000","message":"I think we can get rid of the new update_router method, and follow what\u0027s already being done in other instances. For example check out _test_conntrack_disassociate_fip, it\u0027s a bit different than what you did here.","commit_id":"d11edf16b53c6ba8a2819ee1ef215f7c3ae253f6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"d0b7436920d3b4950c031969d7141f8a9a983b6a","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        #before we can delete the router, we need to clear the gw_port and"},{"line_number":163,"context_line":"        #allow the agent to do the needed cleanup"},{"line_number":164,"context_line":"        router_info[\u0027gw_port\u0027] \u003d {}"},{"line_number":165,"context_line":"        self.update_router(self.agent, router_info)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        self._delete_router(self.agent, router.router_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a8ffd7b_ddfac174","line":164,"in_reply_to":"9a8ffd7b_89e0f1fb","updated":"2015-12-03 14:53:58.000000000","message":"Done","commit_id":"d11edf16b53c6ba8a2819ee1ef215f7c3ae253f6"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"e44d357278eef15a5844a604a36a24626e47145e","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            self._assert_onlink_subnet_routes("},{"line_number":174,"context_line":"                router, ip_versions, snat_ns_name)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        # while normal operation cleans up the gw port first, here we are"},{"line_number":177,"context_line":"        # testing if the code can handle errors in the control channel"},{"line_number":178,"context_line":"        # and the gw_port has not been cleaned up first"},{"line_number":179,"context_line":"        self._delete_router(self.agent, router.router_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da6ed579_55839dcc","line":176,"updated":"2016-01-12 19:56:38.000000000","message":"I would clarify and say that typically this happens:\nneutron router-gateway-clear r\nneutron router-delete r\n\nResulting in two notifications to the agent. Instead, this code flow simulates a situation that only happens in exceptional cases, the clearing of the gateway notification was missed, and that we\u0027re checking that the L3 agent is robust enough to handle that and delete the router correctly.","commit_id":"a4093c335380287f6ff723ca0e5f703a81fe1e66"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"ef0e5c40f97d4d3a0ed598ec56ba2a345a8784a2","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            self._assert_onlink_subnet_routes("},{"line_number":174,"context_line":"                router, ip_versions, snat_ns_name)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        # while normal operation cleans up the gw port first, here we are"},{"line_number":177,"context_line":"        # testing if the code can handle errors in the control channel"},{"line_number":178,"context_line":"        # and the gw_port has not been cleaned up first"},{"line_number":179,"context_line":"        self._delete_router(self.agent, router.router_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da6ed579_2bcdb330","line":176,"in_reply_to":"da6ed579_55839dcc","updated":"2016-01-15 15:09:52.000000000","message":"since I had to do a rebase, I went ahead and made this change","commit_id":"a4093c335380287f6ff723ca0e5f703a81fe1e66"}]}
