)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fa436bf0340cc597ee0aeca729d3b8092e2e4508","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     2c393223 (BGP Dynamic Routing: introduce BgpDriver)"},{"line_number":2,"context_line":"Author:     vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2016-01-03 21:39:26 +0530"},{"line_number":4,"context_line":"Commit:     vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-01-06 15:37:37 +0000"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"fa69d971_de757032","line":2,"updated":"2016-01-08 04:07:14.000000000","message":"@Ryan: Please set yourself as author. It\u0027s your patch. Will figure out what stupidity I am doing. Sorry for this ;)","commit_id":"9737f53dc6812bb385bed59a484049bb1716bfc4"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":14,"context_line":"distributed routers not supported."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Partially-Implements: blueprint bgp-dynamic-routing"},{"line_number":17,"context_line":"Co-Authored-By: vikram.choudhary \u003cvikram.choudhary@huawei.com\u003e"},{"line_number":18,"context_line":"Change-Id: Ide76f9fdfba228000ddfa41a1168e77d21e92d9f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"5aef4532_a35e0ce7","line":17,"updated":"2016-03-07 23:55:41.000000000","message":"So far none of the these patches have had a release note, and a docimpact, when do you intend to file one? In fact [1] doesn\u0027t even target one. I\u0027d suggest you do that now rather than later.\n\n[1] https://review.openstack.org/#/c/288856/","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"}],"neutron/db/bgp_db.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87d498fe202cb29d990839ab6fe0c7e4aab39fb6","unresolved":false,"context_lines":[{"line_number":879,"context_line":"            try:"},{"line_number":880,"context_line":"                return query.all()"},{"line_number":881,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":882,"context_line":"                raise bgp_ext.NetworkNotBound(network_id\u003dnetwork_id)"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def _bgp_speaker_for_gateway_network(self, context,"},{"line_number":885,"context_line":"                                         network_id, ip_version):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_f956bed0","side":"PARENT","line":882,"range":{"start_line":882,"start_character":30,"end_line":882,"end_character":45},"updated":"2016-03-02 21:04:16.000000000","message":"I\u0027m confused, why are you no longer raising this exception?","commit_id":"1c9e439e7a1bda5b665997816891111e679faf67"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"f5bc34cd57ef46456eebf202bf9b3097dcfee291","unresolved":false,"context_lines":[{"line_number":879,"context_line":"            try:"},{"line_number":880,"context_line":"                return query.all()"},{"line_number":881,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":882,"context_line":"                raise bgp_ext.NetworkNotBound(network_id\u003dnetwork_id)"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def _bgp_speaker_for_gateway_network(self, context,"},{"line_number":885,"context_line":"                                         network_id, ip_version):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_11337eac","side":"PARENT","line":882,"range":{"start_line":882,"start_character":30,"end_line":882,"end_character":45},"in_reply_to":"7af24918_54805746","updated":"2016-03-02 21:57:14.000000000","message":"Actually, looking again, the exception was not raised anyway because .all() didn\u0027t raise NoResultFound.","commit_id":"1c9e439e7a1bda5b665997816891111e679faf67"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"01fefaa07c6edc8202c770cd65afaf632b14f01f","unresolved":false,"context_lines":[{"line_number":879,"context_line":"            try:"},{"line_number":880,"context_line":"                return query.all()"},{"line_number":881,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":882,"context_line":"                raise bgp_ext.NetworkNotBound(network_id\u003dnetwork_id)"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def _bgp_speaker_for_gateway_network(self, context,"},{"line_number":885,"context_line":"                                         network_id, ip_version):"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_54805746","side":"PARENT","line":882,"range":{"start_line":882,"start_character":30,"end_line":882,"end_character":45},"in_reply_to":"7af24918_f956bed0","updated":"2016-03-02 21:20:54.000000000","message":"The exception is no longer raised because the assumption of 1 speaker per network is no longer valid. Instead of raising an exception and returning query.one(), we return a list that may or may not be empty. All that was being done before was to basically wrap NoResultFound in a friendlier exception. However, we don\u0027t even need to raise the exception.","commit_id":"1c9e439e7a1bda5b665997816891111e679faf67"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87d498fe202cb29d990839ab6fe0c7e4aab39fb6","unresolved":false,"context_lines":[{"line_number":892,"context_line":"                  BgpSpeakerNetworkBinding.ip_version \u003d\u003d ip_version)"},{"line_number":893,"context_line":"            try:"},{"line_number":894,"context_line":"                return query.one()"},{"line_number":895,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":896,"context_line":"                raise bgp_ext.NetworkNotBoundForIpVersion("},{"line_number":897,"context_line":"                                                        network_id\u003dnetwork_id,"},{"line_number":898,"context_line":"                                                        ip_version\u003dip_version)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_79590efe","side":"PARENT","line":895,"range":{"start_line":895,"start_character":26,"end_line":895,"end_character":39},"updated":"2016-03-02 21:04:16.000000000","message":"Ditto","commit_id":"1c9e439e7a1bda5b665997816891111e679faf67"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"01fefaa07c6edc8202c770cd65afaf632b14f01f","unresolved":false,"context_lines":[{"line_number":892,"context_line":"                  BgpSpeakerNetworkBinding.ip_version \u003d\u003d ip_version)"},{"line_number":893,"context_line":"            try:"},{"line_number":894,"context_line":"                return query.one()"},{"line_number":895,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":896,"context_line":"                raise bgp_ext.NetworkNotBoundForIpVersion("},{"line_number":897,"context_line":"                                                        network_id\u003dnetwork_id,"},{"line_number":898,"context_line":"                                                        ip_version\u003dip_version)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_b44c3b43","side":"PARENT","line":895,"range":{"start_line":895,"start_character":26,"end_line":895,"end_character":39},"in_reply_to":"7af24918_79590efe","updated":"2016-03-02 21:20:54.000000000","message":"See comments at line 882","commit_id":"1c9e439e7a1bda5b665997816891111e679faf67"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"f5bc34cd57ef46456eebf202bf9b3097dcfee291","unresolved":false,"context_lines":[{"line_number":892,"context_line":"                  BgpSpeakerNetworkBinding.ip_version \u003d\u003d ip_version)"},{"line_number":893,"context_line":"            try:"},{"line_number":894,"context_line":"                return query.one()"},{"line_number":895,"context_line":"            except sa_exc.NoResultFound:"},{"line_number":896,"context_line":"                raise bgp_ext.NetworkNotBoundForIpVersion("},{"line_number":897,"context_line":"                                                        network_id\u003dnetwork_id,"},{"line_number":898,"context_line":"                                                        ip_version\u003dip_version)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_d1ec76f5","side":"PARENT","line":895,"range":{"start_line":895,"start_character":26,"end_line":895,"end_character":39},"in_reply_to":"7af24918_b44c3b43","updated":"2016-03-02 21:57:14.000000000","message":"But, it would\u0027ve been raised here.","commit_id":"1c9e439e7a1bda5b665997816891111e679faf67"}],"neutron/db/bgp_dragentscheduler_db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1fd238caadb52a84625b5231b70356501ba660d6","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def schedule_bgp_speaker(self, context, created_bgp_speaker):"},{"line_number":76,"context_line":"        if self.bgp_drscheduler:"},{"line_number":77,"context_line":"            agents \u003d self.bgp_drscheduler.schedule(context,"},{"line_number":78,"context_line":"                                                   created_bgp_speaker)"},{"line_number":79,"context_line":"            for agent in agents:"},{"line_number":80,"context_line":"                self._bgp_rpc.bgp_speaker_created(context,"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_8d5fe40d","line":77,"updated":"2016-02-14 12:40:57.000000000","message":"self.schedule_bgp_speaker(context, bgp_speaker)\n^[[01;31m2016-02-14 18:02:14.854 TRACE neutron.api.v2.resource ^[[01;35m^[[00m  File \"/opt/stack/neutron/neutron/db/bgp_dragentscheduler_db.py\", line 81, in schedule_bgp_speaker\n^[[01;31m2016-02-14 18:02:14.854 TRACE neutron.api.v2.resource ^[[01;35m^[[00m    created_bgp_speaker)\n^[[01;31m2016-02-14 18:02:14.854 TRACE neutron.api.v2.resource ^[[01;35m^[[00mTypeError: schedule() takes exactly 4 arguments (3 given)\n^[[01;31m2016-02-14 18:02:14.854 TRACE neutron.api.v2.resource ^[[01;35m^[[00m","commit_id":"d7496927f5408370242fe4b639f8bb0dc0420f22"}],"neutron/db/bgp_rpc_db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"fa436bf0340cc597ee0aeca729d3b8092e2e4508","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Hewlett Packard Enterprise Development Co."},{"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":17,"id":"fa69d971_fb540622","line":1,"updated":"2016-01-08 04:07:14.000000000","message":"Year has passed. Let\u0027s change to 2016.","commit_id":"9737f53dc6812bb385bed59a484049bb1716bfc4"}],"neutron/db/l3_db.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":410,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":411,"context_line":"                            events.AFTER_CREATE,"},{"line_number":412,"context_line":"                            self._create_gw_port,"},{"line_number":413,"context_line":"                            gw_ips\u003dext_ips,"},{"line_number":414,"context_line":"                            network_id\u003dnew_network_id,"},{"line_number":415,"context_line":"                            router_id\u003drouter_id)"},{"line_number":416,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_745590f8","side":"PARENT","line":413,"range":{"start_line":413,"start_character":35,"end_line":413,"end_character":42},"updated":"2016-03-02 23:13:55.000000000","message":"What is the difference between ext_ips and gw_ips in this context?","commit_id":"1c9e439e7a1bda5b665997816891111e679faf67"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"e233f9663c1a4671d3224f13bfdd488b9eaf5d22","unresolved":false,"context_lines":[{"line_number":410,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":411,"context_line":"                            events.AFTER_CREATE,"},{"line_number":412,"context_line":"                            self._create_gw_port,"},{"line_number":413,"context_line":"                            gw_ips\u003dext_ips,"},{"line_number":414,"context_line":"                            network_id\u003dnew_network_id,"},{"line_number":415,"context_line":"                            router_id\u003drouter_id)"},{"line_number":416,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_f5b99716","side":"PARENT","line":413,"range":{"start_line":413,"start_character":35,"end_line":413,"end_character":42},"in_reply_to":"7af24918_745590f8","updated":"2016-03-03 00:40:19.000000000","message":"Looks like there\u0027s actually no difference, will revert this change","commit_id":"1c9e439e7a1bda5b665997816891111e679faf67"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":414,"context_line":"                            events.AFTER_CREATE,"},{"line_number":415,"context_line":"                            self._create_gw_port,"},{"line_number":416,"context_line":"                            gw_ips\u003dgw_ips,"},{"line_number":417,"context_line":"                            network_id\u003dnew_network_id,"},{"line_number":418,"context_line":"                            router_id\u003drouter_id)"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_7110025a","line":416,"range":{"start_line":416,"start_character":28,"end_line":416,"end_character":34},"updated":"2016-03-02 23:13:55.000000000","message":"All of the others pass \u0027gateway_ips\u0027.  This one passes \u0027gw_ips\u0027.  What gives?","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"e233f9663c1a4671d3224f13bfdd488b9eaf5d22","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":414,"context_line":"                            events.AFTER_CREATE,"},{"line_number":415,"context_line":"                            self._create_gw_port,"},{"line_number":416,"context_line":"                            gw_ips\u003dgw_ips,"},{"line_number":417,"context_line":"                            network_id\u003dnew_network_id,"},{"line_number":418,"context_line":"                            router_id\u003drouter_id)"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_b5954f88","line":416,"range":{"start_line":416,"start_character":28,"end_line":416,"end_character":34},"in_reply_to":"7af24918_7110025a","updated":"2016-03-03 00:40:19.000000000","message":"Because this was here first, should probably use gw_ips at L374 and L836","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"895bc224ad69cbd6292d33620ba1246b3bf5b7ea","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":414,"context_line":"                            events.AFTER_CREATE,"},{"line_number":415,"context_line":"                            self._create_gw_port,"},{"line_number":416,"context_line":"                            gw_ips\u003dgw_ips,"},{"line_number":417,"context_line":"                            network_id\u003dnew_network_id,"},{"line_number":418,"context_line":"                            router_id\u003drouter_id)"},{"line_number":419,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_b876e6d4","line":416,"range":{"start_line":416,"start_character":28,"end_line":416,"end_character":34},"in_reply_to":"7af24918_b5954f88","updated":"2016-03-03 00:54:32.000000000","message":"Nevermind, will just pass ext_ips","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":833,"context_line":"                        self,"},{"line_number":834,"context_line":"                        cidrs\u003d[x[\u0027cidr\u0027] for x in subnets],"},{"line_number":835,"context_line":"                        network_id\u003dgw_network_id,"},{"line_number":836,"context_line":"                        gateway_ips\u003dgw_ips)"},{"line_number":837,"context_line":"        return self._make_router_interface_info(router_id, port[\u0027tenant_id\u0027],"},{"line_number":838,"context_line":"                                                port[\u0027id\u0027], port[\u0027network_id\u0027],"},{"line_number":839,"context_line":"                                                subnets[0][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_b10e0a39","line":836,"range":{"start_line":836,"start_character":24,"end_line":836,"end_character":35},"updated":"2016-03-02 23:13:55.000000000","message":"ditto.","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"f01723d408faac0029ed6731fbf909755865ba7f","unresolved":false,"context_lines":[{"line_number":833,"context_line":"                        self,"},{"line_number":834,"context_line":"                        cidrs\u003d[x[\u0027cidr\u0027] for x in subnets],"},{"line_number":835,"context_line":"                        network_id\u003dgw_network_id,"},{"line_number":836,"context_line":"                        gateway_ips\u003dgw_ips)"},{"line_number":837,"context_line":"        return self._make_router_interface_info(router_id, port[\u0027tenant_id\u0027],"},{"line_number":838,"context_line":"                                                port[\u0027id\u0027], port[\u0027network_id\u0027],"},{"line_number":839,"context_line":"                                                subnets[0][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_d56f3b29","line":836,"range":{"start_line":836,"start_character":24,"end_line":836,"end_character":35},"in_reply_to":"7af24918_b10e0a39","updated":"2016-03-03 00:26:44.000000000","message":"Oops, disregard.  This is a stray ditto.","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":367,"context_line":"            self._check_router_gw_port_in_use(context, router_id)"},{"line_number":368,"context_line":"        self._core_plugin.delete_port("},{"line_number":369,"context_line":"            admin_ctx, gw_port[\u0027id\u0027], l3_port_check\u003dFalse)"},{"line_number":370,"context_line":"        registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":371,"context_line":"                        events.AFTER_DELETE, self,"},{"line_number":372,"context_line":"                        router_id\u003drouter_id,"},{"line_number":373,"context_line":"                        network_id\u003dold_network_id,"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_78ab131e","line":370,"updated":"2016-03-07 23:55:41.000000000","message":"btw have you considered passing the context here rather than pulling it out within the callback?\n\nPerhaps this needed to be done in the context of [1], but it\u0027s never too late!\n\n[1] https://review.openstack.org/#/c/241062/17/neutron/db/l3_db.py","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":367,"context_line":"            self._check_router_gw_port_in_use(context, router_id)"},{"line_number":368,"context_line":"        self._core_plugin.delete_port("},{"line_number":369,"context_line":"            admin_ctx, gw_port[\u0027id\u0027], l3_port_check\u003dFalse)"},{"line_number":370,"context_line":"        registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":371,"context_line":"                        events.AFTER_DELETE, self,"},{"line_number":372,"context_line":"                        router_id\u003drouter_id,"},{"line_number":373,"context_line":"                        network_id\u003dold_network_id,"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_6359a45a","line":370,"in_reply_to":"5aef4532_78ab131e","updated":"2016-03-08 00:28:19.000000000","message":"I had considered that, now I can\u0027t remember why I didn\u0027t pass the context here.","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":409,"context_line":"                                                  subnet[\u0027cidr\u0027])"},{"line_number":410,"context_line":"            self._create_router_gw_port(context, router,"},{"line_number":411,"context_line":"                                        new_network_id, ext_ips)"},{"line_number":412,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":413,"context_line":"                            events.AFTER_CREATE,"},{"line_number":414,"context_line":"                            self._create_gw_port,"},{"line_number":415,"context_line":"                            gw_ips\u003dext_ips,"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_98689ff7","line":412,"updated":"2016-03-07 23:55:41.000000000","message":"ditto","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"5bb20cc3e47b5280b022276b6bc487eaa51ace2f","unresolved":false,"context_lines":[{"line_number":412,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":413,"context_line":"                            events.AFTER_CREATE,"},{"line_number":414,"context_line":"                            self._create_gw_port,"},{"line_number":415,"context_line":"                            gw_ips\u003dext_ips,"},{"line_number":416,"context_line":"                            network_id\u003dnew_network_id,"},{"line_number":417,"context_line":"                            router_id\u003drouter_id)"},{"line_number":418,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_30a0929f","line":415,"range":{"start_line":415,"start_character":28,"end_line":415,"end_character":34},"updated":"2016-03-07 18:37:29.000000000","message":"I hate to keep harping on this but I\u0027m still bothered that some ROUTER_GATEWAY notifications are passing gw_ips and others are passing gateway_ips.  It took me a while to check through and confirm that they are consistent within the same event, which they are, but the lack of consistency bothers me.\n\n  AFTER_CREATE passes gw_ips\n  BEFORE_CREATE passes neither\n  AFTER_DELETE passes gateway_ips\n  BEFORE_DELETE passes neither\n\nFor ROUTER_INTERFACE...\n\n  AFTER_CREATE passes gateway_ips\n  BEFORE_CREATE passes neither\n  AFTER_DELETE passes gateway_ips\n  BEFORE_DELETE passes neither\n  \nSince it is correct, I\u0027ll mark it a nit but would like it cleaned up eventually.","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":412,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":413,"context_line":"                            events.AFTER_CREATE,"},{"line_number":414,"context_line":"                            self._create_gw_port,"},{"line_number":415,"context_line":"                            gw_ips\u003dext_ips,"},{"line_number":416,"context_line":"                            network_id\u003dnew_network_id,"},{"line_number":417,"context_line":"                            router_id\u003drouter_id)"},{"line_number":418,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_356eb62f","line":415,"range":{"start_line":415,"start_character":28,"end_line":415,"end_character":34},"in_reply_to":"5aef4532_30a0929f","updated":"2016-03-07 23:55:41.000000000","message":"I agree with you, especially if this is handled from within the same module.  Ultimately this is somewhat a fault of the registry API that permits this abuse. I wish we\u0027d had a stronger contract to be enforced and right now we\u0027re are at mercy of developers\u0027 diligence. Watch bug 1547283, as this might get cleaned up","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":412,"context_line":"            registry.notify(resources.ROUTER_GATEWAY,"},{"line_number":413,"context_line":"                            events.AFTER_CREATE,"},{"line_number":414,"context_line":"                            self._create_gw_port,"},{"line_number":415,"context_line":"                            gw_ips\u003dext_ips,"},{"line_number":416,"context_line":"                            network_id\u003dnew_network_id,"},{"line_number":417,"context_line":"                            router_id\u003drouter_id)"},{"line_number":418,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_83367001","line":415,"range":{"start_line":415,"start_character":28,"end_line":415,"end_character":34},"in_reply_to":"5aef4532_356eb62f","updated":"2016-03-08 00:28:19.000000000","message":"It\u0027s not too late to adjust L374, let me see how tangled this mess is and see about getting to some consistency here.","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"1af6bf385745f3e8c985e124b258745d694edea0","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from neutron._i18n import _, _LE, _LI, _LW"},{"line_number":30,"context_line":"from neutron.agent import securitygroups_rpc as sg_rpc"},{"line_number":31,"context_line":"from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api"},{"line_number":32,"context_line":"from neutron.api.rpc.handlers import bgp_speaker_rpc as bs_rpc"},{"line_number":33,"context_line":"from neutron.api.rpc.handlers import dhcp_rpc"},{"line_number":34,"context_line":"from neutron.api.rpc.handlers import dvr_rpc"},{"line_number":35,"context_line":"from neutron.api.rpc.handlers import metadata_rpc"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a5de9d1_a30df03f","line":32,"updated":"2016-01-28 13:47:38.000000000","message":"Let\u0027s fallback to service plugin.\n\nhttps://review.openstack.org/#/c/207625/20/neutron/services/bgp/plugin.py","commit_id":"ef341aaeaeb2b63c28a1ed63a48e36fc9d012d47"}],"neutron/services/bgp/bgp_plugin.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"5f12dd40d7013e4991c86a839d9e461e0a13f847","unresolved":false,"context_lines":[{"line_number":142,"context_line":"                #FIXME(tidwellr) this call assumes only 1 binding per network"},{"line_number":143,"context_line":"                bgp_speaker_db \u003d self._bgp_speaker_for_gateway_network("},{"line_number":144,"context_line":"                                                ctx,"},{"line_number":145,"context_line":"                                                kwargs[\u0027floating_network_id\u0027])"},{"line_number":146,"context_line":"                bgp_speaker_id \u003d bgp_speaker_db.id"},{"line_number":147,"context_line":"            except bgp_ext.NetworkNotBound:"},{"line_number":148,"context_line":"                LOG.debug(\"Network is not a BGP binding network.\")"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a5de9d1_925ab94f","line":145,"updated":"2016-02-02 13:40:26.000000000","message":"You can speed this up by running it on \u0027HEAD~[0-9]\u0027 (e.g. HEAD~1, this change only)...\n************* Module neutron.services.bgp.bgp_plugin\nE:143,33: No value for argument \u0027ip_version\u0027 in method call (no-value-for-parameter)\nERROR: InvocationError: \u0027/bin/sh ./tools/coding-checks.sh --pylint \u0027","commit_id":"570c989aafad55bb70f81e4ab2023a95a418cbb1"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"ded714eb870bde155e93e88b93c44074c501cf43","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                speakers \u003d self._bgp_speakers_for_gateway_network(ctx,"},{"line_number":216,"context_line":"                                                                  gw_network)"},{"line_number":217,"context_line":"                next_hops \u003d {4: None, 6: None}"},{"line_number":218,"context_line":"                for ip in kwargs[\u0027gw_ips\u0027]:"},{"line_number":219,"context_line":"                    next_hops[IPAddress(ip).version] \u003d ip"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"                for speaker in speakers:"}],"source_content_type":"text/x-python","patch_set":19,"id":"7a5de9d1_37d41446","line":218,"updated":"2016-02-02 13:57:26.000000000","message":"^[[01;31m2016-02-02 19:22:32.087 TRACE neutron.callbacks.manager ^[[01;35m^[[00mTraceback (most recent call last):\n^[[01;31m2016-02-02 19:22:32.087 TRACE neutron.callbacks.manager ^[[01;35m^[[00m  File \"/opt/stack/neutron/neutron/callbacks/manager.py\", line 141, in _notify_loop\n^[[01;31m2016-02-02 19:22:32.087 TRACE neutron.callbacks.manager ^[[01;35m^[[00m    callback(resource, event, trigger, **kwargs)\n^[[01;31m2016-02-02 19:22:32.087 TRACE neutron.callbacks.manager ^[[01;35m^[[00m  File \"/opt/stack/neutron/neutron/services/bgp/bgp_plugin.py\", line 201, in router_gateway_callback\n^[[01;31m2016-02-02 19:22:32.087 TRACE neutron.callbacks.manager ^[[01;35m^[[00m    self._handle_router_gateway_after_create(**kwargs)\n^[[01;31m2016-02-02 19:22:32.087 TRACE neutron.callbacks.manager ^[[01;35m^[[00m  File \"/opt/stack/neutron/neutron/services/bgp/bgp_plugin.py\", line 219, in _handle_router_gateway_after_create\n^[[01;31m2016-02-02 19:22:32.087 TRACE neutron.callbacks.manager ^[[01;35m^[[00m    for ip in kwargs[\u0027gw_ips\u0027]:\n^[[01;31m2016-02-02 19:22:32.087 TRACE neutron.callbacks.manager ^[[01;35m^[[00mTypeError: \u0027NoneType\u0027 object is not iterable","commit_id":"570c989aafad55bb70f81e4ab2023a95a418cbb1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"901b33bf8bf2d22d94fa6c693b2d71fa29d2ea90","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    def router_gateway_callback(self, resource, event, trigger, **kwargs):"},{"line_number":222,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":223,"context_line":"            self._handle_router_gateway_after_create(**kwargs)"},{"line_number":224,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":225,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":226,"context_line":"            router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":227,"context_line":"            next_hops \u003d {n_const.IP_VERSION_4: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a5ae5dd_d890b845","line":224,"range":{"start_line":224,"start_character":39,"end_line":224,"end_character":40},"updated":"2016-02-05 19:43:18.000000000","message":"The AFTER_DELETE path ends up being a no-op. The destination prefixes are not passed on the notification, the call to _tenant_prefixes_by_router at L236 always returns an empty list because the gateway port has been deleted before this callback invoked.\n\n3 choices as I see it:\n\n1. Do nothing with this notification and let the periodic re-sync in the agent flush these prefixes on its own. This gives us a worst case of 60 seconds where the next-hop for these prefixes is invalid. Not very elegant and a little lazy, but eventually consistent.\n\n2. Just go ahead and look up what we *think* the prefixes behind this router were and proactively withdraw the routes. Any discrepancies would be resolved by the periodic re-sync in the agent. Better, but still relies on the agent re-sync.\n\n3. Go into the L3 code and look up the prefixes before deleting the gateway port and pass them on the notification. This adds another step to tearing down a gateway port. In addition this isn\u0027t a nice separation of concerns because we\u0027re adding some pre-delete logic for BGP just so we can pass it on a notification.\n\nAll things considered I like option 2 the best. It allows us to immediately withdraw all the routes we can immediately, then the agent will finish off anything we missed when it re-syncs.","commit_id":"fa201fbda94f206356fb980c8f18ac133000dc59"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d92274cabb9d0edda0995a660f66a77634d303fe","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    def router_gateway_callback(self, resource, event, trigger, **kwargs):"},{"line_number":222,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":223,"context_line":"            self._handle_router_gateway_after_create(**kwargs)"},{"line_number":224,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":225,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":226,"context_line":"            router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":227,"context_line":"            next_hops \u003d {n_const.IP_VERSION_4: None,"}],"source_content_type":"text/x-python","patch_set":21,"id":"5a5ae5dd_e6b85c2c","line":224,"range":{"start_line":224,"start_character":39,"end_line":224,"end_character":40},"in_reply_to":"5a5ae5dd_d890b845","updated":"2016-02-07 00:57:32.000000000","message":"Let me add another:\n\n4. Move this to a BEFORE_DELETE callback.\n\nI don\u0027t like relying on the periodic sync for normal operation.  I\u0027d rather it be there as a backup in exceptional conditions.  So, I\u0027m not a fan of #1.  I\u0027m not sure I understand how you intend to accomplish #2 but it sounds like we\u0027re still relying on the periodic sync for normal operation.  #3 is a bit intrusive but it might be okay.  I like #4.  You pointed out to me in a chat that a rollback might occur [1] in the face of an exception.  In my opinion, this is the exceptional condition and I\u0027d rather depend on the resync to fix this.  In my mind, the user has already asked for the gateway to be deleted and shouldn\u0027t be surprised that some routers are removed.\n\nThe one drawback of #4 is that it sends a notification in a transaction.  Could we use some combination of #3 and #4 to do the query before the transaction and then do the notification after the transaction?  Could we do it without being intrusive to the l3_db code?\n\n [1] https://github.com/openstack/neutron/blob/060905783f/neutron/db/l3_db.py#L380","commit_id":"fa201fbda94f206356fb980c8f18ac133000dc59"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f49d16ee9a0181ec8dbd04baa4e14a715572c7e2","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                \"for tenant networks, floating IP\u0027s, and DVR host routes.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def _setup_rpc(self):"},{"line_number":67,"context_line":"        self.topic \u003d topics.BGP_PLUGIN"},{"line_number":68,"context_line":"        self.conn \u003d n_rpc.create_connection()"},{"line_number":69,"context_line":"        self.agent_notifiers[n_const.AGENT_TYPE_BGP_ROUTING] \u003d ("},{"line_number":70,"context_line":"            bgp_dr_rpc_agent_api.BgpDrAgentNotifyApi()"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_6a3fe625","line":67,"updated":"2016-02-14 12:06:06.000000000","message":"import BGP_PLUGIN from bgp_consts","commit_id":"d7496927f5408370242fe4b639f8bb0dc0420f22"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f49d16ee9a0181ec8dbd04baa4e14a715572c7e2","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def _setup_rpc(self):"},{"line_number":67,"context_line":"        self.topic \u003d topics.BGP_PLUGIN"},{"line_number":68,"context_line":"        self.conn \u003d n_rpc.create_connection()"},{"line_number":69,"context_line":"        self.agent_notifiers[n_const.AGENT_TYPE_BGP_ROUTING] \u003d ("},{"line_number":70,"context_line":"            bgp_dr_rpc_agent_api.BgpDrAgentNotifyApi()"},{"line_number":71,"context_line":"        )"},{"line_number":72,"context_line":"        self._bgp_rpc \u003d self.agent_notifiers[n_const.AGENT_TYPE_BGP_ROUTING]"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_8a46aabd","line":69,"updated":"2016-02-14 12:06:06.000000000","message":"ditto","commit_id":"d7496927f5408370242fe4b639f8bb0dc0420f22"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"f49d16ee9a0181ec8dbd04baa4e14a715572c7e2","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.agent_notifiers[n_const.AGENT_TYPE_BGP_ROUTING] \u003d ("},{"line_number":70,"context_line":"            bgp_dr_rpc_agent_api.BgpDrAgentNotifyApi()"},{"line_number":71,"context_line":"        )"},{"line_number":72,"context_line":"        self._bgp_rpc \u003d self.agent_notifiers[n_const.AGENT_TYPE_BGP_ROUTING]"},{"line_number":73,"context_line":"        self.endpoints \u003d [bs_rpc.BgpSpeakerRpcCallback()]"},{"line_number":74,"context_line":"        self.conn.create_consumer(self.topic, self.endpoints,"},{"line_number":75,"context_line":"                                  fanout\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":27,"id":"dae33548_ea1136b1","line":72,"updated":"2016-02-14 12:06:06.000000000","message":"ditto","commit_id":"d7496927f5408370242fe4b639f8bb0dc0420f22"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from neutron.services import service_base"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"PLUGIN_NAME \u003d bgp_ext.BGP_EXT_ALIAS + \u0027_svc_plugin\u0027"},{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_756199d2","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":33},"updated":"2016-02-18 21:11:46.000000000","message":"uh?","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class BgpPlugin(service_base.ServicePluginBase,"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_555c5518","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":33},"updated":"2016-02-18 21:11:46.000000000","message":"You already got one.  Greedy patch needs two loggers.  :P","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad022ed3c50d59a56a40a054a2783440a31ab666","unresolved":false,"context_lines":[{"line_number":36,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class BgpPlugin(service_base.ServicePluginBase,"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_b597a1ea","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":33},"in_reply_to":"dae33548_555c5518","updated":"2016-02-18 21:26:22.000000000","message":"ugh, bad rebase :(","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            dest \u003d kwargs[\u0027floating_ip_address\u0027] + \u0027/32\u0027"},{"line_number":148,"context_line":"            bgp_speaker_id \u003d None"},{"line_number":149,"context_line":"            try:"},{"line_number":150,"context_line":"                #FIXME(tidwellr) this assumes only 1 binding per network"},{"line_number":151,"context_line":"                bgp_speaker_db \u003d self._bgp_speaker_for_gateway_network("},{"line_number":152,"context_line":"                                                ctx,"},{"line_number":153,"context_line":"                                                kwargs[\u0027floating_network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_95d53d44","line":150,"range":{"start_line":150,"start_character":17,"end_line":150,"end_character":22},"updated":"2016-02-18 21:11:46.000000000","message":"TODO is the convention","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad022ed3c50d59a56a40a054a2783440a31ab666","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            dest \u003d kwargs[\u0027floating_ip_address\u0027] + \u0027/32\u0027"},{"line_number":148,"context_line":"            bgp_speaker_id \u003d None"},{"line_number":149,"context_line":"            try:"},{"line_number":150,"context_line":"                #FIXME(tidwellr) this assumes only 1 binding per network"},{"line_number":151,"context_line":"                bgp_speaker_db \u003d self._bgp_speaker_for_gateway_network("},{"line_number":152,"context_line":"                                                ctx,"},{"line_number":153,"context_line":"                                                kwargs[\u0027floating_network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_90eeeb1f","line":150,"range":{"start_line":150,"start_character":17,"end_line":150,"end_character":22},"in_reply_to":"dae33548_95d53d44","updated":"2016-02-18 21:26:22.000000000","message":"This is actually a real FIXME.  Will re-spin to fix.","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def _handle_router_interface_after_create(self, **kwargs):"},{"line_number":189,"context_line":"        gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":190,"context_line":"        if gw_network:"},{"line_number":191,"context_line":"            try:"},{"line_number":192,"context_line":"                ctx \u003d context.get_admin_context()"},{"line_number":193,"context_line":"                with ctx.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_7554f9c8","line":190,"range":{"start_line":190,"start_character":8,"end_line":190,"end_character":22},"updated":"2016-02-18 21:11:46.000000000","message":"Lots of indentation causing lots of strange formatting.  You could at least reduce the indentation by one level by reversing the sense of this check:\n\n  if not gw_network:\n      return\n\n  ... the rest of the method indented less.","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad022ed3c50d59a56a40a054a2783440a31ab666","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def _handle_router_interface_after_create(self, **kwargs):"},{"line_number":189,"context_line":"        gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":190,"context_line":"        if gw_network:"},{"line_number":191,"context_line":"            try:"},{"line_number":192,"context_line":"                ctx \u003d context.get_admin_context()"},{"line_number":193,"context_line":"                with ctx.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_d0f4f3f1","line":190,"range":{"start_line":190,"start_character":8,"end_line":190,"end_character":22},"in_reply_to":"dae33548_7554f9c8","updated":"2016-02-18 21:26:22.000000000","message":"Done","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                    speakers \u003d self._bgp_speakers_for_gateway_network("},{"line_number":195,"context_line":"                                                                   ctx,"},{"line_number":196,"context_line":"                                                                   gw_network)"},{"line_number":197,"context_line":"                    next_hops \u003d {n_const.IP_VERSION_4: None,"},{"line_number":198,"context_line":"                                 n_const.IP_VERSION_6: None}"},{"line_number":199,"context_line":"                    for ip in kwargs[\u0027gateway_ips\u0027]:"},{"line_number":200,"context_line":"                        next_hops[IPAddress(ip).version] \u003d ip"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_35a6f1ad","line":197,"range":{"start_line":197,"start_character":20,"end_line":197,"end_character":29},"updated":"2016-02-18 21:11:46.000000000","message":"nit:  There really isn\u0027t much of a need to initialize this like this.  You could change this to:\n\n  next_hops \u003d {}\n\nChange L208 to this:\n\n  if speaker.ip_version in next_hops:\n\n... and move L207 after L208.  That would work unless \u0027ip\u0027 on L200 were ever None.","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad022ed3c50d59a56a40a054a2783440a31ab666","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                    speakers \u003d self._bgp_speakers_for_gateway_network("},{"line_number":195,"context_line":"                                                                   ctx,"},{"line_number":196,"context_line":"                                                                   gw_network)"},{"line_number":197,"context_line":"                    next_hops \u003d {n_const.IP_VERSION_4: None,"},{"line_number":198,"context_line":"                                 n_const.IP_VERSION_6: None}"},{"line_number":199,"context_line":"                    for ip in kwargs[\u0027gateway_ips\u0027]:"},{"line_number":200,"context_line":"                        next_hops[IPAddress(ip).version] \u003d ip"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_10dbfb7c","line":197,"range":{"start_line":197,"start_character":20,"end_line":197,"end_character":29},"in_reply_to":"dae33548_35a6f1ad","updated":"2016-02-18 21:26:22.000000000","message":"Done","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                                          kwargs[\u0027router_id\u0027],"},{"line_number":206,"context_line":"                                                          speaker.id)"},{"line_number":207,"context_line":"                        next_hop \u003d next_hops[speaker.ip_version]"},{"line_number":208,"context_line":"                        if next_hop:"},{"line_number":209,"context_line":"                            rl \u003d self._route_list_from_prefixes_and_next_hop("},{"line_number":210,"context_line":"                                                                     prefixes,"},{"line_number":211,"context_line":"                                                                     next_hop)"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_35755163","line":208,"range":{"start_line":208,"start_character":24,"end_line":208,"end_character":35},"updated":"2016-02-18 21:11:46.000000000","message":"maybe:\n\n  if not next_hop:\n      continue\n\n  ... the rest indented less.","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad022ed3c50d59a56a40a054a2783440a31ab666","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                                          kwargs[\u0027router_id\u0027],"},{"line_number":206,"context_line":"                                                          speaker.id)"},{"line_number":207,"context_line":"                        next_hop \u003d next_hops[speaker.ip_version]"},{"line_number":208,"context_line":"                        if next_hop:"},{"line_number":209,"context_line":"                            rl \u003d self._route_list_from_prefixes_and_next_hop("},{"line_number":210,"context_line":"                                                                     prefixes,"},{"line_number":211,"context_line":"                                                                     next_hop)"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_70e6c744","line":208,"range":{"start_line":208,"start_character":24,"end_line":208,"end_character":35},"in_reply_to":"dae33548_35755163","updated":"2016-02-18 21:26:22.000000000","message":"Done","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":225,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":226,"context_line":"            router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":227,"context_line":"            next_hops \u003d {n_const.IP_VERSION_4: None,"},{"line_number":228,"context_line":"                         n_const.IP_VERSION_6: None}"},{"line_number":229,"context_line":"            for ip in kwargs[\u0027gateway_ips\u0027]:"},{"line_number":230,"context_line":"                next_hops[IPAddress(ip).version] \u003d ip"},{"line_number":231,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":232,"context_line":"            speakers \u003d self._bgp_speakers_for_gateway_network(ctx, gw_network)"},{"line_number":233,"context_line":"            for speaker in speakers:"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_551a95c6","line":230,"range":{"start_line":227,"start_character":0,"end_line":230,"end_character":53},"updated":"2016-02-18 21:11:46.000000000","message":"This is the third time I\u0027ve seen this code in this file.  That hit my threshold for a refactor.","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad022ed3c50d59a56a40a054a2783440a31ab666","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":225,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":226,"context_line":"            router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":227,"context_line":"            next_hops \u003d {n_const.IP_VERSION_4: None,"},{"line_number":228,"context_line":"                         n_const.IP_VERSION_6: None}"},{"line_number":229,"context_line":"            for ip in kwargs[\u0027gateway_ips\u0027]:"},{"line_number":230,"context_line":"                next_hops[IPAddress(ip).version] \u003d ip"},{"line_number":231,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":232,"context_line":"            speakers \u003d self._bgp_speakers_for_gateway_network(ctx, gw_network)"},{"line_number":233,"context_line":"            for speaker in speakers:"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_b0d20f5a","line":230,"range":{"start_line":227,"start_character":0,"end_line":230,"end_character":53},"in_reply_to":"dae33548_551a95c6","updated":"2016-02-18 21:26:22.000000000","message":"Done","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            with ctx.session.begin(subtransactions\u003dTrue):"},{"line_number":250,"context_line":"                speakers \u003d self._bgp_speakers_for_gateway_network(ctx,"},{"line_number":251,"context_line":"                                                                  gw_network)"},{"line_number":252,"context_line":"                next_hops \u003d {n_const.IP_VERSION_4: None,"},{"line_number":253,"context_line":"                             n_const.IP_VERSION_6: None}"},{"line_number":254,"context_line":"                for ip in kwargs[\u0027gw_ips\u0027]:"},{"line_number":255,"context_line":"                    next_hops[IPAddress(ip).version] \u003d ip"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"                for speaker in speakers:"},{"line_number":258,"context_line":"                    next_hop \u003d next_hops[speaker.ip_version]"},{"line_number":259,"context_line":"                    if next_hop:"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_f5fc8973","line":256,"range":{"start_line":252,"start_character":0,"end_line":256,"end_character":0},"updated":"2016-02-18 21:11:46.000000000","message":"fourth","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad022ed3c50d59a56a40a054a2783440a31ab666","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            with ctx.session.begin(subtransactions\u003dTrue):"},{"line_number":250,"context_line":"                speakers \u003d self._bgp_speakers_for_gateway_network(ctx,"},{"line_number":251,"context_line":"                                                                  gw_network)"},{"line_number":252,"context_line":"                next_hops \u003d {n_const.IP_VERSION_4: None,"},{"line_number":253,"context_line":"                             n_const.IP_VERSION_6: None}"},{"line_number":254,"context_line":"                for ip in kwargs[\u0027gw_ips\u0027]:"},{"line_number":255,"context_line":"                    next_hops[IPAddress(ip).version] \u003d ip"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"                for speaker in speakers:"},{"line_number":258,"context_line":"                    next_hop \u003d next_hops[speaker.ip_version]"},{"line_number":259,"context_line":"                    if next_hop:"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_f0c817aa","line":256,"range":{"start_line":252,"start_character":0,"end_line":256,"end_character":0},"in_reply_to":"dae33548_f5fc8973","updated":"2016-02-18 21:26:22.000000000","message":"Done","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8ff0c37396667be94551385e33d7d4a462bc5dad","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"                for speaker in speakers:"},{"line_number":258,"context_line":"                    next_hop \u003d next_hops[speaker.ip_version]"},{"line_number":259,"context_line":"                    if next_hop:"},{"line_number":260,"context_line":"                        prefixes \u003d self._tenant_prefixes_by_router(ctx,"},{"line_number":261,"context_line":"                                                                   router_id,"},{"line_number":262,"context_line":"                                                                   speaker.id)"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_75da3918","line":259,"range":{"start_line":259,"start_character":20,"end_line":259,"end_character":31},"updated":"2016-02-18 21:11:46.000000000","message":"ditto (L208)","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ad022ed3c50d59a56a40a054a2783440a31ab666","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"                for speaker in speakers:"},{"line_number":258,"context_line":"                    next_hop \u003d next_hops[speaker.ip_version]"},{"line_number":259,"context_line":"                    if next_hop:"},{"line_number":260,"context_line":"                        prefixes \u003d self._tenant_prefixes_by_router(ctx,"},{"line_number":261,"context_line":"                                                                   router_id,"},{"line_number":262,"context_line":"                                                                   speaker.id)"}],"source_content_type":"text/x-python","patch_set":30,"id":"dae33548_d0cb53a2","line":259,"range":{"start_line":259,"start_character":20,"end_line":259,"end_character":31},"in_reply_to":"dae33548_75da3918","updated":"2016-02-18 21:26:22.000000000","message":"Done","commit_id":"16a9ccbcdc97d1d3f5e80ba38f42255b8d2829c1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87d498fe202cb29d990839ab6fe0c7e4aab39fb6","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                                                        self._bgp_rpc,"},{"line_number":203,"context_line":"                                                        speaker.id,"},{"line_number":204,"context_line":"                                                        rl)"},{"line_number":205,"context_line":"        except bgp_ext.NetworkNotBound:"},{"line_number":206,"context_line":"            msg \u003d _(\"Network %s is not a BGP gateway network, \""},{"line_number":207,"context_line":"                    \"ignoring router interface creation.\") % gw_network"},{"line_number":208,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_b9cf167e","line":205,"range":{"start_line":205,"start_character":23,"end_line":205,"end_character":38},"updated":"2016-03-02 21:04:16.000000000","message":"You no longer raise this exception anywhere since this patch is removing the one place where did.","commit_id":"7f2a2a03c36f3d8507baf3d1d8ee59d9aab34af5"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"01fefaa07c6edc8202c770cd65afaf632b14f01f","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                                                        self._bgp_rpc,"},{"line_number":203,"context_line":"                                                        speaker.id,"},{"line_number":204,"context_line":"                                                        rl)"},{"line_number":205,"context_line":"        except bgp_ext.NetworkNotBound:"},{"line_number":206,"context_line":"            msg \u003d _(\"Network %s is not a BGP gateway network, \""},{"line_number":207,"context_line":"                    \"ignoring router interface creation.\") % gw_network"},{"line_number":208,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_946e5f94","line":205,"range":{"start_line":205,"start_character":23,"end_line":205,"end_character":38},"in_reply_to":"7af24918_b9cf167e","updated":"2016-03-02 21:20:54.000000000","message":"Done","commit_id":"7f2a2a03c36f3d8507baf3d1d8ee59d9aab34af5"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87d498fe202cb29d990839ab6fe0c7e4aab39fb6","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                        self.start_route_advertisements(ctx, self._bgp_rpc,"},{"line_number":251,"context_line":"                                                        speaker.id, routes)"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        except bgp_ext.NetworkNotBound:"},{"line_number":254,"context_line":"            msg \u003d _(\"Router %s is not attached to a BGP gateway network, \""},{"line_number":255,"context_line":"                    \"ignoring router gateway interface creation.\") % router_id"},{"line_number":256,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_d9c4a260","line":253,"range":{"start_line":253,"start_character":23,"end_line":253,"end_character":38},"updated":"2016-03-02 21:04:16.000000000","message":"ditto","commit_id":"7f2a2a03c36f3d8507baf3d1d8ee59d9aab34af5"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"01fefaa07c6edc8202c770cd65afaf632b14f01f","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                        self.start_route_advertisements(ctx, self._bgp_rpc,"},{"line_number":251,"context_line":"                                                        speaker.id, routes)"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        except bgp_ext.NetworkNotBound:"},{"line_number":254,"context_line":"            msg \u003d _(\"Router %s is not attached to a BGP gateway network, \""},{"line_number":255,"context_line":"                    \"ignoring router gateway interface creation.\") % router_id"},{"line_number":256,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_b4fa7bbb","line":253,"range":{"start_line":253,"start_character":23,"end_line":253,"end_character":38},"in_reply_to":"7af24918_d9c4a260","updated":"2016-03-02 21:20:54.000000000","message":"Done","commit_id":"7f2a2a03c36f3d8507baf3d1d8ee59d9aab34af5"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"87d498fe202cb29d990839ab6fe0c7e4aab39fb6","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                    self.stop_route_advertisements(ctx, self._bgp_rpc,"},{"line_number":266,"context_line":"                                                   speaker.id, routes)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"            except bgp_ext.NetworkNotBound:"},{"line_number":269,"context_line":"                msg \u003d _(\"Network %s is not a BGP gateway network, \""},{"line_number":270,"context_line":"                        \"ignoring router interface delete.\") % gw_network"},{"line_number":271,"context_line":"                LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_19a56ab4","line":268,"range":{"start_line":268,"start_character":27,"end_line":268,"end_character":42},"updated":"2016-03-02 21:04:16.000000000","message":"ditto","commit_id":"7f2a2a03c36f3d8507baf3d1d8ee59d9aab34af5"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"01fefaa07c6edc8202c770cd65afaf632b14f01f","unresolved":false,"context_lines":[{"line_number":265,"context_line":"                    self.stop_route_advertisements(ctx, self._bgp_rpc,"},{"line_number":266,"context_line":"                                                   speaker.id, routes)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"            except bgp_ext.NetworkNotBound:"},{"line_number":269,"context_line":"                msg \u003d _(\"Network %s is not a BGP gateway network, \""},{"line_number":270,"context_line":"                        \"ignoring router interface delete.\") % gw_network"},{"line_number":271,"context_line":"                LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":38,"id":"7af24918_94f5bfcc","line":268,"range":{"start_line":268,"start_character":27,"end_line":268,"end_character":42},"in_reply_to":"7af24918_19a56ab4","updated":"2016-03-02 21:20:54.000000000","message":"Done","commit_id":"7f2a2a03c36f3d8507baf3d1d8ee59d9aab34af5"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                                                 agent.host)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def floatingip_update_callback(self, resource, event, trigger, **kwargs):"},{"line_number":139,"context_line":"        if event is events.AFTER_UPDATE:"},{"line_number":140,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":141,"context_line":"            new_router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":142,"context_line":"            last_router_id \u003d kwargs[\u0027last_known_router_id\u0027]"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_d4b90417","line":139,"range":{"start_line":139,"start_character":8,"end_line":139,"end_character":39},"updated":"2016-03-02 23:13:55.000000000","message":"nit:  Consider:\n\n  if event is not events.AFTER_UPDATE:\n      return","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    def floatingip_update_callback(self, resource, event, trigger, **kwargs):"},{"line_number":139,"context_line":"        if event is events.AFTER_UPDATE:"},{"line_number":140,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":141,"context_line":"            new_router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":142,"context_line":"            last_router_id \u003d kwargs[\u0027last_known_router_id\u0027]"},{"line_number":143,"context_line":"            next_hop \u003d kwargs[\u0027next_hop\u0027]"},{"line_number":144,"context_line":"            dest \u003d kwargs[\u0027floating_ip_address\u0027] + \u0027/32\u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_3ddf6b0e","line":141,"range":{"start_line":141,"start_character":12,"end_line":141,"end_character":47},"updated":"2016-03-02 23:13:55.000000000","message":"nit:  Consider just adding these to the list of params for this method.  I tend to prefer not using kwargs when I don\u0027t need the indirection.\n\nSame comment applies to a handful of other uses of kwargs in this code but only after following comment on L166.  I won\u0027t point them all out.  But, I think the code would look a lot cleaner overall this way.  Just looking at the strange indentation, like on L188.","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            next_hop \u003d kwargs[\u0027next_hop\u0027]"},{"line_number":144,"context_line":"            dest \u003d kwargs[\u0027floating_ip_address\u0027] + \u0027/32\u0027"},{"line_number":145,"context_line":"            bgp_speakers \u003d self._bgp_speakers_for_gw_network_by_family("},{"line_number":146,"context_line":"                                                ctx,"},{"line_number":147,"context_line":"                                                kwargs[\u0027floating_network_id\u0027],"},{"line_number":148,"context_line":"                                                n_const.IP_VERSION_4)"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_5d851705","line":146,"range":{"start_line":146,"start_character":16,"end_line":146,"end_character":48},"updated":"2016-03-02 23:13:55.000000000","message":"piconit:  I normally just indent 4 spaces from the previous line in cases like this.","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":163,"context_line":"    def router_interface_callback(self, resource, event, trigger, **kwargs):"},{"line_number":164,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":165,"context_line":"            self._handle_router_interface_after_create(**kwargs)"},{"line_number":166,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":167,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":168,"context_line":"            next_hops \u003d self._next_hops_from_gateway_ips("},{"line_number":169,"context_line":"                                                        kwargs[\u0027gateway_ips\u0027])"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_545b34f6","line":166,"updated":"2016-03-02 23:13:55.000000000","message":"nit:  Consider wrapping the code below in to \"_handle_router_interface_after_delete\" just for a little better uniformity (with L165) and separation of concerns in the code.  But see my comments below.  There is already a _handle_router_interface_after_delete but I\u0027m not sure if it is really a complement to _handle_router_interface_after_create.","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                                                      ctx,"},{"line_number":193,"context_line":"                                                      kwargs[\u0027router_id\u0027],"},{"line_number":194,"context_line":"                                                      speaker.id)"},{"line_number":195,"context_line":"                next_hop \u003d next_hops[speaker.ip_version]"},{"line_number":196,"context_line":"                if next_hop:"},{"line_number":197,"context_line":"                    rl \u003d self._route_list_from_prefixes_and_next_hop(prefixes,"},{"line_number":198,"context_line":"                                                                     next_hop)"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_3dbc8bdb","line":195,"range":{"start_line":195,"start_character":36,"end_line":195,"end_character":56},"updated":"2016-03-02 23:13:55.000000000","message":"nit:  I don\u0027t know if _next_hops_from_gateway_ips guarantees that this will be found but it would be a good idea to code safer:\n\n  next_hop \u003d next_hops.get(speaker.ip_version)","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def router_gateway_callback(self, resource, event, trigger, **kwargs):"},{"line_number":205,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":206,"context_line":"            self._handle_router_gateway_after_create(**kwargs)"},{"line_number":207,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":208,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":209,"context_line":"            router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":210,"context_line":"            next_hops \u003d self._next_hops_from_gateway_ips("}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_1419acd7","line":207,"updated":"2016-03-02 23:13:55.000000000","message":"similar comment to L166.","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":243,"context_line":"                    self.start_route_advertisements(ctx, self._bgp_rpc,"},{"line_number":244,"context_line":"                                                    speaker.id, routes)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def _handle_router_interface_after_delete(self, gw_network, routes):"},{"line_number":247,"context_line":"        if gw_network and routes:"},{"line_number":248,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":249,"context_line":"            speakers \u003d self._bgp_speakers_for_gateway_network(ctx, gw_network)"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_4207f2c9","line":246,"range":{"start_line":246,"start_character":8,"end_line":246,"end_character":45},"updated":"2016-03-02 23:13:55.000000000","message":"nit: This doesn\u0027t seem to be the converse of _handle_router_interface_after_create.  I do like symmetry.  :)","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                                               speaker.id, routes)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def _next_hops_from_gateway_ips(self, gw_ips):"},{"line_number":255,"context_line":"        next_hops \u003d {}"},{"line_number":256,"context_line":"        for ip in gw_ips:"},{"line_number":257,"context_line":"            next_hops[IPAddress(ip).version] \u003d ip"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"        return next_hops"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    def start_route_advertisements(self, ctx, bgp_rpc,"},{"line_number":262,"context_line":"                                   bgp_speaker_id, routes):"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_94af7c29","line":259,"range":{"start_line":255,"start_character":8,"end_line":259,"end_character":24},"updated":"2016-03-02 23:13:55.000000000","message":"nit:  This is a nice place for a dict comprehension:\n\n  return {IPAddress(ip).version: ip for ip in gw_ips}","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":262,"context_line":"                                   bgp_speaker_id, routes):"},{"line_number":263,"context_line":"        agents \u003d self.list_dragent_hosting_bgp_speaker(ctx, bgp_speaker_id)"},{"line_number":264,"context_line":"        for agent in agents[\u0027agents\u0027]:"},{"line_number":265,"context_line":"            bgp_rpc.bgp_routes_advertisement(ctx, bgp_speaker_id,"},{"line_number":266,"context_line":"                                             routes, agent[\u0027host\u0027])"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        # Could have a large number of routes passed, check log level first"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_7df1f300","line":265,"range":{"start_line":265,"start_character":20,"end_line":265,"end_character":44},"updated":"2016-03-02 23:13:55.000000000","message":"attonit:  This is a similar call to L278 but in a different style.  ;)\n\nActually I only noticed because I was comparing the two and the style difference threw me off.\n\nThere aren\u0027t many differences between these two methods.  But, don\u0027t go off and do something silly -- like add an argument to the method to switch behavior -- to reduce code duplication.  If there is a nice way, fine.","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":269,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":270,"context_line":"            for route in routes:"},{"line_number":271,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""},{"line_number":272,"context_line":"                LOG.debug(msg, route[\u0027destination\u0027], bgp_speaker_id)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def stop_route_advertisements(self, ctx, bgp_rpc,"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_421a527e","line":271,"range":{"start_line":271,"start_character":23,"end_line":271,"end_character":31},"updated":"2016-03-02 23:13:55.000000000","message":"note:  different than next method","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"3f04aa51bd86716af93963de60a94f9ff60deeb2","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":270,"context_line":"            for route in routes:"},{"line_number":271,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""},{"line_number":272,"context_line":"                LOG.debug(msg, route[\u0027destination\u0027], bgp_speaker_id)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def stop_route_advertisements(self, ctx, bgp_rpc,"},{"line_number":275,"context_line":"                                  bgp_speaker_id, routes):"}],"source_content_type":"text/x-python","patch_set":39,"id":"7af24918_c20e623a","line":272,"range":{"start_line":272,"start_character":36,"end_line":272,"end_character":51},"updated":"2016-03-02 23:13:55.000000000","message":"note:  different than next method","commit_id":"889769bd6e83f068e5c911d335ba33e799ad7b0c"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                                                 agent.host)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def floatingip_update_callback(self, resource, event, trigger, **kwargs):"},{"line_number":139,"context_line":"        if event is not events.AFTER_UPDATE:"},{"line_number":140,"context_line":"            return"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        ctx \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_9809bf98","line":139,"updated":"2016-03-07 23:55:41.000000000","message":"I\u0027d personally prefer \u003d\u003d/!\u003d over is/is not when comparing string values. Where did you noticed this?","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                                                 agent.host)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def floatingip_update_callback(self, resource, event, trigger, **kwargs):"},{"line_number":139,"context_line":"        if event is not events.AFTER_UPDATE:"},{"line_number":140,"context_line":"            return"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        ctx \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_83c150e7","line":139,"in_reply_to":"5aef4532_9809bf98","updated":"2016-03-08 00:28:19.000000000","message":"Done","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                                                [new_host_route])"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def router_interface_callback(self, resource, event, trigger, **kwargs):"},{"line_number":165,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":166,"context_line":"            self._handle_router_interface_after_create(**kwargs)"},{"line_number":167,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":168,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_58f0d790","line":165,"updated":"2016-03-07 23:55:41.000000000","message":"ditto","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                                                [new_host_route])"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def router_interface_callback(self, resource, event, trigger, **kwargs):"},{"line_number":165,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":166,"context_line":"            self._handle_router_interface_after_create(**kwargs)"},{"line_number":167,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":168,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_e3b65489","line":165,"in_reply_to":"5aef4532_58f0d790","updated":"2016-03-08 00:28:19.000000000","message":"Done","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    def router_interface_callback(self, resource, event, trigger, **kwargs):"},{"line_number":165,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":166,"context_line":"            self._handle_router_interface_after_create(**kwargs)"},{"line_number":167,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":168,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":169,"context_line":"            next_hops \u003d self._next_hops_from_gateway_ips("},{"line_number":170,"context_line":"                                                        kwargs[\u0027gateway_ips\u0027])"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_b82bdbea","line":167,"updated":"2016-03-07 23:55:41.000000000","message":"ditto","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    def router_interface_callback(self, resource, event, trigger, **kwargs):"},{"line_number":165,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":166,"context_line":"            self._handle_router_interface_after_create(**kwargs)"},{"line_number":167,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":168,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":169,"context_line":"            next_hops \u003d self._next_hops_from_gateway_ips("},{"line_number":170,"context_line":"                                                        kwargs[\u0027gateway_ips\u0027])"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_c3bb5871","line":167,"in_reply_to":"5aef4532_b82bdbea","updated":"2016-03-08 00:28:19.000000000","message":"Done","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                                                    rl)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def router_gateway_callback(self, resource, event, trigger, **kwargs):"},{"line_number":206,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":207,"context_line":"            self._handle_router_gateway_after_create(**kwargs)"},{"line_number":208,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":209,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_f8356346","line":206,"updated":"2016-03-07 23:55:41.000000000","message":"ditto","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                                                    rl)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def router_gateway_callback(self, resource, event, trigger, **kwargs):"},{"line_number":206,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":207,"context_line":"            self._handle_router_gateway_after_create(**kwargs)"},{"line_number":208,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":209,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_43a8e81f","line":206,"in_reply_to":"5aef4532_f8356346","updated":"2016-03-08 00:28:19.000000000","message":"Done","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":205,"context_line":"    def router_gateway_callback(self, resource, event, trigger, **kwargs):"},{"line_number":206,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":207,"context_line":"            self._handle_router_gateway_after_create(**kwargs)"},{"line_number":208,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":209,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":210,"context_line":"            router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":211,"context_line":"            next_hops \u003d self._next_hops_from_gateway_ips("}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_584737bb","line":208,"updated":"2016-03-07 23:55:41.000000000","message":"ditto","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":205,"context_line":"    def router_gateway_callback(self, resource, event, trigger, **kwargs):"},{"line_number":206,"context_line":"        if event is events.AFTER_CREATE:"},{"line_number":207,"context_line":"            self._handle_router_gateway_after_create(**kwargs)"},{"line_number":208,"context_line":"        if event is events.AFTER_DELETE:"},{"line_number":209,"context_line":"            gw_network \u003d kwargs[\u0027network_id\u0027]"},{"line_number":210,"context_line":"            router_id \u003d kwargs[\u0027router_id\u0027]"},{"line_number":211,"context_line":"            next_hops \u003d self._next_hops_from_gateway_ips("}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_a363ac19","line":208,"in_reply_to":"5aef4532_584737bb","updated":"2016-03-08 00:28:19.000000000","message":"Done","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":253,"context_line":"                                               speaker.id, routes)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    def _next_hops_from_gateway_ips(self, gw_ips):"},{"line_number":256,"context_line":"        return {IPAddress(ip).version: ip for ip in gw_ips}"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def start_route_advertisements(self, ctx, bgp_rpc,"},{"line_number":259,"context_line":"                                   bgp_speaker_id, routes):"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_3e3213f2","line":256,"updated":"2016-03-08 00:28:19.000000000","message":"Should be:\n\nif gw_ips:\n    return {IPAddress(ip).version: ip for ip in gw_ips}\nreturn {}","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                                             routes,"},{"line_number":265,"context_line":"                                             agent[\u0027host\u0027])"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        # Could have a large number of routes passed, check log level first"},{"line_number":268,"context_line":"        if LOG.isEnabledFor(logging.DEBUG):"},{"line_number":269,"context_line":"            for route in routes:"},{"line_number":270,"context_line":"                msg \u003d \"Starting route advertisements for %s on BgpSpeaker %s\""}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_38550b50","line":267,"updated":"2016-03-07 23:55:41.000000000","message":"you could extract this into a util method. DRY (Don\u0027t Repeat Yourself)!","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"}],"neutron/tests/unit/db/test_bgp_db.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"166d8e367be7f607e233fbb7e01b7f6e3c2393fe","unresolved":false,"context_lines":[{"line_number":829,"context_line":"                self.assertTrue(tenant_prefix_found)"},{"line_number":830,"context_line":"                self.assertTrue(fip_prefix_found)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    def test__bgp_speakers_for_gateway_network_by_ip_version(self):"},{"line_number":833,"context_line":"        with self.network() as ext_net, self.bgp_speaker(6, 1234) as s1,\\"},{"line_number":834,"context_line":"            self.bgp_speaker(6, 4321) as s2:"},{"line_number":835,"context_line":"            gw_net_id \u003d ext_net[\u0027network\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_436aa881","line":832,"updated":"2016-03-07 23:55:41.000000000","message":"are you sure these two test provide the coverage for all the code you wrote in this patch? Looks a bit slim.","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"cd044089f5115b0bb27566c7f79db24a968d45b9","unresolved":false,"context_lines":[{"line_number":829,"context_line":"                self.assertTrue(tenant_prefix_found)"},{"line_number":830,"context_line":"                self.assertTrue(fip_prefix_found)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    def test__bgp_speakers_for_gateway_network_by_ip_version(self):"},{"line_number":833,"context_line":"        with self.network() as ext_net, self.bgp_speaker(6, 1234) as s1,\\"},{"line_number":834,"context_line":"            self.bgp_speaker(6, 4321) as s2:"},{"line_number":835,"context_line":"            gw_net_id \u003d ext_net[\u0027network\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_9effe700","line":832,"in_reply_to":"5aef4532_436aa881","updated":"2016-03-08 00:28:19.000000000","message":"For the DB layer, yes. You caught me, I did skimp on tests for the plugin itself.","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3ae55a70e1f2ecc070ba7e697a8ce603a72573f5","unresolved":false,"context_lines":[{"line_number":829,"context_line":"                self.assertTrue(tenant_prefix_found)"},{"line_number":830,"context_line":"                self.assertTrue(fip_prefix_found)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    def test__bgp_speakers_for_gateway_network_by_ip_version(self):"},{"line_number":833,"context_line":"        with self.network() as ext_net, self.bgp_speaker(6, 1234) as s1,\\"},{"line_number":834,"context_line":"            self.bgp_speaker(6, 4321) as s2:"},{"line_number":835,"context_line":"            gw_net_id \u003d ext_net[\u0027network\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":41,"id":"5aef4532_70a2ccaf","line":832,"in_reply_to":"5aef4532_9effe700","updated":"2016-03-09 02:39:21.000000000","message":"I won\u0027t forget your lack of action to address the inadequate coverage.","commit_id":"e54a515eebde613fe01e90ac01e1a550633d2409"}]}
