)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"ad0e452e1e738f9a91ec34e1cdd2e94281da0ab7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"each.  For that reason, it is worth the effort to make sure we check"},{"line_number":13,"context_line":"only once."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I391fafe68b76e1c620d2b25e8613ba507fd25dfd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAUH%2F%2FF5I%3D","line":15,"updated":"2014-01-17 14:52:20.000000000","message":"Add bug or blueprint reference.","commit_id":"9c1e4a2b00e5197cd3e3edf1b6b0a463ff36731b"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"35a3e681a1122aa2d86f9990a30d7ae34156f771","unresolved":false,"context_lines":[{"line_number":12,"context_line":"each.  For that reason, it is worth the effort to make sure we check"},{"line_number":13,"context_line":"only once."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I391fafe68b76e1c620d2b25e8613ba507fd25dfd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAUH%2F%2FFfE%3D","line":15,"in_reply_to":"AAAAUH%2F%2FF5I%3D","updated":"2014-01-17 15:44:20.000000000","message":"Probably needs a reference to bp neutron-tempest-parallel","commit_id":"9c1e4a2b00e5197cd3e3edf1b6b0a463ff36731b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"01878ed6598d785e2d92204026e32f7381b16268","unresolved":false,"context_lines":[{"line_number":12,"context_line":"each.  For that reason, it is worth the effort to make sure we check"},{"line_number":13,"context_line":"only once."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I391fafe68b76e1c620d2b25e8613ba507fd25dfd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAUH%2F%2FFZs%3D","line":15,"in_reply_to":"AAAAUH%2F%2FFfE%3D","updated":"2014-01-17 15:57:48.000000000","message":"Done","commit_id":"9c1e4a2b00e5197cd3e3edf1b6b0a463ff36731b"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c46883fc3a84fc691ba0e1858295377cce47b2b9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"each.  For that reason, it is worth the effort to make sure we check"},{"line_number":13,"context_line":"only once."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This is targetted at the neutron-tempest-parallel bp because it shaves"},{"line_number":16,"context_line":"time off the time to set up a router, something that hinders parallel"},{"line_number":17,"context_line":"performance."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAUH%2F9qlk%3D","line":15,"updated":"2014-02-05 07:45:34.000000000","message":"bp neutron-tempest-parallel for the proper link","commit_id":"fdcc6f4965f640bfef8f65bf55833d91d4dc9c0e"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c46883fc3a84fc691ba0e1858295377cce47b2b9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"time off the time to set up a router, something that hinders parallel"},{"line_number":17,"context_line":"performance."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This patch got into the gate somehow and it is currently not approved."},{"line_number":20,"context_line":"I am removing this patch from the gate."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: I391fafe68b76e1c620d2b25e8613ba507fd25dfd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAUH%2F9qls%3D","line":19,"updated":"2014-02-05 07:45:34.000000000","message":"please remove these 2 lines","commit_id":"fdcc6f4965f640bfef8f65bf55833d91d4dc9c0e"}],"neutron/agent/l3_agent.py":[{"author":{"_account_id":7141,"name":"Sylvain Afchain","email":"safchain@redhat.com","username":"sylvainA"},"change_message_id":"08523c8e825f0b8d222df1346b497d512ab591d6","unresolved":false,"context_lines":[{"line_number":535,"context_line":""},{"line_number":536,"context_line":"        if not ip_lib.device_exists(interface_name,"},{"line_number":537,"context_line":"                                    root_helper\u003dself.root_helper,"},{"line_number":538,"context_line":"                                    namespace\u003dri.ns_name()):"},{"line_number":539,"context_line":"            self.driver.plug(ex_gw_port[\u0027network_id\u0027],"},{"line_number":540,"context_line":"                             ex_gw_port[\u0027id\u0027], interface_name,"},{"line_number":541,"context_line":"                             ex_gw_port[\u0027mac_address\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FF74%3D","line":538,"updated":"2014-01-17 14:40:33.000000000","message":"Why not removing this condition and let self.driver.plug check if the device exists ?","commit_id":"9c1e4a2b00e5197cd3e3edf1b6b0a463ff36731b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"01878ed6598d785e2d92204026e32f7381b16268","unresolved":false,"context_lines":[{"line_number":535,"context_line":""},{"line_number":536,"context_line":"        if not ip_lib.device_exists(interface_name,"},{"line_number":537,"context_line":"                                    root_helper\u003dself.root_helper,"},{"line_number":538,"context_line":"                                    namespace\u003dri.ns_name()):"},{"line_number":539,"context_line":"            self.driver.plug(ex_gw_port[\u0027network_id\u0027],"},{"line_number":540,"context_line":"                             ex_gw_port[\u0027id\u0027], interface_name,"},{"line_number":541,"context_line":"                             ex_gw_port[\u0027mac_address\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FFeg%3D","line":538,"in_reply_to":"AAAAUH%2F%2FF74%3D","updated":"2014-01-17 15:57:48.000000000","message":"I considered this.  The reason I did not do it is that the plug method may perform other checks which take just as much time, or more.  For example, some drivers check whether the bridge exists before checking if the device exists.  In that case, we do not save anything.","commit_id":"9c1e4a2b00e5197cd3e3edf1b6b0a463ff36731b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"a59b1f490ed164f2a988fe75f5c731f1f61ef414","unresolved":false,"context_lines":[{"line_number":542,"context_line":""},{"line_number":543,"context_line":"    def external_gateway_added(self, ri, ex_gw_port,"},{"line_number":544,"context_line":"                               interface_name, internal_cidrs):"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"        self.driver.plug(ex_gw_port[\u0027network_id\u0027],"},{"line_number":547,"context_line":"                         ex_gw_port[\u0027id\u0027], interface_name,"},{"line_number":548,"context_line":"                         ex_gw_port[\u0027mac_address\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FNcQ%3D","line":545,"updated":"2014-02-14 21:02:51.000000000","message":"I decide to take this patch in a different direction.  Now, it puts the responsibility on the driver to do the right thing if the device already exists.\n\nThis gives more opportunity for optimization down the road.  For example, I think it will be possible to eliminate the check for the device altogether in a future patch.","commit_id":"dcbe0b11933ba325a31956e6b629e909a652fbc0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"a59b1f490ed164f2a988fe75f5c731f1f61ef414","unresolved":false,"context_lines":[{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    def external_gateway_removed(self, ri, ex_gw_port,"},{"line_number":578,"context_line":"                                 interface_name, internal_cidrs):"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"        self.driver.unplug(interface_name,"},{"line_number":581,"context_line":"                           bridge\u003dself.conf.external_network_bridge,"},{"line_number":582,"context_line":"                           namespace\u003dri.ns_name(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FNcE%3D","line":579,"updated":"2014-02-14 21:02:51.000000000","message":"Similar change here.  The driver is responsible for doing the right thing if the device is already gone.","commit_id":"dcbe0b11933ba325a31956e6b629e909a652fbc0"}],"neutron/agent/linux/interface.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"a59b1f490ed164f2a988fe75f5c731f1f61ef414","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        \"\"\"Plug in the interface.\"\"\""},{"line_number":162,"context_line":"        if not bridge:"},{"line_number":163,"context_line":"            bridge \u003d self.conf.ovs_integration_bridge"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        self.check_bridge_exists(bridge)"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        if not ip_lib.device_exists(device_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FNbI%3D","side":"PARENT","line":164,"updated":"2014-02-14 21:02:51.000000000","message":"There is no point in checking if the bridge exists if we\u0027re not going to go through with the rest of it.  So, I put this call after the check to see if the device exists.  It saves a system call in the event that the device already exists.","commit_id":"b70dce2aab5b1c496786d4258a93f3c7ea3dc267"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"a59b1f490ed164f2a988fe75f5c731f1f61ef414","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            if self.conf.ovs_use_veth:"},{"line_number":200,"context_line":"                root_dev.link.set_up()"},{"line_number":201,"context_line":"        else:"},{"line_number":202,"context_line":"            LOG.info(_(\"Device %s already exists\"), device_name)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def unplug(self, device_name, bridge\u003dNone, namespace\u003dNone, prefix\u003dNone):"},{"line_number":205,"context_line":"        \"\"\"Unplug the interface.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FNa4%3D","line":202,"updated":"2014-02-14 21:02:51.000000000","message":"I reduce the severity of this message since this is more of an expected condition now.  No need to warn about this.","commit_id":"dcbe0b11933ba325a31956e6b629e909a652fbc0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"a59b1f490ed164f2a988fe75f5c731f1f61ef414","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                device \u003d ip_lib.IPDevice(device_name,"},{"line_number":217,"context_line":"                                         self.root_helper,"},{"line_number":218,"context_line":"                                         namespace)"},{"line_number":219,"context_line":"                if device:"},{"line_number":220,"context_line":"                    device.link.delete()"},{"line_number":221,"context_line":"                    LOG.debug(_(\"Unplugged interface \u0027%s\u0027\"), device_name)"},{"line_number":222,"context_line":"        except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUX%2F%2FNZM%3D","line":219,"updated":"2014-02-14 21:02:51.000000000","message":"This should be device.link.address to match what ip_lib.device_exists was doing.  I\u0027ll fix in the next patch.","commit_id":"dcbe0b11933ba325a31956e6b629e909a652fbc0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d96cd9d480cd19cb24de0759b2b684eecb3c18b7","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                device \u003d ip_lib.IPDevice(device_name,"},{"line_number":217,"context_line":"                                         self.root_helper,"},{"line_number":218,"context_line":"                                         namespace)"},{"line_number":219,"context_line":"                if device.link.address:"},{"line_number":220,"context_line":"                    device.link.delete()"},{"line_number":221,"context_line":"                    LOG.debug(_(\"Unplugged interface \u0027%s\u0027\"), device_name)"},{"line_number":222,"context_line":"        except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FZhc%3D","line":219,"updated":"2014-02-26 21:26:31.000000000","message":"This still runs an extra \"ip netns exec ... ip link show\".  This is costly.  I don\u0027t think we should check.  If the device doesn\u0027t exist then ip_lib throws RuntimeError.  It is caught below and we log an error.  So what.  I\u0027m leaning toward dropping this.","commit_id":"5f50d4445ad3bb676b6d513066701f0994b9fe09"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6ba588db26b5b35aa18f81aa58ba205bcd7be956","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                device \u003d ip_lib.IPDevice(device_name,"},{"line_number":217,"context_line":"                                         self.root_helper,"},{"line_number":218,"context_line":"                                         namespace)"},{"line_number":219,"context_line":"                if device.link.address:"},{"line_number":220,"context_line":"                    device.link.delete()"},{"line_number":221,"context_line":"                    LOG.debug(_(\"Unplugged interface \u0027%s\u0027\"), device_name)"},{"line_number":222,"context_line":"        except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVX%2F%2F8oQ%3D","line":219,"in_reply_to":"AAAAU3%2F%2FZhc%3D","updated":"2014-02-27 07:42:16.000000000","message":"Concerned about logging at error level something that is expected","commit_id":"5f50d4445ad3bb676b6d513066701f0994b9fe09"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"cac9ca5b25a522d263e07039fe2545d19157f6ee","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                device \u003d ip_lib.IPDevice(device_name,"},{"line_number":217,"context_line":"                                         self.root_helper,"},{"line_number":218,"context_line":"                                         namespace)"},{"line_number":219,"context_line":"                if device.link.address:"},{"line_number":220,"context_line":"                    device.link.delete()"},{"line_number":221,"context_line":"                    LOG.debug(_(\"Unplugged interface \u0027%s\u0027\"), device_name)"},{"line_number":222,"context_line":"        except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fse8%3D","line":219,"in_reply_to":"AAAAVX%2F%2F8oQ%3D","updated":"2014-03-04 16:25:07.000000000","message":"I wouldn\u0027t say it is expected.  It is expected that the device exists when we ask to delete it.  However, it is tolerable.","commit_id":"5f50d4445ad3bb676b6d513066701f0994b9fe09"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c2fece3537f4ff9ca811344e076102202644ebe3","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                device \u003d ip_lib.IPDevice(device_name,"},{"line_number":217,"context_line":"                                         self.root_helper,"},{"line_number":218,"context_line":"                                         namespace)"},{"line_number":219,"context_line":"                if device.link.address:"},{"line_number":220,"context_line":"                    device.link.delete()"},{"line_number":221,"context_line":"                    LOG.debug(_(\"Unplugged interface \u0027%s\u0027\"), device_name)"},{"line_number":222,"context_line":"        except RuntimeError:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fr9I%3D","line":219,"in_reply_to":"AAAAVn%2F%2Fse8%3D","updated":"2014-03-04 17:16:05.000000000","message":"Agree","commit_id":"5f50d4445ad3bb676b6d513066701f0994b9fe09"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d96cd9d480cd19cb24de0759b2b684eecb3c18b7","unresolved":false,"context_lines":[{"line_number":369,"context_line":"    def unplug(self, device_name, bridge\u003dNone, namespace\u003dNone, prefix\u003dNone):"},{"line_number":370,"context_line":"        \"\"\"Unplug the interface.\"\"\""},{"line_number":371,"context_line":"        try:"},{"line_number":372,"context_line":"            device \u003d ip_lib.IPDevice(device_name, self.root_helper, namespace)"},{"line_number":373,"context_line":"            if device.link.address:"},{"line_number":374,"context_line":"                device.link.delete()"},{"line_number":375,"context_line":"                LOG.debug(_(\"Unplugged interface \u0027%s\u0027\"), device_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FZV8%3D","line":372,"updated":"2014-02-26 21:26:31.000000000","message":"I don\u0027t think there is any point to moving this here.  I\u0027m going to move it back.  There isn\u0027t any risk of throwing a RuntimeError just to construct this IPDevice.","commit_id":"5f50d4445ad3bb676b6d513066701f0994b9fe09"}],"neutron/tests/unit/test_l3_agent.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"bfba97c9ee3b4be8dd24bbac213bdde314bcc543","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":385,"context_line":"        agent.process_router_floating_ip_addresses \u003d mock.Mock()"},{"line_number":386,"context_line":"        agent.process_router_floating_ip_nat_rules \u003d mock.Mock()"},{"line_number":387,"context_line":"        agent.external_gateway_added \u003d mock.Mock()"},{"line_number":388,"context_line":"        router \u003d self._prepare_router_data()"},{"line_number":389,"context_line":"        fake_floatingips1 \u003d {\u0027floatingips\u0027: ["},{"line_number":390,"context_line":"            {\u0027id\u0027: _uuid(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2FMus%3D","line":387,"updated":"2014-02-14 22:57:15.000000000","message":"Can this be added to setup, rather than repeating in several tests?\n\nIf not, can the tests that need it, be separated out to another class?","commit_id":"2a671b7b76ace995d797b05321fb59f0d183d248"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"423c0362479797eb40d80dde1200f47175da7a05","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":385,"context_line":"        agent.process_router_floating_ip_addresses \u003d mock.Mock()"},{"line_number":386,"context_line":"        agent.process_router_floating_ip_nat_rules \u003d mock.Mock()"},{"line_number":387,"context_line":"        agent.external_gateway_added \u003d mock.Mock()"},{"line_number":388,"context_line":"        router \u003d self._prepare_router_data()"},{"line_number":389,"context_line":"        fake_floatingips1 \u003d {\u0027floatingips\u0027: ["},{"line_number":390,"context_line":"            {\u0027id\u0027: _uuid(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUX%2F%2BqkA%3D","line":387,"in_reply_to":"AAAAUX%2F%2FMus%3D","updated":"2014-02-19 22:31:02.000000000","message":"I think that would require some refactoring that I feel would be out of the scope of this patch.","commit_id":"2a671b7b76ace995d797b05321fb59f0d183d248"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"836eb0ca6ad45cb1e47b6c2fc3c3040abd087df7","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":385,"context_line":"        agent.process_router_floating_ip_addresses \u003d mock.Mock()"},{"line_number":386,"context_line":"        agent.process_router_floating_ip_nat_rules \u003d mock.Mock()"},{"line_number":387,"context_line":"        agent.external_gateway_added \u003d mock.Mock()"},{"line_number":388,"context_line":"        router \u003d self._prepare_router_data()"},{"line_number":389,"context_line":"        fake_floatingips1 \u003d {\u0027floatingips\u0027: ["},{"line_number":390,"context_line":"            {\u0027id\u0027: _uuid(),"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAVX%2F%2F9Cg%3D","line":387,"updated":"2014-02-27 06:44:51.000000000","message":"everything looks good to me, but, I wonder, why are the external_gateway_added mocked out?\n\nThanks","commit_id":"94bad0b4f82054ae7cf809b7b9e824c10d4930f2"}]}
