)]}'
{"neutron/agent/l3/ha_router.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"2cf01a9b7ef3473f69f10a796c9e8a8b3e7df7e3","unresolved":false,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def external_gateway_removed(self, ex_gw_port, interface_name):"},{"line_number":365,"context_line":"        self._clear_vips(interface_name)"},{"line_number":366,"context_line":"        self.driver.unplug(interface_name,"},{"line_number":367,"context_line":"                           bridge\u003dself.agent_conf.external_network_bridge,"},{"line_number":368,"context_line":"                           namespace\u003dself.ns_name,"},{"line_number":369,"context_line":"                           prefix\u003drouter.EXTERNAL_DEV_PREFIX)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_615f0176","line":366,"updated":"2015-10-12 20:52:33.000000000","message":"I know I made the suggestion in IRC to switch from PS1 to PS2, but thinking about it again it may be wrong. There\u0027s no reason to deviate between HA and legacy routers in this case, so I think it\u0027s safer to remove IP addresses from the master like you did in PS1.","commit_id":"26db08bffb37b40352d96a9868a7b5821a289963"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"8e2ae3e759d7ecb0692821a58d45e141c38834c4","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            self.driver.unplug(interface_name,"},{"line_number":373,"context_line":"                               bridge\u003dself.agent_conf.external_network_bridge,"},{"line_number":374,"context_line":"                               namespace\u003dself.ns_name,"},{"line_number":375,"context_line":"                               prefix\u003drouter.EXTERNAL_DEV_PREFIX)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    def delete(self, agent):"},{"line_number":378,"context_line":"        super(HaRouter, self).delete(agent)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_f2266667","line":375,"updated":"2015-10-14 14:28:47.000000000","message":"Are we creating the following race condition?\n1. User removes external gateway from a non-master router\n2. before the router update arrives at the network node, the router becomes master\n3. now the IP address is removed when it wasn\u0027t supposed to be.","commit_id":"931d9dd8c6ea32a0693850da557270c5328788f2"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"365fea9486e0fb7dc064a83f7180d30a977ec5b1","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            self.driver.unplug(interface_name,"},{"line_number":373,"context_line":"                               bridge\u003dself.agent_conf.external_network_bridge,"},{"line_number":374,"context_line":"                               namespace\u003dself.ns_name,"},{"line_number":375,"context_line":"                               prefix\u003drouter.EXTERNAL_DEV_PREFIX)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    def delete(self, agent):"},{"line_number":378,"context_line":"        super(HaRouter, self).delete(agent)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_a02cf302","line":375,"in_reply_to":"5a2ca52d_6027bb64","updated":"2015-10-15 08:49:25.000000000","message":"Also, while it is possible that right after removing the external gateway from a router, and before the request propagates to the L3 agent, that agent becomes the master. However, since there is no concurrency in this code (only one can happen at exactly the same time - either the gateway removal request is handled or the router becomes master - but not both), this code can be considered \u0027safe\u0027 IMO. Unless I\u0027m wrong in the whole concurrency issue :)","commit_id":"931d9dd8c6ea32a0693850da557270c5328788f2"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bc879ef416f58f0bdb3578929c8e589308c2a089","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            self.driver.unplug(interface_name,"},{"line_number":373,"context_line":"                               bridge\u003dself.agent_conf.external_network_bridge,"},{"line_number":374,"context_line":"                               namespace\u003dself.ns_name,"},{"line_number":375,"context_line":"                               prefix\u003drouter.EXTERNAL_DEV_PREFIX)"},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"    def delete(self, agent):"},{"line_number":378,"context_line":"        super(HaRouter, self).delete(agent)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_6027bb64","line":375,"in_reply_to":"5a2ca52d_f2266667","updated":"2015-10-15 08:44:25.000000000","message":"The user can\u0027t remove the gateway from a \"non-master\" router. Like in DVR, in HA you can only address the \u0027one\u0027 router which is then manage/scheduled by Neutron as it deems fit. If you remove the external gateway from a router, the gateway should be removed from all the L3 agents hosting it at roughly the same time, so no race condition is possible here.","commit_id":"931d9dd8c6ea32a0693850da557270c5328788f2"}],"neutron/tests/unit/agent/l3/test_ha_router.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ca9e5c09ce388cffea0e8e79805a0b4d4af2b812","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        ri._get_cidrs_from_keepalived \u003d mock.MagicMock(return_value\u003daddresses)"},{"line_number":50,"context_line":"        self.assertEqual(set(addresses), ri.get_router_cidrs(device))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_external_gateway_removed_master(self):"},{"line_number":53,"context_line":"        ri \u003d self._create_router()"},{"line_number":54,"context_line":"        ri.namespace \u003d \u0027fake-namespace\u0027"},{"line_number":55,"context_line":"        self.agent_conf.external_network_bridge \u003d \u0027br-fake\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_b8c97e7a","line":52,"updated":"2015-10-15 13:12:09.000000000","message":"John and I discussed these tests over IRC. I\u0027d much rather see a functional test that removes an external gateway from a standby node and makes sure that no exception as thrown.","commit_id":"daa219cba399fa4b5633745fa183d5feead61e72"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"c4db04f8034d43971f8329b406bef2f9763d6544","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        ri._get_cidrs_from_keepalived \u003d mock.MagicMock(return_value\u003daddresses)"},{"line_number":50,"context_line":"        self.assertEqual(set(addresses), ri.get_router_cidrs(device))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_external_gateway_removed_master(self):"},{"line_number":53,"context_line":"        ri \u003d self._create_router()"},{"line_number":54,"context_line":"        ri.namespace \u003d \u0027fake-namespace\u0027"},{"line_number":55,"context_line":"        self.agent_conf.external_network_bridge \u003d \u0027br-fake\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a29b11f_803f77d5","line":52,"in_reply_to":"5a2ca52d_b8c97e7a","updated":"2015-10-20 14:48:34.000000000","message":"Done! It does look a lot nicer now! :)","commit_id":"daa219cba399fa4b5633745fa183d5feead61e72"}]}
