)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"040392c8c14e451a6659a36ac1e541889776d01a","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-04 16:15:43 -0800"},{"line_number":4,"context_line":"Commit:     Michael Smith \u003cmichael.smith6@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-05 08:59:56 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"L3 Agent support for routers with HA and DVR"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The main difference for DVR HA routers is where"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5a890539_fdfe9c38","line":6,"updated":"2014-12-05 17:30:05.000000000","message":"We\u0027re going to need a functional test that creates a router with HA and distributed on.","commit_id":"fbe2adedd09144a5e9c16bade21c72f24bd08a5a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"04686e64eda7233b7c7f7fb6c097a72d26637ed1","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-04 16:15:43 -0800"},{"line_number":4,"context_line":"Commit:     Michael Smith \u003cmichael.smith6@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-12-05 08:59:56 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"L3 Agent support for routers with HA and DVR"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The main difference for DVR HA routers is where"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5a890539_3348555c","line":6,"in_reply_to":"5a890539_fdfe9c38","updated":"2014-12-05 18:01:39.000000000","message":"Agreed.  This is really just a WIP for now.  I wanted to get what I have out there to share progress.","commit_id":"fbe2adedd09144a5e9c16bade21c72f24bd08a5a"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"be905256b879cb3c1526519c37b6b462bbb307a5","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-04 16:15:43 -0800"},{"line_number":4,"context_line":"Commit:     Michael Smith \u003cmichael.smith6@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-07 12:34:11 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"L3 Agent support for routers with HA and DVR"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The main difference for DVR HA routers is where"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_a525fbc2","line":6,"updated":"2015-01-09 10:19:19.000000000","message":"I made the same comment on PS1, to reiterate, a functional test for an HA DVR router would save you so much time. I can\u0027t imagine verifying this manually on every little change. Also, I don\u0027t want this patch to depend on Adolfo\u0027s DVR functional test patch, but I trust you\u0027re running his test locally.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"39b03873153b6734fba90b62ee38664dcf6edde7","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-04 16:15:43 -0800"},{"line_number":4,"context_line":"Commit:     Michael Smith \u003cmichael.smith6@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-07 12:34:11 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"L3 Agent support for routers with HA and DVR"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The main difference for DVR HA routers is where"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_61b13c01","line":6,"in_reply_to":"3a961159_a525fbc2","updated":"2015-01-09 17:55:18.000000000","message":"Good reminder.  We need to get the existing dvr related functional tests merged ASAP and add more for anything new like dvr-ha.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"be905256b879cb3c1526519c37b6b462bbb307a5","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-01-07 12:34:11 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"L3 Agent support for routers with HA and DVR"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The main difference for DVR HA routers is where"},{"line_number":10,"context_line":"the VRRP/keepalived logic is run and which ports"},{"line_number":11,"context_line":"fall in the HA domain for DVR.  Instead of running"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_40ed2524","line":8,"updated":"2015-01-09 10:19:19.000000000","message":"This is a general comment so I just put it here.\n\nI noticed that in a lot of places in the code it seems like a lot of the complexity is because the controller (On HEAD) notifies the agent to configure a router when it shouldn\u0027t (Both if the ex gw port was not allocated, and if the agent is not running on in snat-mode). If you depend on Rajeev\u0027s patch a lot of that will/should go away. I think that generally introducing depedencies between server and agent patches is wrong, but is right in this case, because there\u0027s no point in working on this patch then making substantial simplifications once Rajeev\u0027s patch is merged.\n\nThe second point is trickier - Should this depend on Carl\u0027s Router class\u0027 patch or not. I think that what you\u0027re doing is the correct thing to do - First get this working so we understand what we *need*, then we make the necessary changes to Carl\u0027s patch, then depend on it. The alternative is to introduce a depedency in the opposite direction, which is the correct thing to do technically, because then we\u0027ll know that Carl\u0027s patch is designed correctly, but I suspect that this patch will take a while to merge and I don\u0027t want to \u0027artifically\u0027 delay Carl\u0027s patch.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"39b03873153b6734fba90b62ee38664dcf6edde7","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-01-07 12:34:11 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"L3 Agent support for routers with HA and DVR"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The main difference for DVR HA routers is where"},{"line_number":10,"context_line":"the VRRP/keepalived logic is run and which ports"},{"line_number":11,"context_line":"fall in the HA domain for DVR.  Instead of running"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_218c942e","line":8,"in_reply_to":"3a961159_40ed2524","updated":"2015-01-09 17:55:18.000000000","message":"Point 1: Are you referring to Rajeev\u0027s ha patch?  I am using his patch while developing this one, but I haven\u0027t formally linked them yet.  I guess I should  take that step.   But I\u0027m not sure it explicitly fixes the problem you are referring to (notifying a router when it shouldn\u0027t).\nPoint 2: I\u0027m not sure which patch should merge first, it could be argued that Carl\u0027s patch is for \"the greater good\" and this one is more of a niche.  When I push the next PS for this one, we may have a better idea.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e42cb6c1acb2585afca7afef740934c272ede531","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch will be dependent on another patch"},{"line_number":17,"context_line":"which will modify the l3-plugin and scheduler to"},{"line_number":18,"context_line":"support a router configured as HA and DVR."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Partial-Bug: #1365473"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_dba5a303","line":18,"updated":"2015-01-08 13:17:19.000000000","message":"Can you add the review # of that other patch?","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"bb2352f429c2df18f370725063993f47caf44084","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch will be dependent on another patch"},{"line_number":17,"context_line":"which will modify the l3-plugin and scheduler to"},{"line_number":18,"context_line":"support a router configured as HA and DVR."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Partial-Bug: #1365473"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a961159_18c1e62e","line":18,"in_reply_to":"3a961159_dba5a303","updated":"2015-01-08 18:37:17.000000000","message":"good idea","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"}],"neutron/agent/l3/agent.py":[{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"29f203c1ffea82e52e8760585b208e8e0fbcad1a","unresolved":false,"context_lines":[{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        if self.conf.enable_metadata_proxy:"},{"line_number":482,"context_line":"            if self._valid_ha(ri):"},{"line_number":483,"context_line":"                self._add_keepalived_notifiers(ri)"},{"line_number":484,"context_line":"            else:"},{"line_number":485,"context_line":"                self._spawn_metadata_proxy(ri.router_id, ri.ns_name)"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_36ad9ceb","line":483,"updated":"2014-12-29 03:28:54.000000000","message":"Should this step (_add_keepalived_notifiers) also be hold off until ex_gw added for DVR? ri.keepalived_manager is initialized by process_ha_router_added above.","commit_id":"6152abf3992ded5e4693acbbf5494ed26986dee1"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"a75f17cc09092e5c2189fb94edbbd43b610a89ba","unresolved":false,"context_lines":[{"line_number":480,"context_line":""},{"line_number":481,"context_line":"        if self.conf.enable_metadata_proxy:"},{"line_number":482,"context_line":"            if self._valid_ha(ri):"},{"line_number":483,"context_line":"                self._add_keepalived_notifiers(ri)"},{"line_number":484,"context_line":"            else:"},{"line_number":485,"context_line":"                self._spawn_metadata_proxy(ri.router_id, ri.ns_name)"},{"line_number":486,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_51a00e90","line":483,"in_reply_to":"3a961159_36ad9ceb","updated":"2015-01-05 22:18:15.000000000","message":"good point","commit_id":"6152abf3992ded5e4693acbbf5494ed26986dee1"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"29f203c1ffea82e52e8760585b208e8e0fbcad1a","unresolved":false,"context_lines":[{"line_number":492,"context_line":"            return"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        if self._valid_ha(ri):"},{"line_number":495,"context_line":"            self.process_ha_router_removed(ri)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"        ri.router[\u0027gw_port\u0027] \u003d None"},{"line_number":498,"context_line":"        ri.router[l3_constants.INTERFACE_KEY] \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_96b9f017","line":495,"updated":"2014-12-29 03:28:54.000000000","message":"Same concern with above comment. What if ex_gw is not added when the router is removed? the unplug of HA device could fail.","commit_id":"6152abf3992ded5e4693acbbf5494ed26986dee1"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"a75f17cc09092e5c2189fb94edbbd43b610a89ba","unresolved":false,"context_lines":[{"line_number":492,"context_line":"            return"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"        if self._valid_ha(ri):"},{"line_number":495,"context_line":"            self.process_ha_router_removed(ri)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"        ri.router[\u0027gw_port\u0027] \u003d None"},{"line_number":498,"context_line":"        ri.router[l3_constants.INTERFACE_KEY] \u003d []"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_31caa24f","line":495,"in_reply_to":"3a961159_96b9f017","updated":"2015-01-05 22:18:15.000000000","message":"I\u0027ll make a change - thanks.","commit_id":"6152abf3992ded5e4693acbbf5494ed26986dee1"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"be905256b879cb3c1526519c37b6b462bbb307a5","unresolved":false,"context_lines":[{"line_number":404,"context_line":"                    raise Exception(msg)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"    def _valid_ha(self, ri):"},{"line_number":407,"context_line":"        # don\u0027t host ha routers on dvr ONLY nodes"},{"line_number":408,"context_line":"        return (ri.is_ha and self.conf.agent_mode !\u003d \u0027dvr\u0027)"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def _router_added(self, router_id, router):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_e57d43b3","line":407,"updated":"2015-01-09 10:19:19.000000000","message":"I think it\u0027s pretty clear that the controller should be scheduling routers on appropriate nodes. The agent shouldn\u0027t be making these kind of decisions. If it gets a router, it configures it.\n\nIf I understand correctly, I think that a lot of the conditionals and parameter-passing going on will be eliminated if you just assume that the controller knows what it\u0027s doing.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"39b03873153b6734fba90b62ee38664dcf6edde7","unresolved":false,"context_lines":[{"line_number":404,"context_line":"                    raise Exception(msg)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"    def _valid_ha(self, ri):"},{"line_number":407,"context_line":"        # don\u0027t host ha routers on dvr ONLY nodes"},{"line_number":408,"context_line":"        return (ri.is_ha and self.conf.agent_mode !\u003d \u0027dvr\u0027)"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def _router_added(self, router_id, router):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_e1d7ecec","line":407,"in_reply_to":"3a961159_e57d43b3","updated":"2015-01-09 17:55:18.000000000","message":"In some cases however, the agent needs to determine \"how\" configure a particular router.  This comes down to some conditionals and/or object type identity.  I do agree alot of these conditionals will disappear.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1510d423326a251da2b9a2868975b51f1b4e16b6","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            self._create_router_namespace(ri)"},{"line_number":424,"context_line":"        self.process_router_add(ri)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        if ri.is_ha and not ri.router.get(\u0027distributed\u0027):"},{"line_number":427,"context_line":"            # hold off ha_router_added until ex_gw add for DVR"},{"line_number":428,"context_line":"            self.process_ha_router_added(ri)"},{"line_number":429,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_15552f1d","line":426,"updated":"2015-01-08 18:14:52.000000000","message":"I\u0027m working hard with the refactoring efforts to remove statements like this if above.  The idea will be to use inheritance instead.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"bb2352f429c2df18f370725063993f47caf44084","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            self._create_router_namespace(ri)"},{"line_number":424,"context_line":"        self.process_router_add(ri)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        if ri.is_ha and not ri.router.get(\u0027distributed\u0027):"},{"line_number":427,"context_line":"            # hold off ha_router_added until ex_gw add for DVR"},{"line_number":428,"context_line":"            self.process_ha_router_added(ri)"},{"line_number":429,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_78082a91","line":426,"in_reply_to":"3a961159_15552f1d","updated":"2015-01-08 18:37:17.000000000","message":"Absolutely.  I am just working with what we have so far.  Until the other refactoring patches get stable, I was trying to make progress as a WIP.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8227e29d4b9d906c07edf7829662d77786a83b3e","unresolved":false,"context_lines":[{"line_number":628,"context_line":"        # TODO(mrsmith) - we shouldn\u0027t need to check here"},{"line_number":629,"context_line":"        if \u0027distributed\u0027 not in ri.router:"},{"line_number":630,"context_line":"            ri.router[\u0027distributed\u0027] \u003d False"},{"line_number":631,"context_line":"        if ri.router[\u0027distributed\u0027] and self._valid_ha(ri):"},{"line_number":632,"context_line":"            # all scheduled dvr routers are valid hosts"},{"line_number":633,"context_line":"            # for ext_gw ports while in ha mode"},{"line_number":634,"context_line":"            ri.router[\u0027gw_port_host\u0027] \u003d self.host"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_2de05496","line":631,"updated":"2015-01-15 19:52:17.000000000","message":"Instead of L629-631, could do:\n    if ri.router.setdefault(\u0027distributed\u0027, False) and self._valid_ha(ri):","commit_id":"3670b7fc71f84b72ec7e215fe328c18ab8e0955d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c8df4c5a5a6a1d93886b67048e687ab7fc385a65","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                        \"one external network.\")"},{"line_number":345,"context_line":"                    raise Exception(msg)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def _valid_ha(self, ri):"},{"line_number":348,"context_line":"        # don\u0027t host ha routers on dvr ONLY nodes"},{"line_number":349,"context_line":"        return (ri.is_ha and self.conf.agent_mode !\u003d \u0027dvr\u0027)"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_1b731081","line":347,"updated":"2015-01-23 17:36:16.000000000","message":"The thought occurred to me that maybe we should have two dvr router classes.  One for the dvr on compute nodes and the other for the snat part.  It seems to me that they are totally different functions.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"d81b13b6dfb3fd52a09959011972b811bd259ccd","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                        \"one external network.\")"},{"line_number":345,"context_line":"                    raise Exception(msg)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def _valid_ha(self, ri):"},{"line_number":348,"context_line":"        # don\u0027t host ha routers on dvr ONLY nodes"},{"line_number":349,"context_line":"        return (ri.is_ha and self.conf.agent_mode !\u003d \u0027dvr\u0027)"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_3193245c","line":347,"in_reply_to":"1a930d6b_1b731081","updated":"2015-01-27 16:29:15.000000000","message":"Interesting idea.  I think rather than an additional class, perhaps the \"dvr-only\" router could be created on a non dvr_snat node.  I believe it can be mostly ignorant of any ha logic (dvr only).  We would have to make sure all code that checks for \u0027ha\u0027 is not in shared methods and only in ha_router or dvr_ha_router classes.  Thats the end goal is it not?","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c8df4c5a5a6a1d93886b67048e687ab7fc385a65","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        self.event_observers.notify("},{"line_number":397,"context_line":"            adv_svc.AdvancedService.before_router_removed, ri)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        if self._valid_ha(ri):"},{"line_number":400,"context_line":"            self.process_ha_router_removed(ri)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        ri.router[\u0027gw_port\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_782b3a94","line":399,"updated":"2015-01-23 17:36:16.000000000","message":"I feel like this if statement is adding more of the conditional mess that I hoping to get rid of.  See note on L347.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"49fb0585df112d49ff27f1997571746004914c4b","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        self.event_observers.notify("},{"line_number":397,"context_line":"            adv_svc.AdvancedService.before_router_removed, ri)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        if self._valid_ha(ri):"},{"line_number":400,"context_line":"            self.process_ha_router_removed(ri)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        ri.router[\u0027gw_port\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_b0e57bdd","line":399,"in_reply_to":"1a930d6b_782b3a94","updated":"2015-01-26 19:11:12.000000000","message":"I think we are on the same page (see your other comments).  Code like this can move out of the shared area and land in the router-type specific areas at some point.  When is the only question..... :)","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0673775f8a8752820fb745a2f085ddf26120c160","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        self.event_observers.notify("},{"line_number":397,"context_line":"            adv_svc.AdvancedService.before_router_removed, ri)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"        if self._valid_ha(ri):"},{"line_number":400,"context_line":"            self.process_ha_router_removed(ri)"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"        ri.router[\u0027gw_port\u0027] \u003d None"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_297f66ac","line":399,"in_reply_to":"1a930d6b_b0e57bdd","updated":"2015-01-26 20:55:58.000000000","message":"Agreed.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"dbc7b240148df866fad94349d7642f87f953f48a","unresolved":false,"context_lines":[{"line_number":489,"context_line":"            self._set_subnet_info(ex_gw_port)"},{"line_number":490,"context_line":"            if not ri.ex_gw_port:"},{"line_number":491,"context_line":"                if ri.router.get(\u0027distributed\u0027):"},{"line_number":492,"context_line":"                    self.process_ha_router_added(ri)"},{"line_number":493,"context_line":"                self.external_gateway_added(ri, ex_gw_port, interface_name)"},{"line_number":494,"context_line":"            elif not _gateway_ports_equal(ex_gw_port, ri.ex_gw_port):"},{"line_number":495,"context_line":"                self.external_gateway_updated(ri, ex_gw_port, interface_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_433c3a94","line":492,"updated":"2015-01-30 23:15:16.000000000","message":"check for _valid_ha()","commit_id":"98a0a93cb77c159ae7e7358762a0f2beff17b53e"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"dbc7b240148df866fad94349d7642f87f953f48a","unresolved":false,"context_lines":[{"line_number":827,"context_line":"        self._external_gateway_added(ri, ex_gw_port, interface_name,"},{"line_number":828,"context_line":"                                     ri.ns_name, preserve_ips)"},{"line_number":829,"context_line":""},{"line_number":830,"context_line":"    def external_gateway_updated(self, ri, ex_gw_port, interface_name):"},{"line_number":831,"context_line":"        preserve_ips \u003d []"},{"line_number":832,"context_line":"        if ri.router[\u0027distributed\u0027]:"},{"line_number":833,"context_line":"            if (self.conf.agent_mode \u003d\u003d \u0027dvr_snat\u0027 and"}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_43d51a42","line":830,"updated":"2015-01-30 23:15:16.000000000","message":"move _ha_disable_addressing_on_interface below as well","commit_id":"98a0a93cb77c159ae7e7358762a0f2beff17b53e"}],"neutron/agent/l3/dvr.py":[{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"f967cbb83ab5cb32ccebcc6754f3110969bae71f","unresolved":false,"context_lines":[{"line_number":38,"context_line":"FIP_RT_TBL \u003d 16"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class RouterL3(object):"},{"line_number":42,"context_line":"    def __init__(self):"},{"line_number":43,"context_line":"        self.snat_ports \u003d []"},{"line_number":44,"context_line":"        self.floating_ips_dict \u003d {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_31ae7482","line":41,"updated":"2015-01-12 17:41:47.000000000","message":"Changed from a mixin to simple inheritance - (see other commments)","commit_id":"a96f0e396dd42313113a1b25682fed5a04b3f24a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c8df4c5a5a6a1d93886b67048e687ab7fc385a65","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        self._internal_network_added(ns_name, network_id, port_id,"},{"line_number":199,"context_line":"                                     internal_cidr, mac_address,"},{"line_number":200,"context_line":"                                     interface_name, prefix, is_ha)"},{"line_number":201,"context_line":"        if is_ha:"},{"line_number":202,"context_line":"            self._add_vip(ri, internal_cidr, interface_name)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _create_dvr_gateway(self, ri, ex_gw_port, gw_interface_name,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_e4716e45","line":201,"updated":"2015-01-23 17:36:16.000000000","message":"This is the kind of code that I\u0027m hoping to get rid of with the inheritance.  We may need to move _internal_network_added to the router class before fixing it though.  I just noticed your TODO above.  I plan to start moving most of this code in the next week.\n\nSo, I guess I\u0027m just thinking out loud here.  It sounds like we\u0027re on the same page.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"49fb0585df112d49ff27f1997571746004914c4b","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        self._internal_network_added(ns_name, network_id, port_id,"},{"line_number":199,"context_line":"                                     internal_cidr, mac_address,"},{"line_number":200,"context_line":"                                     interface_name, prefix, is_ha)"},{"line_number":201,"context_line":"        if is_ha:"},{"line_number":202,"context_line":"            self._add_vip(ri, internal_cidr, interface_name)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _create_dvr_gateway(self, ri, ex_gw_port, gw_interface_name,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_702dd3fd","line":201,"in_reply_to":"1a930d6b_e4716e45","updated":"2015-01-26 19:11:12.000000000","message":"I think we are on the same page (see my other comment in agent.py).  I think most of the dvr+ha code can move to specific router-type classes.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"}],"neutron/agent/l3/dvr_ha_router.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c8df4c5a5a6a1d93886b67048e687ab7fc385a65","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":25,"context_line":"        super(DvrHaRouter, self).__init__(*args, **kwargs)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def init_router(self):"},{"line_number":28,"context_line":"        self.init_ha()"},{"line_number":29,"context_line":"        self.init_dvr()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_76a98b7a","line":27,"updated":"2015-01-23 17:36:16.000000000","message":"I\u0027m not sure this is necessary.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0673775f8a8752820fb745a2f085ddf26120c160","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":25,"context_line":"        super(DvrHaRouter, self).__init__(*args, **kwargs)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def init_router(self):"},{"line_number":28,"context_line":"        self.init_ha()"},{"line_number":29,"context_line":"        self.init_dvr()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_44d659f2","line":27,"in_reply_to":"1a930d6b_7062333f","updated":"2015-01-26 20:55:58.000000000","message":"I think there must be something wrong.  As long as they all call super(...).__init__() except for RouterInfo then you should not have that problem.  I created a quick example to show this [1].  When I run the example, I get this:\n\n $ ./routers.py \n Called Router __init__\n Called DvrRouter __init__\n Called HaRouter __init__\n Called DvrHaRouter __init__\n\nEither way you do it, we need a unit test to ensure that each class has been initialized when creating an instance of this class.  It should be doable in a very easy unit test.\n\n [1] http://paste.openstack.org/show/162395/","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"49fb0585df112d49ff27f1997571746004914c4b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":25,"context_line":"        super(DvrHaRouter, self).__init__(*args, **kwargs)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def init_router(self):"},{"line_number":28,"context_line":"        self.init_ha()"},{"line_number":29,"context_line":"        self.init_dvr()"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_7062333f","line":27,"in_reply_to":"1a930d6b_76a98b7a","updated":"2015-01-26 19:11:12.000000000","message":"I was surprised to find the __init__ methods for the two parent classes of the mixin was not being called.  Only the first one would be called.  I searched around and found a few discussions like this one - http://stackoverflow.com/questions/7415974/better-way-to-access-super-class-method-in-multiple-inheritance \n\nI went down the road of having only one __init__ method in the base class of all routers RouterInfo.  The init_router methods do specific things in the specific router classes.  \n\nI am open to suggestions if this isn\u0027t the way to go.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"596da46e761f34122ebce7d00dafd47685e3eb79","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        super(DvrHaRouter, self)._ha_disable_addressing_on_interface("},{"line_number":60,"context_line":"            interface_name, ns_name)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def _snat_internal_network_added(self, port):"},{"line_number":63,"context_line":"        interface_name \u003d self.get_snat_int_device_name(port[\u0027id\u0027])"},{"line_number":64,"context_line":"        ns_name \u003d self.get_ha_ns_name()"},{"line_number":65,"context_line":"        super(DvrHaRouter, self)._internal_ha_network_added("}],"source_content_type":"text/x-python","patch_set":21,"id":"da9b358b_add87654","line":62,"updated":"2015-03-30 22:54:09.000000000","message":"Change to snat_internal_network_added()","commit_id":"9ec3ad2d2d7c77d264f3df9a0800639b12a40ad2"}],"neutron/agent/l3/dvr_router.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c8df4c5a5a6a1d93886b67048e687ab7fc385a65","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":23,"context_line":"        super(DvrRouter, self).__init__(*args, **kwargs)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def init_dvr(self):"},{"line_number":26,"context_line":"        self.floating_ips_dict \u003d {}"},{"line_number":27,"context_line":"        self.snat_iptables_manager \u003d None"},{"line_number":28,"context_line":"        # Linklocal subnet for router and floating IP namespace link"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_76726b4a","line":25,"updated":"2015-01-23 17:36:16.000000000","message":"Why can\u0027t this be done in __init__?  As long as all of the __init__ methods call super, they should all be called.  Is there a reason I\u0027m missing.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"49fb0585df112d49ff27f1997571746004914c4b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":23,"context_line":"        super(DvrRouter, self).__init__(*args, **kwargs)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def init_dvr(self):"},{"line_number":26,"context_line":"        self.floating_ips_dict \u003d {}"},{"line_number":27,"context_line":"        self.snat_iptables_manager \u003d None"},{"line_number":28,"context_line":"        # Linklocal subnet for router and floating IP namespace link"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_5049b7b5","line":25,"in_reply_to":"1a930d6b_76726b4a","updated":"2015-01-26 19:11:12.000000000","message":"See response in dvr_ha_router.py","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"}],"neutron/agent/l3/ha.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e42cb6c1acb2585afca7afef740934c272ede531","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            return"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        self._set_subnet_info(ha_port)"},{"line_number":144,"context_line":"        if ri.router.get(\u0027distributed\u0027):"},{"line_number":145,"context_line":"            ns_name \u003d self.get_snat_ns_name(ri.router[\u0027id\u0027])"},{"line_number":146,"context_line":"        else:"},{"line_number":147,"context_line":"            ns_name \u003d ri.ns_name"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_fbe7bf0f","line":144,"updated":"2015-01-08 13:17:19.000000000","message":"Just noticed that this code block 144-147 is repeated in two other places. Extract method.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"be905256b879cb3c1526519c37b6b462bbb307a5","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            return"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        self._set_subnet_info(ha_port)"},{"line_number":144,"context_line":"        if ri.router.get(\u0027distributed\u0027):"},{"line_number":145,"context_line":"            ns_name \u003d self.get_snat_ns_name(ri.router[\u0027id\u0027])"},{"line_number":146,"context_line":"        else:"},{"line_number":147,"context_line":"            ns_name \u003d ri.ns_name"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_601dc161","line":144,"in_reply_to":"3a961159_d8267e15","updated":"2015-01-09 10:19:19.000000000","message":"And of course with Carl\u0027s patch, get_ns_name (Or a property name, or however we end up calling it) will be a method of the Router class, so there will be no need for any of these conditionals.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"bb2352f429c2df18f370725063993f47caf44084","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            return"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        self._set_subnet_info(ha_port)"},{"line_number":144,"context_line":"        if ri.router.get(\u0027distributed\u0027):"},{"line_number":145,"context_line":"            ns_name \u003d self.get_snat_ns_name(ri.router[\u0027id\u0027])"},{"line_number":146,"context_line":"        else:"},{"line_number":147,"context_line":"            ns_name \u003d ri.ns_name"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_d8267e15","line":144,"in_reply_to":"3a961159_fbe7bf0f","updated":"2015-01-08 18:37:17.000000000","message":"good point.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"be905256b879cb3c1526519c37b6b462bbb307a5","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    def get_ha_device_name(self, port_id):"},{"line_number":164,"context_line":"        return (HA_DEV_PREFIX + port_id)[:self.driver.DEV_NAME_LEN]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def ha_network_added(self, ri, network_id, port_id, internal_cidr,"},{"line_number":167,"context_line":"                         mac_address, ns_name):"},{"line_number":168,"context_line":"        interface_name \u003d self.get_ha_device_name(port_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_c03595db","line":165,"updated":"2015-01-09 10:19:19.000000000","message":"If you depend on Carl\u0027s patch and add the ns_name generation to the Router class we won\u0027t need this.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"be905256b879cb3c1526519c37b6b462bbb307a5","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            _get_metadata_proxy_process_manager(ri.router_id,"},{"line_number":207,"context_line":"                                                ns_name,"},{"line_number":208,"context_line":"                                                self.conf))"},{"line_number":209,"context_line":"        pid \u003d pm.get_pid_file_name(ensure_pids_dir\u003dTrue)"},{"line_number":210,"context_line":"        if ri.keepalived_manager:"},{"line_number":211,"context_line":"            ri.keepalived_manager.add_notifier("},{"line_number":212,"context_line":"                callback(pid), \u0027master\u0027, ri.ha_vr_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_806e2dc6","line":209,"updated":"2015-01-09 10:19:19.000000000","message":"Ok here I\u0027m not sure I got it right. The conditional is now because HA-only routers will have it initialized, but HA+DVR routers, that were configured before the external device was configured, won\u0027t have the manager initialized? Is that correct? If so this will be simplified by making sure the controller only notifies the agent when it actually needs to do something.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"39b03873153b6734fba90b62ee38664dcf6edde7","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            _get_metadata_proxy_process_manager(ri.router_id,"},{"line_number":207,"context_line":"                                                ns_name,"},{"line_number":208,"context_line":"                                                self.conf))"},{"line_number":209,"context_line":"        pid \u003d pm.get_pid_file_name(ensure_pids_dir\u003dTrue)"},{"line_number":210,"context_line":"        if ri.keepalived_manager:"},{"line_number":211,"context_line":"            ri.keepalived_manager.add_notifier("},{"line_number":212,"context_line":"                callback(pid), \u0027master\u0027, ri.ha_vr_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_41c9a024","line":209,"in_reply_to":"3a961159_806e2dc6","updated":"2015-01-09 17:55:18.000000000","message":"Yes - the trick here is for dvr we are trying to initialize the \"ha\" parts later.  So some of these code paths get called before \"ha\" is initialized.  There are different ways to handle this of course, but I took this path of softly ignoring the calls.  If we agree to allow a dvr+ha router to be partially intialized until a gw set is done, we\u0027ll have to do some of this.  But if we can get the scheduler to truly schedule only the complete data and the proper time, maybe we can eliminate this logic.","commit_id":"5d4a11569f51046b6bef0fd414424eeb80ecaf19"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"f967cbb83ab5cb32ccebcc6754f3110969bae71f","unresolved":false,"context_lines":[{"line_number":49,"context_line":"]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"class RouterL3(dvr.RouterL3):"},{"line_number":53,"context_line":"    def __init__(self):"},{"line_number":54,"context_line":"        self.ha_port \u003d None"},{"line_number":55,"context_line":"        self.keepalived_manager \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_d1d530e6","line":52,"updated":"2015-01-12 17:41:47.000000000","message":"Changed from a mixin to simple inheritance - (see other commments)","commit_id":"a96f0e396dd42313113a1b25682fed5a04b3f24a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c8df4c5a5a6a1d93886b67048e687ab7fc385a65","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if ri.router.get(\u0027distributed\u0027):"},{"line_number":100,"context_line":"            ns_name \u003d self.get_snat_ns_name(ri.router[\u0027id\u0027])"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            ns_name \u003d ri.ns_name"},{"line_number":103,"context_line":"        self.ha_network_added(ri, ha_port[\u0027network_id\u0027], ha_port[\u0027id\u0027],"},{"line_number":104,"context_line":"                              ha_port[\u0027ip_cidr\u0027], ha_port[\u0027mac_address\u0027],"},{"line_number":105,"context_line":"                              ns_name)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_51c5793a","line":102,"updated":"2015-01-23 17:36:16.000000000","message":"I wonder if creating two dvr classes would help with this conditional stuff too.  Then .ns_name would be right in both contexts.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"49fb0585df112d49ff27f1997571746004914c4b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if ri.router.get(\u0027distributed\u0027):"},{"line_number":100,"context_line":"            ns_name \u003d self.get_snat_ns_name(ri.router[\u0027id\u0027])"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            ns_name \u003d ri.ns_name"},{"line_number":103,"context_line":"        self.ha_network_added(ri, ha_port[\u0027network_id\u0027], ha_port[\u0027id\u0027],"},{"line_number":104,"context_line":"                              ha_port[\u0027ip_cidr\u0027], ha_port[\u0027mac_address\u0027],"},{"line_number":105,"context_line":"                              ns_name)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_70f07367","line":102,"in_reply_to":"1a930d6b_51c5793a","updated":"2015-01-26 19:11:12.000000000","message":"I\u0027m thinking a change like this could be done with simple inheritance in a sub-class?","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0673775f8a8752820fb745a2f085ddf26120c160","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if ri.router.get(\u0027distributed\u0027):"},{"line_number":100,"context_line":"            ns_name \u003d self.get_snat_ns_name(ri.router[\u0027id\u0027])"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            ns_name \u003d ri.ns_name"},{"line_number":103,"context_line":"        self.ha_network_added(ri, ha_port[\u0027network_id\u0027], ha_port[\u0027id\u0027],"},{"line_number":104,"context_line":"                              ha_port[\u0027ip_cidr\u0027], ha_port[\u0027mac_address\u0027],"},{"line_number":105,"context_line":"                              ns_name)"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_c438893f","line":102,"in_reply_to":"1a930d6b_70f07367","updated":"2015-01-26 20:55:58.000000000","message":"I think there is so little that the compute node qrouter shares with snat.  For one, the compute node qrouter doesn\u0027t need to be mixed with Ha at all.  I need to experiment a little more with it.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"}],"neutron/agent/l3/ha_router.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c8df4c5a5a6a1d93886b67048e687ab7fc385a65","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.ha_port \u003d None"},{"line_number":30,"context_line":"        self.keepalived_manager \u003d None"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def init_router(self):"},{"line_number":33,"context_line":"        self.init_ha()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def _verify_ha(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_b6ba13be","line":32,"updated":"2015-01-23 17:36:16.000000000","message":"Ditto.  See notes on other init_router methods in this patch.","commit_id":"9cb9926da2410fa3a1ce143a0b54fe21b10a6d3a"}],"neutron/agent/l3/router_info.py":[{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"f967cbb83ab5cb32ccebcc6754f3110969bae71f","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class RouterInfo(ha.RouterL3):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def __init__(self, router_id, root_helper, router,"},{"line_number":22,"context_line":"                 use_ipv6\u003dFalse, ns_name\u003dNone):"},{"line_number":23,"context_line":"        self.router_id \u003d router_id"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_b1c18431","line":20,"updated":"2015-01-12 17:41:47.000000000","message":"I found that both __init__ methods (for dvr and ha) were not being called given the current Mixin setup.  Therefore results were not expected or desired when testing some cross functionality.  I looked at various ways to fix this but settled on simple inheritance since this is still just a WIP.","commit_id":"a96f0e396dd42313113a1b25682fed5a04b3f24a"}]}
