)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9bb2ada7c324bab1544eb7738c23f17cd8706cda","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-09 11:51:22 -0500"},{"line_number":4,"context_line":"Commit:     rajeev \u003crajeev.grover@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-06 16:11:34 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"HA for DVR - Neutron Server side WIP code"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds HA support for DVR centralized default SNAT"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_60fb017b","line":6,"updated":"2015-01-09 10:39:46.000000000","message":"I know this is WIP, just a friendly reminder that we need unit tests.","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"996b340e5a8b523773681c778089fa3c609b2a74","unresolved":false,"context_lines":[{"line_number":3,"context_line":"AuthorDate: 2014-12-09 11:51:22 -0500"},{"line_number":4,"context_line":"Commit:     rajeev \u003crajeev.grover@hp.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-01-06 16:11:34 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"HA for DVR - Neutron Server side WIP code"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds HA support for DVR centralized default SNAT"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_55b15e00","line":6,"in_reply_to":"3a961159_60fb017b","updated":"2015-01-13 21:10:03.000000000","message":"Yes, continuing to add them in.","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"0500ae95fde7e518264e13263339bbea66fb0776","unresolved":false,"context_lines":[{"line_number":17,"context_line":" - Schedule/de-schedule SNAT on multiple agents"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This is a WIP, will be adding more code in subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: #1365473"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I6a19481d0e19b8a55f32199a27057bf777548b33"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_00ea3d9f","line":20,"updated":"2015-01-09 10:40:56.000000000","message":"It would be helpful if you used the same topic branch as Michael\u0027s patch - It should be \u0027bug/1365473\u0027.","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"996b340e5a8b523773681c778089fa3c609b2a74","unresolved":false,"context_lines":[{"line_number":17,"context_line":" - Schedule/de-schedule SNAT on multiple agents"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This is a WIP, will be adding more code in subsequent patches."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: #1365473"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I6a19481d0e19b8a55f32199a27057bf777548b33"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"3a961159_62b2bee6","line":20,"in_reply_to":"3a961159_00ea3d9f","updated":"2015-01-13 21:10:03.000000000","message":"should be in place with patch set 5.","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"98217e4f64de3d267bcb31c40de2afdc84c27c43","unresolved":false,"context_lines":[{"line_number":18,"context_line":" - Allow conversion of a legacy router to DVR even if HA is"},{"line_number":19,"context_line":"   enabled on the legacy router"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: #1365473"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I6a19481d0e19b8a55f32199a27057bf777548b33"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1a930d6b_f0f87fc6","line":21,"updated":"2015-01-21 15:40:31.000000000","message":"It would be useful to highlight what operations this patch enables, e.g.:\n\n neutron create-router r1 --distributed\n neutron create-router r2 --ha\n neutron update-router r1 --distributed --ha\n ...","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"82ee26712a12569e5a95e86b28de74b132f09e05","unresolved":false,"context_lines":[{"line_number":18,"context_line":" - Allow conversion of a legacy router to DVR even if HA is"},{"line_number":19,"context_line":"   enabled on the legacy router"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: #1365473"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I6a19481d0e19b8a55f32199a27057bf777548b33"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1a930d6b_162e6bfb","line":21,"in_reply_to":"1a930d6b_f0f87fc6","updated":"2015-01-25 22:21:43.000000000","message":"Done","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"6459b68bcb4678828d325288e1a3805a78954adf","unresolved":false,"context_lines":[{"line_number":18,"context_line":" - Enables"},{"line_number":19,"context_line":"    \u0027router-create \u003crouter name\u003e --ha True --distributed True\u0027"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Partial-bug: #1365473"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Co-Authored-By: Adolfo Duarte \u003cadolfo.duarte@hp.com\u003e"},{"line_number":24,"context_line":"Co-Authored-By: Hardik Italia \u003chardik.italia@hp.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":60,"id":"ba8a016a_b23e3189","line":21,"updated":"2015-11-19 12:56:41.000000000","message":"This  should be Closes-Bug.","commit_id":"a744438c948db72761cd4011f4bc75d79beceecd"}],"neutron/db/agents_db.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9f93c019c7183e2689642b61a2faa481b08f4e3f","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                   if k not in [\u0027alive\u0027, \u0027configurations\u0027])"},{"line_number":228,"context_line":"        res[\u0027alive\u0027] \u003d not AgentDbMixin.is_agent_down("},{"line_number":229,"context_line":"            res[\u0027heartbeat_timestamp\u0027])"},{"line_number":230,"context_line":"        res[\u0027configurations\u0027] \u003d get_configuration_dict(agent)"},{"line_number":231,"context_line":"        res[\u0027availability_zone\u0027] \u003d agent[\u0027availability_zone\u0027]"},{"line_number":232,"context_line":"        return self._fields(res, fields)"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_01798dfc","line":230,"updated":"2015-11-16 14:03:04.000000000","message":"why this change?","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                   if k not in [\u0027alive\u0027, \u0027configurations\u0027])"},{"line_number":228,"context_line":"        res[\u0027alive\u0027] \u003d not AgentDbMixin.is_agent_down("},{"line_number":229,"context_line":"            res[\u0027heartbeat_timestamp\u0027])"},{"line_number":230,"context_line":"        res[\u0027configurations\u0027] \u003d get_configuration_dict(agent)"},{"line_number":231,"context_line":"        res[\u0027availability_zone\u0027] \u003d agent[\u0027availability_zone\u0027]"},{"line_number":232,"context_line":"        return self._fields(res, fields)"},{"line_number":233,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_108bb5c4","line":230,"in_reply_to":"ba8a016a_01798dfc","updated":"2015-11-18 07:18:01.000000000","message":"Look at the comments on line 211. \nThe actual file is outside of the class so \"self.get_configuration_dict\" is just a redundant call now that lines 196 to line 204 have been  changed. I imagine it is changed here just so that if self.get_confgiuration gets deleted at some point. \nSee comments on linke 207-L208","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"814e79d6d90784329323005cbed27fe4e9b973ab","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        conf \u003d jsonutils.loads(agent_db.configurations)"},{"line_number":76,"context_line":"    except Exception:"},{"line_number":77,"context_line":"        msg \u003d _LW(\u0027Configuration for agent %(agent_type)s on host %(host)s\u0027"},{"line_number":78,"context_line":"                  \u0027 is invalid.\u0027)"},{"line_number":79,"context_line":"        LOG.warn(msg, {\u0027agent_type\u0027: agent_db.agent_type,"},{"line_number":80,"context_line":"                       \u0027host\u0027: agent_db.host})"},{"line_number":81,"context_line":"        conf \u003d {}"}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_688562cd","line":78,"updated":"2015-12-02 14:51:18.000000000","message":"nit: whitespace should be at the end of previous line.","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"9dc331a5fdce5f997634c76c938b92ce112fe8a1","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        conf \u003d jsonutils.loads(agent_db.configurations)"},{"line_number":76,"context_line":"    except Exception:"},{"line_number":77,"context_line":"        msg \u003d _LW(\u0027Configuration for agent %(agent_type)s on host %(host)s\u0027"},{"line_number":78,"context_line":"                  \u0027 is invalid.\u0027)"},{"line_number":79,"context_line":"        LOG.warn(msg, {\u0027agent_type\u0027: agent_db.agent_type,"},{"line_number":80,"context_line":"                       \u0027host\u0027: agent_db.host})"},{"line_number":81,"context_line":"        conf \u003d {}"}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_b014ff4c","line":78,"in_reply_to":"9a8ffd7b_688562cd","updated":"2015-12-02 17:48:39.000000000","message":"Will include in next patch if one comes along\nDone","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":72,"id":"9a68dd71_8c44591b","updated":"2016-01-22 17:08:47.000000000","message":"All of the changes in this file look like refactoring that no longer have anything to do with this patch as of PS72.  I was actually about to question the need for this refactor even in PS71 but didn\u0027t finish my review before you uploaded PS72.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":72,"id":"9a68dd71_88ae7c7f","in_reply_to":"9a68dd71_8c44591b","updated":"2016-01-22 20:07:12.000000000","message":"Agree. This refactoring probably does not belong in this patch","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"}],"neutron/db/l3_agentschedulers_db.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"08c2e65f5631f376ee653a1b7b1b97bb77d612da","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            agent \u003d self._get_agent(context, agent_id)"},{"line_number":232,"context_line":"            self.validate_agent_router_combination(context, agent, router)"},{"line_number":233,"context_line":"            if self.check_agent_router_scheduling_needed("},{"line_number":234,"context_line":"                    context, agent, router):"},{"line_number":235,"context_line":"                self.create_router_to_agent_binding(context, agent, router)"},{"line_number":236,"context_line":"            else:"},{"line_number":237,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_10f6958f","line":234,"updated":"2015-10-06 13:23:41.000000000","message":"Unrelated whitespaces added here. Please remove.","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f55905591503fe27afb0e21e772797152f8e2924","unresolved":false,"context_lines":[{"line_number":231,"context_line":"            agent \u003d self._get_agent(context, agent_id)"},{"line_number":232,"context_line":"            self.validate_agent_router_combination(context, agent, router)"},{"line_number":233,"context_line":"            if self.check_agent_router_scheduling_needed("},{"line_number":234,"context_line":"                    context, agent, router):"},{"line_number":235,"context_line":"                self.create_router_to_agent_binding(context, agent, router)"},{"line_number":236,"context_line":"            else:"},{"line_number":237,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_9225bfac","line":234,"in_reply_to":"7a2fa921_10f6958f","updated":"2015-10-06 16:36:13.000000000","message":"Done","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"3a56e93d1d9232dee13e42da58855ff6c25466db","unresolved":false,"context_lines":[{"line_number":235,"context_line":"            except db_exc.DBError:"},{"line_number":236,"context_line":"                raise l3agentscheduler.RouterSchedulingFailed("},{"line_number":237,"context_line":"                    router_id\u003drouter_id, agent_id\u003dagent_id)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def add_router_to_l3_agent(self, context, agent_id, router_id):"},{"line_number":240,"context_line":"        \"\"\"Add a l3 agent to host a router.\"\"\""},{"line_number":241,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":63,"id":"7a740942_ec8e2e2d","line":238,"updated":"2015-12-11 22:30:06.000000000","message":"There\u0027s a bug somewhere here. Both HA and DVR routers can use:\nneutron l3-agent-router-{add/remove}. For DVR routers it controls the SNAT portion of the router. For DVR-HA routers it doesn\u0027t seem to work properly.\n\nFor normal DVR routers:\n\nneutron router-show dvr -F distributed --format\u003dvalue\n True\n\nneutron l3-agent-list-hosting-router dvr -c host --format\u003dvalue\n network\n aio\n\nThere\u0027s no indicator where the SNAT portion is, but you\u0027ll have to trust me when I say it\u0027s on host \u0027network\u0027.\n\nneutron l3-agent-router-remove 374fab38-0f75-4145-bee9-76aad55b5748 dvr\n Removed router dvr from L3 agent\n\nneutron l3-agent-list-hosting-router dvr -c host --format\u003dvalue\n aio\n\nnetwork:~$ ip netns | grep snat # No SNAT namespace on \u0027network\u0027 host\n\n# Add router to \u0027aio\u0027 host. \nneutron l3-agent-router-add e857c00f-bb35-408e-a9b9-e3a46b31af31 dvr\n Added router dvr to L3 agent\n\nSNAT namespace added correctly to \u0027aio\u0027 host.\n\n------------------------------------------------------------------------------------------\n\nFor DVR-HA routers, removing works correctly, but adding doesn\u0027t:\n\nneutron router-show dvr_ha -F ha -F distributed --format\u003dvalue\n True\n True\n\nneutron l3-agent-list-hosting-router dvr_ha -c host --format\u003dvalue\n network\n aio\n(SNAT namespace present on both nodes)\n\nneutron l3-agent-router-remove 374fab38-0f75-4145-bee9-76aad55b5748 dvr_ha\n Removed router dvr_ha from L3 agent\n\nneutron l3-agent-list-hosting-router dvr_ha -c host --format\u003dvalue\n aio\n\n*But...*\nneutron l3-agent-router-add 374fab38-0f75-4145-bee9-76aad55b5748 dvr_ha\n Added router dvr_ha to L3 agent\n(No INFO/WARNING/ERROR/TRACE in neutron-server log).\n\nneutron l3-agent-list-hosting-router dvr_ha -c host --format\u003dvalue\n aio\n(Router wasn\u0027t actually scheduled, and SNAT namespace wasn\u0027t created)","commit_id":"5c0b414c5d681b63dd5a7f0a581c2ee2429e005d"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"3a56e93d1d9232dee13e42da58855ff6c25466db","unresolved":false,"context_lines":[{"line_number":524,"context_line":"        if self.router_scheduler:"},{"line_number":525,"context_line":"            return self.router_scheduler.auto_schedule_routers("},{"line_number":526,"context_line":"                self, context, host, router_ids)"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def schedule_router(self, context, router, candidates\u003dNone):"},{"line_number":529,"context_line":"        if self.router_scheduler:"},{"line_number":530,"context_line":"            return self.router_scheduler.schedule("}],"source_content_type":"text/x-python","patch_set":63,"id":"7a740942_67f7b78b","line":527,"updated":"2015-12-11 22:30:06.000000000","message":"Adding an interface to a DVR-HA router throws an exception:\nhttp://paste.openstack.org/show/481698/.\nThis obviously points to a testing coverage issue... It looks like it\u0027s trying to schedule a router that\u0027s already scheduled to a node?\n\nThis happens both when adding/removing an internal interface, and when setting/clear the router as a gateway. I couldn\u0027t test floating IPs because of this.","commit_id":"5c0b414c5d681b63dd5a7f0a581c2ee2429e005d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                              \"rescheduling.\"))"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _get_agent_mode(self, agent_db):"},{"line_number":154,"context_line":"        agent_conf \u003d agents_db.get_configuration_dict(agent_db)"},{"line_number":155,"context_line":"        return agent_conf.get(constants.L3_AGENT_MODE,"},{"line_number":156,"context_line":"                              constants.L3_AGENT_MODE_LEGACY)"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_8c121908","line":154,"range":{"start_line":154,"start_character":21,"end_line":154,"end_character":30},"updated":"2016-01-22 17:08:47.000000000","message":"Looks like part of the get_configuration_dict refactor","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                              \"rescheduling.\"))"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _get_agent_mode(self, agent_db):"},{"line_number":154,"context_line":"        agent_conf \u003d agents_db.get_configuration_dict(agent_db)"},{"line_number":155,"context_line":"        return agent_conf.get(constants.L3_AGENT_MODE,"},{"line_number":156,"context_line":"                              constants.L3_AGENT_MODE_LEGACY)"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_2873d016","line":154,"range":{"start_line":154,"start_character":21,"end_line":154,"end_character":30},"in_reply_to":"9a68dd71_8c121908","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                # ignore_admin_state True comes from manual scheduling"},{"line_number":496,"context_line":"                # where admin_state_up judgement is already done."},{"line_number":497,"context_line":"                continue"},{"line_number":498,"context_line":"            agent_conf \u003d agents_db.get_configuration_dict(l3_agent)"},{"line_number":499,"context_line":"            router_id \u003d agent_conf.get(\u0027router_id\u0027, None)"},{"line_number":500,"context_line":"            handle_internal_only_routers \u003d agent_conf.get("},{"line_number":501,"context_line":"                \u0027handle_internal_only_routers\u0027, True)"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_ec0155b0","line":498,"range":{"start_line":498,"start_character":25,"end_line":498,"end_character":34},"updated":"2016-01-22 17:08:47.000000000","message":"ditto","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                # ignore_admin_state True comes from manual scheduling"},{"line_number":496,"context_line":"                # where admin_state_up judgement is already done."},{"line_number":497,"context_line":"                continue"},{"line_number":498,"context_line":"            agent_conf \u003d agents_db.get_configuration_dict(l3_agent)"},{"line_number":499,"context_line":"            router_id \u003d agent_conf.get(\u0027router_id\u0027, None)"},{"line_number":500,"context_line":"            handle_internal_only_routers \u003d agent_conf.get("},{"line_number":501,"context_line":"                \u0027handle_internal_only_routers\u0027, True)"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_a8d4a0bc","line":498,"range":{"start_line":498,"start_character":25,"end_line":498,"end_character":34},"in_reply_to":"9a68dd71_ec0155b0","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"abb42294d9907127b0e84ad491cd76c9d52ca277","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                not is_router_distributed):"},{"line_number":519,"context_line":"                candidates.append(l3_agent)"},{"line_number":520,"context_line":"            elif (agent_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT) and ("},{"line_number":521,"context_line":"                        sync_router.get(\u0027distributed\u0027, False) and"},{"line_number":522,"context_line":"                        sync_router.get(\u0027ha\u0027, False)):"},{"line_number":523,"context_line":"                candidates.append(l3_agent)"},{"line_number":524,"context_line":"            elif (is_router_distributed and subnet_ids and"}],"source_content_type":"text/x-python","patch_set":73,"id":"9a68dd71_a7a28697","line":521,"range":{"start_line":521,"start_character":36,"end_line":521,"end_character":39},"updated":"2016-01-23 00:06:10.000000000","message":"nit: can we use \u0027is_router_distributed\u0027 here.","commit_id":"4c3d4a72c4e8d8d4e74119af3db8fbd89c2322d3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":530,"context_line":"                candidates.append(l3_agent)"},{"line_number":531,"context_line":"            elif (agent_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT) and ("},{"line_number":532,"context_line":"                        is_router_distributed and"},{"line_number":533,"context_line":"                        sync_router.get(\u0027ha\u0027, False)):"},{"line_number":534,"context_line":"                candidates.append(l3_agent)"},{"line_number":535,"context_line":"            elif (is_router_distributed and subnet_ids and"},{"line_number":536,"context_line":"                    agent_mode.startswith(constants.L3_AGENT_MODE_DVR) and ("}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_8de32c05","line":533,"range":{"start_line":533,"start_character":24,"end_line":533,"end_character":52},"updated":"2016-01-28 19:58:43.000000000","message":"dvr_snat agent is a valid candidate for any type of router so this check is redundant","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"84518621a6cf386e516daa3145717f9cba79370d","unresolved":false,"context_lines":[{"line_number":530,"context_line":"                candidates.append(l3_agent)"},{"line_number":531,"context_line":"            elif (agent_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT) and ("},{"line_number":532,"context_line":"                        is_router_distributed and"},{"line_number":533,"context_line":"                        sync_router.get(\u0027ha\u0027, False)):"},{"line_number":534,"context_line":"                candidates.append(l3_agent)"},{"line_number":535,"context_line":"            elif (is_router_distributed and subnet_ids and"},{"line_number":536,"context_line":"                    agent_mode.startswith(constants.L3_AGENT_MODE_DVR) and ("}],"source_content_type":"text/x-python","patch_set":77,"id":"5a5ae5dd_e3c45741","line":533,"range":{"start_line":533,"start_character":24,"end_line":533,"end_character":52},"in_reply_to":"7a5de9d1_8de32c05","updated":"2016-02-03 21:44:50.000000000","message":"Done","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"}],"neutron/db/l3_dvr_db.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b2ce7c15438a58e3854417bd1300ca25c5f994fa","unresolved":false,"context_lines":[{"line_number":35,"context_line":"from neutron.i18n import _LI, _LW"},{"line_number":36,"context_line":"from neutron import manager"},{"line_number":37,"context_line":"from neutron.plugins.common import constants"},{"line_number":38,"context_line":"from oslo_serialization import jsonutils"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"1a4dcd0f_05914c46","line":38,"updated":"2015-08-15 09:32:21.000000000","message":"oslo_serialization.* should be imported before oslo_utils.*","commit_id":"1a6c952280d293ed539fa67391a571c4f63c1146"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ecab363b466eb3697844fe89b3327ec8a7109a7d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"from neutron.i18n import _LI, _LW"},{"line_number":36,"context_line":"from neutron import manager"},{"line_number":37,"context_line":"from neutron.plugins.common import constants"},{"line_number":38,"context_line":"from oslo_serialization import jsonutils"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"1a4dcd0f_8740f736","line":38,"in_reply_to":"1a4dcd0f_05914c46","updated":"2015-08-16 06:40:57.000000000","message":"Done will be i ps 29","commit_id":"1a6c952280d293ed539fa67391a571c4f63c1146"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b2ce7c15438a58e3854417bd1300ca25c5f994fa","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            \u0027default\u0027: cfg.CONF.router_distributed"},{"line_number":72,"context_line":"        }])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def agent_conf(self, agent_db):"},{"line_number":75,"context_line":"        try:"},{"line_number":76,"context_line":"            conf \u003d jsonutils.loads(agent_db.configurations)"},{"line_number":77,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a4dcd0f_c59a8462","line":74,"updated":"2015-08-15 09:32:21.000000000","message":"it seems this method is used nowhere?","commit_id":"1a6c952280d293ed539fa67391a571c4f63c1146"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ecab363b466eb3697844fe89b3327ec8a7109a7d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            \u0027default\u0027: cfg.CONF.router_distributed"},{"line_number":72,"context_line":"        }])"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def agent_conf(self, agent_db):"},{"line_number":75,"context_line":"        try:"},{"line_number":76,"context_line":"            conf \u003d jsonutils.loads(agent_db.configurations)"},{"line_number":77,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":27,"id":"1a4dcd0f_87123757","line":74,"in_reply_to":"1a4dcd0f_c59a8462","updated":"2015-08-16 06:40:57.000000000","message":"its used to obtain the configuration given an agent_db. \nIt is used in the newer patches in  l 346 in teh _check_dvr_router_remove_required_and_notify_agent.","commit_id":"1a6c952280d293ed539fa67391a571c4f63c1146"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"08c2e65f5631f376ee653a1b7b1b97bb77d612da","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            \u0027default\u0027: cfg.CONF.router_distributed"},{"line_number":67,"context_line":"        }])"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def agent_conf(self, agent_db):"},{"line_number":70,"context_line":"        try:"},{"line_number":71,"context_line":"            conf \u003d jsonutils.loads(agent_db.configurations)"},{"line_number":72,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_b04ec1bf","line":69,"updated":"2015-10-06 13:23:41.000000000","message":"This is an exact code duplication of neutron.db.agents_db.AgentDbMixin.get_configuration_dict(). We can easily change the existing code (for example, move the original function someplace common and invoke that instead).\n\nPerhaps create a neutron/db/db_common.py file?","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f55905591503fe27afb0e21e772797152f8e2924","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            \u0027default\u0027: cfg.CONF.router_distributed"},{"line_number":67,"context_line":"        }])"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def agent_conf(self, agent_db):"},{"line_number":70,"context_line":"        try:"},{"line_number":71,"context_line":"            conf \u003d jsonutils.loads(agent_db.configurations)"},{"line_number":72,"context_line":"        except Exception:"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_f24993d1","line":69,"in_reply_to":"7a2fa921_b04ec1bf","updated":"2015-10-06 16:36:13.000000000","message":"Done. get_configuration_dict was changed into a plain function in agents_db.","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"08c2e65f5631f376ee653a1b7b1b97bb77d612da","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                    if not plugin.check_ports_exist_on_l3agent(context,"},{"line_number":326,"context_line":"                                                               l3_agent,"},{"line_number":327,"context_line":"                                                               router[\u0027id\u0027]):"},{"line_number":328,"context_line":"                        plugin.remove_router_from_l3_agent("},{"line_number":329,"context_line":"                            context, l3_agent[\u0027id\u0027], router[\u0027id\u0027])"},{"line_number":330,"context_line":"        router_interface_info \u003d self._make_router_interface_info("},{"line_number":331,"context_line":"            router[\u0027id\u0027], port[\u0027tenant_id\u0027], port[\u0027id\u0027], subnets[0][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_f02519c2","line":328,"updated":"2015-10-06 13:23:41.000000000","message":"This is the 5th level of indentation for this statement. We can easily return it to be a 4th level indentation by merging the two \u0027if\u0027 clauses above into one.","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"27e82ed384bfa625e9b9dd9cb1e22be461be5cec","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                    if not plugin.check_ports_exist_on_l3agent(context,"},{"line_number":326,"context_line":"                                                               l3_agent,"},{"line_number":327,"context_line":"                                                               router[\u0027id\u0027]):"},{"line_number":328,"context_line":"                        plugin.remove_router_from_l3_agent("},{"line_number":329,"context_line":"                            context, l3_agent[\u0027id\u0027], router[\u0027id\u0027])"},{"line_number":330,"context_line":"        router_interface_info \u003d self._make_router_interface_info("},{"line_number":331,"context_line":"            router[\u0027id\u0027], port[\u0027tenant_id\u0027], port[\u0027id\u0027], subnets[0][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_c1e026fd","line":328,"in_reply_to":"7a2fa921_b288fb23","updated":"2015-10-07 08:19:02.000000000","message":"Reverted back since it caused some problems with the unit tests, and solution looked a bit ugly :\u003c","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f55905591503fe27afb0e21e772797152f8e2924","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                    if not plugin.check_ports_exist_on_l3agent(context,"},{"line_number":326,"context_line":"                                                               l3_agent,"},{"line_number":327,"context_line":"                                                               router[\u0027id\u0027]):"},{"line_number":328,"context_line":"                        plugin.remove_router_from_l3_agent("},{"line_number":329,"context_line":"                            context, l3_agent[\u0027id\u0027], router[\u0027id\u0027])"},{"line_number":330,"context_line":"        router_interface_info \u003d self._make_router_interface_info("},{"line_number":331,"context_line":"            router[\u0027id\u0027], port[\u0027tenant_id\u0027], port[\u0027id\u0027], subnets[0][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_b288fb23","line":328,"in_reply_to":"7a2fa921_f02519c2","updated":"2015-10-06 16:36:13.000000000","message":"Done","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b1e552af6bbda846c9df7ccbe1429eaf614363b9","unresolved":false,"context_lines":[{"line_number":307,"context_line":"                        constants.L3_ROUTER_NAT)"},{"line_number":308,"context_line":"            l3_agents \u003d plugin.get_l3_agents_hosting_routers(context,"},{"line_number":309,"context_line":"                                                             [router[\u0027id\u0027]])"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"            for l3_agent in l3_agents:"},{"line_number":312,"context_line":"                mode \u003d agents_db.get_configuration_dict(l3_agent)[\u0027agent_mode\u0027]"},{"line_number":313,"context_line":"                if not (router.extra_attributes.ha and"}],"source_content_type":"text/x-python","patch_set":59,"id":"fa80f949_442a0a80","line":310,"updated":"2015-11-06 00:28:43.000000000","message":"nit:  Gratuitous whitespace addition.","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":307,"context_line":"                        constants.L3_ROUTER_NAT)"},{"line_number":308,"context_line":"            l3_agents \u003d plugin.get_l3_agents_hosting_routers(context,"},{"line_number":309,"context_line":"                                                             [router[\u0027id\u0027]])"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"            for l3_agent in l3_agents:"},{"line_number":312,"context_line":"                mode \u003d agents_db.get_configuration_dict(l3_agent)[\u0027agent_mode\u0027]"},{"line_number":313,"context_line":"                if not (router.extra_attributes.ha and"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_ae265e14","line":310,"in_reply_to":"fa80f949_442a0a80","updated":"2015-11-18 07:18:01.000000000","message":"Done","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b1e552af6bbda846c9df7ccbe1429eaf614363b9","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"            for l3_agent in l3_agents:"},{"line_number":312,"context_line":"                mode \u003d agents_db.get_configuration_dict(l3_agent)[\u0027agent_mode\u0027]"},{"line_number":313,"context_line":"                if not (router.extra_attributes.ha and"},{"line_number":314,"context_line":"                        mode \u003d\u003d l3_const.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":315,"context_line":"                    if not plugin.check_ports_exist_on_l3agent(context,"},{"line_number":316,"context_line":"                                                               l3_agent,"}],"source_content_type":"text/x-python","patch_set":59,"id":"fa80f949_24890627","line":313,"updated":"2015-11-06 00:28:43.000000000","message":"nit:  consider cleaning up this diff by changing this to:\n\n  if (router.extra_attributes.ha and \n      mode \u003d\u003d l3_const.L3_AGENT_MODE_DVR_SNAT):\n      continue\n\nThat would leave the original code at the same level of indent and clean up the diff considerably.  It can help reviewers to understand the diff more quickly.  In this example, -3,+8 reduces to -0,+3 which is a considerable difference.","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":310,"context_line":""},{"line_number":311,"context_line":"            for l3_agent in l3_agents:"},{"line_number":312,"context_line":"                mode \u003d agents_db.get_configuration_dict(l3_agent)[\u0027agent_mode\u0027]"},{"line_number":313,"context_line":"                if not (router.extra_attributes.ha and"},{"line_number":314,"context_line":"                        mode \u003d\u003d l3_const.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":315,"context_line":"                    if not plugin.check_ports_exist_on_l3agent(context,"},{"line_number":316,"context_line":"                                                               l3_agent,"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_ce23a204","line":313,"in_reply_to":"fa80f949_24890627","updated":"2015-11-18 07:18:01.000000000","message":"Done","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0b4ef43d81ca664fff7c9de721f70e0b2d5897f2","unresolved":false,"context_lines":[{"line_number":382,"context_line":"                        mode \u003d\u003d l3_const.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":383,"context_line":"                    continue"},{"line_number":384,"context_line":"                if not plugin.check_ports_exist_on_l3agent(context,"},{"line_number":385,"context_line":"                                                           l3_agent,"},{"line_number":386,"context_line":"                                                           router[\u0027id\u0027]):"},{"line_number":387,"context_line":"                    plugin.remove_router_from_l3_agent("},{"line_number":388,"context_line":"                        context, l3_agent[\u0027id\u0027], router[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":60,"id":"ba8a016a_e543a011","line":385,"updated":"2015-11-18 20:19:28.000000000","message":"nit: another gratuitous whitespace change.  Don\u0027t do another churn for this but watch out for it.","commit_id":"a744438c948db72761cd4011f4bc75d79beceecd"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"aa65c42713f0ec177590053e483d661263d27e1c","unresolved":false,"context_lines":[{"line_number":382,"context_line":"                        mode \u003d\u003d l3_const.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":383,"context_line":"                    continue"},{"line_number":384,"context_line":"                if not plugin.check_ports_exist_on_l3agent(context,"},{"line_number":385,"context_line":"                                                           l3_agent,"},{"line_number":386,"context_line":"                                                           router[\u0027id\u0027]):"},{"line_number":387,"context_line":"                    plugin.remove_router_from_l3_agent("},{"line_number":388,"context_line":"                        context, l3_agent[\u0027id\u0027], router[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":60,"id":"ba8a016a_85fad473","line":385,"in_reply_to":"ba8a016a_e543a011","updated":"2015-11-18 20:27:25.000000000","message":"Done","commit_id":"a744438c948db72761cd4011f4bc75d79beceecd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"f6309537de4b93afa45a2acdfcbef73db042d894","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                        continue"},{"line_number":388,"context_line":"                    if not plugin.check_ports_exist_on_l3agent(context,"},{"line_number":389,"context_line":"                                                               l3_agent,"},{"line_number":390,"context_line":"                                                               subnet_ids):"},{"line_number":391,"context_line":"                        plugin.remove_router_from_l3_agent("},{"line_number":392,"context_line":"                            context, l3_agent[\u0027id\u0027], router[\u0027id\u0027])"},{"line_number":393,"context_line":"        router_interface_info \u003d self._make_router_interface_info("}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_6453396c","line":390,"updated":"2015-12-02 18:50:36.000000000","message":"Yikes!  I missed this in my review of PS61.  Glad it was caught.","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"}],"neutron/db/l3_dvr_ha_scheduler_db.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c57e12263b6845c25432af927086355aafc2827a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        for router_info in remove_router_info:"},{"line_number":40,"context_line":"            router_id \u003d router_info[\u0027router_id\u0027]"},{"line_number":41,"context_line":"            agent_id \u003d router_info[\u0027agent_id\u0027]"},{"line_number":42,"context_line":"            dvrha_snat_bindings \u003d self._check_router_agent_ha_binding("},{"line_number":43,"context_line":"                context, router_id, agent_id)"},{"line_number":44,"context_line":"            if not dvrha_snat_bindings:"},{"line_number":45,"context_line":"                processed_remove_router_info.append(router_info)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5a5ae5dd_e5a600ad","line":42,"range":{"start_line":42,"start_character":12,"end_line":42,"end_character":31},"updated":"2016-02-08 10:32:56.000000000","message":"to be fixed since the method should return boolean","commit_id":"bad646790b13115eebd532ed81c88bc43de2abac"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"00f2b6925a902b970a4cf2dcb12c3f226cd3f654","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2016 Hewlett-Packard Enterprised Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":84,"id":"5a5ae5dd_cc42e80e","line":1,"updated":"2016-02-08 21:33:07.000000000","message":"No \"-\" in \"Hewlett Packard\" now\n\ns/Enterprised/Enterprise","commit_id":"bc75e820739f25535c08ca5efa0cc8f3e2a5b7d0"}],"neutron/db/l3_dvrhascheduler_db.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b7b86398374b6c592ac1415a85291303f2e65c","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        is_ha \u003d sync_router[\u0027ha\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        if is_ha:"},{"line_number":30,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":31,"context_line":"            active_l3_agents \u003d self.get_l3_agents(context, active\u003dTrue)"},{"line_number":32,"context_line":"            snat_candidates \u003d self.get_snat_candidates(sync_router,"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa32b979_98c71012","line":29,"updated":"2015-06-15 19:00:57.000000000","message":"nit:  I\u0027d prefer the \"return fast\" approach which would be to put the else clause first and return:  For me, this is more readable as it puts the simpler case first and communicates that the method is complete in that case.  Then, the rest of the method is ha specific.  It is just a nit, so I won\u0027t vote negatively for it.\n\n  if not is_ha:\n      super(...)\n      return\n\n  # The rest of the method indented 4 fewer spaces here.","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ee6fb0f692bc4d5cc2278c5556e1f37bc971373a","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        is_ha \u003d sync_router[\u0027ha\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        if is_ha:"},{"line_number":30,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":31,"context_line":"            active_l3_agents \u003d self.get_l3_agents(context, active\u003dTrue)"},{"line_number":32,"context_line":"            snat_candidates \u003d self.get_snat_candidates(sync_router,"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a50d1a3_273e5c28","line":29,"in_reply_to":"fa32b979_98c71012","updated":"2015-07-22 23:46:08.000000000","message":"Done","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b7b86398374b6c592ac1415a85291303f2e65c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            if not ha_network:"},{"line_number":39,"context_line":"                ha_network \u003d self._create_ha_network(context,"},{"line_number":40,"context_line":"                                                     sync_router[\u0027tenant_id\u0027])"},{"line_number":41,"context_line":"                self._set_vr_id(context, router_db, ha_network)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"            for chosen_agent in snat_candidates[: agents_required]:"},{"line_number":44,"context_line":"                port_binding \u003d self.add_ha_port(context.elevated(), router_id,"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa32b979_60ae0e87","line":41,"updated":"2015-06-15 19:00:57.000000000","message":"This seems to have some commonality with l3_hamode_db.py in create_router.  It is difficult for me to reconcile why some things are different and some are the same.  For example,\n\n- why _set_vr_id only conditionally here and unconditionally there\n- why not create ha interfaces here.","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ee6fb0f692bc4d5cc2278c5556e1f37bc971373a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            if not ha_network:"},{"line_number":39,"context_line":"                ha_network \u003d self._create_ha_network(context,"},{"line_number":40,"context_line":"                                                     sync_router[\u0027tenant_id\u0027])"},{"line_number":41,"context_line":"                self._set_vr_id(context, router_db, ha_network)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"            for chosen_agent in snat_candidates[: agents_required]:"},{"line_number":44,"context_line":"                port_binding \u003d self.add_ha_port(context.elevated(), router_id,"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a50d1a3_8d667128","line":41,"in_reply_to":"fa32b979_60ae0e87","updated":"2015-07-22 23:46:08.000000000","message":"moved the _set_vr_id outside of conditional. \n\n\nI am not too familiar with _create_ha_interfaces, but from what I can tell it does not assign the port bindings to a specific agent. \n\nfor the dvrha case we need to assign a \"chosen\" agent to the port binding.  _create_ha_interface does not return the port binding objects (doesn\u0027t return anything looks like), so we can\u0027t really use it here.","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"4b284166b413c40c960a645d2fc1713de15e4f97","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        \"\"\"Unbind the snat routers from the chosen l3 service agent."},{"line_number":67,"context_line":"           Then only if there are not more ha port bindings to the agent,"},{"line_number":68,"context_line":"           delelete the router. Do we need to delete them at all?"},{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":"        vm_ports \u003d []"},{"line_number":71,"context_line":"        router_removed_from \u003d []"}],"source_content_type":"text/x-python","patch_set":55,"id":"7a2fa921_b4c17256","line":68,"range":{"start_line":68,"start_character":32,"end_line":68,"end_character":65},"updated":"2015-10-08 09:32:26.000000000","message":"I think we can remove this question from comments.","commit_id":"d163d3d1aa7b24270321e4cf33dd857d875254b7"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"9a69b1ba1b7d98d643cfe0727fc0d070565aca04","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        \"\"\"Unbind the snat routers from the chosen l3 service agent."},{"line_number":67,"context_line":"           Then only if there are not more ha port bindings to the agent,"},{"line_number":68,"context_line":"           delelete the router. Do we need to delete them at all?"},{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":"        vm_ports \u003d []"},{"line_number":71,"context_line":"        router_removed_from \u003d []"}],"source_content_type":"text/x-python","patch_set":55,"id":"5a2ca52d_cace4fb4","line":68,"in_reply_to":"7a2fa921_5ab4c780","updated":"2015-10-13 11:41:15.000000000","message":"Done","commit_id":"d163d3d1aa7b24270321e4cf33dd857d875254b7"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"06031722fd44e542f6f1e73c02e08a8d41dfb422","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        \"\"\"Unbind the snat routers from the chosen l3 service agent."},{"line_number":67,"context_line":"           Then only if there are not more ha port bindings to the agent,"},{"line_number":68,"context_line":"           delelete the router. Do we need to delete them at all?"},{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":"        vm_ports \u003d []"},{"line_number":71,"context_line":"        router_removed_from \u003d []"}],"source_content_type":"text/x-python","patch_set":55,"id":"7a2fa921_5ab4c780","line":68,"in_reply_to":"7a2fa921_b4c17256","updated":"2015-10-08 10:18:57.000000000","message":"Will do if there\u0027s another revision.","commit_id":"d163d3d1aa7b24270321e4cf33dd857d875254b7"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b1e552af6bbda846c9df7ccbe1429eaf614363b9","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def schedule_snat_router(self, context, router_id, sync_router):"},{"line_number":31,"context_line":"        \"\"\"Schedule the snat router on l3 service agent."},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        if not sync_router[\u0027ha\u0027]:"},{"line_number":35,"context_line":"            super(L3_DVR_HA_scheduler_db_mixin, self).schedule_snat_router("}],"source_content_type":"text/x-python","patch_set":59,"id":"fa80f949_e4fe9e6a","line":32,"updated":"2015-11-06 00:28:43.000000000","message":"nit:  One line docstring","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def schedule_snat_router(self, context, router_id, sync_router):"},{"line_number":31,"context_line":"        \"\"\"Schedule the snat router on l3 service agent."},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        if not sync_router[\u0027ha\u0027]:"},{"line_number":35,"context_line":"            super(L3_DVR_HA_scheduler_db_mixin, self).schedule_snat_router("}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_2a5be588","line":32,"in_reply_to":"fa80f949_e4fe9e6a","updated":"2015-11-18 07:18:01.000000000","message":"Done","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b1e552af6bbda846c9df7ccbe1429eaf614363b9","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":116,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent."},{"line_number":117,"context_line":"        \"\"\""},{"line_number":118,"context_line":"        router_db \u003d self._get_router(context, router_id)"},{"line_number":119,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":120,"context_line":"            self._unbind_dvrha_snat_servicenode(context, router_id)"}],"source_content_type":"text/x-python","patch_set":59,"id":"fa80f949_84eeb2b2","line":117,"updated":"2015-11-06 00:28:43.000000000","message":"nit:  One line docstring","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":116,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent."},{"line_number":117,"context_line":"        \"\"\""},{"line_number":118,"context_line":"        router_db \u003d self._get_router(context, router_id)"},{"line_number":119,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":120,"context_line":"            self._unbind_dvrha_snat_servicenode(context, router_id)"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_ce516264","line":117,"in_reply_to":"fa80f949_84eeb2b2","updated":"2015-11-18 07:18:01.000000000","message":"Done","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"c76e67da511aadf933b10ebf77a9d7b9c015348b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_c496a5ef","line":1,"updated":"2015-12-02 18:52:14.000000000","message":"nit:  Just noticed this.  I probably isn\u0027t a big deal yet but you should start adding Hewlett-Packard Enterprise ... to these.\n\nOnly do it if another PS is needed.","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"651ec60ec08da65944da6396bbef26401bf1cdbf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_64f6d45e","line":1,"in_reply_to":"9a8ffd7b_c496a5ef","updated":"2015-12-02 20:25:50.000000000","message":"\"Hewlett Packard Enterprise...\", no \"-\" :)","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"},{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"814e79d6d90784329323005cbed27fe4e9b973ab","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                            context, host, subnet))"},{"line_number":82,"context_line":"                    if vm_ports:"},{"line_number":83,"context_line":"                        LOG.debug(\u0027One or more ports exist on the snat\u0027"},{"line_number":84,"context_line":"                                  \u0027 enabled l3_agent host %(host)s and\u0027"},{"line_number":85,"context_line":"                                  \u0027 router_id %(id)s\u0027,"},{"line_number":86,"context_line":"                                  {\u0027host\u0027: host, \u0027id\u0027: router_id})"},{"line_number":87,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_2bc99459","line":84,"updated":"2015-12-02 14:51:18.000000000","message":"nit: whitespaces at the end of line","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"9dc331a5fdce5f997634c76c938b92ce112fe8a1","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                            context, host, subnet))"},{"line_number":82,"context_line":"                    if vm_ports:"},{"line_number":83,"context_line":"                        LOG.debug(\u0027One or more ports exist on the snat\u0027"},{"line_number":84,"context_line":"                                  \u0027 enabled l3_agent host %(host)s and\u0027"},{"line_number":85,"context_line":"                                  \u0027 router_id %(id)s\u0027,"},{"line_number":86,"context_line":"                                  {\u0027host\u0027: host, \u0027id\u0027: router_id})"},{"line_number":87,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_931d4564","line":84,"in_reply_to":"9a8ffd7b_2bc99459","updated":"2015-12-02 17:48:39.000000000","message":"Will include in next patch if one is necessary\nDone","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"ea5a2983887aa6deebf05e5e4c236e7d6cb9a38b","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # For dvrha snat routers we have to schedule the snat on all"},{"line_number":39,"context_line":"        # snat candidates because they are all part of the vr group"},{"line_number":40,"context_line":"        snat_candidates \u003d self.get_ha_dvr_snat_candidates(context, sync_router)"},{"line_number":41,"context_line":"        for chosen_agent in snat_candidates:"},{"line_number":42,"context_line":"            self.bind_snat_and_router(context, router_id, [chosen_agent])"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_e60b367c","line":40,"updated":"2015-12-22 22:14:33.000000000","message":"pylint found this issue: You\u0027re calling get_ha_dvr_snat_candidates without the \u0027max_number_of_agents\u0027 parameter (Which is a mandatory param). I was curious how come Jenkins was otherwise voting +1 - Is this code (Lines 40 to 42) ever called? \u0027schedule_snat_router\u0027 is called from exactly one place, in l3_agent_scheduler._schedule_router, where it\u0027s called *only* for routers that are DVR but not HA.","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"20785db4df3965723ea1931a58d96ea356010599","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        # For dvrha snat routers we have to schedule the snat on all"},{"line_number":39,"context_line":"        # snat candidates because they are all part of the vr group"},{"line_number":40,"context_line":"        snat_candidates \u003d self.get_ha_dvr_snat_candidates(context, sync_router)"},{"line_number":41,"context_line":"        for chosen_agent in snat_candidates:"},{"line_number":42,"context_line":"            self.bind_snat_and_router(context, router_id, [chosen_agent])"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_f7b43ed2","line":40,"in_reply_to":"1a7b0d38_e60b367c","updated":"2015-12-23 01:30:28.000000000","message":"yes. This is a mistake. \nI moved the call to get_ha_dvr_snat_candidates to \nl3_agent_scheduler.py L243-245, and forgot to remove it from here. so Lines 40-42 never get called. I think this whole method can be removed now. I\u0027ll do so and retest.","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_6c97a53a","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2016-01-22 17:08:47.000000000","message":"nit:  2016.  :)  Probably means we\u0027ve changed this date twice in this patch.  :(\n\nAlso, we\u0027re Hewlett-Packard Enterprise now.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Hewlett-Packard Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_889d1c0c","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"in_reply_to":"9a68dd71_6c97a53a","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def get_ha_dvr_snat_candidates(self, context, sync_router,"},{"line_number":31,"context_line":"                                   max_number_of_agents):"},{"line_number":32,"context_line":"        \"\"\"Returns a list of available candidates for the rotuer"},{"line_number":33,"context_line":"            from the list of active l3_agents. Any active agent which is"},{"line_number":34,"context_line":"            already hosting the router will be give counted against the"},{"line_number":35,"context_line":"            max_number_of_agents. Only enough candidates to reach"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_8c9c595e","line":32,"range":{"start_line":32,"start_character":58,"end_line":32,"end_character":64},"updated":"2016-01-22 17:08:47.000000000","message":"nit: *router","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def get_ha_dvr_snat_candidates(self, context, sync_router,"},{"line_number":31,"context_line":"                                   max_number_of_agents):"},{"line_number":32,"context_line":"        \"\"\"Returns a list of available candidates for the rotuer"},{"line_number":33,"context_line":"            from the list of active l3_agents. Any active agent which is"},{"line_number":34,"context_line":"            already hosting the router will be give counted against the"},{"line_number":35,"context_line":"            max_number_of_agents. Only enough candidates to reach"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_a8a26049","line":32,"range":{"start_line":32,"start_character":58,"end_line":32,"end_character":64},"in_reply_to":"9a68dd71_8c9c595e","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                                   max_number_of_agents):"},{"line_number":32,"context_line":"        \"\"\"Returns a list of available candidates for the rotuer"},{"line_number":33,"context_line":"            from the list of active l3_agents. Any active agent which is"},{"line_number":34,"context_line":"            already hosting the router will be give counted against the"},{"line_number":35,"context_line":"            max_number_of_agents. Only enough candidates to reach"},{"line_number":36,"context_line":"            max_number_of_agents will be returned, or less if not enough"},{"line_number":37,"context_line":"            are available."}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_acb83dc9","line":34,"range":{"start_line":34,"start_character":47,"end_line":34,"end_character":51},"updated":"2016-01-22 17:08:47.000000000","message":"nit:  Remove \"give\"?","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                                   max_number_of_agents):"},{"line_number":32,"context_line":"        \"\"\"Returns a list of available candidates for the rotuer"},{"line_number":33,"context_line":"            from the list of active l3_agents. Any active agent which is"},{"line_number":34,"context_line":"            already hosting the router will be give counted against the"},{"line_number":35,"context_line":"            max_number_of_agents. Only enough candidates to reach"},{"line_number":36,"context_line":"            max_number_of_agents will be returned, or less if not enough"},{"line_number":37,"context_line":"            are available."}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_c865541e","line":34,"range":{"start_line":34,"start_character":47,"end_line":34,"end_character":51},"in_reply_to":"9a68dd71_acb83dc9","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        :return: list of active l3_agent candidates"},{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        # Get a list of all active agents whicha are allowed to bind"},{"line_number":42,"context_line":"        # the router and return enough to meet max_number_of_agents"},{"line_number":43,"context_line":"        active_l3_agents \u003d self.get_l3_agents(context, active\u003dTrue)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_8cb3f9e8","line":41,"range":{"start_line":41,"start_character":42,"end_line":41,"end_character":48},"updated":"2016-01-22 17:08:47.000000000","message":"nit: *which","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        if len(l3_agents_hosting_router) \u003e\u003d max_number_of_agents:"},{"line_number":53,"context_line":"            selected \u003d []"},{"line_number":54,"context_line":"        else:"},{"line_number":55,"context_line":"            # how many new agents do we need:"},{"line_number":56,"context_line":"            needed \u003d max_number_of_agents - len(l3_agents_hosting_router)"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_cce491e2","line":53,"range":{"start_line":53,"start_character":11,"end_line":53,"end_character":25},"updated":"2016-01-22 17:08:47.000000000","message":"nit:  Just this makes it clear we\u0027re done with this case.  It helps readability.\n\n  return []\n\nIt also means the \u0027else\u0027 can be removed and the rest of the method doesn\u0027t need to be indented.  It all helps readability.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        if len(l3_agents_hosting_router) \u003e\u003d max_number_of_agents:"},{"line_number":53,"context_line":"            selected \u003d []"},{"line_number":54,"context_line":"        else:"},{"line_number":55,"context_line":"            # how many new agents do we need:"},{"line_number":56,"context_line":"            needed \u003d max_number_of_agents - len(l3_agents_hosting_router)"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_4b44fe48","line":53,"range":{"start_line":53,"start_character":11,"end_line":53,"end_character":25},"in_reply_to":"9a68dd71_cce491e2","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            # how many new agents do we need:"},{"line_number":56,"context_line":"            needed \u003d max_number_of_agents - len(l3_agents_hosting_router)"},{"line_number":57,"context_line":"            candidate_set \u003d set(l3_agent_candidates)"},{"line_number":58,"context_line":"            hosting_set \u003d set(l3_agents_hosting_router)"},{"line_number":59,"context_line":"            pool_of_candidates \u003d list(candidate_set - hosting_set)"},{"line_number":60,"context_line":"            selected \u003d self.get_snat_candidates(sync_router,"},{"line_number":61,"context_line":"                                                pool_of_candidates[:needed])"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_4cd181f9","line":58,"updated":"2016-01-22 17:08:47.000000000","message":"nit:  Why not just convert them to a set right up front?  (L45, L49)","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            # how many new agents do we need:"},{"line_number":56,"context_line":"            needed \u003d max_number_of_agents - len(l3_agents_hosting_router)"},{"line_number":57,"context_line":"            candidate_set \u003d set(l3_agent_candidates)"},{"line_number":58,"context_line":"            hosting_set \u003d set(l3_agents_hosting_router)"},{"line_number":59,"context_line":"            pool_of_candidates \u003d list(candidate_set - hosting_set)"},{"line_number":60,"context_line":"            selected \u003d self.get_snat_candidates(sync_router,"},{"line_number":61,"context_line":"                                                pool_of_candidates[:needed])"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_4b6b9eb7","line":58,"in_reply_to":"9a68dd71_4cd181f9","updated":"2016-01-22 20:07:12.000000000","message":"If we already have enough agents (L52) we don\u0027t need to do it, so putting it here saves us a few cpu cycles.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":74,"context_line":"           Then only if there are not more ha port bindings to the agent,"},{"line_number":75,"context_line":"           delete the router."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        vm_ports \u003d []"},{"line_number":78,"context_line":"        router_removed_from \u003d []"},{"line_number":79,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":80,"context_line":"            query_sb \u003d (context.session."}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_cc0b318d","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":16},"updated":"2016-01-22 17:08:47.000000000","message":"The positioning of this initialization is making me wonder...  The only reason this initialization would be meaningful is if subnet_ids on L87 is empty.  In that case L103 would read this empty list.\n\nBut, What happens if vm_ports is left non-empty and then the for loop on L84 goes to the next iteration.  This wouldn\u0027t get re-initialized.  Then, if subnet_ids is empty, L103 would use the previous iteration\u0027s value of vm_ports.  That seems bad to me.\n\nBottom line:  I think this initialization belongs inside L84\u0027s for loop.  I suspect the most natural place for it is before L87.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":74,"context_line":"           Then only if there are not more ha port bindings to the agent,"},{"line_number":75,"context_line":"           delete the router."},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        vm_ports \u003d []"},{"line_number":78,"context_line":"        router_removed_from \u003d []"},{"line_number":79,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":80,"context_line":"            query_sb \u003d (context.session."}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_ebe4d2e1","line":77,"range":{"start_line":77,"start_character":8,"end_line":77,"end_character":16},"in_reply_to":"9a68dd71_cc0b318d","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                                \u0027id\u0027: agent_id})"},{"line_number":101,"context_line":"                context.session.delete(binding)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"                if not vm_ports:"},{"line_number":104,"context_line":"                    (context.session."},{"line_number":105,"context_line":"                     query(RouterL3AgentBinding)."},{"line_number":106,"context_line":"                     filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_ef9147f2","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":31},"updated":"2016-01-22 17:08:47.000000000","message":"nit:  Try to reduce indentation where possible:\n\n  if vm_ports:\n      continue\n\n  (context.session...)","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                                \u0027id\u0027: agent_id})"},{"line_number":101,"context_line":"                context.session.delete(binding)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"                if not vm_ports:"},{"line_number":104,"context_line":"                    (context.session."},{"line_number":105,"context_line":"                     query(RouterL3AgentBinding)."},{"line_number":106,"context_line":"                     filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_4bfb9e79","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":31},"in_reply_to":"9a68dd71_ef9147f2","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"89254c8abc038a060388cb642f18eb54aece6eb9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2016 Hewlett-Packard Enterprised Development Company, L.P."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":75,"id":"9a68dd71_635f2676","line":1,"range":{"start_line":1,"start_character":47,"end_line":1,"end_character":48},"updated":"2016-01-26 16:29:37.000000000","message":"nit:  No \u0027d\u0027","commit_id":"34a31d9bfa0fddaf513bea81b11ca2f882b1a95f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.db.l3_agentschedulers_db import RouterL3AgentBinding"},{"line_number":17,"context_line":"from neutron.db.l3_dvrscheduler_db import CentralizedSnatL3AgentBinding"},{"line_number":18,"context_line":"from neutron.db.l3_dvrscheduler_db import L3_DVRsch_db_mixin"},{"line_number":19,"context_line":"from neutron.db.l3_hamode_db import L3HARouterAgentPortBinding"},{"line_number":20,"context_line":"from neutron.db.l3_hascheduler_db import L3_HA_scheduler_db_mixin"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from oslo_log import log as logging"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_cd9cc45f","line":20,"range":{"start_line":16,"start_character":0,"end_line":20,"end_character":65},"updated":"2016-01-28 19:58:43.000000000","message":"\"Do not import objects, only modules\" http://docs.openstack.org/developer/hacking/#imports","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"b122d9966a01ca391c166dd0c5723e1ab7cad7ac","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.db.l3_agentschedulers_db import RouterL3AgentBinding"},{"line_number":17,"context_line":"from neutron.db.l3_dvrscheduler_db import CentralizedSnatL3AgentBinding"},{"line_number":18,"context_line":"from neutron.db.l3_dvrscheduler_db import L3_DVRsch_db_mixin"},{"line_number":19,"context_line":"from neutron.db.l3_hamode_db import L3HARouterAgentPortBinding"},{"line_number":20,"context_line":"from neutron.db.l3_hascheduler_db import L3_HA_scheduler_db_mixin"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from oslo_log import log as logging"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_d867a123","line":20,"range":{"start_line":16,"start_character":0,"end_line":20,"end_character":65},"in_reply_to":"7a5de9d1_cd9cc45f","updated":"2016-01-28 21:08:00.000000000","message":"Done","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                                           sync_router,"},{"line_number":47,"context_line":"                                                           active_l3_agents)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_agents_hosting_routers("},{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        if len(l3_agents_hosting_router) \u003e\u003d max_number_of_agents:"}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_add148cf","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":32},"updated":"2016-01-28 19:58:43.000000000","message":"Currently it will return also agents in \u0027dvr\u0027 mode which are not suitable for HA it seems. We should count only dvr_snat agents.","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"84518621a6cf386e516daa3145717f9cba79370d","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                                           sync_router,"},{"line_number":47,"context_line":"                                                           active_l3_agents)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_agents_hosting_routers("},{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        if len(l3_agents_hosting_router) \u003e\u003d max_number_of_agents:"}],"source_content_type":"text/x-python","patch_set":77,"id":"5a5ae5dd_83d6c3c3","line":49,"range":{"start_line":49,"start_character":8,"end_line":49,"end_character":32},"in_reply_to":"7a5de9d1_add148cf","updated":"2016-02-03 21:44:50.000000000","message":"Fixed on ps 78","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return query.all()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def _unbind_dvrha_snat_servicenode(self, context, router_id):"},{"line_number":72,"context_line":"        \"\"\"Unbind the snat routers from the chosen l3 service agent."},{"line_number":73,"context_line":"           Then only if there are not more ha port bindings to the agent,"},{"line_number":74,"context_line":"           delete the router."},{"line_number":75,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_ad9f0802","line":72,"range":{"start_line":72,"start_character":44,"end_line":72,"end_character":67},"updated":"2016-01-28 19:58:43.000000000","message":"which chosen agent? It unbinds from all snat agents I guess","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"84518621a6cf386e516daa3145717f9cba79370d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return query.all()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def _unbind_dvrha_snat_servicenode(self, context, router_id):"},{"line_number":72,"context_line":"        \"\"\"Unbind the snat routers from the chosen l3 service agent."},{"line_number":73,"context_line":"           Then only if there are not more ha port bindings to the agent,"},{"line_number":74,"context_line":"           delete the router."},{"line_number":75,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":77,"id":"5a5ae5dd_c3f35b72","line":72,"range":{"start_line":72,"start_character":44,"end_line":72,"end_character":67},"in_reply_to":"7a5de9d1_ad9f0802","updated":"2016-02-03 21:44:50.000000000","message":"This function has been removed on PS 80","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                 filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."},{"line_number":107,"context_line":"                 delete(synchronize_session\u003dFalse))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"                if not self._agent_ha_port_bindings(context, router_id,"},{"line_number":110,"context_line":"                                                    agent_id):"},{"line_number":111,"context_line":"                    router_removed_from.append(host)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_48c4425e","line":109,"range":{"start_line":109,"start_character":28,"end_line":109,"end_character":51},"updated":"2016-01-28 19:58:43.000000000","message":"at this point we already deleted both snat and distributed bindings of the router, aren\u0027t these ha_port_bindings orphaned? I might be missing something","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"84518621a6cf386e516daa3145717f9cba79370d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                 filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."},{"line_number":107,"context_line":"                 delete(synchronize_session\u003dFalse))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"                if not self._agent_ha_port_bindings(context, router_id,"},{"line_number":110,"context_line":"                                                    agent_id):"},{"line_number":111,"context_line":"                    router_removed_from.append(host)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"5a5ae5dd_16145342","line":109,"range":{"start_line":109,"start_character":28,"end_line":109,"end_character":51},"in_reply_to":"7a5de9d1_48c4425e","updated":"2016-02-03 21:44:50.000000000","message":"Same as last comment, this method has been removed","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                          \u0027agent %(id)s\u0027,"},{"line_number":115,"context_line":"                          {\u0027router_id\u0027: router_id, \u0027id\u0027: agent_id})"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        self.l3_rpc_notifier.routers_updated(context, [router_id])"},{"line_number":118,"context_line":"        for host in router_removed_from:"},{"line_number":119,"context_line":"            self.l3_rpc_notifier.router_removed_from_agent(context,"},{"line_number":120,"context_line":"                                                           router_id,"}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_6d5fd041","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":66},"updated":"2016-01-28 19:58:43.000000000","message":"why need to update agents which are still hosting the router, has anything changed for them?","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                                                           host)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":124,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent.\"\"\""},{"line_number":125,"context_line":"        router_db \u003d self._get_router(context, router_id)"},{"line_number":126,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":127,"context_line":"            self._unbind_dvrha_snat_servicenode(context, router_id)"}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_8d5a4c4f","line":124,"range":{"start_line":124,"start_character":34,"end_line":124,"end_character":36},"updated":"2016-01-28 19:58:43.000000000","message":"from","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"84518621a6cf386e516daa3145717f9cba79370d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                                                           host)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":124,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent.\"\"\""},{"line_number":125,"context_line":"        router_db \u003d self._get_router(context, router_id)"},{"line_number":126,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":127,"context_line":"            self._unbind_dvrha_snat_servicenode(context, router_id)"}],"source_content_type":"text/x-python","patch_set":77,"id":"5a5ae5dd_f61ad76d","line":124,"range":{"start_line":124,"start_character":34,"end_line":124,"end_character":36},"in_reply_to":"7a5de9d1_8d5a4c4f","updated":"2016-02-03 21:44:50.000000000","message":"method has been removed on PS79","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        if not remove_router_info:"},{"line_number":139,"context_line":"            return []"},{"line_number":140,"context_line":"        # Process the router information which was returned to make"},{"line_number":141,"context_line":"        # sure we don\u0027t delete routers which have dvrhs snat bindings."},{"line_number":142,"context_line":"        processed_remove_router_info \u003d []"},{"line_number":143,"context_line":"        for router_info in remove_router_info:"},{"line_number":144,"context_line":"            router_id \u003d router_info[\u0027router_id\u0027]"}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_281ea663","line":141,"range":{"start_line":141,"start_character":50,"end_line":141,"end_character":55},"updated":"2016-01-28 19:58:43.000000000","message":"dvrha","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"84518621a6cf386e516daa3145717f9cba79370d","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        if not remove_router_info:"},{"line_number":139,"context_line":"            return []"},{"line_number":140,"context_line":"        # Process the router information which was returned to make"},{"line_number":141,"context_line":"        # sure we don\u0027t delete routers which have dvrhs snat bindings."},{"line_number":142,"context_line":"        processed_remove_router_info \u003d []"},{"line_number":143,"context_line":"        for router_info in remove_router_info:"},{"line_number":144,"context_line":"            router_id \u003d router_info[\u0027router_id\u0027]"}],"source_content_type":"text/x-python","patch_set":77,"id":"5a5ae5dd_d61d5b67","line":141,"range":{"start_line":141,"start_character":50,"end_line":141,"end_character":55},"in_reply_to":"7a5de9d1_281ea663","updated":"2016-02-03 21:44:50.000000000","message":"method has been removed","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":27,"context_line":"class L3_DVR_HA_scheduler_db_mixin(L3_DVRsch_db_mixin,"},{"line_number":28,"context_line":"                                   L3_HA_scheduler_db_mixin):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def get_l3_dvr_snat_agents_hosting_routers(self, context, router_ids,"},{"line_number":31,"context_line":"                                               admin_state_up\u003dNone,"},{"line_number":32,"context_line":"                                               active\u003dNone):"},{"line_number":33,"context_line":"        l3_dvr_snat_agents \u003d []"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_8c05fd11","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":46},"updated":"2016-02-01 13:40:28.000000000","message":"only dvr_snat agents can host dvr(+HA) routers, so what is this function for?","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def get_l3_dvr_snat_agents_hosting_routers(self, context, router_ids,"},{"line_number":31,"context_line":"                                               admin_state_up\u003dNone,"},{"line_number":32,"context_line":"                                               active\u003dNone):"},{"line_number":33,"context_line":"        l3_dvr_snat_agents \u003d []"},{"line_number":34,"context_line":"        l3_agents \u003d self.get_l3_agents_hosting_routers("},{"line_number":35,"context_line":"                context, router_ids, admin_state_up\u003dadmin_state_up)"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_aa6f7cfa","line":32,"range":{"start_line":32,"start_character":47,"end_line":32,"end_character":53},"updated":"2016-02-01 13:40:28.000000000","message":"not needed?","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                                           active_l3_agents)"},{"line_number":62,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_dvr_snat_agents_hosting_routers("},{"line_number":63,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":64,"context_line":"        # We only want to count agents who are in dvr_snat mode"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        if len(l3_agents_hosting_router) \u003e\u003d max_number_of_agents:"},{"line_number":67,"context_line":"            return []"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_4c22a5a4","line":64,"range":{"start_line":64,"start_character":7,"end_line":64,"end_character":63},"updated":"2016-02-01 13:40:28.000000000","message":"to be removed","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"494a8d2426747b43de3e769beff574961dc3bf85","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                                                           active_l3_agents)"},{"line_number":62,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_dvr_snat_agents_hosting_routers("},{"line_number":63,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":64,"context_line":"        # We only want to count agents who are in dvr_snat mode"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        if len(l3_agents_hosting_router) \u003e\u003d max_number_of_agents:"},{"line_number":67,"context_line":"            return []"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_2cdcfe71","line":64,"range":{"start_line":64,"start_character":7,"end_line":64,"end_character":63},"in_reply_to":"7a5de9d1_4c22a5a4","updated":"2016-02-01 22:59:57.000000000","message":"Done","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return query.all()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _unbind_dvrha_snat_servicenode(self, context, router_id):"},{"line_number":88,"context_line":"        \"\"\"Unbind the snat routers from the chosen l3 service agent."},{"line_number":89,"context_line":"           Then only if there are not more ha port bindings to the agent,"},{"line_number":90,"context_line":"           delete the router."},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_8f05ef11","line":88,"range":{"start_line":88,"start_character":40,"end_line":88,"end_character":50},"updated":"2016-02-01 13:40:28.000000000","message":"no chosen agent","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        \"\"\""},{"line_number":92,"context_line":"        router_removed_from \u003d []"},{"line_number":93,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":94,"context_line":"            query_sb \u003d (context.session."},{"line_number":95,"context_line":"                        query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":96,"context_line":"                        filter_by(router_id\u003drouter_id))"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_ef44a34a","line":94,"range":{"start_line":94,"start_character":17,"end_line":94,"end_character":20},"updated":"2016-02-01 13:40:28.000000000","message":"what sb suffix means?","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"494a8d2426747b43de3e769beff574961dc3bf85","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        \"\"\""},{"line_number":92,"context_line":"        router_removed_from \u003d []"},{"line_number":93,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":94,"context_line":"            query_sb \u003d (context.session."},{"line_number":95,"context_line":"                        query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":96,"context_line":"                        filter_by(router_id\u003drouter_id))"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_8c0892db","line":94,"range":{"start_line":94,"start_character":17,"end_line":94,"end_character":20},"in_reply_to":"7a5de9d1_ef44a34a","updated":"2016-02-01 22:59:57.000000000","message":"Done","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        router_removed_from \u003d []"},{"line_number":93,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":94,"context_line":"            query_sb \u003d (context.session."},{"line_number":95,"context_line":"                        query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":96,"context_line":"                        filter_by(router_id\u003drouter_id))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            for binding in query_sb:"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_0fc33f8a","line":95,"range":{"start_line":95,"start_character":24,"end_line":95,"end_character":66},"updated":"2016-02-01 13:40:28.000000000","message":"please join l3 agent here to avoid second db query at #99","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"494a8d2426747b43de3e769beff574961dc3bf85","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        router_removed_from \u003d []"},{"line_number":93,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":94,"context_line":"            query_sb \u003d (context.session."},{"line_number":95,"context_line":"                        query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":96,"context_line":"                        filter_by(router_id\u003drouter_id))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            for binding in query_sb:"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_69a18845","line":95,"range":{"start_line":95,"start_character":24,"end_line":95,"end_character":66},"in_reply_to":"7a5de9d1_0fc33f8a","updated":"2016-02-01 22:59:57.000000000","message":"not clear what you mean. Please provide code. tx","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"                if vm_ports:"},{"line_number":119,"context_line":"                    continue"},{"line_number":120,"context_line":"                (context.session."},{"line_number":121,"context_line":"                 query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":122,"context_line":"                 filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."},{"line_number":123,"context_line":"                 delete(synchronize_session\u003dFalse))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"                if not self._agent_ha_port_bindings(context, router_id,"},{"line_number":126,"context_line":"                                                    agent_id):"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_4f84d709","line":123,"range":{"start_line":120,"start_character":16,"end_line":123,"end_character":51},"updated":"2016-02-01 13:40:28.000000000","message":"this was done at #116, no?","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"494a8d2426747b43de3e769beff574961dc3bf85","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"                if vm_ports:"},{"line_number":119,"context_line":"                    continue"},{"line_number":120,"context_line":"                (context.session."},{"line_number":121,"context_line":"                 query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":122,"context_line":"                 filter_by(router_id\u003drouter_id, l3_agent_id\u003dagent_id)."},{"line_number":123,"context_line":"                 delete(synchronize_session\u003dFalse))"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"                if not self._agent_ha_port_bindings(context, router_id,"},{"line_number":126,"context_line":"                                                    agent_id):"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_47259359","line":123,"range":{"start_line":120,"start_character":16,"end_line":123,"end_character":51},"in_reply_to":"7a5de9d1_4f84d709","updated":"2016-02-01 22:59:57.000000000","message":"Done","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                                                           router_id,"},{"line_number":137,"context_line":"                                                           host)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":140,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent."},{"line_number":141,"context_line":"        :param router_id:"},{"line_number":142,"context_line":"        :param context:"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_cfbe87ad","line":139,"range":{"start_line":139,"start_character":8,"end_line":139,"end_character":31},"updated":"2016-02-01 13:40:28.000000000","message":"this was deleted during dvr scheduling refactoring, please check","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"494a8d2426747b43de3e769beff574961dc3bf85","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                                                           router_id,"},{"line_number":137,"context_line":"                                                           host)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":140,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent."},{"line_number":141,"context_line":"        :param router_id:"},{"line_number":142,"context_line":"        :param context:"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_9800be03","line":139,"range":{"start_line":139,"start_character":8,"end_line":139,"end_character":31},"in_reply_to":"7a5de9d1_cfbe87ad","updated":"2016-02-01 22:59:57.000000000","message":"Done","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"fcb01b451ba4e3de5438b87e1ab99a2427e2d096","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            super(L3_DVR_HA_scheduler_db_mixin,"},{"line_number":149,"context_line":"                  self).unbind_snat_servicenode(context, router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def dvr_deletens_if_no_port(self, context, port_id, port_host\u003dNone):"},{"line_number":152,"context_line":"        \"\"\"Delete the DVR namespace if no dvr serviced port exists."},{"line_number":153,"context_line":"        :param port_host:"},{"line_number":154,"context_line":"        :param port_id:"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_cc8a1564","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":31},"updated":"2016-02-01 13:40:28.000000000","message":"this method was renamed recently https://review.openstack.org/#/c/272555/","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"494a8d2426747b43de3e769beff574961dc3bf85","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            super(L3_DVR_HA_scheduler_db_mixin,"},{"line_number":149,"context_line":"                  self).unbind_snat_servicenode(context, router_id)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def dvr_deletens_if_no_port(self, context, port_id, port_host\u003dNone):"},{"line_number":152,"context_line":"        \"\"\"Delete the DVR namespace if no dvr serviced port exists."},{"line_number":153,"context_line":"        :param port_host:"},{"line_number":154,"context_line":"        :param port_id:"}],"source_content_type":"text/x-python","patch_set":78,"id":"7a5de9d1_33020b0b","line":151,"range":{"start_line":151,"start_character":8,"end_line":151,"end_character":31},"in_reply_to":"7a5de9d1_cc8a1564","updated":"2016-02-01 22:59:57.000000000","message":"Done","commit_id":"872e53eec5134ac488c04e361207b88286be039a"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"05573c578636384c4e60008c8a43addc3221c1e1","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        if not remove_router_info:"},{"line_number":85,"context_line":"            return []"},{"line_number":86,"context_line":"        # Process the router information which was returned to make"},{"line_number":87,"context_line":"        # sure we don\u0027t delete routers which have dvrhs snat bindings."},{"line_number":88,"context_line":"        processed_remove_router_info \u003d []"},{"line_number":89,"context_line":"        for router_info in remove_router_info:"},{"line_number":90,"context_line":"            router_id \u003d router_info[\u0027router_id\u0027]"}],"source_content_type":"text/x-python","patch_set":79,"id":"7a5de9d1_f35553f9","line":87,"range":{"start_line":87,"start_character":50,"end_line":87,"end_character":55},"updated":"2016-02-01 23:02:19.000000000","message":"nit:Is it supposed to be \u0027dvrha\u0027","commit_id":"238171f317772b76f4cd121a37fe81e86150fad8"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":82,"id":"5a5ae5dd_03a6fdad","updated":"2016-02-05 10:36:26.000000000","message":"l3_dvr_ha_scheduler.py is better for visual parsing","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def get_ha_dvr_snat_candidates(self, context, sync_router,"},{"line_number":29,"context_line":"                                   max_number_of_agents):"},{"line_number":30,"context_line":"        \"\"\"Returns a list of available candidates for the router"},{"line_number":31,"context_line":"            from the list of active l3_agents. Any active agent which is"},{"line_number":32,"context_line":"            already hosting the router will be counted against the"},{"line_number":33,"context_line":"            max_number_of_agents. Only enough candidates to reach"},{"line_number":34,"context_line":"            max_number_of_agents will be returned, or less if not enough"},{"line_number":35,"context_line":"            are available."},{"line_number":36,"context_line":"        :param max_number_of_agents:"},{"line_number":37,"context_line":"        :param sync_router:"},{"line_number":38,"context_line":"        :param context:"},{"line_number":39,"context_line":"        :return: list of active l3_agent candidates"},{"line_number":40,"context_line":"        \"\"\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # Get a list of all active agents which are allowed to bind"},{"line_number":43,"context_line":"        # the router and return enough to meet max_number_of_agents"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_f72843e4","line":40,"range":{"start_line":30,"start_character":8,"end_line":40,"end_character":11},"updated":"2016-02-05 10:36:26.000000000","message":"The docstring seems unfinished, also please follow http://docs.openstack.org/developer/hacking/#docstrings","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        l3_agent_candidates \u003d self.get_l3_agent_candidates(context,"},{"line_number":47,"context_line":"                                                           sync_router,"},{"line_number":48,"context_line":"                                                           active_l3_agents)"},{"line_number":49,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_agents_hosting_routers("},{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":"        # We only want to count agents who are in dvr_snat mode"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_ba789490","line":49,"range":{"start_line":49,"start_character":40,"end_line":49,"end_character":69},"updated":"2016-02-04 15:49:16.000000000","message":"should this rather be list_l3_agents_hosting_router()? I see it updated in this patch so asking.","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        l3_agent_candidates \u003d self.get_l3_agent_candidates(context,"},{"line_number":47,"context_line":"                                                           sync_router,"},{"line_number":48,"context_line":"                                                           active_l3_agents)"},{"line_number":49,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_agents_hosting_routers("},{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":"        # We only want to count agents who are in dvr_snat mode"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_77a3f3b2","line":49,"range":{"start_line":49,"start_character":40,"end_line":49,"end_character":69},"in_reply_to":"5a5ae5dd_4948b82d","updated":"2016-02-05 10:36:26.000000000","message":"get_l3_agents_hosting_routers() counts only RouterL3AgentBinding while here we need to count also L3HARouterAgentPortBinding, that\u0027s why we should use list_l3_agents_hosting_router() unless I\u0027m missing something","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"0e23a4fca6235ae271c5652d2850d004e14c05cc","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        l3_agent_candidates \u003d self.get_l3_agent_candidates(context,"},{"line_number":47,"context_line":"                                                           sync_router,"},{"line_number":48,"context_line":"                                                           active_l3_agents)"},{"line_number":49,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_agents_hosting_routers("},{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":"        # We only want to count agents who are in dvr_snat mode"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_4948b82d","line":49,"range":{"start_line":49,"start_character":40,"end_line":49,"end_character":69},"in_reply_to":"5a5ae5dd_ba789490","updated":"2016-02-04 17:12:19.000000000","message":"Will change if a new patch is needed.","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                                                           active_l3_agents)"},{"line_number":49,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_agents_hosting_routers("},{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":"        # We only want to count agents who are in dvr_snat mode"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if len(l3_agents_hosting_router) \u003e\u003d max_number_of_agents:"},{"line_number":54,"context_line":"            return []"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_66e4c80c","line":51,"range":{"start_line":51,"start_character":8,"end_line":51,"end_character":63},"updated":"2016-02-04 15:49:16.000000000","message":"to be removed?","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"0e23a4fca6235ae271c5652d2850d004e14c05cc","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                                                           active_l3_agents)"},{"line_number":49,"context_line":"        l3_agents_hosting_router \u003d self.get_l3_agents_hosting_routers("},{"line_number":50,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":51,"context_line":"        # We only want to count agents who are in dvr_snat mode"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        if len(l3_agents_hosting_router) \u003e\u003d max_number_of_agents:"},{"line_number":54,"context_line":"            return []"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_6959f4fd","line":51,"range":{"start_line":51,"start_character":8,"end_line":51,"end_character":63},"in_reply_to":"5a5ae5dd_66e4c80c","updated":"2016-02-04 17:12:19.000000000","message":"Will remove on next ps upload.","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        hosting_set \u003d set(l3_agents_hosting_router)"},{"line_number":59,"context_line":"        pool_of_candidates \u003d list(candidate_set - hosting_set)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        selected \u003d self.get_l3_agent_candidates(context, sync_router,"},{"line_number":62,"context_line":"                                                pool_of_candidates[:needed],"},{"line_number":63,"context_line":"                                                ignore_admin_state\u003dTrue)"},{"line_number":64,"context_line":"        return selected"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_c689fc27","line":61,"range":{"start_line":61,"start_character":24,"end_line":61,"end_character":47},"updated":"2016-02-04 15:49:16.000000000","message":"why need to call it second time? Won\u0027t it retunt just all pool_of_candidates[:needed] passed to it?","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"0e23a4fca6235ae271c5652d2850d004e14c05cc","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        hosting_set \u003d set(l3_agents_hosting_router)"},{"line_number":59,"context_line":"        pool_of_candidates \u003d list(candidate_set - hosting_set)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        selected \u003d self.get_l3_agent_candidates(context, sync_router,"},{"line_number":62,"context_line":"                                                pool_of_candidates[:needed],"},{"line_number":63,"context_line":"                                                ignore_admin_state\u003dTrue)"},{"line_number":64,"context_line":"        return selected"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_69b1f4e0","line":61,"range":{"start_line":61,"start_character":24,"end_line":61,"end_character":47},"in_reply_to":"5a5ae5dd_c689fc27","updated":"2016-02-04 17:12:19.000000000","message":"I belevie you are correct. Will upload on next PS","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        pool_of_candidates \u003d list(candidate_set - hosting_set)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        selected \u003d self.get_l3_agent_candidates(context, sync_router,"},{"line_number":62,"context_line":"                                                pool_of_candidates[:needed],"},{"line_number":63,"context_line":"                                                ignore_admin_state\u003dTrue)"},{"line_number":64,"context_line":"        return selected"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_636b30f2","line":62,"range":{"start_line":62,"start_character":48,"end_line":62,"end_character":76},"updated":"2016-02-05 10:36:26.000000000","message":"I suspect this method is trying to do what l3_agent_scheduler is actually doing: we\u0027re filtering just first needed agents thus letting no chance to, say, LeastRoutersScheduler to filter agents with least number of routers. It seems l3_agent_scheduler has all it needs to get and schedule a router to the right number of agents. Please see comments in l3_agent_scheduler on this.","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        return selected"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"},{"line_number":67,"context_line":"    def _agent_ha_port_bindings(context, router_id, agent_id):"},{"line_number":68,"context_line":"        query \u003d context.session.query(l3agen_ha_db.L3HARouterAgentPortBinding)"},{"line_number":69,"context_line":"        query \u003d query.filter("},{"line_number":70,"context_line":"            l3agen_ha_db.L3HARouterAgentPortBinding.router_id \u003d\u003d router_id,"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_b77f2baa","line":67,"range":{"start_line":67,"start_character":8,"end_line":67,"end_character":31},"updated":"2016-02-05 10:36:26.000000000","message":"Consider check_router_agent_ha_binding() as that\u0027s how it actually used. Also logically this should be L3_HA_scheduler_db_mixin method for better separation of concerns","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        return selected"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"},{"line_number":67,"context_line":"    def _agent_ha_port_bindings(context, router_id, agent_id):"},{"line_number":68,"context_line":"        query \u003d context.session.query(l3agen_ha_db.L3HARouterAgentPortBinding)"},{"line_number":69,"context_line":"        query \u003d query.filter("},{"line_number":70,"context_line":"            l3agen_ha_db.L3HARouterAgentPortBinding.router_id \u003d\u003d router_id,"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_c67a5cf1","line":67,"range":{"start_line":67,"start_character":8,"end_line":67,"end_character":31},"updated":"2016-02-04 15:49:16.000000000","message":"there can be only one HA binding between router and l3 agent, so why plural?","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"0e23a4fca6235ae271c5652d2850d004e14c05cc","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        return selected"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"},{"line_number":67,"context_line":"    def _agent_ha_port_bindings(context, router_id, agent_id):"},{"line_number":68,"context_line":"        query \u003d context.session.query(l3agen_ha_db.L3HARouterAgentPortBinding)"},{"line_number":69,"context_line":"        query \u003d query.filter("},{"line_number":70,"context_line":"            l3agen_ha_db.L3HARouterAgentPortBinding.router_id \u003d\u003d router_id,"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_29a53ca1","line":67,"range":{"start_line":67,"start_character":8,"end_line":67,"end_character":31},"in_reply_to":"5a5ae5dd_c67a5cf1","updated":"2016-02-04 17:12:19.000000000","message":"Done","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"0e23a4fca6235ae271c5652d2850d004e14c05cc","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        return selected"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"},{"line_number":67,"context_line":"    def _agent_ha_port_bindings(context, router_id, agent_id):"},{"line_number":68,"context_line":"        query \u003d context.session.query(l3agen_ha_db.L3HARouterAgentPortBinding)"},{"line_number":69,"context_line":"        query \u003d query.filter("},{"line_number":70,"context_line":"            l3agen_ha_db.L3HARouterAgentPortBinding.router_id \u003d\u003d router_id,"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_89b470d1","line":67,"range":{"start_line":67,"start_character":8,"end_line":67,"end_character":31},"in_reply_to":"5a5ae5dd_c67a5cf1","updated":"2016-02-04 17:12:19.000000000","message":"will update  on next PS","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        return query.all()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def get_dvr_routers_to_remove(self, context, port_id):"},{"line_number":75,"context_line":"        \"\"\"Delete the DVR namespace if no dvr serviced port exists."},{"line_number":76,"context_line":"        :param port_id:"},{"line_number":77,"context_line":"        :param context:"},{"line_number":78,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_e6f2f86e","line":75,"range":{"start_line":75,"start_character":11,"end_line":75,"end_character":67},"updated":"2016-02-04 15:49:16.000000000","message":"nit please update the docstring, the method doesn\u0027t actually delete any namespace","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"0e23a4fca6235ae271c5652d2850d004e14c05cc","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        return query.all()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def get_dvr_routers_to_remove(self, context, port_id):"},{"line_number":75,"context_line":"        \"\"\"Delete the DVR namespace if no dvr serviced port exists."},{"line_number":76,"context_line":"        :param port_id:"},{"line_number":77,"context_line":"        :param context:"},{"line_number":78,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_e9ae4484","line":75,"range":{"start_line":75,"start_character":11,"end_line":75,"end_character":67},"in_reply_to":"5a5ae5dd_e6f2f86e","updated":"2016-02-04 17:12:19.000000000","message":"Done","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"}],"neutron/db/l3_dvrscheduler_db.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9bb2ada7c324bab1544eb7738c23f17cd8706cda","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                             query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":279,"context_line":"                             filter_by(router_id\u003drouter_id,"},{"line_number":280,"context_line":"                                       l3_agent_id\u003dagent_id)."},{"line_number":281,"context_line":"                             delete(synchronize_session\u003dFalse))"},{"line_number":282,"context_line":"                    self.l3_rpc_notifier.router_removed_from_agent("},{"line_number":283,"context_line":"                        context, router_id, host)"},{"line_number":284,"context_line":"            LOG.debug(\u0027Removed binding for router %(router_id)s and \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_2089f925","line":281,"updated":"2015-01-09 10:39:46.000000000","message":"I think that you should aggregate the removed hosts then call the notifier in a loop, after the transaction is commited.","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"996b340e5a8b523773681c778089fa3c609b2a74","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                             query(l3agent_sch_db.RouterL3AgentBinding)."},{"line_number":279,"context_line":"                             filter_by(router_id\u003drouter_id,"},{"line_number":280,"context_line":"                                       l3_agent_id\u003dagent_id)."},{"line_number":281,"context_line":"                             delete(synchronize_session\u003dFalse))"},{"line_number":282,"context_line":"                    self.l3_rpc_notifier.router_removed_from_agent("},{"line_number":283,"context_line":"                        context, router_id, host)"},{"line_number":284,"context_line":"            LOG.debug(\u0027Removed binding for router %(router_id)s and \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_07f59350","line":281,"in_reply_to":"3a961159_2089f925","updated":"2015-01-13 21:10:03.000000000","message":"yes, good idea. Added in Patch 4.","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b7b86398374b6c592ac1415a85291303f2e65c","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            try:"},{"line_number":260,"context_line":"                binding \u003d query.one()"},{"line_number":261,"context_line":"            except exc.NoResultFound:"},{"line_number":262,"context_line":"                LOG.debug(\u0027no snat router binding found for %s\u0027, router_id)"},{"line_number":263,"context_line":"                return"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"            host \u003d binding.l3_agent.host"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa32b979_606dae97","side":"PARENT","line":262,"updated":"2015-06-15 19:00:57.000000000","message":"We not longer get this if the query is empty.  But, it was debug, so I think that is okay.","commit_id":"b1ad6101ca1238991dffd6ec6fa7e5ac71c512d7"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b7b86398374b6c592ac1415a85291303f2e65c","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            CentralizedSnatL3AgentBinding.router_id.in_(router_ids))"},{"line_number":302,"context_line":"        return query.all()"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"    def bind_snat_and_router(self, context, router_id, snat_candidates):"},{"line_number":305,"context_line":"        try:"},{"line_number":306,"context_line":"            chosen_agent \u003d self.bind_snat_servicenode("},{"line_number":307,"context_line":"                context, router_id, snat_candidates)"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa32b979_6004cebf","line":304,"updated":"2015-06-15 19:00:57.000000000","message":"Note:  This looks like a trivial refactor of L311-319 in the old patch.","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"154bb621535be85ad07e19a58585c07e197b0088","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            host \u003d binding.l3_agent.host"},{"line_number":283,"context_line":"            subnet_ids \u003d self.get_subnet_ids_on_router(context, router_id)"},{"line_number":284,"context_line":"            for subnet in subnet_ids:"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"                ports \u003d ("},{"line_number":287,"context_line":"                    self._core_plugin.get_ports_on_host_by_subnet("},{"line_number":288,"context_line":"                        context, host, subnet))"}],"source_content_type":"text/x-python","patch_set":44,"id":"ba15a1d1_53cbcc1e","line":285,"updated":"2015-09-20 13:44:14.000000000","message":"nit: why is this additional line necessary?","commit_id":"6d4a57845f3957148b8c32dbf8bcc7a8acca1bf5"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"a04cf74553f69adc34295e05b9d20a46034a6a21","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            host \u003d binding.l3_agent.host"},{"line_number":283,"context_line":"            subnet_ids \u003d self.get_subnet_ids_on_router(context, router_id)"},{"line_number":284,"context_line":"            for subnet in subnet_ids:"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"                ports \u003d ("},{"line_number":287,"context_line":"                    self._core_plugin.get_ports_on_host_by_subnet("},{"line_number":288,"context_line":"                        context, host, subnet))"}],"source_content_type":"text/x-python","patch_set":44,"id":"ba15a1d1_641c086b","line":285,"in_reply_to":"ba15a1d1_53cbcc1e","updated":"2015-09-20 19:50:31.000000000","message":"because my dam ide keeps adding them : ) thanks I removed","commit_id":"6d4a57845f3957148b8c32dbf8bcc7a8acca1bf5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"222005d71b64c4557ec5bfeba7ac1d2a1cc2b9b3","unresolved":false,"context_lines":[{"line_number":462,"context_line":"        router \u003d self.get_router(context, router_id)"},{"line_number":463,"context_line":"        if router[\u0027external_gateway_info\u0027] and router.get(\u0027distributed\u0027):"},{"line_number":464,"context_line":"            bindings \u003d self.unbind_snat(context, router_id, agent_id\u003dagent_id)"},{"line_number":465,"context_line":"            if bindings:"},{"line_number":466,"context_line":"                for binding in bindings:"},{"line_number":467,"context_line":"                    notification_not_sent \u003d self.unbind_router_servicenode("},{"line_number":468,"context_line":"                        context, router_id, binding)"}],"source_content_type":"text/x-python","patch_set":59,"id":"da85f559_91a39dff","line":465,"updated":"2015-11-12 19:02:38.000000000","message":"Is this required as unbind_snat() will always return a list, even an empty one.  Noticed as you don\u0027t have a similar check at L317","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":462,"context_line":"        router \u003d self.get_router(context, router_id)"},{"line_number":463,"context_line":"        if router[\u0027external_gateway_info\u0027] and router.get(\u0027distributed\u0027):"},{"line_number":464,"context_line":"            bindings \u003d self.unbind_snat(context, router_id, agent_id\u003dagent_id)"},{"line_number":465,"context_line":"            if bindings:"},{"line_number":466,"context_line":"                for binding in bindings:"},{"line_number":467,"context_line":"                    notification_not_sent \u003d self.unbind_router_servicenode("},{"line_number":468,"context_line":"                        context, router_id, binding)"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_e0fad9bc","line":465,"in_reply_to":"da85f559_91a39dff","updated":"2015-11-18 07:18:01.000000000","message":"removed\nDone","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cc0cbbd4054990aebb5f8a861be899b143922e15","unresolved":false,"context_lines":[{"line_number":313,"context_line":"                          {\u0027router_id\u0027: router_id, \u0027agent_id\u0027: agent_id})"},{"line_number":314,"context_line":"                router_removed_from.append(host)"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        for host in router_removed_from:"},{"line_number":317,"context_line":"            self.l3_rpc_notifier.router_removed_from_agent(context, router_id,"},{"line_number":318,"context_line":"                                                           host)"},{"line_number":319,"context_line":"        return port_found"}],"source_content_type":"text/x-python","patch_set":63,"id":"7a740942_82f1956c","line":316,"updated":"2015-12-11 08:22:38.000000000","message":"I don\u0027t see the case where router_removed_from will contain more than 1 element","commit_id":"5c0b414c5d681b63dd5a7f0a581c2ee2429e005d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            if not l3_agent.admin_state_up:"},{"line_number":340,"context_line":"                continue"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"            agent_conf \u003d agents_db.get_configuration_dict(l3_agent)"},{"line_number":343,"context_line":"            agent_mode \u003d agent_conf.get(n_const.L3_AGENT_MODE,"},{"line_number":344,"context_line":"                                        n_const.L3_AGENT_MODE_LEGACY)"},{"line_number":345,"context_line":"            if agent_mode !\u003d n_const.L3_AGENT_MODE_DVR_SNAT:"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_ef04e718","line":342,"range":{"start_line":342,"start_character":25,"end_line":342,"end_character":34},"updated":"2016-01-22 17:08:47.000000000","message":"Looks like part of the get_configuration refactor.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            if not l3_agent.admin_state_up:"},{"line_number":340,"context_line":"                continue"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"            agent_conf \u003d agents_db.get_configuration_dict(l3_agent)"},{"line_number":343,"context_line":"            agent_mode \u003d agent_conf.get(n_const.L3_AGENT_MODE,"},{"line_number":344,"context_line":"                                        n_const.L3_AGENT_MODE_LEGACY)"},{"line_number":345,"context_line":"            if agent_mode !\u003d n_const.L3_AGENT_MODE_DVR_SNAT:"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_2be18a9a","line":342,"range":{"start_line":342,"start_character":25,"end_line":342,"end_character":34},"in_reply_to":"9a68dd71_ef04e718","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":363,"context_line":"            candidates.append(l3_agent)"},{"line_number":364,"context_line":"        return candidates"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def bind_snat_and_router(self, context, router_id, snat_candidates):"},{"line_number":367,"context_line":"        try:"},{"line_number":368,"context_line":"            chosen_agent \u003d self.bind_snat_servicenode("},{"line_number":369,"context_line":"                context, router_id, snat_candidates)"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_3244a448","line":366,"range":{"start_line":366,"start_character":8,"end_line":366,"end_character":28},"updated":"2016-01-22 17:08:47.000000000","message":"This seems like kind of a gratuitous creation of a new method.  Its only called from L386","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":363,"context_line":"            candidates.append(l3_agent)"},{"line_number":364,"context_line":"        return candidates"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    def bind_snat_and_router(self, context, router_id, snat_candidates):"},{"line_number":367,"context_line":"        try:"},{"line_number":368,"context_line":"            chosen_agent \u003d self.bind_snat_servicenode("},{"line_number":369,"context_line":"                context, router_id, snat_candidates)"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_0be4c6a9","line":366,"range":{"start_line":366,"start_character":8,"end_line":366,"end_character":28},"in_reply_to":"9a68dd71_3244a448","updated":"2016-01-22 20:07:12.000000000","message":"moved to L386","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        snat_candidates \u003d self.get_snat_candidates(sync_router,"},{"line_number":372,"context_line":"                                                   active_l3_agents)"},{"line_number":373,"context_line":"        if not snat_candidates:"},{"line_number":374,"context_line":"            LOG.warn(_LW(\u0027No candidates found for SNAT\u0027))"},{"line_number":375,"context_line":"            return"},{"line_number":376,"context_line":"        else:"},{"line_number":377,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_688a5ec1","side":"PARENT","line":374,"range":{"start_line":374,"start_character":12,"end_line":374,"end_character":57},"updated":"2016-01-28 19:58:43.000000000","message":"why removing warning?","commit_id":"0d443bb7878da0a68c7a7d5ba70eb0c8d73a0f11"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":280,"context_line":"    def unbind_router_servicenode(self, context, router_id, binding):"},{"line_number":281,"context_line":"        \"\"\"Unbind the router from the chosen l3 service agent.\"\"\""},{"line_number":282,"context_line":"        port_found \u003d False"},{"line_number":283,"context_line":"        router_removed_from \u003d []"},{"line_number":284,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":285,"context_line":"            host \u003d binding.l3_agent.host"},{"line_number":286,"context_line":"            subnet_ids \u003d self.get_subnet_ids_on_router(context, router_id)"}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_8869da27","line":283,"range":{"start_line":283,"start_character":8,"end_line":283,"end_character":32},"updated":"2016-01-28 19:58:43.000000000","message":"there will always be just one element in this list","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"cae7ceefd52c097398c15d6c950c70e1338a8c56","unresolved":false,"context_lines":[{"line_number":313,"context_line":"                                                           host)"},{"line_number":314,"context_line":"        return port_found"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":317,"context_line":"        \"\"\"Unbind snat AND the router from the current agent.\"\"\""},{"line_number":318,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":319,"context_line":"            bindings \u003d self.unbind_snat(context, router_id)"}],"source_content_type":"text/x-python","patch_set":77,"id":"7a5de9d1_e895eee3","line":316,"range":{"start_line":316,"start_character":8,"end_line":316,"end_character":31},"updated":"2016-01-28 19:58:43.000000000","message":"this is overridden in l3_dvrhascheduler_db so changes here seems unrelated, am I missing something?","commit_id":"e69a2a20ae56d549af198ecf31a9e7648131ad8a"}],"neutron/db/l3_hamode_db.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"9bb2ada7c324bab1544eb7738c23f17cd8706cda","unresolved":false,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def create_router(self, context, router):"},{"line_number":343,"context_line":"        is_ha \u003d self._is_ha(router[\u0027router\u0027])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        if is_ha and l3_dvr_db.is_distributed_router(router[\u0027router\u0027]):"},{"line_number":346,"context_line":"            raise l3_ha.DistributedHARouterNotSupported()"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_607f8117","side":"PARENT","line":344,"updated":"2015-01-09 10:39:46.000000000","message":"Pretty exciting :)\n\nBy the way you can delete the exception now from the l3_ha extension file.","commit_id":"75832ea45a4a14ded26fc488d6eae80a30fcde24"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"996b340e5a8b523773681c778089fa3c609b2a74","unresolved":false,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def create_router(self, context, router):"},{"line_number":343,"context_line":"        is_ha \u003d self._is_ha(router[\u0027router\u0027])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        if is_ha and l3_dvr_db.is_distributed_router(router[\u0027router\u0027]):"},{"line_number":346,"context_line":"            raise l3_ha.DistributedHARouterNotSupported()"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_e77ec7ae","side":"PARENT","line":344,"in_reply_to":"3a961159_607f8117","updated":"2015-01-13 21:10:03.000000000","message":"yes, getting there. I have re-purposed this exception in Patch set 4 for catching router updates that may attempt to change HA on a DVR.","commit_id":"75832ea45a4a14ded26fc488d6eae80a30fcde24"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"98217e4f64de3d267bcb31c40de2afdc84c27c43","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            ha \u003d cfg.CONF.l3_ha"},{"line_number":340,"context_line":"        return ha"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def create_router(self, context, router):"},{"line_number":343,"context_line":"        is_ha \u003d self._is_ha(router[\u0027router\u0027])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        router[\u0027router\u0027][\u0027ha\u0027] \u003d is_ha"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_0bf6bed7","line":342,"updated":"2015-01-21 15:40:31.000000000","message":"something is not quite right, running this patch with both l3_ha \u003d True and distributed \u003d True. I got some unexpected outcome:\n\nhttp://paste.openstack.org/show/159788/\n\nHow is it possible that I get:\n\nNot enough l3 agents available to ensure HA. Minimum required 2, available 1.\n\nonly when DVR is False?","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"82ee26712a12569e5a95e86b28de74b132f09e05","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            ha \u003d cfg.CONF.l3_ha"},{"line_number":340,"context_line":"        return ha"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def create_router(self, context, router):"},{"line_number":343,"context_line":"        is_ha \u003d self._is_ha(router[\u0027router\u0027])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        router[\u0027router\u0027][\u0027ha\u0027] \u003d is_ha"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_58a58ca0","line":342,"in_reply_to":"1a930d6b_0bf6bed7","updated":"2015-01-25 22:21:43.000000000","message":"Appreciate your trying out the patch. The first and second routers are DVR routers with no external gateway set. The creation succeeds because the routers do not require redundancy at this point. \nThe third router is a legacy router with HA, therefore needs redundant resources because of which it fails.\nA dvr ha router will evaluate agent availability at the time of setting the external gateway because multiple agents are needed for hosting the SNAT service. Patch set 8 has the code updated to error out in this scenario.","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"98217e4f64de3d267bcb31c40de2afdc84c27c43","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            router_db \u003d super(L3_HA_NAT_db_mixin, self)._update_router_db("},{"line_number":373,"context_line":"                context, router_id, data, gw_info)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"            ha_not_changed \u003d ha is None or ha \u003d\u003d router_db.extra_attributes.ha"},{"line_number":376,"context_line":"            if ha_not_changed:"},{"line_number":377,"context_line":"                return router_db"},{"line_number":378,"context_line":"            elif router_db.extra_attributes.distributed:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_d0a46359","line":375,"updated":"2015-01-21 15:40:31.000000000","message":"I am slightly confused here: from what I can see the HA attribute cannot be modified, do you know what\u0027s going on exactly?","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"82ee26712a12569e5a95e86b28de74b132f09e05","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            router_db \u003d super(L3_HA_NAT_db_mixin, self)._update_router_db("},{"line_number":373,"context_line":"                context, router_id, data, gw_info)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"            ha_not_changed \u003d ha is None or ha \u003d\u003d router_db.extra_attributes.ha"},{"line_number":376,"context_line":"            if ha_not_changed:"},{"line_number":377,"context_line":"                return router_db"},{"line_number":378,"context_line":"            elif router_db.extra_attributes.distributed:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_56347349","line":375,"in_reply_to":"1a930d6b_d0a46359","updated":"2015-01-25 22:21:43.000000000","message":"I believe this code is detecting whether the HA attribute is being updated or not as part of this update.","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"98217e4f64de3d267bcb31c40de2afdc84c27c43","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            ha_not_changed \u003d ha is None or ha \u003d\u003d router_db.extra_attributes.ha"},{"line_number":376,"context_line":"            if ha_not_changed:"},{"line_number":377,"context_line":"                return router_db"},{"line_number":378,"context_line":"            elif router_db.extra_attributes.distributed:"},{"line_number":379,"context_line":"                raise l3_ha.DistributedHARouterNotSupported()"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"            ha_network \u003d self.get_ha_network(context,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_b07c3774","line":378,"updated":"2015-01-21 15:40:31.000000000","message":"at this point the router db object has already been updated, I think it\u0027s too late to raise this exception. But what confuses me is your commit message. You say:\n\nThis patch allows conversion of a legacy router to DVR even if HA is enabled on the legacy router. Wouldn\u0027t this line prevent this?\n\nIs your intention to prevent converting a DVR router to HA? If so, at this point we might have already lost the distributed state of the router as the db object has already been updated.","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"82ee26712a12569e5a95e86b28de74b132f09e05","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            ha_not_changed \u003d ha is None or ha \u003d\u003d router_db.extra_attributes.ha"},{"line_number":376,"context_line":"            if ha_not_changed:"},{"line_number":377,"context_line":"                return router_db"},{"line_number":378,"context_line":"            elif router_db.extra_attributes.distributed:"},{"line_number":379,"context_line":"                raise l3_ha.DistributedHARouterNotSupported()"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"            ha_network \u003d self.get_ha_network(context,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_76d5efb7","line":378,"in_reply_to":"1a930d6b_b07c3774","updated":"2015-01-25 22:21:43.000000000","message":"\"This patch allows conversion of a legacy router to DVR even if HA is enabled on the legacy router. Wouldn\u0027t this line prevent this?\"\nNo, because if the router was created as legacy + HA, and subsequently a \"router-update \u003crtrName\u003e --distributed True was issued\", the ha_not_changed will be true, therefore, the conversion would go through (provided other requirements, independent of this patch, for such a conversion are met)\n\nThe intent here is to disallow changing the HA attribute when the end state of the router is going to be DVR. i.e. prevent someone from updating an existing DVR non-HA router to DVR HA or converting a legacy non-HA to DVR and HA at the same time.\nThe exception here will cause a db rollback so no changes would be committed to the db object.","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"98217e4f64de3d267bcb31c40de2afdc84c27c43","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    def remove_router_from_ha_network(self, context, id):"},{"line_number":416,"context_line":"        router_db \u003d self._get_router(context, id)"},{"line_number":417,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":418,"context_line":"            ha_network \u003d self.get_ha_network(context, router_db.tenant_id)"},{"line_number":419,"context_line":"            if ha_network:"},{"line_number":420,"context_line":"                self._delete_vr_id_allocation("},{"line_number":421,"context_line":"                    context, ha_network, router_db.extra_attributes.ha_vr_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_b08277fe","line":418,"updated":"2015-01-21 15:40:31.000000000","message":"strictly speaking, this change is not needed.","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"82ee26712a12569e5a95e86b28de74b132f09e05","unresolved":false,"context_lines":[{"line_number":415,"context_line":"    def remove_router_from_ha_network(self, context, id):"},{"line_number":416,"context_line":"        router_db \u003d self._get_router(context, id)"},{"line_number":417,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":418,"context_line":"            ha_network \u003d self.get_ha_network(context, router_db.tenant_id)"},{"line_number":419,"context_line":"            if ha_network:"},{"line_number":420,"context_line":"                self._delete_vr_id_allocation("},{"line_number":421,"context_line":"                    context, ha_network, router_db.extra_attributes.ha_vr_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_16982b1b","line":418,"in_reply_to":"1a930d6b_b08277fe","updated":"2015-01-25 22:21:43.000000000","message":"When external gateway is cleared from DVR the router has to be removed from the ha network. I refactored  this code for re-use. See unbind_snat_servicenode in l3_hascheduler_db.py","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"757cd47a7ff1aed873d51f0ad0c4a1b7f718befc","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                    context, ha_network, router_db.extra_attributes.ha_vr_id)"},{"line_number":423,"context_line":"                self._delete_ha_interfaces(context, router_db.id)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def delete_router(self, context, id):"},{"line_number":426,"context_line":"        self.remove_router_from_ha_network(context, id)"},{"line_number":427,"context_line":"        return super(L3_HA_NAT_db_mixin, self).delete_router(context, id)"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_d334ccfd","line":425,"updated":"2015-01-26 23:04:07.000000000","message":"Check out:\n\nhttps://review.openstack.org/#/c/144260/4/neutron/db/l3_hamode_db.py\n\nPlease reverse the order of lines 426 and 427 so we avoid a regression in case the patch above merges before this one.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"7baa1b6330f70b53b58e803bdfdcd091598e6dc4","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                    context, ha_network, router_db.extra_attributes.ha_vr_id)"},{"line_number":423,"context_line":"                self._delete_ha_interfaces(context, router_db.id)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def delete_router(self, context, id):"},{"line_number":426,"context_line":"        self.remove_router_from_ha_network(context, id)"},{"line_number":427,"context_line":"        return super(L3_HA_NAT_db_mixin, self).delete_router(context, id)"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa81d914_e141810c","line":425,"in_reply_to":"1a930d6b_d334ccfd","updated":"2015-01-28 16:14:16.000000000","message":"sure, I see the logic. Will do.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"217314f2f778f5c3974537c83843b025e65172f6","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                    context, ha_network, router_db.extra_attributes.ha_vr_id)"},{"line_number":423,"context_line":"                self._delete_ha_interfaces(context, router_db.id)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    def delete_router(self, context, id):"},{"line_number":426,"context_line":"        self.remove_router_from_ha_network(context, id)"},{"line_number":427,"context_line":"        return super(L3_HA_NAT_db_mixin, self).delete_router(context, id)"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_8485a0ae","line":425,"in_reply_to":"fa81d914_e141810c","updated":"2015-02-19 01:14:15.000000000","message":"Done","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b7b86398374b6c592ac1415a85291303f2e65c","unresolved":false,"context_lines":[{"line_number":263,"context_line":""},{"line_number":264,"context_line":"        min_agents \u003d cfg.CONF.min_l3_agents_per_router"},{"line_number":265,"context_line":"        num_agents \u003d len(self.get_l3_agents(context, active\u003dTrue,"},{"line_number":266,"context_line":"                    filters\u003d{\u0027agent_modes\u0027: [constants.L3_AGENT_MODE_LEGACY,"},{"line_number":267,"context_line":"                                        constants.L3_AGENT_MODE_DVR_SNAT]}))"},{"line_number":268,"context_line":"        max_agents \u003d cfg.CONF.max_l3_agents_per_router"},{"line_number":269,"context_line":"        if max_agents:"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa32b979_601b6e1c","line":266,"updated":"2015-06-15 19:00:57.000000000","message":"Don\u0027t change this indentation here.","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b7b86398374b6c592ac1415a85291303f2e65c","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                    ha_network \u003d self._create_ha_network(context,"},{"line_number":365,"context_line":"                                                         router_db.tenant_id)"},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"                self._set_vr_id(context, router_db, ha_network)"},{"line_number":368,"context_line":"                self._create_ha_interfaces(context, router_db, ha_network)"},{"line_number":369,"context_line":"                self._notify_ha_interfaces_updated(context, router_db.id)"},{"line_number":370,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa32b979_2089e626","line":367,"updated":"2015-06-15 19:00:57.000000000","message":"This seems to repeat some stuff with l3_dvrhascheduler_db.py.  Is there some refactoring needed of this method as a prior step to be able to find some commonality?","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b7b86398374b6c592ac1415a85291303f2e65c","unresolved":false,"context_lines":[{"line_number":411,"context_line":"    def delete_router(self, context, id):"},{"line_number":412,"context_line":"        router_db \u003d self._get_router(context, id)"},{"line_number":413,"context_line":"        super(L3_HA_NAT_db_mixin, self).delete_router("},{"line_number":414,"context_line":"            context, id)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":417,"context_line":"            ha_network \u003d self.get_ha_network(context, router_db.tenant_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa32b979_a0cbb652","line":414,"updated":"2015-06-15 19:00:57.000000000","message":"Changing random whitespace just muddies up the patch and makes it more difficult to review.","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d9b7b86398374b6c592ac1415a85291303f2e65c","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            context, id)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":417,"context_line":"            ha_network \u003d self.get_ha_network(context, router_db.tenant_id)"},{"line_number":418,"context_line":"            if ha_network:"},{"line_number":419,"context_line":"                self._delete_vr_id_allocation("},{"line_number":420,"context_line":"                    context, ha_network, router_db.extra_attributes.ha_vr_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa32b979_c0c6fa48","line":417,"updated":"2015-06-15 19:00:57.000000000","message":"Ditto.","commit_id":"7a4132282ae93db85955f20e7665179d0a69657b"},{"author":{"_account_id":16053,"name":"Pengtao Huang","email":"huangpengtao@huawei.com","username":"huangpengtao"},"change_message_id":"c3f132a04a4e91b7d0a544ad8856b4392bc24a9f","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        self._update_bindings_for_port(context, states, host,"},{"line_number":558,"context_line":"                                       constants.DEVICE_OWNER_ROUTER_INTF)"},{"line_number":559,"context_line":"        self._update_bindings_for_port(context, states, host,"},{"line_number":560,"context_line":"                                       constants.DEVICE_OWNER_ROUTER_SNAT)"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa1b9901_345f86e6","line":560,"updated":"2015-08-26 09:43:09.000000000","message":"can the constants.DEVICE_OWNER_ROUTER_INTF and constants.DEVICE_OWNER_ROUTER_SNAT to be a list value?\nlike [constants.DEVICE_OWNER_ROUTER_INTF,constants.DEVICE_OWNER_ROUTER_SNAT]","commit_id":"56e79d4c42c0a22c1eefdba7c244a9969e99a38d"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"2b3876c27139d62e45e4e83322532702e9e7cb63","unresolved":false,"context_lines":[{"line_number":557,"context_line":"        self._update_bindings_for_port(context, states, host,"},{"line_number":558,"context_line":"                                       constants.DEVICE_OWNER_ROUTER_INTF)"},{"line_number":559,"context_line":"        self._update_bindings_for_port(context, states, host,"},{"line_number":560,"context_line":"                                       constants.DEVICE_OWNER_ROUTER_SNAT)"}],"source_content_type":"text/x-python","patch_set":31,"id":"da20952f_47f22d9c","line":560,"in_reply_to":"fa1b9901_345f86e6","updated":"2015-08-26 21:56:01.000000000","message":"yes it can. Originally I was worried there would be cases where i had to do only one and not both so i coded so I could add if statements later on. However I can\u0027t think of a use case where I would do one but not the other type.","commit_id":"56e79d4c42c0a22c1eefdba7c244a9969e99a38d"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"154bb621535be85ad07e19a58585c07e197b0088","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        min_agents \u003d cfg.CONF.min_l3_agents_per_router"},{"line_number":286,"context_line":"        num_agents \u003d len(self.get_l3_agents(context, active\u003dTrue,"},{"line_number":287,"context_line":"                    filters\u003d{\u0027agent_modes\u0027: [constants.L3_AGENT_MODE_LEGACY,"},{"line_number":288,"context_line":"                                        constants.L3_AGENT_MODE_DVR_SNAT]}))"},{"line_number":289,"context_line":"        max_agents \u003d cfg.CONF.max_l3_agents_per_router"},{"line_number":290,"context_line":"        if max_agents:"},{"line_number":291,"context_line":"            if max_agents \u003e num_agents:"}],"source_content_type":"text/x-python","patch_set":44,"id":"ba15a1d1_734db0c3","line":288,"updated":"2015-09-20 13:44:14.000000000","message":"nit: why is this gratuitous whitespace change necessary?","commit_id":"6d4a57845f3957148b8c32dbf8bcc7a8acca1bf5"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"a04cf74553f69adc34295e05b9d20a46034a6a21","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        min_agents \u003d cfg.CONF.min_l3_agents_per_router"},{"line_number":286,"context_line":"        num_agents \u003d len(self.get_l3_agents(context, active\u003dTrue,"},{"line_number":287,"context_line":"                    filters\u003d{\u0027agent_modes\u0027: [constants.L3_AGENT_MODE_LEGACY,"},{"line_number":288,"context_line":"                                        constants.L3_AGENT_MODE_DVR_SNAT]}))"},{"line_number":289,"context_line":"        max_agents \u003d cfg.CONF.max_l3_agents_per_router"},{"line_number":290,"context_line":"        if max_agents:"},{"line_number":291,"context_line":"            if max_agents \u003e num_agents:"}],"source_content_type":"text/x-python","patch_set":44,"id":"ba15a1d1_84191c7c","line":288,"in_reply_to":"ba15a1d1_734db0c3","updated":"2015-09-20 19:50:31.000000000","message":"Done","commit_id":"6d4a57845f3957148b8c32dbf8bcc7a8acca1bf5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"08c2e65f5631f376ee653a1b7b1b97bb77d612da","unresolved":false,"context_lines":[{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        min_agents \u003d cfg.CONF.min_l3_agents_per_router"},{"line_number":286,"context_line":"        num_agents \u003d len(self.get_l3_agents(context, active\u003dTrue,"},{"line_number":287,"context_line":"                    filters\u003d{\u0027agent_modes\u0027: [constants.L3_AGENT_MODE_LEGACY,"},{"line_number":288,"context_line":"                                        constants.L3_AGENT_MODE_DVR_SNAT]}))"},{"line_number":289,"context_line":"        max_agents \u003d cfg.CONF.max_l3_agents_per_router"},{"line_number":290,"context_line":"        if max_agents:"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_eb968a93","line":287,"updated":"2015-10-06 13:23:41.000000000","message":"Indentation changes seem unrelated.","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f55905591503fe27afb0e21e772797152f8e2924","unresolved":false,"context_lines":[{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        min_agents \u003d cfg.CONF.min_l3_agents_per_router"},{"line_number":286,"context_line":"        num_agents \u003d len(self.get_l3_agents(context, active\u003dTrue,"},{"line_number":287,"context_line":"                    filters\u003d{\u0027agent_modes\u0027: [constants.L3_AGENT_MODE_LEGACY,"},{"line_number":288,"context_line":"                                        constants.L3_AGENT_MODE_DVR_SNAT]}))"},{"line_number":289,"context_line":"        max_agents \u003d cfg.CONF.max_l3_agents_per_router"},{"line_number":290,"context_line":"        if max_agents:"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_3242ab3f","line":287,"in_reply_to":"7a2fa921_eb968a93","updated":"2015-10-06 16:36:13.000000000","message":"Done","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"08c2e65f5631f376ee653a1b7b1b97bb77d612da","unresolved":false,"context_lines":[{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        return router_db"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def remove_router_from_ha_network(self, context, router_db):"},{"line_number":438,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":439,"context_line":"            ha_network \u003d self.get_ha_network(context,"},{"line_number":440,"context_line":"                                             router_db.tenant_id)"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_c8ff1100","line":437,"updated":"2015-10-06 13:23:41.000000000","message":"This function is only used once, which gives me the impression this change is not needed. Why can\u0027t the original function be left as is?","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f55905591503fe27afb0e21e772797152f8e2924","unresolved":false,"context_lines":[{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        return router_db"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def remove_router_from_ha_network(self, context, router_db):"},{"line_number":438,"context_line":"        if router_db.extra_attributes.ha:"},{"line_number":439,"context_line":"            ha_network \u003d self.get_ha_network(context,"},{"line_number":440,"context_line":"                                             router_db.tenant_id)"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_f290b397","line":437,"in_reply_to":"7a2fa921_c8ff1100","updated":"2015-10-06 16:36:13.000000000","message":"This change was reverted.","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"51d523c332f463f217a30699d94973c1a2469f3f","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                return router_db"},{"line_number":416,"context_line":"            elif router_db.extra_attributes.distributed:"},{"line_number":417,"context_line":"                raise l3_ha.DvrUpdateToHAmodeNotSupported()"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"            ha_network \u003d self.get_ha_network(context,"},{"line_number":420,"context_line":"                                             router_db.tenant_id)"},{"line_number":421,"context_line":"            router_db.extra_attributes.ha \u003d ha"}],"source_content_type":"text/x-python","patch_set":57,"id":"3a29b11f_4db428d0","line":418,"updated":"2015-10-20 20:08:57.000000000","message":"Since this check is now here, and DistributedHaRouterNotSupported() execption no longer exists. \nL405-406 need to be removed.","commit_id":"9b906e57c60476cca0836cbd6506b196754f1ac4"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"4f5e3d9577ee200c979374eb39e40a4a82d5e24d","unresolved":false,"context_lines":[{"line_number":413,"context_line":"                return router_db"},{"line_number":414,"context_line":"            elif router_db.extra_attributes.distributed:"},{"line_number":415,"context_line":"                raise l3_ha.DvrUpdateToHAmodeNotSupported()"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"            ha_network \u003d self.get_ha_network(context,"},{"line_number":418,"context_line":"                                             router_db.tenant_id)"},{"line_number":419,"context_line":"            router_db.extra_attributes.ha \u003d ha"}],"source_content_type":"text/x-python","patch_set":58,"id":"3a29b11f_48b416d0","line":416,"updated":"2015-10-20 20:37:10.000000000","message":"I am still not confortable with this code. \nThe check for weather or not a dvr is being upgraded to ha is being made after the call to _update_router_db.","commit_id":"a30eedf2848c5a20eae2c8314c3461f418d97be6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9f93c019c7183e2689642b61a2faa481b08f4e3f","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        if requested_ha_state and requested_distributed_state:"},{"line_number":413,"context_line":"            if not original_ha_state and not original_distributed_state:"},{"line_number":414,"context_line":"                raise l3_ha.UpdateToDVRHamodeNotSupported"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        if original_ha_state and requested_distributed_state:"},{"line_number":417,"context_line":"            if not original_distributed_state:"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_214ff193","line":414,"updated":"2015-11-16 14:03:04.000000000","message":"should be l3_ha.UpdateToDVRHamodeNotSupported()","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        if requested_ha_state and requested_distributed_state:"},{"line_number":413,"context_line":"            if not original_ha_state and not original_distributed_state:"},{"line_number":414,"context_line":"                raise l3_ha.UpdateToDVRHamodeNotSupported"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        if original_ha_state and requested_distributed_state:"},{"line_number":417,"context_line":"            if not original_distributed_state:"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_ea8abdbe","line":414,"in_reply_to":"ba8a016a_214ff193","updated":"2015-11-18 07:18:01.000000000","message":"Done","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9f93c019c7183e2689642b61a2faa481b08f4e3f","unresolved":false,"context_lines":[{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        if original_ha_state and requested_distributed_state:"},{"line_number":417,"context_line":"            if not original_distributed_state:"},{"line_number":418,"context_line":"                raise l3_ha.DvrModeUpdateOfHANotSupported"},{"line_number":419,"context_line":"            return"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        if original_distributed_state and requested_ha_state:"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_e148098a","line":418,"updated":"2015-11-16 14:03:04.000000000","message":"should be l3_ha.DvrModeUpdateOfHANotSupported()","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        if original_ha_state and requested_distributed_state:"},{"line_number":417,"context_line":"            if not original_distributed_state:"},{"line_number":418,"context_line":"                raise l3_ha.DvrModeUpdateOfHANotSupported"},{"line_number":419,"context_line":"            return"},{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        if original_distributed_state and requested_ha_state:"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_0a8621b9","line":418,"in_reply_to":"ba8a016a_e148098a","updated":"2015-11-18 07:18:01.000000000","message":"Done","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9f93c019c7183e2689642b61a2faa481b08f4e3f","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        if original_distributed_state and requested_ha_state:"},{"line_number":422,"context_line":"            if not original_ha_state:"},{"line_number":423,"context_line":"                raise l3_ha.HAmodeUpdateOfDvrNotSupported"},{"line_number":424,"context_line":"            return"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_6155f91b","line":423,"updated":"2015-11-16 14:03:04.000000000","message":"Should be l3_ha.HAmodeUpdateOfDvrNotSupported()","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"        if original_distributed_state and requested_ha_state:"},{"line_number":422,"context_line":"            if not original_ha_state:"},{"line_number":423,"context_line":"                raise l3_ha.HAmodeUpdateOfDvrNotSupported"},{"line_number":424,"context_line":"            return"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_ca8fb9ca","line":423,"in_reply_to":"ba8a016a_6155f91b","updated":"2015-11-18 07:18:01.000000000","message":"Done","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":10267,"name":"venkata anil","email":"anilvenkata@redhat.com","username":"anil"},"change_message_id":"937aac9df6c970f6e6e8c23879360187d1103876","unresolved":false,"context_lines":[{"line_number":611,"context_line":"        device_filter \u003d {\u0027device_id\u0027: states.keys(),"},{"line_number":612,"context_line":"                         \u0027device_owner\u0027:"},{"line_number":613,"context_line":"                         [constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":614,"context_line":"                          constants.DEVICE_OWNER_ROUTER_SNAT]}"},{"line_number":615,"context_line":"        ports \u003d self._core_plugin.get_ports(admin_ctx, filters\u003ddevice_filter)"},{"line_number":616,"context_line":"        active_ports \u003d (port for port in ports"},{"line_number":617,"context_line":"            if states[port[\u0027device_id\u0027]] \u003d\u003d constants.HA_ROUTER_STATE_ACTIVE)"}],"source_content_type":"text/x-python","patch_set":63,"id":"7a740942_5b4e6fc2","line":614,"updated":"2015-12-10 13:03:56.000000000","message":"I think with this change,\n\nport[\u0027device_owner\u0027] will be [constants.DEVICE_OWNER_ROUTER_INTF, constants.DEVICE_OWNER_ROUTER_SNAT] for HA always(with or without DVR).\n\n\nWill it be better if we have\n\n1) port[\u0027device_owner\u0027] \u003d constants.DEVICE_OWNER_ROUTER_INTF for only HA(without DVR)  and\n\n2)  port[\u0027device_owner\u0027] \u003d  [constants.DEVICE_OWNER_ROUTER_INTF, constants.DEVICE_OWNER_ROUTER_SNAT] for HA with DVR\n\n?","commit_id":"5c0b414c5d681b63dd5a7f0a581c2ee2429e005d"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"3a56e93d1d9232dee13e42da58855ff6c25466db","unresolved":false,"context_lines":[{"line_number":611,"context_line":"        device_filter \u003d {\u0027device_id\u0027: states.keys(),"},{"line_number":612,"context_line":"                         \u0027device_owner\u0027:"},{"line_number":613,"context_line":"                         [constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":614,"context_line":"                          constants.DEVICE_OWNER_ROUTER_SNAT]}"},{"line_number":615,"context_line":"        ports \u003d self._core_plugin.get_ports(admin_ctx, filters\u003ddevice_filter)"},{"line_number":616,"context_line":"        active_ports \u003d (port for port in ports"},{"line_number":617,"context_line":"            if states[port[\u0027device_id\u0027]] \u003d\u003d constants.HA_ROUTER_STATE_ACTIVE)"}],"source_content_type":"text/x-python","patch_set":63,"id":"7a740942_d64bc385","line":614,"in_reply_to":"7a740942_5b4e6fc2","updated":"2015-12-11 22:30:06.000000000","message":"Does it matter? If a router is only HA and not DVR, the code still seems correct to me.","commit_id":"5c0b414c5d681b63dd5a7f0a581c2ee2429e005d"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c57e12263b6845c25432af927086355aafc2827a","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        query \u003d query.filter("},{"line_number":575,"context_line":"            L3HARouterAgentPortBinding.router_id \u003d\u003d router_id,"},{"line_number":576,"context_line":"            L3HARouterAgentPortBinding.l3_agent_id \u003d\u003d agent_id)"},{"line_number":577,"context_line":"        return query.all()"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    def _get_bindings_and_update_router_state_for_dead_agents(self, context,"},{"line_number":580,"context_line":"                                                              router_id):"}],"source_content_type":"text/x-python","patch_set":83,"id":"5a5ae5dd_45b274e6","line":577,"range":{"start_line":577,"start_character":15,"end_line":577,"end_character":26},"updated":"2016-02-08 10:32:56.000000000","message":"this should be .firts() is not None","commit_id":"bad646790b13115eebd532ed81c88bc43de2abac"}],"neutron/db/l3_hascheduler_db.py":[{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"12b6d08832a8c6836d0c07e98aa33d06d6ca30e6","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            super(L3_HA_scheduler_db_mixin,"},{"line_number":101,"context_line":"                  self).schedule_snat_router(context, router_id, sync_router)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":104,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent.\"\"\""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        self.remove_router_from_ha_network(context, router_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f8a0d343","line":103,"updated":"2015-01-07 02:42:56.000000000","message":"I wonder why this method and the schedule_snat_router method are put in hascheduler instead of dvrscheduler?","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"de6c1342d533c32b63c41d6b56cb37cc251294ae","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            super(L3_HA_scheduler_db_mixin,"},{"line_number":101,"context_line":"                  self).schedule_snat_router(context, router_id, sync_router)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":104,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent.\"\"\""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        self.remove_router_from_ha_network(context, router_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_75fbe8bd","line":103,"in_reply_to":"3a961159_e9554bc2","updated":"2015-01-08 02:42:56.000000000","message":"OK. I will remove my -1. Will take a closer look.","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"c13ec0315f494907dbc9ae6b355abc6f53b9ce88","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            super(L3_HA_scheduler_db_mixin,"},{"line_number":101,"context_line":"                  self).schedule_snat_router(context, router_id, sync_router)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def unbind_snat_servicenode(self, context, router_id):"},{"line_number":104,"context_line":"        \"\"\"Unbind the snat router to the chosen l3 service agent.\"\"\""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        self.remove_router_from_ha_network(context, router_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_e9554bc2","line":103,"in_reply_to":"3a961159_f8a0d343","updated":"2015-01-07 23:37:04.000000000","message":"Xu Han: both these methods override the same methods defined in the dvrscheduler_db.py because for HA the methods have to create/remove the ha ports and other steps.","commit_id":"160ca11e4770b489b9292c1585dae26dbbca6933"},{"author":{"_account_id":10971,"name":"Michael Smith","email":"michael.smith6@hp.com","username":"mrsmith"},"change_message_id":"5491c3eecdce0a120f55bfe573acf23e8e5c62bd","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"#class L3_HA_scheduler_db_mixin(l3_sch_db.L3AgentSchedulerDbMixin):"},{"line_number":30,"context_line":"class L3_HA_scheduler_db_mixin(l3_dvrsch_db.L3_DVRsch_db_mixin):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def get_ha_routers_l3_agents_count(self, context):"},{"line_number":33,"context_line":"        \"\"\"Return a map between HA routers and how many agents every"},{"line_number":34,"context_line":"        router is scheduled to."}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_82e891b4","line":31,"updated":"2015-01-13 17:18:34.000000000","message":"can this be cleaned up?","commit_id":"5f67dbfafe027e4ea42ff5e365e3237c246ed54d"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"98217e4f64de3d267bcb31c40de2afdc84c27c43","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import l3_dvrscheduler_db as l3_dvrsch_db"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class L3_HA_scheduler_db_mixin(l3_dvrsch_db.L3_DVRsch_db_mixin):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_ha_routers_l3_agents_count(self, context):"},{"line_number":28,"context_line":"        \"\"\"Return a map between HA routers and how many agents every"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_6bb662de","line":25,"updated":"2015-01-21 15:40:31.000000000","message":"this is not needed; you should keep the two mixin separate. I think it would be safer to have a third mixin DvrHA that has the extended logic as done below (even though not strictly necessary) and add it to the list of the mixin supported by the l3_router_plugin.","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"82ee26712a12569e5a95e86b28de74b132f09e05","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import l3_dvrscheduler_db as l3_dvrsch_db"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class L3_HA_scheduler_db_mixin(l3_dvrsch_db.L3_DVRsch_db_mixin):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_ha_routers_l3_agents_count(self, context):"},{"line_number":28,"context_line":"        \"\"\"Return a map between HA routers and how many agents every"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_96b25b92","line":25,"in_reply_to":"1a930d6b_6bb662de","updated":"2015-01-25 22:21:43.000000000","message":"Armando: this patch is overriding some of the methods through inheritance, I will touch base with you to understand the mixin approach.","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"757cd47a7ff1aed873d51f0ad0c4a1b7f718befc","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                port_binding \u003d self.add_ha_port(context.elevated(), router_id,"},{"line_number":85,"context_line":"                                          ha_network.network.id,"},{"line_number":86,"context_line":"                                          sync_router[\u0027tenant_id\u0027])"},{"line_number":87,"context_line":"                port_binding.l3_agent_id \u003d chosen_agent[\u0027id\u0027]"},{"line_number":88,"context_line":"                self.bind_snat_servicenode("},{"line_number":89,"context_line":"                    context, router_id, [chosen_agent])"},{"line_number":90,"context_line":"                self.bind_dvr_router_servicenode("}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_dcd69927","line":87,"updated":"2015-01-26 23:04:07.000000000","message":"The DVR part should be DVR code from the DVR scheduler... It\u0027s just too easy to fall out of sync. If something is changed in the schedule_snat_router method of the DVR scheduler you just know no one will remember to change it here. Basically lines 88 to 91 should not be called explicitly from this file, but by a call to the DVR scheduler, that would also be called whenever a DVR, non-HA router is scheduled.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"7baa1b6330f70b53b58e803bdfdcd091598e6dc4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                port_binding \u003d self.add_ha_port(context.elevated(), router_id,"},{"line_number":85,"context_line":"                                          ha_network.network.id,"},{"line_number":86,"context_line":"                                          sync_router[\u0027tenant_id\u0027])"},{"line_number":87,"context_line":"                port_binding.l3_agent_id \u003d chosen_agent[\u0027id\u0027]"},{"line_number":88,"context_line":"                self.bind_snat_servicenode("},{"line_number":89,"context_line":"                    context, router_id, [chosen_agent])"},{"line_number":90,"context_line":"                self.bind_dvr_router_servicenode("}],"source_content_type":"text/x-python","patch_set":8,"id":"fa81d914_01b135f8","line":87,"in_reply_to":"1a930d6b_dcd69927","updated":"2015-01-28 16:14:16.000000000","message":"Ok, will look into that, probably refactor and create a utility method that can live in dvr scheduler file.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"217314f2f778f5c3974537c83843b025e65172f6","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                port_binding \u003d self.add_ha_port(context.elevated(), router_id,"},{"line_number":85,"context_line":"                                          ha_network.network.id,"},{"line_number":86,"context_line":"                                          sync_router[\u0027tenant_id\u0027])"},{"line_number":87,"context_line":"                port_binding.l3_agent_id \u003d chosen_agent[\u0027id\u0027]"},{"line_number":88,"context_line":"                self.bind_snat_servicenode("},{"line_number":89,"context_line":"                    context, router_id, [chosen_agent])"},{"line_number":90,"context_line":"                self.bind_dvr_router_servicenode("}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_049a9013","line":87,"in_reply_to":"fa81d914_01b135f8","updated":"2015-02-19 01:14:15.000000000","message":"Done","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"6ec294cb01abd80461ad4870af75aca08552b3bb","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import l3_dvrscheduler_db as l3_dvrsch_db"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class L3_HA_scheduler_db_mixin(l3_dvrsch_db.L3_DVRsch_db_mixin):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_ha_routers_l3_agents_count(self, context):"},{"line_number":28,"context_line":"        \"\"\"Return a map between HA routers and how many agents every"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a016987_77bdf6d6","line":25,"updated":"2015-05-22 22:50:30.000000000","message":"I am gonna hate this but what if we are more explicit about using a mixin that is both HA and DVR? So something like:\n\nclass L3_HA_DVR (L3_HA_scheduler_db_mixin, l3_dvrsch_db.L3_DVRsch_db_mixin)\n\nand you use that one in the service plugin? That\u0027s better self-documenting.","commit_id":"86c8c2256c9ad37040e3ba6a6e28a6db0cef47e1"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3c483c4112b071b62f24d64efa8fc0a003188ccb","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import l3_dvrscheduler_db as l3_dvrsch_db"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class L3_HA_scheduler_db_mixin(l3_dvrsch_db.L3_DVRsch_db_mixin):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_ha_routers_l3_agents_count(self, context):"},{"line_number":28,"context_line":"        \"\"\"Return a map between HA routers and how many agents every"}],"source_content_type":"text/x-python","patch_set":14,"id":"1af86dd1_d3a0fb92","line":25,"in_reply_to":"7a016987_77bdf6d6","updated":"2015-06-12 18:51:40.000000000","message":"Armando what did you mean by \"use that one in the service plugin\"? \n\nthanks.","commit_id":"86c8c2256c9ad37040e3ba6a6e28a6db0cef47e1"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"827194b4e51d9a77475337f83b207607a3e6a024","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.db import l3_dvrscheduler_db as l3_dvrsch_db"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class L3_HA_scheduler_db_mixin(l3_dvrsch_db.L3_DVRsch_db_mixin):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def get_ha_routers_l3_agents_count(self, context):"},{"line_number":28,"context_line":"        \"\"\"Return a map between HA routers and how many agents every"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a016987_0775c6f8","line":25,"in_reply_to":"7a016987_77bdf6d6","updated":"2015-05-29 00:05:20.000000000","message":"Will add this asap.","commit_id":"86c8c2256c9ad37040e3ba6a6e28a6db0cef47e1"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"7ea39038909f478c4a3f7c00d7eab96a2a23107d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def list_l3_agents_hosting_router(self, context, router_id):"},{"line_number":73,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":74,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":75,"context_line":"            if (router_db.extra_attributes.ha and"},{"line_number":76,"context_line":"                    not router_db.extra_attributes.distributed):"},{"line_number":77,"context_line":"                bindings \u003d self.get_l3_bindings_hosting_router_with_ha_states("},{"line_number":78,"context_line":"                    context, router_id)"}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_71aa9e72","line":75,"updated":"2015-12-22 22:51:36.000000000","message":"This is incorrect. If it\u0027s a DVR-HA router I want to see the ha_states for the SNAT bindings.","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"20785db4df3965723ea1931a58d96ea356010599","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def list_l3_agents_hosting_router(self, context, router_id):"},{"line_number":73,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":74,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":75,"context_line":"            if (router_db.extra_attributes.ha and"},{"line_number":76,"context_line":"                    not router_db.extra_attributes.distributed):"},{"line_number":77,"context_line":"                bindings \u003d self.get_l3_bindings_hosting_router_with_ha_states("},{"line_number":78,"context_line":"                    context, router_id)"}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_9725bac3","line":75,"in_reply_to":"1a7b0d38_71aa9e72","updated":"2015-12-23 01:30:28.000000000","message":"Reverted back","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                bindings \u003d self.get_l3_bindings_hosting_router_with_ha_states("},{"line_number":77,"context_line":"                    context, router_id)"},{"line_number":78,"context_line":"                if router_db.extra_attributes.distributed:"},{"line_number":79,"context_line":"                    ha_agent_id_list \u003d [agent_binding[0][\u0027id\u0027]"},{"line_number":80,"context_line":"                                        for agent_binding in bindings]"},{"line_number":81,"context_line":"                    ds_bindings \u003d self._get_l3_bindings_hosting_routers("},{"line_number":82,"context_line":"                        context, [router_id])"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_32c7c497","line":79,"range":{"start_line":79,"start_character":39,"end_line":79,"end_character":40},"updated":"2016-01-22 17:08:47.000000000","message":"nit:  Change this to { to make this a set.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                bindings \u003d self.get_l3_bindings_hosting_router_with_ha_states("},{"line_number":77,"context_line":"                    context, router_id)"},{"line_number":78,"context_line":"                if router_db.extra_attributes.distributed:"},{"line_number":79,"context_line":"                    ha_agent_id_list \u003d [agent_binding[0][\u0027id\u0027]"},{"line_number":80,"context_line":"                                        for agent_binding in bindings]"},{"line_number":81,"context_line":"                    ds_bindings \u003d self._get_l3_bindings_hosting_routers("},{"line_number":82,"context_line":"                        context, [router_id])"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_0b80468a","line":79,"range":{"start_line":79,"start_character":39,"end_line":79,"end_character":40},"in_reply_to":"9a68dd71_32c7c497","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            agents.append(l3_agent_dict)"},{"line_number":70,"context_line":"        return {\u0027agents\u0027: agents}"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def list_l3_agents_hosting_router(self, context, router_id):"},{"line_number":73,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":74,"context_line":"            router_db \u003d self._get_router(context, router_id)"},{"line_number":75,"context_line":"            if router_db.extra_attributes.ha:"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_237c591e","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":37},"updated":"2016-02-05 10:36:26.000000000","message":"please override this in l3_dvrhascheduler rather then adding dvr logic in ha scheduler","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                if router_db.extra_attributes.distributed:"},{"line_number":79,"context_line":"                    ha_agent_id_list \u003d {agent_binding[0][\u0027id\u0027]"},{"line_number":80,"context_line":"                                        for agent_binding in bindings}"},{"line_number":81,"context_line":"                    ds_bindings \u003d self._get_l3_bindings_hosting_routers("},{"line_number":82,"context_line":"                        context, [router_id])"},{"line_number":83,"context_line":"                    for new_binding in ds_bindings:"},{"line_number":84,"context_line":"                        if new_binding.l3_agent[\u0027id\u0027] not in ha_agent_id_list:"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_c8e322a3","line":81,"range":{"start_line":81,"start_character":20,"end_line":81,"end_character":31},"updated":"2016-02-05 10:36:26.000000000","message":"what ds_ means?","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                    ds_bindings \u003d self._get_l3_bindings_hosting_routers("},{"line_number":82,"context_line":"                        context, [router_id])"},{"line_number":83,"context_line":"                    for new_binding in ds_bindings:"},{"line_number":84,"context_line":"                        if new_binding.l3_agent[\u0027id\u0027] not in ha_agent_id_list:"},{"line_number":85,"context_line":"                            bindings.append((new_binding.l3_agent, None))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_e96a9f80","line":84,"range":{"start_line":84,"start_character":24,"end_line":84,"end_character":78},"updated":"2016-02-05 10:36:26.000000000","message":"what is the case when this is true?","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"}],"neutron/extensions/l3_ext_ha_mode.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"757cd47a7ff1aed873d51f0ad0c4a1b7f718befc","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    }"},{"line_number":29,"context_line":"}"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class DistributedHARouterNotSupported(NotImplementedError):"},{"line_number":33,"context_line":"    message \u003d _(\"Currently update of HA mode for distributed routers is \""},{"line_number":34,"context_line":"                \"not supported.\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_53de1cde","line":31,"updated":"2015-01-26 23:04:07.000000000","message":"Please rename this exception as it now means something entirely different.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"217314f2f778f5c3974537c83843b025e65172f6","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    }"},{"line_number":29,"context_line":"}"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class DistributedHARouterNotSupported(NotImplementedError):"},{"line_number":33,"context_line":"    message \u003d _(\"Currently update of HA mode for distributed routers is \""},{"line_number":34,"context_line":"                \"not supported.\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_a4f9c44f","line":31,"in_reply_to":"1a930d6b_53de1cde","updated":"2015-02-19 01:14:15.000000000","message":"Done","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"51d523c332f463f217a30699d94973c1a2469f3f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class DvrUpdateToHAmodeNotSupported(NotImplementedError):"},{"line_number":33,"context_line":"    message \u003d _(\"Currently update of HA mode for distributed routers is \""},{"line_number":34,"context_line":"                \"not supported.\")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class MaxVRIDAllocationTriesReached(exceptions.NeutronException):"},{"line_number":38,"context_line":"    message \u003d _(\"Failed to allocate a VRID in the network %(network_id)s \""}],"source_content_type":"text/x-python","patch_set":57,"id":"3a29b11f_0d79502f","line":35,"updated":"2015-10-20 20:08:57.000000000","message":"Due to this change, l 405-406 need to be removed from neutron/db/l3_ha_mode_db.py","commit_id":"9b906e57c60476cca0836cbd6506b196754f1ac4"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9f93c019c7183e2689642b61a2faa481b08f4e3f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    message \u003d _(\"Currently distributed HA routers are \""},{"line_number":34,"context_line":"                \"not supported.\")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class HAmodeUpdateOfDvrNotSupported(NotImplementedError):"},{"line_number":38,"context_line":"    message \u003d _(\"Currently update of HA mode for a distributed router is\""},{"line_number":39,"context_line":"                \"not supported.\")"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_6103b910","line":36,"updated":"2015-11-16 14:03:04.000000000","message":"where are these tested?","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9f93c019c7183e2689642b61a2faa481b08f4e3f","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class HAmodeUpdateOfDvrNotSupported(NotImplementedError):"},{"line_number":38,"context_line":"    message \u003d _(\"Currently update of HA mode for a distributed router is\""},{"line_number":39,"context_line":"                \"not supported.\")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_c111455f","line":38,"updated":"2015-11-16 14:03:04.000000000","message":"missing space at the end of the sentence","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3a209a347a1d65036bc822188b7babf626f26752","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class HAmodeUpdateOfDvrNotSupported(NotImplementedError):"},{"line_number":38,"context_line":"    message \u003d _(\"Currently update of HA mode for a distributed router is\""},{"line_number":39,"context_line":"                \"not supported.\")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"ba8a016a_0a5b8155","line":38,"in_reply_to":"ba8a016a_c111455f","updated":"2015-11-18 07:18:01.000000000","message":"These  are tested in file test/unit/db/test_l3_hamode_db.py\nL220 - L291","commit_id":"d6aec2b64e997e4eacd4fd3eb5ac9bad34a70e9b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0b4ef43d81ca664fff7c9de721f70e0b2d5897f2","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class HAmodeUpdateOfDvrNotSupported(NotImplementedError):"},{"line_number":38,"context_line":"    message \u003d _(\"Currently update of HA mode for a distributed router is\""},{"line_number":39,"context_line":"                \" not supported.\")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class DvrModeUpdateOfHANotSupported(NotImplementedError):"}],"source_content_type":"text/x-python","patch_set":60,"id":"ba8a016a_052ee442","line":39,"updated":"2015-11-18 20:19:28.000000000","message":"nit:  Usually we put the space at the end of the line rather than at the beginning.","commit_id":"a744438c948db72761cd4011f4bc75d79beceecd"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"aa65c42713f0ec177590053e483d661263d27e1c","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class HAmodeUpdateOfDvrNotSupported(NotImplementedError):"},{"line_number":38,"context_line":"    message \u003d _(\"Currently update of HA mode for a distributed router is\""},{"line_number":39,"context_line":"                \" not supported.\")"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class DvrModeUpdateOfHANotSupported(NotImplementedError):"}],"source_content_type":"text/x-python","patch_set":60,"id":"ba8a016a_c5fbfc79","line":39,"in_reply_to":"ba8a016a_052ee442","updated":"2015-11-18 20:27:25.000000000","message":"Done","commit_id":"a744438c948db72761cd4011f4bc75d79beceecd"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"20dd74c3f45e6ba6115cd6b13edf9bb5c2e33dc8","unresolved":false,"context_lines":[{"line_number":30,"context_line":"}"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class DistributedHARouterNotSupported(exceptions.BadRequest):"},{"line_number":34,"context_line":"    message \u003d _(\"Currently distributed HA routers are \""},{"line_number":35,"context_line":"                \"not supported.\")"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":68,"id":"da6ed579_12ba4dc1","line":33,"updated":"2016-01-15 23:09:52.000000000","message":"Shouldn\u0027t this exception be removed?","commit_id":"ab1df47e40f604ca6a94509b116101cc5743c577"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"1c6895af9cb851419be8ee5c2624c3da9ef46b9d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"}"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class DistributedHARouterNotSupported(exceptions.BadRequest):"},{"line_number":34,"context_line":"    message \u003d _(\"Currently distributed HA routers are \""},{"line_number":35,"context_line":"                \"not supported.\")"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":68,"id":"da6ed579_925abd4f","line":33,"in_reply_to":"da6ed579_12ba4dc1","updated":"2016-01-15 23:24:29.000000000","message":"It probably could be. I checked everywhere in the current code and nothing else calls it. I will remove and push new ps with other comments asap.","commit_id":"ab1df47e40f604ca6a94509b116101cc5743c577"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class HAmodeUpdateOfDvrHaNotSupported(NotImplementedError):"},{"line_number":44,"context_line":"    message \u003d _(\"Currently update of HA mode for a DVR/HA router is \""},{"line_number":45,"context_line":"                \"not supported.\")"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_1ab1a847","line":44,"range":{"start_line":44,"start_character":51,"end_line":44,"end_character":57},"updated":"2016-02-04 15:49:16.000000000","message":"nit: DVR\u0026HA","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class DVRmodeUpdateOfDvrHaNotSupported(NotImplementedError):"},{"line_number":49,"context_line":"    message \u003d _(\"Currently update of distributed mode for a DVR/HA router \""},{"line_number":50,"context_line":"                \"is not supported\")"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_3a9344a5","line":49,"range":{"start_line":49,"start_character":60,"end_line":49,"end_character":66},"updated":"2016-02-04 15:49:16.000000000","message":"ditto","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"class UpdateToDvrHamodeNotSupported(NotImplementedError):"},{"line_number":54,"context_line":"    message \u003d _(\"Currently updating a router to DVR/HA is not supported.\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class UpdateToNonDvrHamodeNotSupported(NotImplementedError):"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_da91d09a","line":54,"range":{"start_line":54,"start_character":48,"end_line":54,"end_character":54},"updated":"2016-02-04 15:49:16.000000000","message":"ditto","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"3332679bf343483ac539e7bb349dac4d63396519","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class UpdateToNonDvrHamodeNotSupported(NotImplementedError):"},{"line_number":58,"context_line":"    message \u003d _(\"Currently updating a router from DVR/HA to non-DVR \""},{"line_number":59,"context_line":"                \" non-HA is not supported.\")"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_9aea780e","line":58,"range":{"start_line":58,"start_character":50,"end_line":58,"end_character":56},"updated":"2016-02-04 15:49:16.000000000","message":"ditto","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"}],"neutron/scheduler/l3_agent_scheduler.py":[{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"08c2e65f5631f376ee653a1b7b1b97bb77d612da","unresolved":false,"context_lines":[{"line_number":232,"context_line":"    def _schedule_router(self, plugin, context, router_id,"},{"line_number":233,"context_line":"                         candidates\u003dNone):"},{"line_number":234,"context_line":"        sync_router \u003d plugin.get_router(context, router_id)"},{"line_number":235,"context_line":"        router_ha \u003d sync_router.get(\u0027ha\u0027, False)"},{"line_number":236,"context_line":"        router_distributed \u003d sync_router.get(\u0027distributed\u0027, False)"},{"line_number":237,"context_line":"        candidates \u003d candidates or self._get_candidates("},{"line_number":238,"context_line":"            plugin, context, sync_router)"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_664aaf85","line":235,"updated":"2015-10-06 13:23:41.000000000","message":"nit: how about \u0027is_router_ha\u0027 and \u0027is_router_distributed\u0027? Not a must, though.","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"08c2e65f5631f376ee653a1b7b1b97bb77d612da","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        if router_ha and router_distributed:"},{"line_number":242,"context_line":"            snat_candidates \u003d plugin.get_ha_dvr_snat_candidates(context,"},{"line_number":243,"context_line":"                                                            sync_router)"},{"line_number":244,"context_line":"            chosen_agents \u003d self._bind_ha_router(plugin, context,"},{"line_number":245,"context_line":"                                     router_id, snat_candidates)"},{"line_number":246,"context_line":"            if chosen_agents:"},{"line_number":247,"context_line":"                chosen_agent \u003d chosen_agents[-1]"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_86682bf7","line":244,"updated":"2015-10-06 13:23:41.000000000","message":"Lines 244-247 are duplicate with lines 270-274. Those lines can probably be exported to some private (prefixed with \u0027_\u0027) function that receives the candidates and returns the last self._bind_ha_router() agent returned..","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"f55905591503fe27afb0e21e772797152f8e2924","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        if router_ha and router_distributed:"},{"line_number":242,"context_line":"            snat_candidates \u003d plugin.get_ha_dvr_snat_candidates(context,"},{"line_number":243,"context_line":"                                                            sync_router)"},{"line_number":244,"context_line":"            chosen_agents \u003d self._bind_ha_router(plugin, context,"},{"line_number":245,"context_line":"                                     router_id, snat_candidates)"},{"line_number":246,"context_line":"            if chosen_agents:"},{"line_number":247,"context_line":"                chosen_agent \u003d chosen_agents[-1]"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_726d8303","line":244,"in_reply_to":"7a2fa921_86682bf7","updated":"2015-10-06 16:36:13.000000000","message":"Done","commit_id":"247c587ddc3a461557366c0dc0293438bf4ce3f5"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"91ebe21de72bc6e39d198c638a6019c22f8380eb","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            # timing problem. Non-active l3 agent can return to"},{"line_number":172,"context_line":"            # active any time"},{"line_number":173,"context_line":"            l3_agents \u003d plugin.get_l3_agents_hosting_routers("},{"line_number":174,"context_line":"                context, [sync_router[\u0027id\u0027]], admin_state_up\u003dTrue)"},{"line_number":175,"context_line":"            if l3_agents and not sync_router.get(\u0027distributed\u0027, False):"},{"line_number":176,"context_line":"                LOG.debug(\u0027Router %(router_id)s has already been hosted \u0027"},{"line_number":177,"context_line":"                          \u0027by L3 agent %(agent_id)s\u0027,"}],"source_content_type":"text/x-python","patch_set":63,"id":"7a740942_895c2e4c","line":174,"updated":"2015-12-12 00:11:50.000000000","message":"When you add/remove an internal/external device to an HA, non-DVR router, this is the code you hit. When it\u0027s HA + DVR you don\u0027t, and it ends up trying to schedule the router to an agent that\u0027s already hosting the router and you get an exception down the line: http://paste.openstack.org/show/481698/.","commit_id":"5c0b414c5d681b63dd5a7f0a581c2ee2429e005d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a665c3074e99cdd066078397a68562b4722f696b","unresolved":false,"context_lines":[{"line_number":251,"context_line":"            snat_candidates \u003d plugin.get_ha_dvr_snat_candidates(context,"},{"line_number":252,"context_line":"                                                            sync_router)"},{"line_number":253,"context_line":"            chosen_agent \u003d self._schedule_ha_router(plugin, context,"},{"line_number":254,"context_line":"                                                    router_id, snat_candidates)"},{"line_number":255,"context_line":"        if router_distributed:"},{"line_number":256,"context_line":"            for chosen_agent in candidates:"},{"line_number":257,"context_line":"                self.bind_router(context, router_id, chosen_agent)"}],"source_content_type":"text/x-python","patch_set":63,"id":"7a740942_e6080d30","line":254,"updated":"2015-12-09 18:43:55.000000000","message":"what if this returns None? Do we wnat to return here?","commit_id":"5c0b414c5d681b63dd5a7f0a581c2ee2429e005d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2449086d522d5378861a40e4f28785fa111afebd","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                                                            sync_router)"},{"line_number":253,"context_line":"            chosen_agent \u003d self._schedule_ha_router(plugin, context,"},{"line_number":254,"context_line":"                                                    router_id, snat_candidates)"},{"line_number":255,"context_line":"        if router_distributed:"},{"line_number":256,"context_line":"            for chosen_agent in candidates:"},{"line_number":257,"context_line":"                self.bind_router(context, router_id, chosen_agent)"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"7a740942_f97af276","line":255,"updated":"2015-12-09 18:45:54.000000000","message":"if you changed it to elif that would be better","commit_id":"5c0b414c5d681b63dd5a7f0a581c2ee2429e005d"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        candidates \u003d candidates or self._get_candidates("},{"line_number":236,"context_line":"            plugin, context, sync_router)"},{"line_number":237,"context_line":"        chosen_agent \u003d None"},{"line_number":238,"context_line":"        if (sync_router.get(\u0027ha\u0027, False) and"},{"line_number":239,"context_line":"                sync_router.get(\u0027distributed\u0027, False)):"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"            # Make sure the router interface is bound on all the appropriate"},{"line_number":242,"context_line":"            # l3 agents configured with agent_mode: dvr_snat"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_92e0f0fb","line":239,"range":{"start_line":238,"start_character":11,"end_line":239,"end_character":55},"updated":"2016-01-22 17:08:47.000000000","message":"nit:  consider a local variable to avoid a line break in the if statement and to self-document the meaning of the boolean:\n\n  is_ha_and_distributed \u003d (sync_router.get(\u0027ha\u0027, False) and\n                sync_router.get(\u0027distributed\u0027, False))\n  if is_ha_and_distributed:\n\nIt is just a minor readability improvement.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        candidates \u003d candidates or self._get_candidates("},{"line_number":236,"context_line":"            plugin, context, sync_router)"},{"line_number":237,"context_line":"        chosen_agent \u003d None"},{"line_number":238,"context_line":"        if (sync_router.get(\u0027ha\u0027, False) and"},{"line_number":239,"context_line":"                sync_router.get(\u0027distributed\u0027, False)):"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"            # Make sure the router interface is bound on all the appropriate"},{"line_number":242,"context_line":"            # l3 agents configured with agent_mode: dvr_snat"}],"source_content_type":"text/x-python","patch_set":72,"id":"9a68dd71_061cbd68","line":239,"range":{"start_line":238,"start_character":11,"end_line":239,"end_character":55},"in_reply_to":"9a68dd71_92e0f0fb","updated":"2016-01-22 20:07:12.000000000","message":"Done","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":"                if chosen_snat_agents:"},{"line_number":250,"context_line":"                    chosen_agent \u003d chosen_snat_agents[-1]"},{"line_number":251,"context_line":"                    self.bind_router(context, router_id, chosen_agent)"},{"line_number":252,"context_line":"            return chosen_agent"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        candidates \u003d candidates or self._get_candidates("}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_a665b61e","line":251,"range":{"start_line":251,"start_character":20,"end_line":251,"end_character":36},"updated":"2016-02-05 10:36:26.000000000","message":"_bind_dvr_ha_router() will call it for each chosen agent, I guess this one is noop","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            return False"},{"line_number":289,"context_line":"        return True"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def _node_count_in_range_for_dvr_ha(self, candidates, offset\u003d0):"},{"line_number":292,"context_line":"        if not candidates or len(candidates) \u003c (self.min_ha_agents - offset):"},{"line_number":293,"context_line":"            LOG.error(_LE(\"Not enough candidates, a HA router needs at least \""},{"line_number":294,"context_line":"                          \"%s agents\"), self.min_ha_agents)"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_23e0d828","line":291,"range":{"start_line":291,"start_character":8,"end_line":291,"end_character":39},"updated":"2016-02-05 10:36:26.000000000","message":"what for and where is it used?","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4a2d6fe1d615f047f7c4ec664a683f44fd0c4ff3","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":"        return chosen_agents"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    def _bind_dvr_ha_router(self, plugin, context, router_id, candidates):"},{"line_number":375,"context_line":"        \"\"\"Bind a DVR HA router to agents based on the total number"},{"line_number":376,"context_line":"        of agents already bound"},{"line_number":377,"context_line":"        \"\"\""},{"line_number":378,"context_line":"        # TODO(Adolfo): investigate if we need to check for enough agents.."},{"line_number":379,"context_line":"        chosen_agents \u003d self._choose_router_agents_for_ha("},{"line_number":380,"context_line":"            plugin, context, candidates)"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"        self._bind_ha_router_to_agents(plugin, context, router_id,"},{"line_number":383,"context_line":"                                       chosen_agents)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        return chosen_agents"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"class ChanceScheduler(L3Scheduler):"}],"source_content_type":"text/x-python","patch_set":82,"id":"5a5ae5dd_463f2224","line":385,"range":{"start_line":374,"start_character":4,"end_line":385,"end_character":28},"updated":"2016-02-05 10:36:26.000000000","message":"This looks exactly the same as _bind_ha_router() except for no check to self._enough_candidates_for_ha(). I guess we don\u0027t need it","commit_id":"4f4ea0bb24e0d29f57894d99cb13b4846b650207"}],"neutron/tests/functional/services/l3_router/test_l3_dvr_ha_router_plugin.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"7ea39038909f478c4a3f7c00d7eab96a2a23107d","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return (super(L3DvrHATestCase, self)."},{"line_number":42,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_update_router_db_cvr_to_dvrha(self):"},{"line_number":45,"context_line":"        router \u003d self._create_router(distributed\u003dFalse, ha\u003dFalse)"},{"line_number":46,"context_line":"        self.assertRaises("},{"line_number":47,"context_line":"            l3_ext_ha_mode.UpdateToDvrHamodeNotSupported,"}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_51c4423f","line":44,"updated":"2015-12-22 22:51:36.000000000","message":"What does \u0027cvr\u0027 mean here?","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"792aa2d5a8160ea489e4b582ee8db0e7759bd958","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return (super(L3DvrHATestCase, self)."},{"line_number":42,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_update_router_db_cvr_to_dvrha(self):"},{"line_number":45,"context_line":"        router \u003d self._create_router(distributed\u003dFalse, ha\u003dFalse)"},{"line_number":46,"context_line":"        self.assertRaises("},{"line_number":47,"context_line":"            l3_ext_ha_mode.UpdateToDvrHamodeNotSupported,"}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_d19ef206","line":44,"in_reply_to":"1a7b0d38_51c4423f","updated":"2015-12-22 23:03:06.000000000","message":"I think he meant \"centralized virtual router\" or \"legacy router\"","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"20785db4df3965723ea1931a58d96ea356010599","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        return (super(L3DvrHATestCase, self)."},{"line_number":42,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_update_router_db_cvr_to_dvrha(self):"},{"line_number":45,"context_line":"        router \u003d self._create_router(distributed\u003dFalse, ha\u003dFalse)"},{"line_number":46,"context_line":"        self.assertRaises("},{"line_number":47,"context_line":"            l3_ext_ha_mode.UpdateToDvrHamodeNotSupported,"}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_772cceab","line":44,"in_reply_to":"1a7b0d38_d19ef206","updated":"2015-12-23 01:30:28.000000000","message":"correct, cvr\u003dcentralized virtual router (legacy) sorry. I was being ocd and wanted everything to fit in three letters achronyms so they fit nice on the test reports.","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"7ea39038909f478c4a3f7c00d7eab96a2a23107d","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.assertFalse(router[\u0027distributed\u0027])"},{"line_number":122,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def test_get_device_owner_distributed_ha_router_object(self):"},{"line_number":125,"context_line":"        router \u003d self._create_router()"},{"line_number":126,"context_line":"        self.assertEqual("},{"line_number":127,"context_line":"            constants.DEVICE_OWNER_DVR_INTERFACE,"}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_5149a2cf","line":124,"updated":"2015-12-22 22:51:36.000000000","message":"It looks like you copy/pasted all of the tests below from neutron/tests/functional/services/l3_router/l3_router_plugin. Instead of copy/pasting it\u0027s easy to run the tests twice with different test setUp and/or a different _create_router method.","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"20785db4df3965723ea1931a58d96ea356010599","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.assertFalse(router[\u0027distributed\u0027])"},{"line_number":122,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def test_get_device_owner_distributed_ha_router_object(self):"},{"line_number":125,"context_line":"        router \u003d self._create_router()"},{"line_number":126,"context_line":"        self.assertEqual("},{"line_number":127,"context_line":"            constants.DEVICE_OWNER_DVR_INTERFACE,"}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_b237a4e2","line":124,"in_reply_to":"1a7b0d38_5149a2cf","updated":"2015-12-23 01:30:28.000000000","message":"Yes.  I originaly tried doing that but when I did it failed with some \nduplicate id test message. \nI tried class L3DvrHATestCase(L3DvrTestCase): \nand then defining my own Setup and deleting all tests which were the same. But no luck! still fails with error about duplicate test ids.\nIt would be great if you can point me to an example where it shows how to do it\nthanks.","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":12444,"name":"John Schwarz","email":"jschwarz@redhat.com","username":"jschwarz"},"change_message_id":"95d25c5e2eaceda0948500e00eba0add3bd6ce6f","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        self.assertFalse(router[\u0027distributed\u0027])"},{"line_number":122,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def test_get_device_owner_distributed_ha_router_object(self):"},{"line_number":125,"context_line":"        router \u003d self._create_router()"},{"line_number":126,"context_line":"        self.assertEqual("},{"line_number":127,"context_line":"            constants.DEVICE_OWNER_DVR_INTERFACE,"}],"source_content_type":"text/x-python","patch_set":65,"id":"1a7b0d38_849f8a02","line":124,"in_reply_to":"1a7b0d38_b237a4e2","updated":"2015-12-24 13:35:45.000000000","message":"I managed to get most of the tests going using this diff: http://pastebin.com/6Rz2eTuf (only 2 tests failed, but probably because the tests are not relevant to HA/DVR but only to DVR).","commit_id":"36019f5b3c3ef51c1a58d1d5d8f23a85311d9d30"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"abb42294d9907127b0e84ad491cd76c9d52ca277","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def test_update_vm_port_host_router_update(self):"},{"line_number":123,"context_line":"        # The behavior for this scenario of a dvrha router differs greatly"},{"line_number":124,"context_line":"        # fro the behavior of a dvr only router, making it not possible"},{"line_number":125,"context_line":"        # to inherit the test from the ancestor."},{"line_number":126,"context_line":"        # register l3 agents in dvr mode in addition to existing dvr_snat agent"},{"line_number":127,"context_line":"        HOST1 \u003d \u0027host1\u0027"}],"source_content_type":"text/x-python","patch_set":73,"id":"9a68dd71_0706f285","line":124,"range":{"start_line":124,"start_character":10,"end_line":124,"end_character":13},"updated":"2016-01-23 00:06:10.000000000","message":"nit: from","commit_id":"4c3d4a72c4e8d8d4e74119af3db8fbd89c2322d3"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c57e12263b6845c25432af927086355aafc2827a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            agent_mode\u003dconstants.L3_AGENT_MODE_DVR_SNAT)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _create_router(self, distributed\u003dTrue, ha\u003dTrue):"},{"line_number":38,"context_line":"        # We have to mock the number of agents available for scheduling,"},{"line_number":39,"context_line":"        # otherwise the test fails because the plugin will refuse to"},{"line_number":40,"context_line":"        # create the ha interfaces."},{"line_number":41,"context_line":"        return (super(L3DvrHATestCase, self)."},{"line_number":42,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5a5ae5dd_80effa1c","line":40,"range":{"start_line":38,"start_character":8,"end_line":40,"end_character":35},"updated":"2016-02-08 10:32:56.000000000","message":"comment seems unrelated","commit_id":"bad646790b13115eebd532ed81c88bc43de2abac"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c57e12263b6845c25432af927086355aafc2827a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # We have to mock the number of agents available for scheduling,"},{"line_number":39,"context_line":"        # otherwise the test fails because the plugin will refuse to"},{"line_number":40,"context_line":"        # create the ha interfaces."},{"line_number":41,"context_line":"        return (super(L3DvrHATestCase, self)."},{"line_number":42,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def test_update_router_db_cvr_to_dvrha(self):"},{"line_number":45,"context_line":"        router \u003d self._create_router(distributed\u003dFalse, ha\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5a5ae5dd_00dc6a71","line":42,"range":{"start_line":41,"start_character":8,"end_line":42,"end_character":63},"updated":"2016-02-08 10:32:56.000000000","message":"no-op","commit_id":"bad646790b13115eebd532ed81c88bc43de2abac"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c57e12263b6845c25432af927086355aafc2827a","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        self.assertIn(self.l3_agent_2[\u0027id\u0027], dvr_snat_agent_ids)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_update_vm_port_host_router_update(self):"},{"line_number":135,"context_line":"        # The behavior for this scenario of a dvrha router differs greatly"},{"line_number":136,"context_line":"        # from the behavior of a dvr only router, making it not possible"},{"line_number":137,"context_line":"        # to inherit the test from the ancestor."},{"line_number":138,"context_line":"        # register l3 agents in dvr mode in addition to existing dvr_snat agent"}],"source_content_type":"text/x-python","patch_set":83,"id":"5a5ae5dd_b72cbd99","line":135,"range":{"start_line":135,"start_character":59,"end_line":135,"end_character":74},"updated":"2016-02-08 10:32:56.000000000","message":"it should not differ now","commit_id":"bad646790b13115eebd532ed81c88bc43de2abac"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"00f2b6925a902b970a4cf2dcb12c3f226cd3f654","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":84,"id":"5a5ae5dd_cc274861","line":1,"updated":"2016-02-08 21:33:07.000000000","message":"nit: 2015-2016","commit_id":"bc75e820739f25535c08ca5efa0cc8f3e2a5b7d0"}],"neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c57e12263b6845c25432af927086355aafc2827a","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class L3DvrTestCase(test_l3_dvr_router_plugin_base.L3DvrTestCaseBase):"},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(L3DvrTestCase, self).setUp()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_update_router_db_centralized_to_distributed(self):"},{"line_number":31,"context_line":"        router \u003d self._create_router(distributed\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5a5ae5dd_c5d504e5","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":42},"updated":"2016-02-08 10:32:56.000000000","message":"no-op","commit_id":"bad646790b13115eebd532ed81c88bc43de2abac"}],"neutron/tests/functional/services/l3_router/test_l3_dvr_router_plugin_base.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"035d828a89190aac7acdc07f9eee08461be310a8","unresolved":false,"context_lines":[{"line_number":27,"context_line":"DEVICE_OWNER_COMPUTE \u003d constants.DEVICE_OWNER_COMPUTE_PREFIX + \u0027fake\u0027"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class L3DvrTestCaseBase(ml2_test_base.ML2TestFramework):"},{"line_number":31,"context_line":"    \"\"\"This class contains the tests and setup methods which are commong to"},{"line_number":32,"context_line":"    both type of routers: dvr-only and dvr-ha."},{"line_number":33,"context_line":"    Tests and setup methods which are particular to each type of router, should"}],"source_content_type":"text/x-python","patch_set":83,"id":"5a5ae5dd_3e3ae2e7","line":30,"range":{"start_line":30,"start_character":6,"end_line":30,"end_character":23},"updated":"2016-02-08 12:29:14.000000000","message":"tests from this module will be executed 3 times while should be only twice: for dvr and for dvr+ha. I think we don\u0027t need this base module","commit_id":"bad646790b13115eebd532ed81c88bc43de2abac"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c57e12263b6845c25432af927086355aafc2827a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            agent_mode\u003dconstants.L3_AGENT_MODE_DVR_SNAT)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _create_router(self, distributed\u003dTrue, ha\u003dFalse):"},{"line_number":42,"context_line":"        return (super(L3DvrTestCaseBase, self)."},{"line_number":43,"context_line":"                _create_router(distributed\u003ddistributed, ha\u003dha))"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def test_get_device_owner_distributed_router_object(self):"},{"line_number":46,"context_line":"        router \u003d self._create_router()"}],"source_content_type":"text/x-python","patch_set":83,"id":"5a5ae5dd_a576c803","line":43,"range":{"start_line":42,"start_character":8,"end_line":43,"end_character":63},"updated":"2016-02-08 10:32:56.000000000","message":"no-op","commit_id":"bad646790b13115eebd532ed81c88bc43de2abac"}],"neutron/tests/unit/db/test_l3_ha_db.py":[{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"757cd47a7ff1aed873d51f0ad0c4a1b7f718befc","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    def test_ha_router_create(self):"},{"line_number":133,"context_line":"        router \u003d self._create_router()"},{"line_number":134,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_ha_router_create_with_distributed(self):"},{"line_number":137,"context_line":"        router \u003d self._create_router(distributed\u003dTrue)"},{"line_number":138,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_763866d3","line":135,"updated":"2015-01-26 23:04:07.000000000","message":"I think that this test should assert that HA resources were not created?","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"217314f2f778f5c3974537c83843b025e65172f6","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    def test_ha_router_create(self):"},{"line_number":133,"context_line":"        router \u003d self._create_router()"},{"line_number":134,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_ha_router_create_with_distributed(self):"},{"line_number":137,"context_line":"        router \u003d self._create_router(distributed\u003dTrue)"},{"line_number":138,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_04653044","line":135,"in_reply_to":"1a930d6b_763866d3","updated":"2015-02-19 01:14:15.000000000","message":"Done","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"7baa1b6330f70b53b58e803bdfdcd091598e6dc4","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    def test_ha_router_create(self):"},{"line_number":133,"context_line":"        router \u003d self._create_router()"},{"line_number":134,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def test_ha_router_create_with_distributed(self):"},{"line_number":137,"context_line":"        router \u003d self._create_router(distributed\u003dTrue)"},{"line_number":138,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa81d914_f25cf127","line":135,"in_reply_to":"1a930d6b_763866d3","updated":"2015-01-28 16:14:16.000000000","message":"I assume you are referring to test_ha_router_create_with_distributed(..). Will look into it.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"757cd47a7ff1aed873d51f0ad0c4a1b7f718befc","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        router \u003d self._create_router(distributed\u003dTrue)"},{"line_number":138,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"},{"line_number":139,"context_line":"        self.assertTrue(router[\u0027distributed\u0027])"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def test_no_ha_router_create(self):"},{"line_number":142,"context_line":"        router \u003d self._create_router(ha\u003dFalse)"},{"line_number":143,"context_line":"        self.assertFalse(router[\u0027ha\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_76cce689","line":140,"updated":"2015-01-26 23:04:07.000000000","message":"We\u0027re missing coverage for the deletion of HA routers (Which isn\u0027t your problem), and the deletion of HA-distributed routers (Which I would ask you to add a test for. Something basic that makes sure we don\u0027t throw exceptions or otherwise die horribly).","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"217314f2f778f5c3974537c83843b025e65172f6","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        router \u003d self._create_router(distributed\u003dTrue)"},{"line_number":138,"context_line":"        self.assertTrue(router[\u0027ha\u0027])"},{"line_number":139,"context_line":"        self.assertTrue(router[\u0027distributed\u0027])"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def test_no_ha_router_create(self):"},{"line_number":142,"context_line":"        router \u003d self._create_router(ha\u003dFalse)"},{"line_number":143,"context_line":"        self.assertFalse(router[\u0027ha\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_c46f9826","line":140,"in_reply_to":"1a930d6b_76cce689","updated":"2015-02-19 01:14:15.000000000","message":"Done","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"757cd47a7ff1aed873d51f0ad0c4a1b7f718befc","unresolved":false,"context_lines":[{"line_number":403,"context_line":""},{"line_number":404,"context_line":"        routers_after \u003d self.plugin.get_routers(self.admin_ctx)"},{"line_number":405,"context_line":"        self.assertEqual(routers_before, routers_after)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    def test_get_number_of_agents_for_scheduling(self):"},{"line_number":408,"context_line":"        \"\"\"Test get_number_of_agents_for_scheduling raises exception"},{"line_number":409,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_76f786d3","line":406,"updated":"2015-01-26 23:04:07.000000000","message":"I kind of lost it here - We still need to make sure that HA routers don\u0027t consider DVR-Computes for scheduling purposes. Is this still happening?","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"7baa1b6330f70b53b58e803bdfdcd091598e6dc4","unresolved":false,"context_lines":[{"line_number":403,"context_line":""},{"line_number":404,"context_line":"        routers_after \u003d self.plugin.get_routers(self.admin_ctx)"},{"line_number":405,"context_line":"        self.assertEqual(routers_before, routers_after)"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"    def test_get_number_of_agents_for_scheduling(self):"},{"line_number":408,"context_line":"        \"\"\"Test get_number_of_agents_for_scheduling raises exception"},{"line_number":409,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa81d914_d2e8cd7e","line":406,"in_reply_to":"1a930d6b_76f786d3","updated":"2015-01-28 16:14:16.000000000","message":"Yes, I had the similar thought/concern but it is being indirectly tested because of the unit tests for the get_l3_agents filter at test_l3_schedulers.py: TestGetL3AgentsWithAgentModeFilter","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"}],"neutron/tests/unit/scheduler/test_l3_agent_scheduler.py":[{"author":{"_account_id":14611,"name":"dasm","display_name":"dasm","email":"dsmigiel@redhat.com","username":"dasm"},"change_message_id":"814e79d6d90784329323005cbed27fe4e9b973ab","unresolved":false,"context_lines":[{"line_number":1531,"context_line":"        if host \u003d\u003d \u0027foo_host\u0027:"},{"line_number":1532,"context_line":"            port \u003d {\u0027subnet_id\u0027: str(uuid.uuid4()),"},{"line_number":1533,"context_line":"                \u0027binding:host_id\u0027: host,"},{"line_number":1534,"context_line":"                \u0027device_owner\u0027: \u0027network:router_centralized_snat:\u0027,"},{"line_number":1535,"context_line":"                \u0027id\u0027: 1234}"},{"line_number":1536,"context_line":"        else:"},{"line_number":1537,"context_line":"            port \u003d {\u0027subnet_id\u0027: str(uuid.uuid4()),"}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_d7d8a720","line":1534,"updated":"2015-12-02 14:51:18.000000000","message":"If you\u0027ll be doing new patchset, you can consider change like:\n\n \u0027device_owner\u0027: (\u0027network:router_centralized_snat:\u0027 if host \u003d\u003d \u0027foo_host\u0027 else \u0027compute:\u0027),","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"9dc331a5fdce5f997634c76c938b92ce112fe8a1","unresolved":false,"context_lines":[{"line_number":1531,"context_line":"        if host \u003d\u003d \u0027foo_host\u0027:"},{"line_number":1532,"context_line":"            port \u003d {\u0027subnet_id\u0027: str(uuid.uuid4()),"},{"line_number":1533,"context_line":"                \u0027binding:host_id\u0027: host,"},{"line_number":1534,"context_line":"                \u0027device_owner\u0027: \u0027network:router_centralized_snat:\u0027,"},{"line_number":1535,"context_line":"                \u0027id\u0027: 1234}"},{"line_number":1536,"context_line":"        else:"},{"line_number":1537,"context_line":"            port \u003d {\u0027subnet_id\u0027: str(uuid.uuid4()),"}],"source_content_type":"text/x-python","patch_set":62,"id":"9a8ffd7b_136075ce","line":1534,"in_reply_to":"9a8ffd7b_d7d8a720","updated":"2015-12-02 17:48:39.000000000","message":"I like it. Will do if a new patch presents itself. thanks\nDONE","commit_id":"807ea9ffef68e30607d286b6758da66548efb600"}],"neutron/tests/unit/test_l3_schedulers.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"98217e4f64de3d267bcb31c40de2afdc84c27c43","unresolved":false,"context_lines":[{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"        self.assertEqual(agent_ids, [record[\u0027id\u0027] for record in result])"},{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":"    def _test_ha_schedule_snat_router_with_snat_candidates(self, ha_net\u003dTrue):"},{"line_number":1209,"context_line":"        sync_router \u003d {"},{"line_number":1210,"context_line":"                       \u0027name\u0027: \u0027router1\u0027,"},{"line_number":1211,"context_line":"                       \u0027ha\u0027: True,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_ebda52e8","line":1208,"updated":"2015-01-21 15:40:31.000000000","message":"without some functional tests it\u0027s really impossible to establish the correctness of this patch. This is about integration of two bulky functionality: unit coverage will only get you so far. What\u0027s your plan on the matter?","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"c326922c8e1640ab870436be4fd97913beec2cc4","unresolved":false,"context_lines":[{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"        self.assertEqual(agent_ids, [record[\u0027id\u0027] for record in result])"},{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":"    def _test_ha_schedule_snat_router_with_snat_candidates(self, ha_net\u003dTrue):"},{"line_number":1209,"context_line":"        sync_router \u003d {"},{"line_number":1210,"context_line":"                       \u0027name\u0027: \u0027router1\u0027,"},{"line_number":1211,"context_line":"                       \u0027ha\u0027: True,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a930d6b_76488f87","line":1208,"in_reply_to":"1a930d6b_ebda52e8","updated":"2015-01-25 22:31:59.000000000","message":"yes, Adolfo is working on adding DVR HA functional tests to the functional tests he very recently contributed.","commit_id":"6921cda6154ba5015dba1261b3fe1351a5d2e22b"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"757cd47a7ff1aed873d51f0ad0c4a1b7f718befc","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"        ha_network \u003d l3_hamode_db.L3HARouterNetwork(tenant_id\u003d\u0027foo_tenant\u0027)"},{"line_number":1221,"context_line":"        ha_network.network \u003d network"},{"line_number":1222,"context_line":"        ha_network.network.id \u003d \u0027foo_net_id\u0027"},{"line_number":1223,"context_line":""},{"line_number":1224,"context_line":"        with contextlib.nested("},{"line_number":1225,"context_line":"            mock.patch.object(self.plugin, \u0027get_ha_network\u0027),"},{"line_number":1226,"context_line":"            mock.patch.object(self.plugin, \u0027_create_ha_network\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_16aba289","line":1223,"updated":"2015-01-26 23:04:07.000000000","message":"Is there a reason for mocking anything? Could I ask you to consider to rewrite this test without mocking at all, like the other tests in this test case?","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"7baa1b6330f70b53b58e803bdfdcd091598e6dc4","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"        ha_network \u003d l3_hamode_db.L3HARouterNetwork(tenant_id\u003d\u0027foo_tenant\u0027)"},{"line_number":1221,"context_line":"        ha_network.network \u003d network"},{"line_number":1222,"context_line":"        ha_network.network.id \u003d \u0027foo_net_id\u0027"},{"line_number":1223,"context_line":""},{"line_number":1224,"context_line":"        with contextlib.nested("},{"line_number":1225,"context_line":"            mock.patch.object(self.plugin, \u0027get_ha_network\u0027),"},{"line_number":1226,"context_line":"            mock.patch.object(self.plugin, \u0027_create_ha_network\u0027),"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa81d914_347d966f","line":1223,"in_reply_to":"1a930d6b_16aba289","updated":"2015-01-28 16:14:16.000000000","message":"Since this is a unit test I mocked the calls out so that the test can control the values returned by the methods being called by the method under test.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"757cd47a7ff1aed873d51f0ad0c4a1b7f718befc","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"            self.adminContext, \u0027foo_router_id\u0027, snat_candidate)"},{"line_number":1271,"context_line":"        mock_bind.assert_called_once_with("},{"line_number":1272,"context_line":"            self.adminContext, \u0027foo_router_id\u0027, [snat_candidate])"},{"line_number":1273,"context_line":""},{"line_number":1274,"context_line":"    def test_ha_schedule_snat_router_with_snat_candidates(self):"},{"line_number":1275,"context_line":"        self._test_ha_schedule_snat_router_with_snat_candidates()"},{"line_number":1276,"context_line":"        self._test_ha_schedule_snat_router_with_snat_candidates(ha_net\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a930d6b_3685fe06","line":1273,"updated":"2015-01-26 23:04:07.000000000","message":"The two calls should probably happen in two different tests.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"7baa1b6330f70b53b58e803bdfdcd091598e6dc4","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"            self.adminContext, \u0027foo_router_id\u0027, snat_candidate)"},{"line_number":1271,"context_line":"        mock_bind.assert_called_once_with("},{"line_number":1272,"context_line":"            self.adminContext, \u0027foo_router_id\u0027, [snat_candidate])"},{"line_number":1273,"context_line":""},{"line_number":1274,"context_line":"    def test_ha_schedule_snat_router_with_snat_candidates(self):"},{"line_number":1275,"context_line":"        self._test_ha_schedule_snat_router_with_snat_candidates()"},{"line_number":1276,"context_line":"        self._test_ha_schedule_snat_router_with_snat_candidates(ha_net\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa81d914_f4e93e1b","line":1273,"in_reply_to":"1a930d6b_3685fe06","updated":"2015-01-28 16:14:16.000000000","message":"for tracking test failures I suppose? will do.","commit_id":"2427ba03c98a363817ae79ca3cafe11c20be8dbb"}],"releasenotes/notes/dvr-ha-support-cc67e84d9380cd0b.yaml":[{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"89afa84beaa36a0abf3608e07c975a1c1569b504","unresolved":false,"context_lines":[{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - High Availability  support for SNAT services on Distributed"},{"line_number":7,"context_line":"    Virtual Routers.   Routers can now be created with the flags"},{"line_number":8,"context_line":"    distributed\u003dTure and ha\u003dTrue. The created routers will provide"},{"line_number":9,"context_line":"    Distributed Virtual Routing as well as SNAT high availability on the"},{"line_number":10,"context_line":"    l3 agents configured for dvr_snat mode."},{"line_number":11,"context_line":"issues:"}],"source_content_type":"text/x-yaml","patch_set":68,"id":"da6ed579_9e3969f5","line":8,"range":{"start_line":8,"start_character":16,"end_line":8,"end_character":20},"updated":"2016-01-15 22:51:56.000000000","message":"True","commit_id":"ab1df47e40f604ca6a94509b116101cc5743c577"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"1c6895af9cb851419be8ee5c2624c3da9ef46b9d","unresolved":false,"context_lines":[{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - High Availability  support for SNAT services on Distributed"},{"line_number":7,"context_line":"    Virtual Routers.   Routers can now be created with the flags"},{"line_number":8,"context_line":"    distributed\u003dTure and ha\u003dTrue. The created routers will provide"},{"line_number":9,"context_line":"    Distributed Virtual Routing as well as SNAT high availability on the"},{"line_number":10,"context_line":"    l3 agents configured for dvr_snat mode."},{"line_number":11,"context_line":"issues:"}],"source_content_type":"text/x-yaml","patch_set":68,"id":"da6ed579_354adb56","line":8,"range":{"start_line":8,"start_character":16,"end_line":8,"end_character":20},"in_reply_to":"da6ed579_9e3969f5","updated":"2016-01-15 23:24:29.000000000","message":"Done","commit_id":"ab1df47e40f604ca6a94509b116101cc5743c577"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"7d863e60e0d073f165268b7d2be053e7aa23e615","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    High Availability (HA) of SNAT service is supported"},{"line_number":4,"context_line":"    for Distributed Virtual Routers (DVRs)."},{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - High Availability  support for SNAT services on Distributed"}],"source_content_type":"text/x-yaml","patch_set":72,"id":"9a68dd71_d238a8f1","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":55},"updated":"2016-01-22 17:08:47.000000000","message":"Are there plans to update neutron documentation for this update?","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"70947f0e31c2ce74505ec9409de00bfebcd35647","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    High Availability (HA) of SNAT service is supported"},{"line_number":4,"context_line":"    for Distributed Virtual Routers (DVRs)."},{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - High Availability  support for SNAT services on Distributed"}],"source_content_type":"text/x-yaml","patch_set":72,"id":"9a68dd71_c684655f","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":55},"in_reply_to":"9a68dd71_d238a8f1","updated":"2016-01-22 20:07:12.000000000","message":"Yes.","commit_id":"5a13673cfa7e6809af7ab62e7bfb8ff08c29cf49"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"00f2b6925a902b970a4cf2dcb12c3f226cd3f654","unresolved":false,"context_lines":[{"line_number":3,"context_line":"    High Availability (HA) of SNAT service is supported"},{"line_number":4,"context_line":"    for Distributed Virtual Routers (DVRs)."},{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - High Availability  support for SNAT services on Distributed"},{"line_number":7,"context_line":"    Virtual Routers.   Routers can now be created with the flags"},{"line_number":8,"context_line":"    distributed\u003dTrue and ha\u003dTrue. The created routers will provide"},{"line_number":9,"context_line":"    Distributed Virtual Routing as well as SNAT high availability on the"}],"source_content_type":"text/x-yaml","patch_set":84,"id":"5a5ae5dd_ccac28a1","line":6,"updated":"2016-02-08 21:33:07.000000000","message":"nit: extra space on this line and next","commit_id":"bc75e820739f25535c08ca5efa0cc8f3e2a5b7d0"}]}
