)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"6912eb45a9a98edf481dd1be9db1063f987262e6","unresolved":false,"context_lines":[{"line_number":21,"context_line":"will not be able to remove from the l3 agent router_info."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":24,"context_line":"Closes-Bug: #1523780"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da6ed579_37f2a870","line":24,"range":{"start_line":24,"start_character":13,"end_line":24,"end_character":20},"updated":"2016-01-12 23:02:48.000000000","message":"I\u0027ve got a bunch of reviews that claim to close the same bug [1-7].  In general, we can only have one review close a bug.  If it needs other patches then it needs to depend on them and then wait for them all to get merged and then close the bug.\n\nAs it is now, the first one of these to merge will close the bug and then we\u0027ll be reviewing the rest on a bug marked closed.  Something needs to be done.  Here are some options.\n\n1.  You could line them all up properly with most of them marked with related-bug instead of closes-bug with the last one coming in a closing it.\n2.  You could keep them independent and file a bug for each independent fix.\n3.  Some mix of 1 and 2.\n4.  Tell me that they are all independent fixes for the same bug and which one is the best one to review (probably abandon most of the others).\n\n[1] https://review.openstack.org/#/c/265672/\n[2] https://review.openstack.org/#/c/265676/\n[3] https://review.openstack.org/#/c/265680/\n[4] https://review.openstack.org/#/c/265682/\n[5] https://review.openstack.org/#/c/265685/\n[6] https://review.openstack.org/#/c/266109/\n[7] https://review.openstack.org/#/c/260303/","commit_id":"7699ade9ac0fa7530f02024cbeab72d461e4edac"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fcd1cd51d3e743d9103b232f695be3da3afd7358","unresolved":false,"context_lines":[{"line_number":21,"context_line":"will not be able to remove from the l3 agent router_info."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":24,"context_line":"Closes-Bug: #1523780"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da6ed579_c6691827","line":24,"range":{"start_line":24,"start_character":13,"end_line":24,"end_character":20},"in_reply_to":"da6ed579_37f2a870","updated":"2016-01-13 01:34:17.000000000","message":"Thank you, as Kevin Benton mentioned in Patch Set 10 https://review.openstack.org/#/c/260303/10:\n\"to elaborate, the commit message identifies 4 different race conditions. please fix one in each patch so it\u0027s clear what is being done\". Different people have different views, so now each patch deal with each one race.\nMaybe I should register a separated lp bug for each patch.","commit_id":"7699ade9ac0fa7530f02024cbeab72d461e4edac"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"862d70a659dd962783f860a8cf75551f68e3ffbf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"will not be able to remove from the l3 agent router_info."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":24,"context_line":"Closes-Bug: #1523780"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"da6ed579_1013e50e","line":24,"range":{"start_line":24,"start_character":13,"end_line":24,"end_character":20},"in_reply_to":"da6ed579_c6691827","updated":"2016-01-13 03:20:25.000000000","message":"New LP bug #1533441","commit_id":"7699ade9ac0fa7530f02024cbeab72d461e4edac"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2016-01-08 15:52:13 +0800"},{"line_number":4,"context_line":"Commit:     LIU Yulong \u003cliuyulong@letv.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-18 14:25:42 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Clean up l3 agent side HA router stuffs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is to ensure that after a delete router"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a68dd71_ba8c0280","line":6,"updated":"2016-02-15 12:19:53.000000000","message":"some linguistic nits ahead, but I\u0027m not native, so probably others could help better than me.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     LIU Yulong \u003cliuyulong@letv.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-18 14:25:42 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Clean up l3 agent side HA router stuffs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is to ensure that after a delete router"},{"line_number":10,"context_line":"RPC l3 agent could clean up all resoutces of a HA router."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a68dd71_7ff2fc70","line":7,"range":{"start_line":7,"start_character":33,"end_line":7,"end_character":39},"updated":"2016-02-15 12:19:53.000000000","message":"stuffs -\u003e state ?","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     LIU Yulong \u003cliuyulong@letv.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-18 14:25:42 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Clean up l3 agent side HA router stuffs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is to ensure that after a delete router"},{"line_number":10,"context_line":"RPC l3 agent could clean up all resoutces of a HA router."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"dae33548_dad180fd","line":7,"range":{"start_line":7,"start_character":33,"end_line":7,"end_character":39},"in_reply_to":"9a68dd71_7ff2fc70","updated":"2016-02-15 15:22:04.000000000","message":"The stuffs here means HA router attributes and resources, such as keepalived manager, route rules, external process etc.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Clean up l3 agent side HA router stuffs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is to ensure that after a delete router"},{"line_number":10,"context_line":"RPC l3 agent could clean up all resoutces of a HA router."},{"line_number":11,"context_line":"And partially soloving the Race Exception:"},{"line_number":12,"context_line":"\u0027HA router has no ha interface\u0027"},{"line_number":13,"context_line":"Once race happened between l3 agent rpc get router info"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a68dd71_1a218e9f","line":10,"range":{"start_line":10,"start_character":32,"end_line":10,"end_character":41},"updated":"2016-02-15 12:19:53.000000000","message":"resoutces -\u003e resources, of a HA router -\u003e of an HA router.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Clean up l3 agent side HA router stuffs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is to ensure that after a delete router"},{"line_number":10,"context_line":"RPC l3 agent could clean up all resoutces of a HA router."},{"line_number":11,"context_line":"And partially soloving the Race Exception:"},{"line_number":12,"context_line":"\u0027HA router has no ha interface\u0027"},{"line_number":13,"context_line":"Once race happened between l3 agent rpc get router info"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"dae33548_fa73a44b","line":10,"range":{"start_line":10,"start_character":32,"end_line":10,"end_character":41},"in_reply_to":"9a68dd71_1a218e9f","updated":"2016-02-15 15:22:04.000000000","message":"Done","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is to ensure that after a delete router"},{"line_number":10,"context_line":"RPC l3 agent could clean up all resoutces of a HA router."},{"line_number":11,"context_line":"And partially soloving the Race Exception:"},{"line_number":12,"context_line":"\u0027HA router has no ha interface\u0027"},{"line_number":13,"context_line":"Once race happened between l3 agent rpc get router info"},{"line_number":14,"context_line":"call(plugin_rpc.get_routers) and HA port deleting(after a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a68dd71_1a6f4ec6","line":11,"range":{"start_line":11,"start_character":14,"end_line":11,"end_character":22},"updated":"2016-02-15 12:19:53.000000000","message":"soloving -\u003e solving.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is to ensure that after a delete router"},{"line_number":10,"context_line":"RPC l3 agent could clean up all resoutces of a HA router."},{"line_number":11,"context_line":"And partially soloving the Race Exception:"},{"line_number":12,"context_line":"\u0027HA router has no ha interface\u0027"},{"line_number":13,"context_line":"Once race happened between l3 agent rpc get router info"},{"line_number":14,"context_line":"call(plugin_rpc.get_routers) and HA port deleting(after a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"dae33548_ba791c32","line":11,"range":{"start_line":11,"start_character":14,"end_line":11,"end_character":22},"in_reply_to":"9a68dd71_1a6f4ec6","updated":"2016-02-15 15:22:04.000000000","message":"Done","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":11,"context_line":"And partially soloving the Race Exception:"},{"line_number":12,"context_line":"\u0027HA router has no ha interface\u0027"},{"line_number":13,"context_line":"Once race happened between l3 agent rpc get router info"},{"line_number":14,"context_line":"call(plugin_rpc.get_routers) and HA port deleting(after a"},{"line_number":15,"context_line":"router delete API call), neutron server side"},{"line_number":16,"context_line":"_process_sync_ha_data may get a HA router without"},{"line_number":17,"context_line":"ha interface information, this is the mainly reasion why"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a68dd71_7a868a66","line":14,"range":{"start_line":14,"start_character":41,"end_line":14,"end_character":49},"updated":"2016-02-15 12:19:53.000000000","message":"port deleting -\u003e port is deleted","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":11,"context_line":"And partially soloving the Race Exception:"},{"line_number":12,"context_line":"\u0027HA router has no ha interface\u0027"},{"line_number":13,"context_line":"Once race happened between l3 agent rpc get router info"},{"line_number":14,"context_line":"call(plugin_rpc.get_routers) and HA port deleting(after a"},{"line_number":15,"context_line":"router delete API call), neutron server side"},{"line_number":16,"context_line":"_process_sync_ha_data may get a HA router without"},{"line_number":17,"context_line":"ha interface information, this is the mainly reasion why"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"dae33548_da7ce022","line":14,"range":{"start_line":14,"start_character":41,"end_line":14,"end_character":49},"in_reply_to":"9a68dd71_7a868a66","updated":"2016-02-15 15:22:04.000000000","message":"Done","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"1523ef3e896c3c1fdbef9cf1c670258bdd3a6eee","unresolved":false,"context_lines":[{"line_number":25,"context_line":"router x without HA port\u0027."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":28,"context_line":"Closes-Bug: #1533441"},{"line_number":29,"context_line":"Related-Bug: #1523780"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"bacf61ea_0b65a1e0","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":21},"updated":"2016-07-27 14:11:53.000000000","message":"Both of these bugs have been closed since they were describing multiple issues, which are already addressed by different bug reports.\n\nPlease update these lines to the new bug reports, to make it easier for us to review this patch.","commit_id":"9c84dfd52b30ae51f45eeecabdc96c5c40995b71"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b274f7d1dd7ba8015aa0a54905afd41cb7505a49","unresolved":false,"context_lines":[{"line_number":25,"context_line":"router x without HA port\u0027."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":28,"context_line":"Closes-Bug: #1533441"},{"line_number":29,"context_line":"Related-Bug: #1523780"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"bacf61ea_47e92c1a","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":21},"in_reply_to":"bacf61ea_0b65a1e0","updated":"2016-07-28 02:57:57.000000000","message":"Done.\nOK, let\u0027s use that bug #1605546 as the new tracker for the \"infinite loop\" which is a successor of bug #1533441.","commit_id":"9c84dfd52b30ae51f45eeecabdc96c5c40995b71"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"002e978fb0017f4d685d6dfeb13afa05d9ac2576","unresolved":false,"context_lines":[{"line_number":25,"context_line":"router x without HA port\u0027."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":28,"context_line":"Closes-Bug: #1605546"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_c4e4ef3c","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":20},"updated":"2016-07-28 08:34:18.000000000","message":"Patch [1] Also claims to resolve this issue. Please re-submit this with \"Related-Bug\" instead.\n\n[1]: https://review.openstack.org/#/c/265680/","commit_id":"79766d1f8417ecd34ef1220a940f3df8c72910df"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"eb2e2207eaa89c88d2cfa2c7acd9b89f5f6533ba","unresolved":false,"context_lines":[{"line_number":25,"context_line":"router x without HA port\u0027."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":28,"context_line":"Closes-Bug: #1605546"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_ba5e3243","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":20},"in_reply_to":"bacf61ea_04a607c1","updated":"2016-07-28 09:25:42.000000000","message":"Firstly we should check patch\u0027s filter, https://review.openstack.org/#/c/265680/, to see if a L3 dvr_snat/legacy agent still have chance to get a HA router without ha_port. If not, the current code of this patch maybe not needed, then we can ambitiously remove the following code:\n\n ha_port \u003d self.router.get(n_consts.HA_INTERFACE_KEY)\n        if not ha_port:\n            LOG.error(_LE(\u0027Unable to process HA router %s without HA port\u0027),\n                      self.router_id)\n            return","commit_id":"79766d1f8417ecd34ef1220a940f3df8c72910df"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"29165865aa875ad714d62ebb1a7e7a4dea28800d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"router x without HA port\u0027."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":28,"context_line":"Closes-Bug: #1605546"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_d665b3e1","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":20},"in_reply_to":"bacf61ea_33bf01fd","updated":"2016-07-28 13:05:17.000000000","message":"Actually this patch fix the `infinitive loop` (https://bugs.launchpad.net/neutron/+bug/1533441). But, if 265680 or some patch else could totally prevent the l3 agent from getting a HA router without ha_port. That `infinitive loop` or None keepalived_manager things will no long exist. And then, according to there is no chance to get a HA router without ha_port, I will change this patch code to \"remove that ha_port check\".\n\n\nBut, for now, I consider that l3 agent still have chance to get a HA router without ha_port.","commit_id":"79766d1f8417ecd34ef1220a940f3df8c72910df"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"87069efceeca6b080415e3a470ad85c746944f8c","unresolved":false,"context_lines":[{"line_number":25,"context_line":"router x without HA port\u0027."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":28,"context_line":"Closes-Bug: #1605546"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_33bf01fd","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":20},"in_reply_to":"bacf61ea_ba5e3243","updated":"2016-07-28 12:48:27.000000000","message":"From your comment I understand that until (if) 265680 merges, we won\u0027t know if this patch will fix anything or even if it\u0027s actually needed (dvr_snat/legacy might actually be working after 265680).\n\nIf this is indeed the case, I suggest you abandon this patch. This way it won\u0027t take cycles from reviewers (who are potentially reviewing a mute patch) and if needed it can be restored later on once we know if it\u0027s needed.\n\nAlso, It\u0027s unclear to me why we need to wait until 265680 - you can rebase this patch on 265680 and see if there\u0027s still a problem. Also, a proper bug report should be opened for the dvr_snat/legacy case (if one is required).","commit_id":"79766d1f8417ecd34ef1220a940f3df8c72910df"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0659e980b18001e53471f34701baeba0fb428678","unresolved":false,"context_lines":[{"line_number":25,"context_line":"router x without HA port\u0027."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":28,"context_line":"Closes-Bug: #1605546"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_04a607c1","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":20},"in_reply_to":"bacf61ea_c4e4ef3c","updated":"2016-07-28 08:40:12.000000000","message":"Also, that bug is a duplicate of another bug, so it is unclear what bug this patch attempts to resolve.","commit_id":"79766d1f8417ecd34ef1220a940f3df8c72910df"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"04c64654b413ea0aae764ced3a86bdb1bcad8fc5","unresolved":false,"context_lines":[{"line_number":25,"context_line":"router x without HA port\u0027."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":28,"context_line":"Closes-Bug: #1605546"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"bacf61ea_5609c394","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":20},"in_reply_to":"bacf61ea_d665b3e1","updated":"2016-07-28 13:09:16.000000000","message":"Then this patch tries to resolve https://bugs.launchpad.net/neutron/+bug/1606844 and should be marked as such.","commit_id":"79766d1f8417ecd34ef1220a940f3df8c72910df"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0926cd8b394ffc09b68d9c942b8054ba53e8c0dc","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     LIU Yulong \u003cliuyulong@letv.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-28 13:42:06 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Clean up L3 agent side HA router stuffs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Once race happened between l3 agent RPC get router info call"},{"line_number":10,"context_line":"(plugin_rpc.get_routers) and HA port deletion(after a router"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bacf61ea_e507547f","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":39},"updated":"2016-07-28 16:13:32.000000000","message":"How about \"Resolve infinite loops in L3 HA agent side\" instead?","commit_id":"61616ec2e9df574bdcc674f307e669602b89784a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1def731534106abec95bd3b9c555ebc82ccc1aa3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     LIU Yulong \u003cliuyulong@letv.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-28 13:42:06 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Clean up L3 agent side HA router stuffs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Once race happened between l3 agent RPC get router info call"},{"line_number":10,"context_line":"(plugin_rpc.get_routers) and HA port deletion(after a router"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"bacf61ea_8219197c","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":39},"in_reply_to":"bacf61ea_e507547f","updated":"2016-07-28 23:23:39.000000000","message":"Done","commit_id":"61616ec2e9df574bdcc674f307e669602b89784a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"65e0770268096eb3d85e14cefa504824e3bff0c8","unresolved":false,"context_lines":[{"line_number":26,"context_line":"could clean up the resources of a HA router."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":29,"context_line":"Closes-Bug: #1607381"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"9a89bdaa_0e724e49","line":29,"updated":"2016-09-07 03:53:17.000000000","message":"I see a couple of patches that claim to close this bug! Here\u0027s the other one [1]. Which one do you want? We can\u0027t have both of them closing the bug. That just makes things very confusing down the road.\n\n [1] https://review.openstack.org/#/c/365653/","commit_id":"eff838334620c59ed5368cf8a65a59dbc978f290"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4cecccd34dbca7c54b8f74775a8e46ce8b1c55ee","unresolved":false,"context_lines":[{"line_number":26,"context_line":"could clean up the resources of a HA router."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":29,"context_line":"Closes-Bug: #1607381"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"9a89bdaa_42c98725","line":29,"in_reply_to":"9a89bdaa_0e724e49","updated":"2016-09-07 06:39:27.000000000","message":"I suggested John that it\u0027s better to fire a new bug [1] in the patch you mentioned here. But he did not agree that. : )\n\n[1] https://review.openstack.org/#/c/365653/1//COMMIT_MSG","commit_id":"eff838334620c59ed5368cf8a65a59dbc978f290"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"bcf7b411c8192582114edcbea09dd2983d398eca","unresolved":false,"context_lines":[{"line_number":27,"context_line":"the last guard in L3 agent side."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: I3b33af236d816e1ef93d6d81804fab82092671ca"},{"line_number":30,"context_line":"Closes-Bug: #1607381"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"9a89bdaa_dd53b669","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":10},"updated":"2016-09-07 07:07:52.000000000","message":"Re: the comments in the last patchset - this should be changed to Related-Bug instead (since 1607381 has been fully fixed).","commit_id":"9bd1c3935bf29a65a1e4f39ac313da0a2e7b2252"}],"neutron/agent/l3/ha_router.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7d5671970d6d788f31a0e2e64d16f513e25879be","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            return self.keepalived_manager.config.get_instance(self.ha_vr_id)"},{"line_number":133,"context_line":"        except AttributeError:"},{"line_number":134,"context_line":"            LOG.error(_LE(\u0027Unable to get router %s keepalived instance.\u0027),"},{"line_number":135,"context_line":"                      self.router_id)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _get_primary_vip(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_afb6b0f6","line":134,"updated":"2016-01-15 02:22:56.000000000","message":"May be specify \"HA router\" in the message is better.","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8f4639e3ffa680e6a81363cc50424e7b9e4fcffd","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            return self.keepalived_manager.config.get_instance(self.ha_vr_id)"},{"line_number":133,"context_line":"        except AttributeError:"},{"line_number":134,"context_line":"            LOG.error(_LE(\u0027Unable to get router %s keepalived instance.\u0027),"},{"line_number":135,"context_line":"                      self.router_id)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _get_primary_vip(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_dd24ef0d","line":134,"in_reply_to":"da6ed579_afb6b0f6","updated":"2016-01-15 10:38:44.000000000","message":"Done","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7d5671970d6d788f31a0e2e64d16f513e25879be","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        instance \u003d self._get_keepalived_instance()"},{"line_number":190,"context_line":"        if not instance:"},{"line_number":191,"context_line":"            LOG.warning(_LW(\u0027Failed to update HA router %s routes because \u0027"},{"line_number":192,"context_line":"                            \u0027HA router keepalived instance is None.\u0027),"},{"line_number":193,"context_line":"                        self.router_id)"},{"line_number":194,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_0f901c94","line":191,"updated":"2016-01-15 02:22:56.000000000","message":"I think the warning here is a bit duplicated. You just print \"Unable to get ****\" at line 134.","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8f4639e3ffa680e6a81363cc50424e7b9e4fcffd","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        instance \u003d self._get_keepalived_instance()"},{"line_number":190,"context_line":"        if not instance:"},{"line_number":191,"context_line":"            LOG.warning(_LW(\u0027Failed to update HA router %s routes because \u0027"},{"line_number":192,"context_line":"                            \u0027HA router keepalived instance is None.\u0027),"},{"line_number":193,"context_line":"                        self.router_id)"},{"line_number":194,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_7d570326","line":191,"in_reply_to":"da6ed579_0f901c94","updated":"2016-01-15 10:38:44.000000000","message":"This is useful for cloud administrator to locate which action is failed, as we know here it is \"to update HA router %s routes\".","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7d5671970d6d788f31a0e2e64d16f513e25879be","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    def delete(self, agent):"},{"line_number":391,"context_line":"        super(HaRouter, self).delete(agent)"},{"line_number":392,"context_line":"        if self.keepalived_manager:"},{"line_number":393,"context_line":"            if self.ha_port:"},{"line_number":394,"context_line":"                self.destroy_state_change_monitor(self.process_monitor)"},{"line_number":395,"context_line":"                self.ha_network_removed()"},{"line_number":396,"context_line":"            self.disable_keepalived()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_2f9ac06e","line":393,"updated":"2016-01-15 02:22:56.000000000","message":"I don\u0027t think this if check is needed. From the current code, if keepalived_manager is not None, ha_port is not None. And I go through the code, when ha_port is None, it will not break code.","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8f4639e3ffa680e6a81363cc50424e7b9e4fcffd","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    def delete(self, agent):"},{"line_number":391,"context_line":"        super(HaRouter, self).delete(agent)"},{"line_number":392,"context_line":"        if self.keepalived_manager:"},{"line_number":393,"context_line":"            if self.ha_port:"},{"line_number":394,"context_line":"                self.destroy_state_change_monitor(self.process_monitor)"},{"line_number":395,"context_line":"                self.ha_network_removed()"},{"line_number":396,"context_line":"            self.disable_keepalived()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_fdae937f","line":393,"in_reply_to":"da6ed579_2f9ac06e","updated":"2016-01-15 10:38:44.000000000","message":"Exception raised in get_ha_device_name() -- self.ha_port[\u0027id\u0027]","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"28c8faa70968e52734bbe2cd71e760b40ce5c92f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def _get_keepalived_instance(self):"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            return self.keepalived_manager.config.get_instance(self.ha_vr_id)"},{"line_number":133,"context_line":"        except AttributeError:"},{"line_number":134,"context_line":"            LOG.error(_LE(\u0027Unable to get HA router %s keepalived instance.\u0027),"},{"line_number":135,"context_line":"                      self.router_id)"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_3acb9f20","line":133,"updated":"2016-01-16 06:07:28.000000000","message":"Can you add a comment inline here explaining why an AttributeError is thrown when there is no keepalived instance? (e.g. which part is not defined, \u0027config\u0027, \u0027keepalived_manager\u0027, \u0027ha_vr_id\u0027, etc)","commit_id":"5799f2ca9541fbbb1bdd5f579a7ff6889a8591dc"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"18b723fcc8228f785b34675d512d3f667a3f666d","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def _get_keepalived_instance(self):"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            return self.keepalived_manager.config.get_instance(self.ha_vr_id)"},{"line_number":133,"context_line":"        except AttributeError:"},{"line_number":134,"context_line":"            LOG.error(_LE(\u0027Unable to get HA router %s keepalived instance.\u0027),"},{"line_number":135,"context_line":"                      self.router_id)"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_b819bc7b","line":133,"in_reply_to":"da6ed579_3acb9f20","updated":"2016-01-18 06:34:29.000000000","message":"OK, done","commit_id":"5799f2ca9541fbbb1bdd5f579a7ff6889a8591dc"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"28c8faa70968e52734bbe2cd71e760b40ce5c92f","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    def routes_updated(self, old_routes, new_routes):"},{"line_number":187,"context_line":"        instance \u003d self._get_keepalived_instance()"},{"line_number":188,"context_line":"        if not instance:"},{"line_number":189,"context_line":"            LOG.warning(_LW(\u0027Failed to update HA router %s routes because \u0027"},{"line_number":190,"context_line":"                            \u0027HA router keepalived instance is None.\u0027),"},{"line_number":191,"context_line":"                        self.router_id)"},{"line_number":192,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_dacfe327","line":189,"updated":"2016-01-16 06:07:28.000000000","message":"\"Failed to update HA router %s routes because it does not have a keepalived instance.\"\n\nOperators won\u0027t care that it\u0027s because a function returned \u0027None\u0027","commit_id":"5799f2ca9541fbbb1bdd5f579a7ff6889a8591dc"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"18b723fcc8228f785b34675d512d3f667a3f666d","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    def routes_updated(self, old_routes, new_routes):"},{"line_number":187,"context_line":"        instance \u003d self._get_keepalived_instance()"},{"line_number":188,"context_line":"        if not instance:"},{"line_number":189,"context_line":"            LOG.warning(_LW(\u0027Failed to update HA router %s routes because \u0027"},{"line_number":190,"context_line":"                            \u0027HA router keepalived instance is None.\u0027),"},{"line_number":191,"context_line":"                        self.router_id)"},{"line_number":192,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_782a6480","line":189,"in_reply_to":"da6ed579_dacfe327","updated":"2016-01-18 06:34:29.000000000","message":"Done","commit_id":"5799f2ca9541fbbb1bdd5f579a7ff6889a8591dc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def _get_keepalived_instance(self):"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            return self.keepalived_manager.config.get_instance(self.ha_vr_id)"},{"line_number":133,"context_line":"        except AttributeError:"},{"line_number":134,"context_line":"            # It has race conditon between create HA router and delete,"},{"line_number":135,"context_line":"            # because those opreations can be run concurrently both neutron"},{"line_number":136,"context_line":"            # server side and L3 agent side. After a deleting API call the L3"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_faf59aca","line":133,"range":{"start_line":133,"start_character":15,"end_line":133,"end_character":29},"updated":"2016-02-15 12:19:53.000000000","message":"just a question, nothing to fix: Why is it an AttributeError?","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def _get_keepalived_instance(self):"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            return self.keepalived_manager.config.get_instance(self.ha_vr_id)"},{"line_number":133,"context_line":"        except AttributeError:"},{"line_number":134,"context_line":"            # It has race conditon between create HA router and delete,"},{"line_number":135,"context_line":"            # because those opreations can be run concurrently both neutron"},{"line_number":136,"context_line":"            # server side and L3 agent side. After a deleting API call the L3"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_5fd602c6","line":133,"range":{"start_line":133,"start_character":15,"end_line":133,"end_character":29},"in_reply_to":"9a68dd71_faf59aca","updated":"2016-02-15 15:22:04.000000000","message":"\"self.keepalived_manager \u003d None\" in #L40, something messages like None type has no attribute config.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            return self.keepalived_manager.config.get_instance(self.ha_vr_id)"},{"line_number":133,"context_line":"        except AttributeError:"},{"line_number":134,"context_line":"            # It has race conditon between create HA router and delete,"},{"line_number":135,"context_line":"            # because those opreations can be run concurrently both neutron"},{"line_number":136,"context_line":"            # server side and L3 agent side. After a deleting API call the L3"},{"line_number":137,"context_line":"            # agent may sync a HA router info without HA interface information,"},{"line_number":138,"context_line":"            # which will cause the L3 agent unable to init the HA router"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_dac5368e","line":135,"range":{"start_line":135,"start_character":28,"end_line":135,"end_character":38},"updated":"2016-02-15 12:19:53.000000000","message":"opreations -\u003e operations.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            return self.keepalived_manager.config.get_instance(self.ha_vr_id)"},{"line_number":133,"context_line":"        except AttributeError:"},{"line_number":134,"context_line":"            # It has race conditon between create HA router and delete,"},{"line_number":135,"context_line":"            # because those opreations can be run concurrently both neutron"},{"line_number":136,"context_line":"            # server side and L3 agent side. After a deleting API call the L3"},{"line_number":137,"context_line":"            # agent may sync a HA router info without HA interface information,"},{"line_number":138,"context_line":"            # which will cause the L3 agent unable to init the HA router"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_3a634cb3","line":135,"range":{"start_line":135,"start_character":28,"end_line":135,"end_character":38},"in_reply_to":"9a68dd71_dac5368e","updated":"2016-02-15 15:22:04.000000000","message":"Done","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            # delete the HA router, it will try to delete the HA stuffs too."},{"line_number":142,"context_line":"            # Because the keepalived manager was never created successfully,"},{"line_number":143,"context_line":"            # here will never get the HA router keepalived instance."},{"line_number":144,"context_line":"            LOG.error(_LE(\u0027Unable to get HA router %s keepalived instance.\u0027),"},{"line_number":145,"context_line":"                      self.router_id)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def _get_primary_vip(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_7abe8ad5","line":144,"range":{"start_line":144,"start_character":16,"end_line":144,"end_character":21},"updated":"2016-02-15 12:19:53.000000000","message":"Shall we better log this as a warning, explaining that the router could have been deleted ?","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            # delete the HA router, it will try to delete the HA stuffs too."},{"line_number":142,"context_line":"            # Because the keepalived manager was never created successfully,"},{"line_number":143,"context_line":"            # here will never get the HA router keepalived instance."},{"line_number":144,"context_line":"            LOG.error(_LE(\u0027Unable to get HA router %s keepalived instance.\u0027),"},{"line_number":145,"context_line":"                      self.router_id)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def _get_primary_vip(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_daf980ca","line":144,"range":{"start_line":144,"start_character":16,"end_line":144,"end_character":21},"in_reply_to":"9a68dd71_7abe8ad5","updated":"2016-02-15 15:22:04.000000000","message":"Warning is fine, and done, I will add some log detail.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0926cd8b394ffc09b68d9c942b8054ba53e8c0dc","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _add_vip(self, ip_cidr, interface, scope\u003dNone):"},{"line_number":186,"context_line":"        instance \u003d self._get_keepalived_instance()"},{"line_number":187,"context_line":"        if not instance:"},{"line_number":188,"context_line":"            return"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        instance.add_vip(ip_cidr, interface, scope)"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_f729c78a","line":188,"range":{"start_line":187,"start_character":8,"end_line":188,"end_character":18},"updated":"2016-07-28 16:13:32.000000000","message":"The amount of code duplication here is crazy(!)\n\nHow about we add a decorator that will handle the retrieval of the keepalived instance and that doesn\u0027t run if the instance is not there? i.e.\n\n def keepalived_instance_decorator(func):\n     @six.wraps\n     def inner(self, *args, **kwargs):\n         instance \u003d self._get_keepalived_instance()\n         if not instance:\n             return\n         return func(self, instance, *args, **kwargs)\n     return inner","commit_id":"61616ec2e9df574bdcc674f307e669602b89784a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1def731534106abec95bd3b9c555ebc82ccc1aa3","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _add_vip(self, ip_cidr, interface, scope\u003dNone):"},{"line_number":186,"context_line":"        instance \u003d self._get_keepalived_instance()"},{"line_number":187,"context_line":"        if not instance:"},{"line_number":188,"context_line":"            return"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        instance.add_vip(ip_cidr, interface, scope)"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_a2f25dd0","line":188,"range":{"start_line":187,"start_character":8,"end_line":188,"end_character":18},"in_reply_to":"bacf61ea_f729c78a","updated":"2016-07-28 23:23:39.000000000","message":"Yeah, I\u0027ve noticed that, working on it.","commit_id":"61616ec2e9df574bdcc674f307e669602b89784a"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"0926cd8b394ffc09b68d9c942b8054ba53e8c0dc","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        we must delete the address first as it is autoconfigured by the kernel."},{"line_number":259,"context_line":"        \"\"\""},{"line_number":260,"context_line":"        manager \u003d self.keepalived_manager"},{"line_number":261,"context_line":"        if not manager:"},{"line_number":262,"context_line":"            # keepalived manager was not initialized properly."},{"line_number":263,"context_line":"            return"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        if manager.get_process().active:"},{"line_number":266,"context_line":"            if self.ha_state !\u003d \u0027master\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_773dd7ba","line":263,"range":{"start_line":261,"start_character":8,"end_line":263,"end_character":18},"updated":"2016-07-28 16:13:32.000000000","message":"Same as the upper comment for the keepalived instance (this is done again in line 441).","commit_id":"61616ec2e9df574bdcc674f307e669602b89784a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"1def731534106abec95bd3b9c555ebc82ccc1aa3","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        we must delete the address first as it is autoconfigured by the kernel."},{"line_number":259,"context_line":"        \"\"\""},{"line_number":260,"context_line":"        manager \u003d self.keepalived_manager"},{"line_number":261,"context_line":"        if not manager:"},{"line_number":262,"context_line":"            # keepalived manager was not initialized properly."},{"line_number":263,"context_line":"            return"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        if manager.get_process().active:"},{"line_number":266,"context_line":"            if self.ha_state !\u003d \u0027master\u0027:"}],"source_content_type":"text/x-python","patch_set":11,"id":"bacf61ea_82ed99f1","line":263,"range":{"start_line":261,"start_character":8,"end_line":263,"end_character":18},"in_reply_to":"bacf61ea_773dd7ba","updated":"2016-07-28 23:23:39.000000000","message":"Done","commit_id":"61616ec2e9df574bdcc674f307e669602b89784a"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"af57fb9d3e6a0a5b6768754652466479acd0596e","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            # here will never get the HA router keepalived instance."},{"line_number":145,"context_line":"            LOG.warning("},{"line_number":146,"context_line":"                _LW(\"Unable to get HA router %s keepalived instance. \""},{"line_number":147,"context_line":"                    \"HA router keepalived_manager may never initiate \""},{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bacf61ea_2c77a203","line":147,"range":{"start_line":147,"start_character":49,"end_line":147,"end_character":68},"updated":"2016-08-03 11:40:37.000000000","message":"was never initiated","commit_id":"da03a5f95bf2243a0b1c3c48d975a4ec9ebe3ff8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ccf16f33b01d9b35410057a04d24368402e6ff16","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            # here will never get the HA router keepalived instance."},{"line_number":145,"context_line":"            LOG.warning("},{"line_number":146,"context_line":"                _LW(\"Unable to get HA router %s keepalived instance. \""},{"line_number":147,"context_line":"                    \"HA router keepalived_manager may never initiate \""},{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bacf61ea_b3200af9","line":147,"range":{"start_line":147,"start_character":49,"end_line":147,"end_character":68},"in_reply_to":"bacf61ea_2c77a203","updated":"2016-08-03 13:09:18.000000000","message":"Done","commit_id":"da03a5f95bf2243a0b1c3c48d975a4ec9ebe3ff8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"af57fb9d3e6a0a5b6768754652466479acd0596e","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_instance(func):"},{"line_number":152,"context_line":"        @functools.wraps(func)"},{"line_number":153,"context_line":"        def wrapped(self, *args, **kwargs):"},{"line_number":154,"context_line":"            if self._get_keepalived_instance():"}],"source_content_type":"text/x-python","patch_set":12,"id":"bacf61ea_4cf2d670","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":22},"updated":"2016-08-03 11:40:37.000000000","message":"Please rename to \"check_keepalived_instance\" for extra clarity.","commit_id":"da03a5f95bf2243a0b1c3c48d975a4ec9ebe3ff8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ccf16f33b01d9b35410057a04d24368402e6ff16","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_instance(func):"},{"line_number":152,"context_line":"        @functools.wraps(func)"},{"line_number":153,"context_line":"        def wrapped(self, *args, **kwargs):"},{"line_number":154,"context_line":"            if self._get_keepalived_instance():"}],"source_content_type":"text/x-python","patch_set":12,"id":"bacf61ea_f378c2fa","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":22},"in_reply_to":"bacf61ea_4cf2d670","updated":"2016-08-03 13:09:18.000000000","message":"Done","commit_id":"da03a5f95bf2243a0b1c3c48d975a4ec9ebe3ff8"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5af087f52eb9664ba14fb3c34bdbfa5751f6f9f0","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        @functools.wraps(func)"},{"line_number":153,"context_line":"        def wrapped(self, *args, **kwargs):"},{"line_number":154,"context_line":"            if self._get_keepalived_instance():"},{"line_number":155,"context_line":"                return func(self, *args, **kwargs)"},{"line_number":156,"context_line":"        return wrapped"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def check_keepalived_manager(func):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9ad45d7e_cfbefa63","line":155,"updated":"2016-08-12 06:49:23.000000000","message":"do we ever have to worry about it going away concurrently during these operations? If so, it would be better to make this do\n\ntry:\n    return func(...\nexcept:\n    with executils.save_and_reraise() as ctx:\n        ctx.reraise \u003d not self._get_keepalived_instance()","commit_id":"7de4a26b3adb022a043b036996d6b27c584a5851"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"467b535141f2a9c5300abb40e2b995508a5c673a","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        @functools.wraps(func)"},{"line_number":153,"context_line":"        def wrapped(self, *args, **kwargs):"},{"line_number":154,"context_line":"            if self._get_keepalived_instance():"},{"line_number":155,"context_line":"                return func(self, *args, **kwargs)"},{"line_number":156,"context_line":"        return wrapped"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def check_keepalived_manager(func):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9ad45d7e_6ac25c54","line":155,"in_reply_to":"9ad45d7e_cfbefa63","updated":"2016-08-12 07:10:58.000000000","message":"In L3 agent side we don\u0027t worry about the concurrently processing of a router, because of the router_processing_queue. L135-144 I added the comment about the race between L3 agent and neutron server. Is this the concern you suggested?","commit_id":"7de4a26b3adb022a043b036996d6b27c584a5851"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7ed1682c72adf229f4c52e5ec38aab93d6abb7e0","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_keepalived_instance(func):"},{"line_number":152,"context_line":"        @functools.wraps(func)"},{"line_number":153,"context_line":"        def wrapped(self, *args, **kwargs):"},{"line_number":154,"context_line":"            if self._get_keepalived_instance():"},{"line_number":155,"context_line":"                return func(self, *args, **kwargs)"},{"line_number":156,"context_line":"        return wrapped"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def check_keepalived_manager(func):"},{"line_number":159,"context_line":"        @functools.wraps(func)"},{"line_number":160,"context_line":"        def wrapped(self, *args, **kwargs):"},{"line_number":161,"context_line":"            if self.keepalived_manager:"},{"line_number":162,"context_line":"                return func(self, *args, **kwargs)"},{"line_number":163,"context_line":"        return wrapped"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @check_keepalived_instance"},{"line_number":166,"context_line":"    def _get_primary_vip(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3ac371cc_657679a5","line":163,"range":{"start_line":151,"start_character":0,"end_line":163,"end_character":22},"updated":"2016-08-17 07:24:03.000000000","message":"These two functions seem to be a little duplicated too, merge them seems more reasonable. Any ideas?","commit_id":"7de4a26b3adb022a043b036996d6b27c584a5851"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f7f9a759fb9d65d28e8ac87620f711b737541481","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            # It has race conditon between create HA router and delete,"},{"line_number":136,"context_line":"            # because those operations can be run concurrently both neutron"},{"line_number":137,"context_line":"            # server side and L3 agent side. After a deleting API call the L3"},{"line_number":138,"context_line":"            # agent may sync a HA router info without HA interface information,"},{"line_number":139,"context_line":"            # which will cause the L3 agent unable to init the HA router"},{"line_number":140,"context_line":"            # keepalived manager, but the HA router info is placed in the"},{"line_number":141,"context_line":"            # agent router_info cache already. When the L3 agent try to"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_b0bbd8c3","line":138,"updated":"2016-09-05 11:42:36.000000000","message":"I don\u0027t understand where this patch is coming from. Why do we spend a bunch of effort trying to hide partially formed routers from the agent on the server side if we have to write all of this logic on the agent side? \n\nIf we can\u0027t trust the server to filter, we should remove the filtering completely and have the agent watch for this stuff. Otherwise we should fix the filtering to ensure it doesn\u0027t send partially formed routers. One or the other, not both.","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"2fc7eae2068e7d76f244ce4a2dbec13237da1769","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            # It has race conditon between create HA router and delete,"},{"line_number":136,"context_line":"            # because those operations can be run concurrently both neutron"},{"line_number":137,"context_line":"            # server side and L3 agent side. After a deleting API call the L3"},{"line_number":138,"context_line":"            # agent may sync a HA router info without HA interface information,"},{"line_number":139,"context_line":"            # which will cause the L3 agent unable to init the HA router"},{"line_number":140,"context_line":"            # keepalived manager, but the HA router info is placed in the"},{"line_number":141,"context_line":"            # agent router_info cache already. When the L3 agent try to"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_0c8708b6","line":138,"in_reply_to":"9a89bdaa_b0bbd8c3","updated":"2016-09-05 14:41:01.000000000","message":"This patch is staying here for a really long time. This long comments may tell the reason why it is here. \n\nYes, I\u0027d like to see one day [1] will be removed.\n\n[1] https://review.openstack.org/#/c/265672/19/neutron/agent/l3/ha_router.py@82","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f7f9a759fb9d65d28e8ac87620f711b737541481","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            # delete the HA router, it will try to delete the HA stuffs too."},{"line_number":143,"context_line":"            # Because the keepalived manager was never created successfully,"},{"line_number":144,"context_line":"            # here will never get the HA router keepalived instance."},{"line_number":145,"context_line":"            LOG.warning("},{"line_number":146,"context_line":"                _LW(\"Unable to get HA router %s keepalived instance. \""},{"line_number":147,"context_line":"                    \"HA router keepalived_manager was never initiated \""},{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_2de5b308","line":145,"updated":"2016-09-05 11:42:36.000000000","message":"this shouldn\u0027t be a warning. it\u0027s a valid progression of system events to land here. debug","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"2fc7eae2068e7d76f244ce4a2dbec13237da1769","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            # delete the HA router, it will try to delete the HA stuffs too."},{"line_number":143,"context_line":"            # Because the keepalived manager was never created successfully,"},{"line_number":144,"context_line":"            # here will never get the HA router keepalived instance."},{"line_number":145,"context_line":"            LOG.warning("},{"line_number":146,"context_line":"                _LW(\"Unable to get HA router %s keepalived instance. \""},{"line_number":147,"context_line":"                    \"HA router keepalived_manager was never initiated \""},{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_6c825454","line":145,"in_reply_to":"9a89bdaa_2de5b308","updated":"2016-09-05 14:41:01.000000000","message":"Done","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"365478a9eaed7389f0041617e96f39edb09bd5f9","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_ha_attributes(check_instance\u003dFalse, check_manager\u003dFalse):"},{"line_number":152,"context_line":"        def check(func):"},{"line_number":153,"context_line":"            @functools.wraps(func)"},{"line_number":154,"context_line":"            def wrapped(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_a9b0d88c","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":27},"updated":"2016-09-05 11:03:51.000000000","message":"A bit weird that both arguments can be false (thus no checks should be made) but the function won\u0027t be ran afterall, but meh :)","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"2fc7eae2068e7d76f244ce4a2dbec13237da1769","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_ha_attributes(check_instance\u003dFalse, check_manager\u003dFalse):"},{"line_number":152,"context_line":"        def check(func):"},{"line_number":153,"context_line":"            @functools.wraps(func)"},{"line_number":154,"context_line":"            def wrapped(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_cc17e04f","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":27},"in_reply_to":"9a89bdaa_a9b0d88c","updated":"2016-09-05 14:41:01.000000000","message":"If all param ares False, why check it? Maybe a double True is needed someday.","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f7f9a759fb9d65d28e8ac87620f711b737541481","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_ha_attributes(check_instance\u003dFalse, check_manager\u003dFalse):"},{"line_number":152,"context_line":"        def check(func):"},{"line_number":153,"context_line":"            @functools.wraps(func)"},{"line_number":154,"context_line":"            def wrapped(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_ed9e6b55","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":27},"in_reply_to":"9a89bdaa_a9b0d88c","updated":"2016-09-05 11:42:36.000000000","message":"move this function outside of the class definition. otherwise each object is going to also have a bound \u0027check_ha_attribute\u0027 function that will just explode when called because the signature is incorrect for a bound method.","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"2fc7eae2068e7d76f244ce4a2dbec13237da1769","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    \"successfully due to the concurrently delete operation.\"),"},{"line_number":149,"context_line":"                self.router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_ha_attributes(check_instance\u003dFalse, check_manager\u003dFalse):"},{"line_number":152,"context_line":"        def check(func):"},{"line_number":153,"context_line":"            @functools.wraps(func)"},{"line_number":154,"context_line":"            def wrapped(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_59a8f01f","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":27},"in_reply_to":"9a89bdaa_ed9e6b55","updated":"2016-09-05 14:41:01.000000000","message":"Done","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f7f9a759fb9d65d28e8ac87620f711b737541481","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_ha_attributes(check_instance\u003dFalse, check_manager\u003dFalse):"},{"line_number":152,"context_line":"        def check(func):"},{"line_number":153,"context_line":"            @functools.wraps(func)"},{"line_number":154,"context_line":"            def wrapped(self, *args, **kwargs):"},{"line_number":155,"context_line":"                if ((check_instance and self._get_keepalived_instance()) or"},{"line_number":156,"context_line":"                    (check_manager and self.keepalived_manager)):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_edb02bf7","line":153,"updated":"2016-09-05 11:42:36.000000000","message":"use six.wraps() instead of functools.","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"2fc7eae2068e7d76f244ce4a2dbec13237da1769","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def check_ha_attributes(check_instance\u003dFalse, check_manager\u003dFalse):"},{"line_number":152,"context_line":"        def check(func):"},{"line_number":153,"context_line":"            @functools.wraps(func)"},{"line_number":154,"context_line":"            def wrapped(self, *args, **kwargs):"},{"line_number":155,"context_line":"                if ((check_instance and self._get_keepalived_instance()) or"},{"line_number":156,"context_line":"                    (check_manager and self.keepalived_manager)):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a89bdaa_2ce84c10","line":153,"in_reply_to":"9a89bdaa_edb02bf7","updated":"2016-09-05 14:41:01.000000000","message":"Done","commit_id":"3784d5b39a467b12ec23a612919f671e9f2d7580"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"65e0770268096eb3d85e14cefa504824e3bff0c8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"IP_MONITOR_PROCESS_SERVICE \u003d \u0027ip_monitor\u0027"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def check_ha_attributes(check_instance\u003dFalse, check_manager\u003dFalse):"},{"line_number":37,"context_line":"    def check(func):"},{"line_number":38,"context_line":"        @six.wraps(func)"},{"line_number":39,"context_line":"        def wrapped(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":20,"id":"9a89bdaa_9b705ede","line":36,"updated":"2016-09-07 03:53:17.000000000","message":"I really strongly preferred the two methods you had in PS17. Yeah, it\u0027s a few more lines of code and the methods look similar but it is much more straight-forward. I\u0027m sorry that feedback on PS17 led you to this. I just find methods like this harder to read because I have to parse the overly complex condition on L40 - L41\n\nIMO, combining two methods that just happen to look similar and adding extra arguments and complex conditionals to the method so that it can do both jobs is never a good strategy to reduce code duplication.","commit_id":"eff838334620c59ed5368cf8a65a59dbc978f290"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4cecccd34dbca7c54b8f74775a8e46ce8b1c55ee","unresolved":false,"context_lines":[{"line_number":33,"context_line":"IP_MONITOR_PROCESS_SERVICE \u003d \u0027ip_monitor\u0027"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def check_ha_attributes(check_instance\u003dFalse, check_manager\u003dFalse):"},{"line_number":37,"context_line":"    def check(func):"},{"line_number":38,"context_line":"        @six.wraps(func)"},{"line_number":39,"context_line":"        def wrapped(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":20,"id":"9a89bdaa_e2da9be7","line":36,"in_reply_to":"9a89bdaa_9b705ede","updated":"2016-09-07 06:39:27.000000000","message":"done, revert back to patch set 17.","commit_id":"eff838334620c59ed5368cf8a65a59dbc978f290"}],"neutron/tests/unit/agent/l3/test_agent.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7d5671970d6d788f31a0e2e64d16f513e25879be","unresolved":false,"context_lines":[{"line_number":1916,"context_line":"        # remove the HA router"},{"line_number":1917,"context_line":"        update.id \u003d router_id"},{"line_number":1918,"context_line":"        update.router \u003d None"},{"line_number":1919,"context_line":"        update.action \u003d 1  # ROUTER_DELETED"},{"line_number":1920,"context_line":"        agent._queue.each_update_to_next_router.side_effect \u003d ["},{"line_number":1921,"context_line":"            [(router_processor, update)]]"},{"line_number":1922,"context_line":"        agent._process_router_update()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_74c97158","line":1919,"updated":"2016-01-15 02:22:56.000000000","message":"What about using router_processing_queue.DELETE_ROUTER here?","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8f4639e3ffa680e6a81363cc50424e7b9e4fcffd","unresolved":false,"context_lines":[{"line_number":1916,"context_line":"        # remove the HA router"},{"line_number":1917,"context_line":"        update.id \u003d router_id"},{"line_number":1918,"context_line":"        update.router \u003d None"},{"line_number":1919,"context_line":"        update.action \u003d 1  # ROUTER_DELETED"},{"line_number":1920,"context_line":"        agent._queue.each_update_to_next_router.side_effect \u003d ["},{"line_number":1921,"context_line":"            [(router_processor, update)]]"},{"line_number":1922,"context_line":"        agent._process_router_update()"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_bd29fbe7","line":1919,"in_reply_to":"da6ed579_74c97158","updated":"2016-01-15 10:38:44.000000000","message":"copy from L1867, haha","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":1917,"context_line":"        router \u003d {\u0027id\u0027: router_id,"},{"line_number":1918,"context_line":"                  \u0027routes\u0027: [],"},{"line_number":1919,"context_line":"                  \u0027admin_state_up\u0027: True,"},{"line_number":1920,"context_line":"                  \u0027external_gateway_info\u0027: {\u0027network_id\u0027: \u0027aaa\u0027},"},{"line_number":1921,"context_line":"                  \u0027ha\u0027: True}"},{"line_number":1922,"context_line":"        update.router \u003d router"},{"line_number":1923,"context_line":"        router_processor \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_5a7aa6f2","line":1920,"range":{"start_line":1920,"start_character":59,"end_line":1920,"end_character":62},"updated":"2016-02-15 12:19:53.000000000","message":"for \"aaa\" you can use the FAKE_ID constant from the top of this file.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":1917,"context_line":"        router \u003d {\u0027id\u0027: router_id,"},{"line_number":1918,"context_line":"                  \u0027routes\u0027: [],"},{"line_number":1919,"context_line":"                  \u0027admin_state_up\u0027: True,"},{"line_number":1920,"context_line":"                  \u0027external_gateway_info\u0027: {\u0027network_id\u0027: \u0027aaa\u0027},"},{"line_number":1921,"context_line":"                  \u0027ha\u0027: True}"},{"line_number":1922,"context_line":"        update.router \u003d router"},{"line_number":1923,"context_line":"        router_processor \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_7f6dc603","line":1920,"range":{"start_line":1920,"start_character":59,"end_line":1920,"end_character":62},"in_reply_to":"9a68dd71_5a7aa6f2","updated":"2016-02-15 15:22:04.000000000","message":"Some code copy from #L1949 or #L1964. OK, let me start the new code  style.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":1925,"context_line":"            [(router_processor, update)]]"},{"line_number":1926,"context_line":"        self.assertEqual({}, agent.router_info)"},{"line_number":1927,"context_line":"        self.plugin_api.get_routers.return_value \u003d [router]"},{"line_number":1928,"context_line":"        self.plugin_api.get_external_network_id.return_value \u003d \u0027aaa\u0027"},{"line_number":1929,"context_line":""},{"line_number":1930,"context_line":"        agent._process_router_update()"},{"line_number":1931,"context_line":"        self.assertIn(router_id, agent.router_info)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_7a7d2ae6","line":1928,"range":{"start_line":1928,"start_character":64,"end_line":1928,"end_character":67},"updated":"2016-02-15 12:19:53.000000000","message":"ditto.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"9a76c57715a07382b6c266f70473072d6b1d8582","unresolved":false,"context_lines":[{"line_number":1933,"context_line":"        # remove the HA router"},{"line_number":1934,"context_line":"        update.id \u003d router_id"},{"line_number":1935,"context_line":"        update.router \u003d None"},{"line_number":1936,"context_line":"        update.action \u003d 1  # ROUTER_DELETED"},{"line_number":1937,"context_line":"        agent._queue.each_update_to_next_router.side_effect \u003d ["},{"line_number":1938,"context_line":"            [(router_processor, update)]]"},{"line_number":1939,"context_line":"        agent._process_router_update()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_b547354a","line":1936,"range":{"start_line":1936,"start_character":25,"end_line":1936,"end_character":27},"updated":"2016-02-15 12:19:53.000000000","message":"don\u0027t we have a constant for that 1 ?","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b4f8c10963a0ed459e7850d3824cfdc58261bae0","unresolved":false,"context_lines":[{"line_number":1933,"context_line":"        # remove the HA router"},{"line_number":1934,"context_line":"        update.id \u003d router_id"},{"line_number":1935,"context_line":"        update.router \u003d None"},{"line_number":1936,"context_line":"        update.action \u003d 1  # ROUTER_DELETED"},{"line_number":1937,"context_line":"        agent._queue.each_update_to_next_router.side_effect \u003d ["},{"line_number":1938,"context_line":"            [(router_processor, update)]]"},{"line_number":1939,"context_line":"        agent._process_router_update()"}],"source_content_type":"text/x-python","patch_set":5,"id":"dae33548_1a4c886f","line":1936,"range":{"start_line":1936,"start_character":25,"end_line":1936,"end_character":27},"in_reply_to":"9a68dd71_b547354a","updated":"2016-02-15 15:22:04.000000000","message":"OK, it\u0027s in the neutron/neutron/agent/l3/router_processing_queue.py, I will change all this use.","commit_id":"4b81ba73e772e80da6f624e402d1375c6fa6c6bf"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"af57fb9d3e6a0a5b6768754652466479acd0596e","unresolved":false,"context_lines":[{"line_number":1993,"context_line":"    def test_process_routers_update_router_deleted_error(self):"},{"line_number":1994,"context_line":"        self._test_process_routers_update_router_deleted(True)"},{"line_number":1995,"context_line":""},{"line_number":1996,"context_line":"    def test_add_and_remove_ha_router_without_ha_port(self):"},{"line_number":1997,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":1998,"context_line":"        agent._queue \u003d mock.Mock()"},{"line_number":1999,"context_line":"        update \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":12,"id":"bacf61ea_6cbb5a76","line":1996,"range":{"start_line":1996,"start_character":8,"end_line":1996,"end_character":53},"updated":"2016-08-03 11:40:37.000000000","message":"This test should be placed in test_ha_router.py instead. This will also give you a nice \u0027self._create_router()\u0027 to do some of the logic you\u0027re already doing.\n\nAlso, this test is overly complicated in my opinion. Why not use the aforementioned _create_router() that will return a HaRouter instance, and then call ri._router_removed() to see that it was removed successfully? This will simulate the case of a router being created without all the resources (because the create procedure wasn\u0027t called and thus they weren\u0027t created) - no need to create the router and process it, etc....","commit_id":"da03a5f95bf2243a0b1c3c48d975a4ec9ebe3ff8"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"12ccbe469c1ea9125bc3efad60e5144dec697515","unresolved":false,"context_lines":[{"line_number":1993,"context_line":"    def test_process_routers_update_router_deleted_error(self):"},{"line_number":1994,"context_line":"        self._test_process_routers_update_router_deleted(True)"},{"line_number":1995,"context_line":""},{"line_number":1996,"context_line":"    def test_add_and_remove_ha_router_without_ha_port(self):"},{"line_number":1997,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":1998,"context_line":"        agent._queue \u003d mock.Mock()"},{"line_number":1999,"context_line":"        update \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":12,"id":"bacf61ea_66fec76c","line":1996,"range":{"start_line":1996,"start_character":8,"end_line":1996,"end_character":53},"in_reply_to":"bacf61ea_53aa6ed3","updated":"2016-08-03 15:49:28.000000000","message":"It shouldn\u0027t matter if the router was added correctly to the cache - all that matters is what happens when the previously-errornous situation is encountered. This encounter can be simulated much easier than what is currently being done here.","commit_id":"da03a5f95bf2243a0b1c3c48d975a4ec9ebe3ff8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"f8dbe1043b31aaa4adb5b5ed71690bd417615362","unresolved":false,"context_lines":[{"line_number":1993,"context_line":"    def test_process_routers_update_router_deleted_error(self):"},{"line_number":1994,"context_line":"        self._test_process_routers_update_router_deleted(True)"},{"line_number":1995,"context_line":""},{"line_number":1996,"context_line":"    def test_add_and_remove_ha_router_without_ha_port(self):"},{"line_number":1997,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":1998,"context_line":"        agent._queue \u003d mock.Mock()"},{"line_number":1999,"context_line":"        update \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":12,"id":"bacf61ea_944f4591","line":1996,"range":{"start_line":1996,"start_character":8,"end_line":1996,"end_character":53},"in_reply_to":"bacf61ea_66fec76c","updated":"2016-08-05 07:27:53.000000000","message":"Done","commit_id":"da03a5f95bf2243a0b1c3c48d975a4ec9ebe3ff8"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ccf16f33b01d9b35410057a04d24368402e6ff16","unresolved":false,"context_lines":[{"line_number":1993,"context_line":"    def test_process_routers_update_router_deleted_error(self):"},{"line_number":1994,"context_line":"        self._test_process_routers_update_router_deleted(True)"},{"line_number":1995,"context_line":""},{"line_number":1996,"context_line":"    def test_add_and_remove_ha_router_without_ha_port(self):"},{"line_number":1997,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":1998,"context_line":"        agent._queue \u003d mock.Mock()"},{"line_number":1999,"context_line":"        update \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":12,"id":"bacf61ea_53aa6ed3","line":1996,"range":{"start_line":1996,"start_character":8,"end_line":1996,"end_character":53},"in_reply_to":"bacf61ea_6cbb5a76","updated":"2016-08-03 13:09:18.000000000","message":"I want the test code trigger the code \"LOG.error(_LE(\u0027Unable to process HA router %s without HA port\u0027).\" And aslo need make sure that router is add to agent router_info cache, and then removed properly.","commit_id":"da03a5f95bf2243a0b1c3c48d975a4ec9ebe3ff8"}],"neutron/tests/unit/agent/l3/test_ha_router.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7d5671970d6d788f31a0e2e64d16f513e25879be","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        mock_instance.virtual_routes.gateway_routes \u003d []"},{"line_number":82,"context_line":"        ri._get_keepalived_instance \u003d mock.Mock(return_value\u003dmock_instance)"},{"line_number":83,"context_line":"        ri.routes_updated()"},{"line_number":84,"context_line":"        self.assertEqual(1, len(ri.routes))"},{"line_number":85,"context_line":"        self.assertEqual(fake_route, ri.routes[0])"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        ri._get_keepalived_instance \u003d mock.Mock(return_value\u003dNone)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_4f6cd4cd","line":84,"updated":"2016-01-15 02:22:56.000000000","message":"This could be simplified to self.assertEqual([fake_route], ri.routes)","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8f4639e3ffa680e6a81363cc50424e7b9e4fcffd","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        mock_instance.virtual_routes.gateway_routes \u003d []"},{"line_number":82,"context_line":"        ri._get_keepalived_instance \u003d mock.Mock(return_value\u003dmock_instance)"},{"line_number":83,"context_line":"        ri.routes_updated()"},{"line_number":84,"context_line":"        self.assertEqual(1, len(ri.routes))"},{"line_number":85,"context_line":"        self.assertEqual(fake_route, ri.routes[0])"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        ri._get_keepalived_instance \u003d mock.Mock(return_value\u003dNone)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_a05c7019","line":84,"in_reply_to":"da6ed579_4f6cd4cd","updated":"2016-01-15 10:38:44.000000000","message":"Done","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"7d5671970d6d788f31a0e2e64d16f513e25879be","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        ri.routes_updated()"},{"line_number":90,"context_line":"        # Nothing changed"},{"line_number":91,"context_line":"        self.assertEqual(1, len(ri.routes))"},{"line_number":92,"context_line":"        self.assertEqual(fake_route, ri.routes[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_0f625cd8","line":92,"updated":"2016-01-15 02:22:56.000000000","message":"ditto","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8f4639e3ffa680e6a81363cc50424e7b9e4fcffd","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        ri.routes_updated()"},{"line_number":90,"context_line":"        # Nothing changed"},{"line_number":91,"context_line":"        self.assertEqual(1, len(ri.routes))"},{"line_number":92,"context_line":"        self.assertEqual(fake_route, ri.routes[0])"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_409ed4b9","line":92,"in_reply_to":"da6ed579_0f625cd8","updated":"2016-01-15 10:38:44.000000000","message":"Done","commit_id":"29517f66e3f234ce26f530f4547bce03549fa1c4"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"89228335629e5b21c8d58658814cdbd4ce753360","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                  \u0027admin_state_up\u0027: True,"},{"line_number":100,"context_line":"                  \u0027ha\u0027: True}"},{"line_number":101,"context_line":"        ri \u003d self._create_router(router\u003drouter)"},{"line_number":102,"context_line":"        ri._process_internal_ports \u003d mock.Mock()"},{"line_number":103,"context_line":"        ri._process_external_on_delete \u003d mock.Mock()"},{"line_number":104,"context_line":"        ri.disable_radvd \u003d mock.Mock()"},{"line_number":105,"context_line":"        ri.router_namespace.delete \u003d mock.Mock()"},{"line_number":106,"context_line":"        agent \u003d mock.Mock()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        vip \u003d ri._get_primary_vip()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_a6f5c351","line":105,"range":{"start_line":102,"start_character":0,"end_line":105,"end_character":48},"updated":"2016-08-07 06:16:24.000000000","message":"So I removed these mocks to see why these are needed, and the short story is that I ran into [1]. I rebased this patch on top of [2] and removed these mocks, and I then reached an exception caused by radvd not being initialized.\n\nFrom this I conclude that these mocks (except for ri.disable_radvd, which is failing) are not required at all (please delete them). Also, this should probably rebase on [2] so that it will run the tests that will ultimately be ran on the gate (and we won\u0027t need 3 extra mocks just to avoid [1]).\n\n[1]: https://bugs.launchpad.net/neutron/+bug/1606844\n[2]: https://review.openstack.org/#/c/348372/6","commit_id":"f9daacb7eaae734380012c929f0fc7a08c5c6202"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b113e658d491cc2b9527052d68325615c9d2d03e","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                  \u0027admin_state_up\u0027: True,"},{"line_number":100,"context_line":"                  \u0027ha\u0027: True}"},{"line_number":101,"context_line":"        ri \u003d self._create_router(router\u003drouter)"},{"line_number":102,"context_line":"        ri._process_internal_ports \u003d mock.Mock()"},{"line_number":103,"context_line":"        ri._process_external_on_delete \u003d mock.Mock()"},{"line_number":104,"context_line":"        ri.disable_radvd \u003d mock.Mock()"},{"line_number":105,"context_line":"        ri.router_namespace.delete \u003d mock.Mock()"},{"line_number":106,"context_line":"        agent \u003d mock.Mock()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        vip \u003d ri._get_primary_vip()"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ad45d7e_21c0387c","line":105,"range":{"start_line":102,"start_character":0,"end_line":105,"end_character":48},"in_reply_to":"bacf61ea_573c682e","updated":"2016-08-09 14:16:20.000000000","message":"Done","commit_id":"f9daacb7eaae734380012c929f0fc7a08c5c6202"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"64765f1ae2c894985ac8108e8b1157d8d0991b3a","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                  \u0027admin_state_up\u0027: True,"},{"line_number":100,"context_line":"                  \u0027ha\u0027: True}"},{"line_number":101,"context_line":"        ri \u003d self._create_router(router\u003drouter)"},{"line_number":102,"context_line":"        ri._process_internal_ports \u003d mock.Mock()"},{"line_number":103,"context_line":"        ri._process_external_on_delete \u003d mock.Mock()"},{"line_number":104,"context_line":"        ri.disable_radvd \u003d mock.Mock()"},{"line_number":105,"context_line":"        ri.router_namespace.delete \u003d mock.Mock()"},{"line_number":106,"context_line":"        agent \u003d mock.Mock()"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        vip \u003d ri._get_primary_vip()"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_573c682e","line":105,"range":{"start_line":102,"start_character":0,"end_line":105,"end_character":48},"in_reply_to":"bacf61ea_a6f5c351","updated":"2016-08-08 01:51:59.000000000","message":"This patch only dedicated to the ha_router_info inner functions, so those 3 functions/calls are all located in the router_info process_delete which is not relevant to this patch, so here only mocked it and passed it, then make things simple. And the Line 108-123 is the essential cases we need. So I do not want mix those two issues. We need make each one could stay separately.","commit_id":"f9daacb7eaae734380012c929f0fc7a08c5c6202"}]}
