)]}'
{"neutron/agent/l3/agent.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":725,"context_line":"        if ri.is_ha:"},{"line_number":726,"context_line":"            ri._remove_vip(ip_cidr)"},{"line_number":727,"context_line":"        else:"},{"line_number":728,"context_line":"            device.addr.delete(ip_cidr)"},{"line_number":729,"context_line":"            self.driver.delete_conntrack_state(namespace\u003dri.ns_name,"},{"line_number":730,"context_line":"                                               ip\u003dip_cidr)"},{"line_number":731,"context_line":"            if ri.router[\u0027distributed\u0027]:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_9c8667b8","line":728,"updated":"2015-02-21 00:20:35.000000000","message":"Nice!  Thanks for doing this.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"e71ee205ea787656a9c1ab9046f80c2f40919e83","unresolved":false,"context_lines":[{"line_number":666,"context_line":"            for p in ri.internal_ports:"},{"line_number":667,"context_line":"                gateway \u003d self._map_internal_interfaces(ri, p, snat_ports)"},{"line_number":668,"context_line":"                internal_interface \u003d ri.get_internal_device_name(p[\u0027id\u0027])"},{"line_number":669,"context_line":"                self._snat_redirect_remove(ri, gateway[\u0027fixed_ips\u0027][0],"},{"line_number":670,"context_line":"                                           p, internal_interface)"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"            if (self.conf.agent_mode \u003d\u003d l3_constants.L3_AGENT_MODE_DVR_SNAT"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_f6dba94c","line":669,"updated":"2015-03-06 13:45:46.000000000","message":"wonder if it should be gateway[\u0027fixed_ps\u0027][0][\u0027ip_address\u0027]","commit_id":"b8dbb47bf3065cf9820d09e5f6a9e0884517c95a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"53e4d7a578f054462e6ba11ece9242a3c78a00b8","unresolved":false,"context_lines":[{"line_number":666,"context_line":"            for p in ri.internal_ports:"},{"line_number":667,"context_line":"                gateway \u003d self._map_internal_interfaces(ri, p, snat_ports)"},{"line_number":668,"context_line":"                internal_interface \u003d ri.get_internal_device_name(p[\u0027id\u0027])"},{"line_number":669,"context_line":"                self._snat_redirect_remove(ri, gateway[\u0027fixed_ips\u0027][0],"},{"line_number":670,"context_line":"                                           p, internal_interface)"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"            if (self.conf.agent_mode \u003d\u003d l3_constants.L3_AGENT_MODE_DVR_SNAT"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_e8700b74","line":669,"in_reply_to":"9a80dd14_1e8207c8","updated":"2015-03-07 01:57:04.000000000","message":"I am a little sad that this was not caught by any test.","commit_id":"b8dbb47bf3065cf9820d09e5f6a9e0884517c95a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"585a7082ae11a12de465991c019f5a8055ce23a5","unresolved":false,"context_lines":[{"line_number":666,"context_line":"            for p in ri.internal_ports:"},{"line_number":667,"context_line":"                gateway \u003d self._map_internal_interfaces(ri, p, snat_ports)"},{"line_number":668,"context_line":"                internal_interface \u003d ri.get_internal_device_name(p[\u0027id\u0027])"},{"line_number":669,"context_line":"                self._snat_redirect_remove(ri, gateway[\u0027fixed_ips\u0027][0],"},{"line_number":670,"context_line":"                                           p, internal_interface)"},{"line_number":671,"context_line":""},{"line_number":672,"context_line":"            if (self.conf.agent_mode \u003d\u003d l3_constants.L3_AGENT_MODE_DVR_SNAT"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_1e8207c8","line":669,"in_reply_to":"9a80dd14_f6dba94c","updated":"2015-03-06 18:06:32.000000000","message":"Yes, good catch, I did have that correct below.","commit_id":"b8dbb47bf3065cf9820d09e5f6a9e0884517c95a"}],"neutron/agent/l3/dvr.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        port \u003d self.get_internal_port(ri, subnet_id)"},{"line_number":201,"context_line":"        # update arp entry only if the subnet is attached to the router"},{"line_number":202,"context_line":"        if port:"},{"line_number":203,"context_line":"            ip_cidr \u003d str(ip) + \u0027/32\u0027"},{"line_number":204,"context_line":"            try:"},{"line_number":205,"context_line":"                # TODO(mrsmith): optimize the calls below for bulk calls"},{"line_number":206,"context_line":"                net \u003d netaddr.IPNetwork(ip_cidr)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_dc90dfee","side":"PARENT","line":203,"updated":"2015-02-21 00:20:35.000000000","message":"Nice!","commit_id":"4b11655b95ec35ae8ca426c0a557a0f2883010d1"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"a90cd8e7add79087a29e55a74371bcbe5b6109c7","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            ns_ipd \u003d ip_lib.IPDevice(sn_int, namespace\u003dri.ns_name)"},{"line_number":179,"context_line":"            ns_ipd.route.add_gateway(gateway, table\u003dsnat_idx)"},{"line_number":180,"context_line":"            ns_ipr.rule.add(ip_cidr, snat_idx, snat_idx)"},{"line_number":181,"context_line":"            ns_ipr.netns.execute([\u0027sysctl\u0027, \u0027-w\u0027, \u0027net.ipv4.conf.%s.\u0027"},{"line_number":182,"context_line":"                                 \u0027send_redirects\u003d0\u0027 % sn_int])"},{"line_number":183,"context_line":"        except Exception:"},{"line_number":184,"context_line":"            LOG.exception(_LE(\u0027DVR: error adding redirection logic\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_494b2c87","line":181,"updated":"2015-02-23 16:49:38.000000000","message":"There is no netns attribute for IPRule anymore with the IPRule, IPRuleCommand split.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"622587def9d3992e8034311a06c9e441a0f53ee4","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            ns_ipd \u003d ip_lib.IPDevice(sn_int, namespace\u003dri.ns_name)"},{"line_number":179,"context_line":"            ns_ipd.route.add_gateway(gateway, table\u003dsnat_idx)"},{"line_number":180,"context_line":"            ns_ipr.rule.add(ip_cidr, snat_idx, snat_idx)"},{"line_number":181,"context_line":"            ns_ipr.netns.execute([\u0027sysctl\u0027, \u0027-w\u0027, \u0027net.ipv4.conf.%s.\u0027"},{"line_number":182,"context_line":"                                 \u0027send_redirects\u003d0\u0027 % sn_int])"},{"line_number":183,"context_line":"        except Exception:"},{"line_number":184,"context_line":"            LOG.exception(_LE(\u0027DVR: error adding redirection logic\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_73cb75a5","line":181,"in_reply_to":"ba7be1f8_494b2c87","updated":"2015-02-23 22:31:45.000000000","message":"Done","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af29f9301b5fb6aa007d6b69e901aa8f2848c54b","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            snat_idx \u003d self._get_snat_idx(ip_cidr)"},{"line_number":192,"context_line":"            ns_ipr \u003d ip_lib.IPRule(namespace\u003dri.ns_name)"},{"line_number":193,"context_line":"            ns_ipd \u003d ip_lib.IPDevice(sn_int, namespace\u003dri.ns_name)"},{"line_number":194,"context_line":"            ns_ipd.route.delete_gateway_by_ip_version(ip_cidr, table\u003dsnat_idx)"},{"line_number":195,"context_line":"            ns_ipr.rule.delete(ip_cidr, snat_idx, snat_idx)"},{"line_number":196,"context_line":"        except Exception:"},{"line_number":197,"context_line":"            LOG.exception(_LE(\u0027DVR: removed snat failed\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_baf0f991","line":194,"updated":"2015-03-04 03:24:47.000000000","message":"Hmm. Not too thrilled with the name of that method. See my comment where it is defined.","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"a70b53e691aa9c7a83ad8ae7214f292b8af9879d","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            snat_idx \u003d net.value"},{"line_number":118,"context_line":"        return snat_idx"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _map_internal_interfaces(self, ri, int_port, snat_ports):"},{"line_number":121,"context_line":"        \"\"\"Return the SNAT port for the given internal interface port.\"\"\""},{"line_number":122,"context_line":"        fixed_ip \u003d int_port[\u0027fixed_ips\u0027][0]"},{"line_number":123,"context_line":"        subnet_id \u003d fixed_ip[\u0027subnet_id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_08d9df21","line":120,"updated":"2015-03-07 02:25:52.000000000","message":"(No action required.) Observation: first arg ri is not used in this method.","commit_id":"ca2db256fe1e938298ffb7d7809ac65bba55f227"}],"neutron/agent/l3/dvr_router.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"45bdbc76cb97b0a46060696b9083e137e0363fc7","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        rule_pr \u003d self.fip_ns.allocate_rule_priority()"},{"line_number":67,"context_line":"        self.floating_ips_dict[floating_ip] \u003d rule_pr"},{"line_number":68,"context_line":"        fip_2_rtr_name \u003d self.fip_ns.get_int_device_name(self.router_id)"},{"line_number":69,"context_line":"        ns_ipr \u003d ip_lib.IPRule(namespace\u003dself.ns_name)"},{"line_number":70,"context_line":"        ns_ipr.rule.add(fixed_ip, dvr_fip_ns.FIP_RT_TBL, rule_pr)"},{"line_number":71,"context_line":"        #Add routing rule in fip namespace"},{"line_number":72,"context_line":"        fip_ns_name \u003d self.fip_ns.get_name()"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_c730ff09","line":69,"updated":"2015-02-27 23:48:50.000000000","message":"I\u0027m not sure ns_ipr is a better name than rule.  I\u0027m wondering why you felt the need to change it.","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0a388fb689d233b8b7944d56cf1aead7a091a764","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        rule_pr \u003d self.fip_ns.allocate_rule_priority()"},{"line_number":67,"context_line":"        self.floating_ips_dict[floating_ip] \u003d rule_pr"},{"line_number":68,"context_line":"        fip_2_rtr_name \u003d self.fip_ns.get_int_device_name(self.router_id)"},{"line_number":69,"context_line":"        ns_ipr \u003d ip_lib.IPRule(namespace\u003dself.ns_name)"},{"line_number":70,"context_line":"        ns_ipr.rule.add(fixed_ip, dvr_fip_ns.FIP_RT_TBL, rule_pr)"},{"line_number":71,"context_line":"        #Add routing rule in fip namespace"},{"line_number":72,"context_line":"        fip_ns_name \u003d self.fip_ns.get_name()"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_b8d3f336","line":69,"in_reply_to":"ba7be1f8_c730ff09","updated":"2015-03-02 16:58:57.000000000","message":"I was just matching the code in dvr.py, but I can change it back.","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"}],"neutron/agent/l3/ha_router.py":[{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"17babe28728e6b3c715afde5b9200338b8826130","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        ipv6_lladdr \u003d self._get_ipv6_lladdr(device.link.address)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        if self._should_delete_ipv6_lladdr(ipv6_lladdr):"},{"line_number":228,"context_line":"            device.addr.flush(6)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        self._remove_vip(ipv6_lladdr)"},{"line_number":231,"context_line":"        self._add_vip(ipv6_lladdr, interface_name, scope\u003d\u0027link\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_2e899626","line":228,"updated":"2015-02-23 18:36:30.000000000","message":"The original code was flushing both IPv4 and IPv6 addresses on the interface. Do you see a likely-hood for any regressions here?","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"622587def9d3992e8034311a06c9e441a0f53ee4","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        ipv6_lladdr \u003d self._get_ipv6_lladdr(device.link.address)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        if self._should_delete_ipv6_lladdr(ipv6_lladdr):"},{"line_number":228,"context_line":"            device.addr.flush(6)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        self._remove_vip(ipv6_lladdr)"},{"line_number":231,"context_line":"        self._add_vip(ipv6_lladdr, interface_name, scope\u003d\u0027link\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_ccff23a9","line":228,"in_reply_to":"ba7be1f8_2e899626","updated":"2015-02-23 22:31:45.000000000","message":"I don\u0027t think so, but I\u0027ll add someone with more HA experience to the review.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"45bdbc76cb97b0a46060696b9083e137e0363fc7","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        ipv6_lladdr \u003d self._get_ipv6_lladdr(device.link.address)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        if self._should_delete_ipv6_lladdr(ipv6_lladdr):"},{"line_number":233,"context_line":"            device.addr.flush(constants.IP_VERSION_6)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        self._remove_vip(ipv6_lladdr)"},{"line_number":236,"context_line":"        self._add_vip(ipv6_lladdr, interface_name, scope\u003d\u0027link\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_a72b0b93","line":233,"updated":"2015-02-27 23:48:50.000000000","message":"It might be good to reply to Sridar\u0027s comment on PS3.  I\u0027m pretty sure that only flushing ipv6 is fine here.  It might go over better if @Assaf said this was fine.","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0a388fb689d233b8b7944d56cf1aead7a091a764","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        ipv6_lladdr \u003d self._get_ipv6_lladdr(device.link.address)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        if self._should_delete_ipv6_lladdr(ipv6_lladdr):"},{"line_number":233,"context_line":"            device.addr.flush(constants.IP_VERSION_6)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        self._remove_vip(ipv6_lladdr)"},{"line_number":236,"context_line":"        self._add_vip(ipv6_lladdr, interface_name, scope\u003d\u0027link\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_f3fe6c6a","line":233,"in_reply_to":"ba7be1f8_a72b0b93","updated":"2015-03-02 16:58:57.000000000","message":"I pinged Assaf to do a review of this.","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"4e87c2789400fafab38647beaa383a7f14f5317d","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        ipv6_lladdr \u003d self._get_ipv6_lladdr(device.link.address)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        if self._should_delete_ipv6_lladdr(ipv6_lladdr):"},{"line_number":233,"context_line":"            device.addr.flush(constants.IP_VERSION_6)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        self._remove_vip(ipv6_lladdr)"},{"line_number":236,"context_line":"        self._add_vip(ipv6_lladdr, interface_name, scope\u003d\u0027link\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_a8880223","line":233,"in_reply_to":"ba7be1f8_f3fe6c6a","updated":"2015-03-02 17:22:51.000000000","message":"Yes I think it\u0027s fine.","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"}],"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import netaddr"},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_1cc277e9","side":"PARENT","line":17,"updated":"2015-02-21 00:20:35.000000000","message":":\u0027(","commit_id":"4b11655b95ec35ae8ca426c0a557a0f2883010d1"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"dce5e0d0e4f8250d6c68c5965f53d8485ef97755","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import eventlet"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import netaddr"},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_bff936ca","side":"PARENT","line":17,"in_reply_to":"ba7be1f8_1cc277e9","updated":"2015-02-23 16:29:49.000000000","message":"Whatever version of flake8 I\u0027m running really likes to complain about imports, but I\u0027ll put it back since upstream doesn\u0027t seem to care.","commit_id":"4b11655b95ec35ae8ca426c0a557a0f2883010d1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        return [l.strip() for l in output.split(\u0027\\n\u0027)]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class IpRule(IPWrapper):"},{"line_number":194,"context_line":"    def _exists(self, ip, ip_version, table, rule_pr):"},{"line_number":195,"context_line":"        # Typical rule from \u0027ip rule show\u0027:"},{"line_number":196,"context_line":"        # 4030201:  from 1.2.3.4/24 lookup 10203040"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_dc553f1e","side":"PARENT","line":193,"updated":"2015-02-21 00:20:35.000000000","message":"Why move it?","commit_id":"4b11655b95ec35ae8ca426c0a557a0f2883010d1"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"dce5e0d0e4f8250d6c68c5965f53d8485ef97755","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        return [l.strip() for l in output.split(\u0027\\n\u0027)]"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"class IpRule(IPWrapper):"},{"line_number":194,"context_line":"    def _exists(self, ip, ip_version, table, rule_pr):"},{"line_number":195,"context_line":"        # Typical rule from \u0027ip rule show\u0027:"},{"line_number":196,"context_line":"        # 4030201:  from 1.2.3.4/24 lookup 10203040"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_3fa2a6ae","side":"PARENT","line":193,"in_reply_to":"ba7be1f8_dc553f1e","updated":"2015-02-23 16:29:49.000000000","message":"Part of this was C on the brain - don\u0027t use something before it\u0027s defined, and IpRuleCommand requires IpCommandBase","commit_id":"4b11655b95ec35ae8ca426c0a557a0f2883010d1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                                     use_root_namespace\u003duse_root_namespace)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"class IPRule(SubProcessBase):"},{"line_number":226,"context_line":"    def __init__(self, namespace\u003dNone):"},{"line_number":227,"context_line":"        super(IPRule, self).__init__(namespace\u003dnamespace)"},{"line_number":228,"context_line":"        self.rule \u003d IpRuleCommand(self)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_bc816b91","line":225,"updated":"2015-02-21 00:20:35.000000000","message":"Uh oh, you now use IPRule here...","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"dce5e0d0e4f8250d6c68c5965f53d8485ef97755","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                                     use_root_namespace\u003duse_root_namespace)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"class IPRule(SubProcessBase):"},{"line_number":226,"context_line":"    def __init__(self, namespace\u003dNone):"},{"line_number":227,"context_line":"        super(IPRule, self).__init__(namespace\u003dnamespace)"},{"line_number":228,"context_line":"        self.rule \u003d IpRuleCommand(self)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_1fa9627b","line":225,"in_reply_to":"ba7be1f8_bc816b91","updated":"2015-02-23 16:29:49.000000000","message":"Yes, I tried to follow the precedence in the file, for example, IPDevice and IpDeviceCommandBase, and since there were very few IpRule in existence it was easy enough to clean them up.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        self.rule \u003d IpRuleCommand(self)"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"class IpRuleCommand(IpCommandBase):"},{"line_number":232,"context_line":"    COMMAND \u003d \u0027rule\u0027"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _exists(self, ip, ip_version, table, rule_pr):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_3c457b70","line":231,"updated":"2015-02-21 00:20:35.000000000","message":"... and IpRule here.  Personally, I prefer IpRule and if there isn\u0027t a strong argument to change it then it would be better to keep it the same (less churn).  But, most importantly, you should be consistent here.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":339,"context_line":"    def add(self, cidr, broadcast, scope\u003d\u0027global\u0027):"},{"line_number":340,"context_line":"        ip_version \u003d netaddr.IPNetwork(cidr).version"},{"line_number":341,"context_line":"        self._as_root([ip_version],"},{"line_number":342,"context_line":"                      (\u0027add\u0027, cidr,"},{"line_number":343,"context_line":"                       \u0027brd\u0027, broadcast,"},{"line_number":344,"context_line":"                       \u0027scope\u0027, scope,"},{"line_number":345,"context_line":"                       \u0027dev\u0027, self.name))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_9c22e7b7","line":342,"updated":"2015-02-21 00:20:35.000000000","message":"Normally I prefer each argument on its own line like in the original.  However, this is one case where I like this better because the arguments have a natural pairing.  Nice.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        options \u003d [ip_version] if ip_version else []"},{"line_number":358,"context_line":"        args \u003d [\u0027show\u0027, self.name]"},{"line_number":359,"context_line":"        if filters:"},{"line_number":360,"context_line":"            args +\u003d filters"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"        retval \u003d []"},{"line_number":363,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_ff2675b9","line":360,"updated":"2015-02-21 00:20:35.000000000","message":"Better.  I like how you\u0027ve not abused filters to append arguments.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":9077,"name":"Rajeev Grover","email":"rgrover687@gmail.com","username":"rajeev"},"change_message_id":"a90cd8e7add79087a29e55a74371bcbe5b6109c7","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def delete_gateway(self, gateway\u003dNone, table\u003dNone, ip_version\u003dNone):"},{"line_number":409,"context_line":"        if ip_version is None:"},{"line_number":410,"context_line":"            ip_version \u003d netaddr.IPNetwork(gateway).version if gateway else \u0027\u0027"},{"line_number":411,"context_line":"        args \u003d [\u0027del\u0027, \u0027default\u0027]"},{"line_number":412,"context_line":"        if gateway:"},{"line_number":413,"context_line":"            args +\u003d [\u0027via\u0027, gateway]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_22728d49","line":410,"updated":"2015-02-23 16:49:38.000000000","message":"handle the gateway\u003dNone case differently because \u0027\u0027 will cause a non empty ip_version list being passed to  _as_root at line 417.\n\n\u003e\u003e\u003e x \u003d []\n\n\u003e\u003e\u003e y \u003d [\u0027\u0027]\n\n\u003e\u003e\u003e len(x)\n\n0\n\n\u003e\u003e\u003e len(y)\n\n1","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"17babe28728e6b3c715afde5b9200338b8826130","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def delete_gateway(self, gateway\u003dNone, table\u003dNone, ip_version\u003dNone):"},{"line_number":409,"context_line":"        if ip_version is None:"},{"line_number":410,"context_line":"            ip_version \u003d netaddr.IPNetwork(gateway).version if gateway else \u0027\u0027"},{"line_number":411,"context_line":"        args \u003d [\u0027del\u0027, \u0027default\u0027]"},{"line_number":412,"context_line":"        if gateway:"},{"line_number":413,"context_line":"            args +\u003d [\u0027via\u0027, gateway]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_73a0d543","line":410,"in_reply_to":"ba7be1f8_22728d49","updated":"2015-02-23 18:36:30.000000000","message":"+1","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"622587def9d3992e8034311a06c9e441a0f53ee4","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def delete_gateway(self, gateway\u003dNone, table\u003dNone, ip_version\u003dNone):"},{"line_number":409,"context_line":"        if ip_version is None:"},{"line_number":410,"context_line":"            ip_version \u003d netaddr.IPNetwork(gateway).version if gateway else \u0027\u0027"},{"line_number":411,"context_line":"        args \u003d [\u0027del\u0027, \u0027default\u0027]"},{"line_number":412,"context_line":"        if gateway:"},{"line_number":413,"context_line":"            args +\u003d [\u0027via\u0027, gateway]"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_b8db0cec","line":410,"in_reply_to":"ba7be1f8_22728d49","updated":"2015-02-23 22:31:45.000000000","message":"Thanks Rajeev, I thought I had fixed all these in PS2 but missed this one.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8a1bab140e57e557c3637fb7e8949477647b2712","unresolved":false,"context_lines":[{"line_number":509,"context_line":"                self._as_root([], (\u0027del\u0027, subnet, \u0027dev\u0027, device))"},{"line_number":510,"context_line":"                if (src !\u003d \u0027\u0027):"},{"line_number":511,"context_line":"                    self._as_root([],"},{"line_number":512,"context_line":"                                  (\u0027append\u0027, subnet,"},{"line_number":513,"context_line":"                                   \u0027proto\u0027, \u0027kernel\u0027,"},{"line_number":514,"context_line":"                                   \u0027src\u0027, src,"},{"line_number":515,"context_line":"                                   \u0027dev\u0027, device))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_bc06cb1e","line":512,"updated":"2015-02-21 00:20:35.000000000","message":"ditto","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f0866ebb71f52eb660b33c94dbce39f0dc57a5ff","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            args +\u003d [\u0027table\u0027, table]"},{"line_number":407,"context_line":"        self._as_root([ip_version], tuple(args))"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def delete_gateway(self, gateway\u003dNone, table\u003dNone, ip_version\u003dNone):"},{"line_number":410,"context_line":"        if ip_version is None and gateway:"},{"line_number":411,"context_line":"            ip_version \u003d netaddr.IPNetwork(gateway).version"},{"line_number":412,"context_line":"        options \u003d [ip_version] if ip_version else []"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_65f19d00","line":409,"updated":"2015-02-25 09:02:36.000000000","message":"Is it necessary to add check for the conflict between ip_version and gateway\u0027s ip version?","commit_id":"0e1b83e5bdb4853908dc5ba59ace09a995cd0186"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"05aed63866a03a6f7ea0c8fa68e97fccf196deb1","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            args +\u003d [\u0027table\u0027, table]"},{"line_number":407,"context_line":"        self._as_root([ip_version], tuple(args))"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def delete_gateway(self, gateway\u003dNone, table\u003dNone, ip_version\u003dNone):"},{"line_number":410,"context_line":"        if ip_version is None and gateway:"},{"line_number":411,"context_line":"            ip_version \u003d netaddr.IPNetwork(gateway).version"},{"line_number":412,"context_line":"        options \u003d [ip_version] if ip_version else []"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_b41c906b","line":409,"in_reply_to":"ba7be1f8_65f19d00","updated":"2015-02-25 16:45:33.000000000","message":"I\u0027m inclined not to since that\u0027s an error in the caller, and none today even pass ip_version.","commit_id":"0e1b83e5bdb4853908dc5ba59ace09a995cd0186"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1316971bc02872f4b005507cbc2f0b7ce2d988ba","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        ip_version \u003d netaddr.IPNetwork(cidr).version"},{"line_number":342,"context_line":"        self._as_root([ip_version],"},{"line_number":343,"context_line":"                      (\u0027add\u0027, cidr,"},{"line_number":344,"context_line":"                       \u0027brd\u0027, broadcast,"},{"line_number":345,"context_line":"                       \u0027scope\u0027, scope,"},{"line_number":346,"context_line":"                       \u0027dev\u0027, self.name))"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_034df2c3","line":344,"updated":"2015-02-26 16:17:00.000000000","message":"Broadcast is not a valid option for ipv6.","commit_id":"147d02e462c9fdc729111d6abc516d49403d8d05"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ebd1cac278cf1e3454744f6a646b552f6de85a4b","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        ip_version \u003d netaddr.IPNetwork(cidr).version"},{"line_number":342,"context_line":"        self._as_root([ip_version],"},{"line_number":343,"context_line":"                      (\u0027add\u0027, cidr,"},{"line_number":344,"context_line":"                       \u0027brd\u0027, broadcast,"},{"line_number":345,"context_line":"                       \u0027scope\u0027, scope,"},{"line_number":346,"context_line":"                       \u0027dev\u0027, self.name))"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_32878d14","line":344,"in_reply_to":"ba7be1f8_034df2c3","updated":"2015-02-26 23:08:33.000000000","message":"Perhaps it\u0027s time to remove the argument then, since it can also be derived from the cidr.  Let me give that a try, thanks.","commit_id":"147d02e462c9fdc729111d6abc516d49403d8d05"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"45bdbc76cb97b0a46060696b9083e137e0363fc7","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    COMMAND \u003d \u0027route\u0027"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def add_gateway(self, gateway, metric\u003dNone, table\u003dNone):"},{"line_number":394,"context_line":"        ip_version \u003d netaddr.IPNetwork(gateway).version"},{"line_number":395,"context_line":"        args \u003d [\u0027replace\u0027, \u0027default\u0027, \u0027via\u0027, gateway]"},{"line_number":396,"context_line":"        if metric:"},{"line_number":397,"context_line":"            args +\u003d [\u0027metric\u0027, metric]"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_e2d7b121","line":394,"updated":"2015-02-27 23:48:50.000000000","message":"Is it time for a little method:  Something like:\n\ndef get_ip_version(ip_or_cidr):\n     return netaddr.IPNetwork(ip_or_cidr).version","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0a388fb689d233b8b7944d56cf1aead7a091a764","unresolved":false,"context_lines":[{"line_number":391,"context_line":"    COMMAND \u003d \u0027route\u0027"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"    def add_gateway(self, gateway, metric\u003dNone, table\u003dNone):"},{"line_number":394,"context_line":"        ip_version \u003d netaddr.IPNetwork(gateway).version"},{"line_number":395,"context_line":"        args \u003d [\u0027replace\u0027, \u0027default\u0027, \u0027via\u0027, gateway]"},{"line_number":396,"context_line":"        if metric:"},{"line_number":397,"context_line":"            args +\u003d [\u0027metric\u0027, metric]"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_13486086","line":394,"in_reply_to":"ba7be1f8_e2d7b121","updated":"2015-03-02 16:58:57.000000000","message":"Sure, I\u0027ll add a helper.","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"45bdbc76cb97b0a46060696b9083e137e0363fc7","unresolved":false,"context_lines":[{"line_number":400,"context_line":"            args +\u003d [\u0027table\u0027, table]"},{"line_number":401,"context_line":"        self._as_root([ip_version], tuple(args))"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    def delete_gateway(self, gateway\u003dNone, table\u003dNone, ip_version\u003dNone):"},{"line_number":404,"context_line":"        if ip_version is None and gateway:"},{"line_number":405,"context_line":"            ip_version \u003d netaddr.IPNetwork(gateway).version"},{"line_number":406,"context_line":"        options \u003d [ip_version] if ip_version else []"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_822ef5a3","line":403,"updated":"2015-02-27 23:48:50.000000000","message":"I\u0027d make this two methods (ignoring the table parameter)\n\n def delete_gateway(gateway):\n\n def delete_gateway_by_ip_version(ip_version):\n\nOne reason is to eliminate the possibility of inconsistent arguments, such as:\n\n delete_gateway(gateway\u003d\u00272000:1:2:3::1\u0027, ip_version\u003d4)\n\nThe other reason is because I don\u0027t think that one method should have different behaviors with different possible combinations of arguments.  I think it should be clear how a method should be called.  If there are two behaviors a method could have, it should be two methods.\n\nThe two methods could share some implementation, one could call the other, etc.","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0a388fb689d233b8b7944d56cf1aead7a091a764","unresolved":false,"context_lines":[{"line_number":400,"context_line":"            args +\u003d [\u0027table\u0027, table]"},{"line_number":401,"context_line":"        self._as_root([ip_version], tuple(args))"},{"line_number":402,"context_line":""},{"line_number":403,"context_line":"    def delete_gateway(self, gateway\u003dNone, table\u003dNone, ip_version\u003dNone):"},{"line_number":404,"context_line":"        if ip_version is None and gateway:"},{"line_number":405,"context_line":"            ip_version \u003d netaddr.IPNetwork(gateway).version"},{"line_number":406,"context_line":"        options \u003d [ip_version] if ip_version else []"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba7be1f8_05f737f6","line":403,"in_reply_to":"ba7be1f8_822ef5a3","updated":"2015-03-02 16:58:57.000000000","message":"Yeah, this is a good solution to not ignoring the version mismatch.","commit_id":"e08799d9cbd43e9172c5ab1cd0a2dc1b76154298"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af29f9301b5fb6aa007d6b69e901aa8f2848c54b","unresolved":false,"context_lines":[{"line_number":265,"context_line":"    COMMAND \u003d \u0027link\u0027"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def set_address(self, mac_address):"},{"line_number":268,"context_line":"        self._as_root([], (\u0027set\u0027, self.name, \u0027address\u0027, mac_address))"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def set_mtu(self, mtu_size):"},{"line_number":271,"context_line":"        self._as_root([], (\u0027set\u0027, self.name, \u0027mtu\u0027, mtu_size))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_750e923c","line":268,"updated":"2015-03-04 03:24:47.000000000","message":"Consider overriding _as_root() for this class to call super with empty opts.","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af29f9301b5fb6aa007d6b69e901aa8f2848c54b","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        ip_version \u003d get_ip_version(gateway)"},{"line_number":411,"context_line":"        self._delete_gateway(ip_version, gateway, table\u003dtable)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def delete_gateway_by_ip_version(self, gateway, table\u003dNone):"},{"line_number":414,"context_line":"        # gateway is only used to determine correct address family"},{"line_number":415,"context_line":"        ip_version \u003d get_ip_version(gateway)"},{"line_number":416,"context_line":"        self._delete_gateway(ip_version, gateway\u003dNone, table\u003dtable)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_fb1990d1","line":413,"updated":"2015-03-04 03:24:47.000000000","message":"The name and usage of this method feels awkward. Since it is currently only called from one place, I wonder if that one place can determine the ip_version and call _delete_gateway directly? (You\u0027d have to rename it.)","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"579e3e1dbe5c149e486582965ce2192b6fb33655","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        ip_version \u003d get_ip_version(gateway)"},{"line_number":411,"context_line":"        self._delete_gateway(ip_version, gateway, table\u003dtable)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def delete_gateway_by_ip_version(self, gateway, table\u003dNone):"},{"line_number":414,"context_line":"        # gateway is only used to determine correct address family"},{"line_number":415,"context_line":"        ip_version \u003d get_ip_version(gateway)"},{"line_number":416,"context_line":"        self._delete_gateway(ip_version, gateway\u003dNone, table\u003dtable)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_242d4647","line":413,"in_reply_to":"9a80dd14_ccc11fe6","updated":"2015-03-05 14:44:21.000000000","message":"Robert - that\u0027s what it was in PS8, and I was asked to do it differently.  I do have a change but have to fix another bug that\u0027s in the way now.","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"0d90bde161b9c3e2cbbed192ecab07d5914d89d0","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        ip_version \u003d get_ip_version(gateway)"},{"line_number":411,"context_line":"        self._delete_gateway(ip_version, gateway, table\u003dtable)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def delete_gateway_by_ip_version(self, gateway, table\u003dNone):"},{"line_number":414,"context_line":"        # gateway is only used to determine correct address family"},{"line_number":415,"context_line":"        ip_version \u003d get_ip_version(gateway)"},{"line_number":416,"context_line":"        self._delete_gateway(ip_version, gateway\u003dNone, table\u003dtable)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_ccc11fe6","line":413,"in_reply_to":"9a80dd14_cef7618b","updated":"2015-03-04 20:19:15.000000000","message":"Would this make sense?\n  def delete_gateway(self, ip_version\u003dNone, gateway\u003dNone, table\u003dNone)","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"cbdc913bd733dfe9a6b657fe559cd5ecee355f9c","unresolved":false,"context_lines":[{"line_number":410,"context_line":"        ip_version \u003d get_ip_version(gateway)"},{"line_number":411,"context_line":"        self._delete_gateway(ip_version, gateway, table\u003dtable)"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    def delete_gateway_by_ip_version(self, gateway, table\u003dNone):"},{"line_number":414,"context_line":"        # gateway is only used to determine correct address family"},{"line_number":415,"context_line":"        ip_version \u003d get_ip_version(gateway)"},{"line_number":416,"context_line":"        self._delete_gateway(ip_version, gateway\u003dNone, table\u003dtable)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_cef7618b","line":413,"in_reply_to":"ba7be1f8_fb1990d1","updated":"2015-03-04 16:02:28.000000000","message":"Or we can provide the gateway to _snat_redirect_remove() so it doesn\u0027t need to call this.  Let me try that first since we have all the information we need to determine it.","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"a70b53e691aa9c7a83ad8ae7214f292b8af9879d","unresolved":false,"context_lines":[{"line_number":223,"context_line":"class IPRule(SubProcessBase):"},{"line_number":224,"context_line":"    def __init__(self, namespace\u003dNone):"},{"line_number":225,"context_line":"        super(IPRule, self).__init__(namespace\u003dnamespace)"},{"line_number":226,"context_line":"        self.rule \u003d IpRuleCommand(self)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"class IpRuleCommand(IpCommandBase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a80dd14_28e06395","line":226,"updated":"2015-03-07 02:25:52.000000000","message":"Nit: self.cmd maybe?","commit_id":"ca2db256fe1e938298ffb7d7809ac65bba55f227"}],"neutron/common/constants.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ca54516712dac9227bd1819b0fb1db6d5c179c63","unresolved":false,"context_lines":[{"line_number":66,"context_line":"IPv4 \u003d \u0027IPv4\u0027"},{"line_number":67,"context_line":"IPv6 \u003d \u0027IPv6\u0027"},{"line_number":68,"context_line":"IPV4 \u003d 4"},{"line_number":69,"context_line":"IPV6 \u003d 6"},{"line_number":70,"context_line":"IPv4_BITS \u003d 32"},{"line_number":71,"context_line":"IPv6_BITS \u003d 128"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_e001f46a","line":69,"updated":"2015-02-25 12:35:14.000000000","message":"L66-69 seem too confusing.  can you try to avoid that?","commit_id":"0e1b83e5bdb4853908dc5ba59ace09a995cd0186"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"edda687e647486459132675fc7dc6b3c101638e1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"IPv4 \u003d \u0027IPv4\u0027"},{"line_number":67,"context_line":"IPv6 \u003d \u0027IPv6\u0027"},{"line_number":68,"context_line":"IPV4 \u003d 4"},{"line_number":69,"context_line":"IPV6 \u003d 6"},{"line_number":70,"context_line":"IPv4_BITS \u003d 32"},{"line_number":71,"context_line":"IPv6_BITS \u003d 128"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_d1758b32","line":69,"in_reply_to":"ba7be1f8_d45ca41b","updated":"2015-02-25 20:25:58.000000000","message":"I\u0027ll change this to IP_VERSION_4/6 to move this review along, but I\u0027m open to other suggestions.","commit_id":"0e1b83e5bdb4853908dc5ba59ace09a995cd0186"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"05aed63866a03a6f7ea0c8fa68e97fccf196deb1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"IPv4 \u003d \u0027IPv4\u0027"},{"line_number":67,"context_line":"IPv6 \u003d \u0027IPv6\u0027"},{"line_number":68,"context_line":"IPV4 \u003d 4"},{"line_number":69,"context_line":"IPV6 \u003d 6"},{"line_number":70,"context_line":"IPv4_BITS \u003d 32"},{"line_number":71,"context_line":"IPv6_BITS \u003d 128"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_d45ca41b","line":69,"in_reply_to":"ba7be1f8_e001f46a","updated":"2015-02-25 16:45:33.000000000","message":"Yes, I only chose this since dhcp.py did the same, I should probably clean that code up as well.\n\nDo you think IPv*_NUM is better ?  There\u0027s nothing great that comes to mind.","commit_id":"0e1b83e5bdb4853908dc5ba59ace09a995cd0186"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"ddb39d14548da6ef8c8e5e7e25b97d1b2eff7bcf","unresolved":false,"context_lines":[{"line_number":66,"context_line":"IPv4 \u003d \u0027IPv4\u0027"},{"line_number":67,"context_line":"IPv6 \u003d \u0027IPv6\u0027"},{"line_number":68,"context_line":"IP_VERSION_4 \u003d 4"},{"line_number":69,"context_line":"IP_VERSION_6 \u003d 6"},{"line_number":70,"context_line":"IPv4_BITS \u003d 32"},{"line_number":71,"context_line":"IPv6_BITS \u003d 128"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_ee31105b","line":69,"updated":"2015-03-03 01:42:45.000000000","message":"my honest impression is that they look like ONE\u003d1.\n\nbut i don\u0027t bother to -1 as it\u0027s far better than capitalization-only differences in the earlier patchsets and i don\u0027t have alternative suggestions.","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"a002f9ef1126eabdd09991a84c03f9af4a3b3327","unresolved":false,"context_lines":[{"line_number":66,"context_line":"IPv4 \u003d \u0027IPv4\u0027"},{"line_number":67,"context_line":"IPv6 \u003d \u0027IPv6\u0027"},{"line_number":68,"context_line":"IP_VERSION_4 \u003d 4"},{"line_number":69,"context_line":"IP_VERSION_6 \u003d 6"},{"line_number":70,"context_line":"IPv4_BITS \u003d 32"},{"line_number":71,"context_line":"IPv6_BITS \u003d 128"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_033b0a3b","line":69,"in_reply_to":"ba7be1f8_ea455cb4","updated":"2015-03-04 19:00:09.000000000","message":"FWIW, I think there is enough in this constant to justify it.  Brian is right that 6 doesn\u0027t quite say IPv6.","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0a775e7d701531544c4172326562450d0e9c315b","unresolved":false,"context_lines":[{"line_number":66,"context_line":"IPv4 \u003d \u0027IPv4\u0027"},{"line_number":67,"context_line":"IPv6 \u003d \u0027IPv6\u0027"},{"line_number":68,"context_line":"IP_VERSION_4 \u003d 4"},{"line_number":69,"context_line":"IP_VERSION_6 \u003d 6"},{"line_number":70,"context_line":"IPv4_BITS \u003d 32"},{"line_number":71,"context_line":"IPv6_BITS \u003d 128"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_ea455cb4","line":69,"in_reply_to":"ba7be1f8_ee31105b","updated":"2015-03-03 15:33:28.000000000","message":"Right.  The only reason I did this was that in previous patches I\u0027ve been asked to not use \u00276\u0027 since it doesn\u0027t imply IPv6.  Figured this was a safe way to make it obvious we meant IPv6.","commit_id":"7ed4face814a35c07c7f9045d1c1aa5479a561c9"}],"neutron/tests/unit/test_linux_interface.py":[{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f0866ebb71f52eb660b33c94dbce39f0dc57a5ff","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        addresses \u003d [dict(scope\u003d\u0027global\u0027,"},{"line_number":99,"context_line":"                          dynamic\u003dFalse, cidr\u003d\u0027172.16.77.240/24\u0027)]"},{"line_number":100,"context_line":"        self.ip_dev().addr.list \u003d mock.Mock(return_value\u003daddresses)"},{"line_number":101,"context_line":"        self.ip_dev().route.list_onlink_routes.return_value \u003d [\u0027172.20.0.0/24\u0027]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        bc \u003d BaseChild(self.conf)"},{"line_number":104,"context_line":"        ns \u003d \u002712345678-1234-5678-90ab-ba0987654321\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_259de5bc","line":101,"updated":"2015-02-25 09:02:36.000000000","message":"Can we add return value for ipv6 online route?","commit_id":"0e1b83e5bdb4853908dc5ba59ace09a995cd0186"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"542ab8a9891a93a4bdb39a3eac128b49c0022ca9","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        addresses \u003d [dict(scope\u003d\u0027global\u0027,"},{"line_number":99,"context_line":"                          dynamic\u003dFalse, cidr\u003d\u0027172.16.77.240/24\u0027)]"},{"line_number":100,"context_line":"        self.ip_dev().addr.list \u003d mock.Mock(return_value\u003daddresses)"},{"line_number":101,"context_line":"        self.ip_dev().route.list_onlink_routes.return_value \u003d [\u0027172.20.0.0/24\u0027]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        bc \u003d BaseChild(self.conf)"},{"line_number":104,"context_line":"        ns \u003d \u002712345678-1234-5678-90ab-ba0987654321\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_85cdb1b9","line":101,"in_reply_to":"ba7be1f8_259de5bc","updated":"2015-02-25 09:03:07.000000000","message":"sorry typo, I meant onlink route","commit_id":"0e1b83e5bdb4853908dc5ba59ace09a995cd0186"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"05aed63866a03a6f7ea0c8fa68e97fccf196deb1","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        addresses \u003d [dict(scope\u003d\u0027global\u0027,"},{"line_number":99,"context_line":"                          dynamic\u003dFalse, cidr\u003d\u0027172.16.77.240/24\u0027)]"},{"line_number":100,"context_line":"        self.ip_dev().addr.list \u003d mock.Mock(return_value\u003daddresses)"},{"line_number":101,"context_line":"        self.ip_dev().route.list_onlink_routes.return_value \u003d [\u0027172.20.0.0/24\u0027]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        bc \u003d BaseChild(self.conf)"},{"line_number":104,"context_line":"        ns \u003d \u002712345678-1234-5678-90ab-ba0987654321\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba7be1f8_af335df4","line":101,"in_reply_to":"ba7be1f8_85cdb1b9","updated":"2015-02-25 16:45:33.000000000","message":"I\u0027ll add a new test, thanks.","commit_id":"0e1b83e5bdb4853908dc5ba59ace09a995cd0186"}],"neutron/tests/unit/test_linux_ip_lib.py":[{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"17babe28728e6b3c715afde5b9200338b8826130","unresolved":false,"context_lines":[{"line_number":747,"context_line":"        gateway \u003d \u0027192.168.45.100\u0027"},{"line_number":748,"context_line":"        metric \u003d 100"},{"line_number":749,"context_line":"        table \u003d 14"},{"line_number":750,"context_line":"        self.route_cmd.add_gateway(gateway, metric, table)"},{"line_number":751,"context_line":"        self._assert_sudo([4],"},{"line_number":752,"context_line":"                          (\u0027replace\u0027, \u0027default\u0027,"},{"line_number":753,"context_line":"                           \u0027via\u0027, gateway,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_0ee1329a","line":750,"updated":"2015-02-23 18:36:30.000000000","message":"The patch adds IPv6 modifications to the classes. \nPlease consider extending the tests to validate IPv6 use-cases. \n\nFeel free to use the tests I\u0027ve written in my patch.","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"622587def9d3992e8034311a06c9e441a0f53ee4","unresolved":false,"context_lines":[{"line_number":747,"context_line":"        gateway \u003d \u0027192.168.45.100\u0027"},{"line_number":748,"context_line":"        metric \u003d 100"},{"line_number":749,"context_line":"        table \u003d 14"},{"line_number":750,"context_line":"        self.route_cmd.add_gateway(gateway, metric, table)"},{"line_number":751,"context_line":"        self._assert_sudo([4],"},{"line_number":752,"context_line":"                          (\u0027replace\u0027, \u0027default\u0027,"},{"line_number":753,"context_line":"                           \u0027via\u0027, gateway,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_33d653c6","line":750,"in_reply_to":"ba7be1f8_0ee1329a","updated":"2015-02-23 22:31:45.000000000","message":"Ok, I\u0027ll do that next update, thanks!","commit_id":"0c7b2664dada5eb8434935182e3f858c94e4c278"}]}
