)]}'
{"neutron/agent/linux/dhcp.py":[{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"b92b971fc72b43aad74bf186473d8da9331739c9","unresolved":false,"context_lines":[{"line_number":579,"context_line":"                        self._format_option6(i, \u0027dns-server\u0027,"},{"line_number":580,"context_line":"                                             \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":581,"context_line":"                                             for ns in"},{"line_number":582,"context_line":"                                             subnet.dns_nameservers])))"},{"line_number":583,"context_line":"            else:"},{"line_number":584,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":585,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_300991dd","line":582,"updated":"2014-07-25 15:14:52.000000000","message":"why for loop? I see that the subnet-create allows multiple dns_nameservers. So if this is applicable to ipv6, it is to ipv4 as well.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"985ea6b70b8192f7b30eb815454dc82d3f7f49bd","unresolved":false,"context_lines":[{"line_number":579,"context_line":"                        self._format_option6(i, \u0027dns-server\u0027,"},{"line_number":580,"context_line":"                                             \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":581,"context_line":"                                             for ns in"},{"line_number":582,"context_line":"                                             subnet.dns_nameservers])))"},{"line_number":583,"context_line":"            else:"},{"line_number":584,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":585,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_aa199b7b","line":582,"in_reply_to":"baada198_300991dd","updated":"2014-07-26 08:41:47.000000000","message":"The reason to use a for loop is that we need to add \"[]\" to IPv6 address and we don\u0027t need to do that for ipv4","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"f41b55fff0cfc17711b207c7b34405edd26d15af","unresolved":false,"context_lines":[{"line_number":579,"context_line":"                        self._format_option6(i, \u0027dns-server\u0027,"},{"line_number":580,"context_line":"                                             \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":581,"context_line":"                                             for ns in"},{"line_number":582,"context_line":"                                             subnet.dns_nameservers])))"},{"line_number":583,"context_line":"            else:"},{"line_number":584,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":585,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_c1b21495","line":582,"in_reply_to":"baada198_aa199b7b","updated":"2014-07-28 14:40:19.000000000","message":"I see. Adding a comment will help understand it.\n\nMy understanding about literal ipv6 addresses (enclosed with \u0027[\u0027and \u0027]\u0027) is they are used in URLs. Therefore I\u0027m not sure it\u0027s needed in here.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"ef2e4b184e4992792c0ea3f2356ccfcc64e160ab","unresolved":false,"context_lines":[{"line_number":579,"context_line":"                        self._format_option6(i, \u0027dns-server\u0027,"},{"line_number":580,"context_line":"                                             \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":581,"context_line":"                                             for ns in"},{"line_number":582,"context_line":"                                             subnet.dns_nameservers])))"},{"line_number":583,"context_line":"            else:"},{"line_number":584,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":585,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_3bd12357","line":582,"in_reply_to":"baada198_c1b21495","updated":"2014-07-29 04:31:44.000000000","message":"Robert, the dnsmasq man page specifically says, \"IPv6 addresses in options must be bracketed with square brackets.\" It took me a while to find this.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"b92b971fc72b43aad74bf186473d8da9331739c9","unresolved":false,"context_lines":[{"line_number":587,"context_line":""},{"line_number":588,"context_line":"            if self.conf.dhcp_domain and subnet.ip_version \u003d\u003d 6:"},{"line_number":589,"context_line":"                options.append(\u0027tag:tag%s,option6:domain-search,%s\u0027 %"},{"line_number":590,"context_line":"                              (i, \u0027\u0027.join(self.conf.dhcp_domain)))"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"            gateway \u003d subnet.gateway_ip"},{"line_number":593,"context_line":"            host_routes \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_d0b3f54b","line":590,"updated":"2014-07-25 15:14:52.000000000","message":"would this be applicable to v4 as well?","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"985ea6b70b8192f7b30eb815454dc82d3f7f49bd","unresolved":false,"context_lines":[{"line_number":587,"context_line":""},{"line_number":588,"context_line":"            if self.conf.dhcp_domain and subnet.ip_version \u003d\u003d 6:"},{"line_number":589,"context_line":"                options.append(\u0027tag:tag%s,option6:domain-search,%s\u0027 %"},{"line_number":590,"context_line":"                              (i, \u0027\u0027.join(self.conf.dhcp_domain)))"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"            gateway \u003d subnet.gateway_ip"},{"line_number":593,"context_line":"            host_routes \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_ead0f354","line":590,"in_reply_to":"baada198_d0b3f54b","updated":"2014-07-26 08:41:47.000000000","message":"on the man page the domain search list is only mentioned as DHCPv6 options. I am not sure if DHCPv4 works in this way. Need to find more information on this.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7515,"name":"Jian LI","email":"ljianbj@cn.ibm.com","username":"leejian0612"},"change_message_id":"0550f687180e1bec4b91fa7e6f19bc2654175b30","unresolved":false,"context_lines":[{"line_number":587,"context_line":""},{"line_number":588,"context_line":"            if self.conf.dhcp_domain and subnet.ip_version \u003d\u003d 6:"},{"line_number":589,"context_line":"                options.append(\u0027tag:tag%s,option6:domain-search,%s\u0027 %"},{"line_number":590,"context_line":"                              (i, \u0027\u0027.join(self.conf.dhcp_domain)))"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"            gateway \u003d subnet.gateway_ip"},{"line_number":593,"context_line":"            host_routes \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_0bdd1f41","line":590,"in_reply_to":"baada198_ead0f354","updated":"2014-07-28 03:25:45.000000000","message":"The dhcp_domain is used to set the search domain for all the subnets the dnsmasq have,  when seted, the dnsmasq process will add an option named --domain to enable this function, but it seems that the --domain option only works for ipv4 subnets, so we hava to use the domain-search option to support ipv6 subnets, and write it in the opts file.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"b92b971fc72b43aad74bf186473d8da9331739c9","unresolved":false,"context_lines":[{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        for port in self.network.ports:"},{"line_number":626,"context_line":"            if getattr(port, \u0027extra_dhcp_opts\u0027, False):"},{"line_number":627,"context_line":"                options.extend("},{"line_number":628,"context_line":"                    self._format_option(port.id, opt.opt_name, opt.opt_value)"},{"line_number":629,"context_line":"                    for opt in port.extra_dhcp_opts)"},{"line_number":630,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_d02e958c","line":627,"updated":"2014-07-25 15:14:52.000000000","message":"I think that this is also applicable to ipv6","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"985ea6b70b8192f7b30eb815454dc82d3f7f49bd","unresolved":false,"context_lines":[{"line_number":624,"context_line":""},{"line_number":625,"context_line":"        for port in self.network.ports:"},{"line_number":626,"context_line":"            if getattr(port, \u0027extra_dhcp_opts\u0027, False):"},{"line_number":627,"context_line":"                options.extend("},{"line_number":628,"context_line":"                    self._format_option(port.id, opt.opt_name, opt.opt_value)"},{"line_number":629,"context_line":"                    for opt in port.extra_dhcp_opts)"},{"line_number":630,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_ea2633b9","line":627,"in_reply_to":"baada198_d02e958c","updated":"2014-07-26 08:41:47.000000000","message":"will address in next patch.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"b92b971fc72b43aad74bf186473d8da9331739c9","unresolved":false,"context_lines":[{"line_number":639,"context_line":"                    dhcp_ips[i].append(ip.ip_address)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        for i, ips in dhcp_ips.items():"},{"line_number":642,"context_line":"            if len(ips) \u003e 1:"},{"line_number":643,"context_line":"                options.append(self._format_option(i,"},{"line_number":644,"context_line":"                                                   \u0027dns-server\u0027,"},{"line_number":645,"context_line":"                                                   \u0027,\u0027.join(ips)))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_10256dad","line":642,"updated":"2014-07-25 15:14:52.000000000","message":"I think this is also applicable to ipv6","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"985ea6b70b8192f7b30eb815454dc82d3f7f49bd","unresolved":false,"context_lines":[{"line_number":639,"context_line":"                    dhcp_ips[i].append(ip.ip_address)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"        for i, ips in dhcp_ips.items():"},{"line_number":642,"context_line":"            if len(ips) \u003e 1:"},{"line_number":643,"context_line":"                options.append(self._format_option(i,"},{"line_number":644,"context_line":"                                                   \u0027dns-server\u0027,"},{"line_number":645,"context_line":"                                                   \u0027,\u0027.join(ips)))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_6a3a23ce","line":642,"in_reply_to":"baada198_10256dad","updated":"2014-07-26 08:41:47.000000000","message":"will address in next patch","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"b92b971fc72b43aad74bf186473d8da9331739c9","unresolved":false,"context_lines":[{"line_number":687,"context_line":""},{"line_number":688,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":691,"context_line":"        \"\"\"Format DHCPv6 option by option name or code.\"\"\""},{"line_number":692,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":693,"context_line":"            set_tag \u003d \u0027tag:\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_15047fc4","line":690,"updated":"2014-07-25 15:14:52.000000000","message":"the only difference between this routine and _format_option is the option name: option versus option6. I\u0027d recommend adding a ip_version argument in _format_option, and remove this new routine.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"985ea6b70b8192f7b30eb815454dc82d3f7f49bd","unresolved":false,"context_lines":[{"line_number":687,"context_line":""},{"line_number":688,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":691,"context_line":"        \"\"\"Format DHCPv6 option by option name or code.\"\"\""},{"line_number":692,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":693,"context_line":"            set_tag \u003d \u0027tag:\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_aa30bbe9","line":690,"in_reply_to":"baada198_15047fc4","updated":"2014-07-26 08:41:47.000000000","message":"will address in next patch.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"6eb5bb7077bc6708f01539b29e0bdae98df7cf82","unresolved":false,"context_lines":[{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":691,"context_line":"        \"\"\"Format DHCPv6 option by option name or code.\"\"\""},{"line_number":692,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":693,"context_line":"            set_tag \u003d \u0027tag:\u0027"},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            set_tag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_b0d84180","line":692,"updated":"2014-07-25 15:08:19.000000000","message":"The minimum version of dnsmasq required was recently bumped to 2.63. I just want to make sure this check is still valid given that update.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"79501cae4daba31d8e6df04078dbf0db0303458e","unresolved":false,"context_lines":[{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":691,"context_line":"        \"\"\"Format DHCPv6 option by option name or code.\"\"\""},{"line_number":692,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":693,"context_line":"            set_tag \u003d \u0027tag:\u0027"},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            set_tag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_f7e608e6","line":692,"in_reply_to":"baada198_6a414338","updated":"2014-07-28 07:05:57.000000000","message":"Actually I cannot find any document from dnsmasq website describing from version the syntax has been changed. Maybe we should just focusing on the syntax of supported version here.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"985ea6b70b8192f7b30eb815454dc82d3f7f49bd","unresolved":false,"context_lines":[{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":691,"context_line":"        \"\"\"Format DHCPv6 option by option name or code.\"\"\""},{"line_number":692,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":693,"context_line":"            set_tag \u003d \u0027tag:\u0027"},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            set_tag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_6a414338","line":692,"in_reply_to":"baada198_b0d84180","updated":"2014-07-26 08:41:47.000000000","message":"Right, then the check should not be necessary. will remove in next patch","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"3e746f00fd6a1096a73f4875e81eeab36c0faf76","unresolved":false,"context_lines":[{"line_number":689,"context_line":""},{"line_number":690,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":691,"context_line":"        \"\"\"Format DHCPv6 option by option name or code.\"\"\""},{"line_number":692,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":693,"context_line":"            set_tag \u003d \u0027tag:\u0027"},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            set_tag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"baada198_bd4d4e74","line":692,"in_reply_to":"baada198_f7e608e6","updated":"2014-07-28 09:27:04.000000000","message":"Checked that the previous patch was added for dnsmasq 2.48. Which means we need to take care versions which don\u0027t support tags. For example, dnsmasq on RH6.4 \n\nI am going to add a new constant TAG_SUPPORT_VERSION and format options based on this new constant.","commit_id":"63eed3d1c3bb49e8bbbfab698117281adbcc56c3"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"e7d1489fd5a823d0d46223e068b1ef731b0562b8","unresolved":false,"context_lines":[{"line_number":369,"context_line":"            else:"},{"line_number":370,"context_line":"                addr_mod \u003d getattr(subnet, \u0027ipv6_address_mode\u0027, None)"},{"line_number":371,"context_line":"                if addr_mod in [constants.DHCPV6_STATEFUL,"},{"line_number":372,"context_line":"                                constants.DHCPV6_STATELESS]:"},{"line_number":373,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":374,"context_line":"            if self.version \u003e\u003d self.TAG_SUPPORT_VERSION:"},{"line_number":375,"context_line":"                set_tag \u003d \u0027set:\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_454d1f98","line":372,"updated":"2014-07-28 21:59:43.000000000","message":"Hi, I think we need to preserve the check for none of the IPv6 attributes being set, for backwards compatability. Remember, these ipv6 attributes are *optional*, not required.","commit_id":"9edeb8d8ca4f17bd5dfa911043103ac97f1a089b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a789e562d5e189caf9af21045799d9d7908e686f","unresolved":false,"context_lines":[{"line_number":369,"context_line":"            else:"},{"line_number":370,"context_line":"                addr_mod \u003d getattr(subnet, \u0027ipv6_address_mode\u0027, None)"},{"line_number":371,"context_line":"                if addr_mod in [constants.DHCPV6_STATEFUL,"},{"line_number":372,"context_line":"                                constants.DHCPV6_STATELESS]:"},{"line_number":373,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":374,"context_line":"            if self.version \u003e\u003d self.TAG_SUPPORT_VERSION:"},{"line_number":375,"context_line":"                set_tag \u003d \u0027set:\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_cae2162f","line":372,"in_reply_to":"baada198_454d1f98","updated":"2014-07-29 02:17:07.000000000","message":"Done","commit_id":"9edeb8d8ca4f17bd5dfa911043103ac97f1a089b"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"c6bd318a40b8f9f411646d4969b57ef5d61534d8","unresolved":false,"context_lines":[{"line_number":371,"context_line":"                if addr_mod in [constants.DHCPV6_STATEFUL,"},{"line_number":372,"context_line":"                                constants.DHCPV6_STATELESS]:"},{"line_number":373,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":374,"context_line":"            if self.version \u003e\u003d self.TAG_SUPPORT_VERSION:"},{"line_number":375,"context_line":"                set_tag \u003d \u0027set:\u0027"},{"line_number":376,"context_line":"            else:"},{"line_number":377,"context_line":"                set_tag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_fb1fc706","line":374,"updated":"2014-07-28 13:43:41.000000000","message":"I think this is confusing: The agent itself won\u0027t run unless the version of dnsmasq is at least MINIMUM_VERSION, which is in fact higher than TAG_SUPPORT_VERSION. Thus, as near as I can tell, you will *always* hit the \"set_tag \u003d \u0027set:\u0027\" portion here. If so, you can remove the check for TAG_SUPPORT_VERSION.","commit_id":"9edeb8d8ca4f17bd5dfa911043103ac97f1a089b"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"05e5455b648e6d9ce59c520b7f65173551ad903a","unresolved":false,"context_lines":[{"line_number":371,"context_line":"                if addr_mod in [constants.DHCPV6_STATEFUL,"},{"line_number":372,"context_line":"                                constants.DHCPV6_STATELESS]:"},{"line_number":373,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":374,"context_line":"            if self.version \u003e\u003d self.TAG_SUPPORT_VERSION:"},{"line_number":375,"context_line":"                set_tag \u003d \u0027set:\u0027"},{"line_number":376,"context_line":"            else:"},{"line_number":377,"context_line":"                set_tag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_0a316e0a","line":374,"in_reply_to":"baada198_6a574ac9","updated":"2014-07-29 02:49:50.000000000","message":"I would like to know Kyle\u0027s opinion too. For my less authoritative opinion, see my comment in patch set 7.","commit_id":"9edeb8d8ca4f17bd5dfa911043103ac97f1a089b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a789e562d5e189caf9af21045799d9d7908e686f","unresolved":false,"context_lines":[{"line_number":371,"context_line":"                if addr_mod in [constants.DHCPV6_STATEFUL,"},{"line_number":372,"context_line":"                                constants.DHCPV6_STATELESS]:"},{"line_number":373,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":374,"context_line":"            if self.version \u003e\u003d self.TAG_SUPPORT_VERSION:"},{"line_number":375,"context_line":"                set_tag \u003d \u0027set:\u0027"},{"line_number":376,"context_line":"            else:"},{"line_number":377,"context_line":"                set_tag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_6a574ac9","line":374,"in_reply_to":"baada198_fb1fc706","updated":"2014-07-29 02:17:07.000000000","message":"Kyle, that was my thought too but checking the check_version function at line 309, only a warning will be logged at line 317 without interrupting the running of dhcp_agent. \n\n            if not is_valid_version:\n                LOG.warning(_(\u0027FAILED VERSION REQUIREMENT FOR DNSMASQ. \u0027\n                              \u0027DHCP AGENT MAY NOT RUN CORRECTLY! \u0027\n                              \u0027Please ensure that its version is %s \u0027\n                              \u0027or above!\u0027), cls.MINIMUM_VERSION)\n\nThat\u0027s why we will still hit the case that version is less than 2.59 which needs to be taken care of. \n\nPlease let me know your thoughts.","commit_id":"9edeb8d8ca4f17bd5dfa911043103ac97f1a089b"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1ad42991dca3c882c08fc8d4ff491afea11b140f","unresolved":false,"context_lines":[{"line_number":316,"context_line":"            if not is_valid_version:"},{"line_number":317,"context_line":"                LOG.warning(_(\u0027FAILED VERSION REQUIREMENT FOR DNSMASQ. \u0027"},{"line_number":318,"context_line":"                              \u0027DHCP AGENT MAY NOT RUN CORRECTLY! \u0027"},{"line_number":319,"context_line":"                              \u0027Please ensure that its version is %s \u0027"},{"line_number":320,"context_line":"                              \u0027or above!\u0027), cls.MINIMUM_VERSION)"},{"line_number":321,"context_line":"        except (OSError, RuntimeError, IndexError, ValueError):"},{"line_number":322,"context_line":"            LOG.error(_(\u0027Unable to determine dnsmasq version. \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_ea77dace","line":319,"updated":"2014-07-29 04:32:11.000000000","message":"If we can\u0027t determine the version we exit (below), but if we can determine the version then we allow any unsupported version? In my opinion this is just silly. As part of the IPv6 enhancements for Juno I say we set a hard requirement on the minimum version. It\u0027s not exactly hard to update dnsmasq.","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f36d8d6bba1654f5240da35acccc9fa87f514a78","unresolved":false,"context_lines":[{"line_number":316,"context_line":"            if not is_valid_version:"},{"line_number":317,"context_line":"                LOG.warning(_(\u0027FAILED VERSION REQUIREMENT FOR DNSMASQ. \u0027"},{"line_number":318,"context_line":"                              \u0027DHCP AGENT MAY NOT RUN CORRECTLY! \u0027"},{"line_number":319,"context_line":"                              \u0027Please ensure that its version is %s \u0027"},{"line_number":320,"context_line":"                              \u0027or above!\u0027), cls.MINIMUM_VERSION)"},{"line_number":321,"context_line":"        except (OSError, RuntimeError, IndexError, ValueError):"},{"line_number":322,"context_line":"            LOG.error(_(\u0027Unable to determine dnsmasq version. \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_44134401","line":319,"in_reply_to":"baada198_ea77dace","updated":"2014-07-29 14:34:03.000000000","message":"We discussed this in today\u0027s IPv6 meeting. We think we should exit when version is not support. I will send out an email to ML.","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1ad42991dca3c882c08fc8d4ff491afea11b140f","unresolved":false,"context_lines":[{"line_number":370,"context_line":"                # Note(scollins) If the IPv6 attributes are not set, set it as"},{"line_number":371,"context_line":"                # static to preserve previous behavior"},{"line_number":372,"context_line":"                addr_mod \u003d getattr(subnet, \u0027ipv6_address_mode\u0027, None)"},{"line_number":373,"context_line":"                ra_mod \u003d getattr(subnet, \u0027ipv6_ra_mode\u0027, None)"},{"line_number":374,"context_line":"                if (addr_mod in [constants.DHCPV6_STATEFUL,"},{"line_number":375,"context_line":"                                 constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                    not addr_mod and not ra_mod):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_382769b7","line":373,"updated":"2014-07-29 04:32:11.000000000","message":"Nit: can you append an \u0027e\u0027 to these two variables? addr_mode, ra_mode","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f36d8d6bba1654f5240da35acccc9fa87f514a78","unresolved":false,"context_lines":[{"line_number":370,"context_line":"                # Note(scollins) If the IPv6 attributes are not set, set it as"},{"line_number":371,"context_line":"                # static to preserve previous behavior"},{"line_number":372,"context_line":"                addr_mod \u003d getattr(subnet, \u0027ipv6_address_mode\u0027, None)"},{"line_number":373,"context_line":"                ra_mod \u003d getattr(subnet, \u0027ipv6_ra_mode\u0027, None)"},{"line_number":374,"context_line":"                if (addr_mod in [constants.DHCPV6_STATEFUL,"},{"line_number":375,"context_line":"                                 constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                    not addr_mod and not ra_mod):"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_64cf688c","line":373,"in_reply_to":"baada198_382769b7","updated":"2014-07-29 14:34:03.000000000","message":"Done","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"c1bf101d0dcd982e7a3ebfe22879d43f482c1ecf","unresolved":false,"context_lines":[{"line_number":584,"context_line":"                        self._format_option(6, i, \u0027dns-server\u0027,"},{"line_number":585,"context_line":"                                            \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":586,"context_line":"                                            for ns in"},{"line_number":587,"context_line":"                                            subnet.dns_nameservers])))"},{"line_number":588,"context_line":"            else:"},{"line_number":589,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":590,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_b6b0cbfe","line":587,"updated":"2014-07-29 17:53:30.000000000","message":"Not sure if the man page is up to date. It\u0027s working without the brackets in my tests.\n\nalso, you can just use subnet.ip_version in stead of \u00274\u0027 and \u00276\u0027.","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ed54187d3f5afff75bc06251fb629f8ec30f72fd","unresolved":false,"context_lines":[{"line_number":584,"context_line":"                        self._format_option(6, i, \u0027dns-server\u0027,"},{"line_number":585,"context_line":"                                            \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":586,"context_line":"                                            for ns in"},{"line_number":587,"context_line":"                                            subnet.dns_nameservers])))"},{"line_number":588,"context_line":"            else:"},{"line_number":589,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":590,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_863b8838","line":587,"in_reply_to":"baada198_b6b0cbfe","updated":"2014-07-30 01:22:08.000000000","message":"Thanks for bringing this up. Will do more test and update the code if necessary.","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1ad42991dca3c882c08fc8d4ff491afea11b140f","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                else:"},{"line_number":629,"context_line":"                    options.append(self._format_option(4, i, \u0027router\u0027))"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"        extra_v4 \u003d extra_v6 \u003d False"},{"line_number":632,"context_line":"        for port in self.network.ports:"},{"line_number":633,"context_line":"            if getattr(port, \u0027extra_dhcp_opts\u0027, False):"},{"line_number":634,"context_line":"                for ip in port.fixed_ips:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_7b455b6e","line":631,"updated":"2014-07-29 04:32:11.000000000","message":"This should be inside the \"for port\" loop, but see below for an alternative.","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f36d8d6bba1654f5240da35acccc9fa87f514a78","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                else:"},{"line_number":629,"context_line":"                    options.append(self._format_option(4, i, \u0027router\u0027))"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"        extra_v4 \u003d extra_v6 \u003d False"},{"line_number":632,"context_line":"        for port in self.network.ports:"},{"line_number":633,"context_line":"            if getattr(port, \u0027extra_dhcp_opts\u0027, False):"},{"line_number":634,"context_line":"                for ip in port.fixed_ips:"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_84bb9ce3","line":631,"in_reply_to":"baada198_7b455b6e","updated":"2014-07-29 14:34:03.000000000","message":"Thanks for the advice!","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1ad42991dca3c882c08fc8d4ff491afea11b140f","unresolved":false,"context_lines":[{"line_number":645,"context_line":"                    options.extend("},{"line_number":646,"context_line":"                        self._format_option(6, port.id,"},{"line_number":647,"context_line":"                                            opt.opt_name, opt.opt_value)"},{"line_number":648,"context_line":"                        for opt in port.extra_dhcp_opts)"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"            # provides all dnsmasq ip as dns-server if there is more than"},{"line_number":651,"context_line":"            # one dnsmasq for a subnet and there is no dns-server submitted"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_1bb8df77","line":648,"updated":"2014-07-29 04:32:11.000000000","message":"Lines 634-648 can be written as:\n\n    for ip_version in (4, 6):\n        if any(\n            netaddr.IPAddress(ip.ip_address).version \u003d\u003d ip_version\n                for ip in port.fixed_ips):\n            options.extend(\n                self._format_option(ip_version, port.id,\n                                    opt.opt_name, opt.opt_value)\n                for opt in port.extra_dhcp_opts)","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f36d8d6bba1654f5240da35acccc9fa87f514a78","unresolved":false,"context_lines":[{"line_number":645,"context_line":"                    options.extend("},{"line_number":646,"context_line":"                        self._format_option(6, port.id,"},{"line_number":647,"context_line":"                                            opt.opt_name, opt.opt_value)"},{"line_number":648,"context_line":"                        for opt in port.extra_dhcp_opts)"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"            # provides all dnsmasq ip as dns-server if there is more than"},{"line_number":651,"context_line":"            # one dnsmasq for a subnet and there is no dns-server submitted"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_2472d04a","line":648,"in_reply_to":"baada198_1bb8df77","updated":"2014-07-29 14:34:03.000000000","message":"Done","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"c1bf101d0dcd982e7a3ebfe22879d43f482c1ecf","unresolved":false,"context_lines":[{"line_number":672,"context_line":"            if len(ips_v6) \u003e 1:"},{"line_number":673,"context_line":"                options.append(self._format_option(6, i,"},{"line_number":674,"context_line":"                                                   \u0027dns-server\u0027,"},{"line_number":675,"context_line":"                                                   \u0027,\u0027.join(ips_v6)))"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":678,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_d6b1bfe1","line":675,"updated":"2014-07-29 17:53:30.000000000","message":"If brackets are needed, it should be in here as well. But please test to see if it\u0027s really needed. I\u0027m using version 2.68.","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1ad42991dca3c882c08fc8d4ff491afea11b140f","unresolved":false,"context_lines":[{"line_number":672,"context_line":"            if len(ips_v6) \u003e 1:"},{"line_number":673,"context_line":"                options.append(self._format_option(6, i,"},{"line_number":674,"context_line":"                                                   \u0027dns-server\u0027,"},{"line_number":675,"context_line":"                                                   \u0027,\u0027.join(ips_v6)))"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":678,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_5e6a45b6","line":675,"updated":"2014-07-29 04:32:11.000000000","message":"Lines 661-675 can be written as:\n\n    for ip_version in (4, 6):\n        vx_ips \u003d [ip for ip in ips\n                  if netaddr.IPAddress(ip).version \u003d\u003d ip_version]\n        if vx_ips:\n            options.append(self._format_option(ip_version, i,\n                                               \u0027dns-server\u0027,\n                                               \u0027,\u0027.join(vx_ips)))","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f36d8d6bba1654f5240da35acccc9fa87f514a78","unresolved":false,"context_lines":[{"line_number":672,"context_line":"            if len(ips_v6) \u003e 1:"},{"line_number":673,"context_line":"                options.append(self._format_option(6, i,"},{"line_number":674,"context_line":"                                                   \u0027dns-server\u0027,"},{"line_number":675,"context_line":"                                                   \u0027,\u0027.join(ips_v6)))"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":678,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_44c1844d","line":675,"in_reply_to":"baada198_5e6a45b6","updated":"2014-07-29 14:34:03.000000000","message":"Done","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ed54187d3f5afff75bc06251fb629f8ec30f72fd","unresolved":false,"context_lines":[{"line_number":672,"context_line":"            if len(ips_v6) \u003e 1:"},{"line_number":673,"context_line":"                options.append(self._format_option(6, i,"},{"line_number":674,"context_line":"                                                   \u0027dns-server\u0027,"},{"line_number":675,"context_line":"                                                   \u0027,\u0027.join(ips_v6)))"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":678,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_c64580b5","line":675,"in_reply_to":"baada198_d6b1bfe1","updated":"2014-07-30 01:22:08.000000000","message":"will do more tests.","commit_id":"2354149e6b028d51572d04b4f509fbf1cc430d2a"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"58ff750522d41ef4328f13a89213be0abf038d78","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                        self._format_option(subnet.ip_version, i, \u0027dns-server\u0027,"},{"line_number":581,"context_line":"                                            \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":582,"context_line":"                                            for ns in"},{"line_number":583,"context_line":"                                            subnet.dns_nameservers])))"},{"line_number":584,"context_line":"            else:"},{"line_number":585,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":586,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_fae8087d","line":583,"updated":"2014-07-31 19:54:19.000000000","message":"Seems like that it doesn\u0027t work for you without the brackets, or probably it doesn\u0027t work with earlier version than 2.6.8. In that case, I suggest simplifying the code as in below:\n\noptions.append(\n             self.format_options(subnet.ip_version, i, \u0027dns-server\u0027,\n                                             \u0027,\u0027.join(convert_to_literal_addrs(subnet.ip_version, subnet.dns_nameservers))\n\nthe method\n\n convert_to_literal_addrs(ip_version, ips):\n      if ip_version \u003d\u003d 4:\n          return ips \n\n      return [\u0027[\u0027 + ns + \u0027]\u0027 for ip in ips]\n\nthe same method can then be used in the other case where dns-server is processed.","commit_id":"9c2439c66a01867161336a5d4db0968998571ec7"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"d6e377ad11527d705bd830bc6d891e98ebd41ab7","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                        self._format_option(subnet.ip_version, i, \u0027dns-server\u0027,"},{"line_number":581,"context_line":"                                            \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":582,"context_line":"                                            for ns in"},{"line_number":583,"context_line":"                                            subnet.dns_nameservers])))"},{"line_number":584,"context_line":"            else:"},{"line_number":585,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":586,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_b2806d4a","line":583,"in_reply_to":"baada198_fae8087d","updated":"2014-08-01 01:51:14.000000000","message":"Done","commit_id":"9c2439c66a01867161336a5d4db0968998571ec7"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"58ff750522d41ef4328f13a89213be0abf038d78","unresolved":false,"context_lines":[{"line_number":663,"context_line":"                                                       \u0027,\u0027.join([\u0027[\u0027 +"},{"line_number":664,"context_line":"                                                                vx_ip +"},{"line_number":665,"context_line":"                                                                \u0027]\u0027"},{"line_number":666,"context_line":"                                                       for vx_ip in vx_ips])))"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":669,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_5a55741c","line":666,"updated":"2014-07-31 19:54:19.000000000","message":"can be simplified as indicated in above","commit_id":"9c2439c66a01867161336a5d4db0968998571ec7"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"d6e377ad11527d705bd830bc6d891e98ebd41ab7","unresolved":false,"context_lines":[{"line_number":663,"context_line":"                                                       \u0027,\u0027.join([\u0027[\u0027 +"},{"line_number":664,"context_line":"                                                                vx_ip +"},{"line_number":665,"context_line":"                                                                \u0027]\u0027"},{"line_number":666,"context_line":"                                                       for vx_ip in vx_ips])))"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":669,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":8,"id":"baada198_127cb970","line":666,"in_reply_to":"baada198_5a55741c","updated":"2014-08-01 01:51:14.000000000","message":"Done","commit_id":"9c2439c66a01867161336a5d4db0968998571ec7"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7e82fbaf4b49dbb20820f0175ebfd63613e1b27b","unresolved":false,"context_lines":[{"line_number":372,"context_line":"                addr_mode \u003d getattr(subnet, \u0027ipv6_address_mode\u0027, None)"},{"line_number":373,"context_line":"                ra_mode \u003d getattr(subnet, \u0027ipv6_ra_mode\u0027, None)"},{"line_number":374,"context_line":"                if (addr_mode in [constants.DHCPV6_STATEFUL,"},{"line_number":375,"context_line":"                                 constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                    not addr_mode and not ra_mode):"},{"line_number":377,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":378,"context_line":"            set_tag \u003d \u0027set:\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_70387bd4","line":375,"updated":"2014-08-01 13:59:06.000000000","message":"Nitpick: indent one more space to line up with [","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ff2cc7b88d9c09dc131f08db440dc6becc75d8d4","unresolved":false,"context_lines":[{"line_number":372,"context_line":"                addr_mode \u003d getattr(subnet, \u0027ipv6_address_mode\u0027, None)"},{"line_number":373,"context_line":"                ra_mode \u003d getattr(subnet, \u0027ipv6_ra_mode\u0027, None)"},{"line_number":374,"context_line":"                if (addr_mode in [constants.DHCPV6_STATEFUL,"},{"line_number":375,"context_line":"                                 constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                    not addr_mode and not ra_mode):"},{"line_number":377,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":378,"context_line":"            set_tag \u003d \u0027set:\u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_1f6c999c","line":375,"in_reply_to":"baada198_70387bd4","updated":"2014-08-11 03:36:27.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7e82fbaf4b49dbb20820f0175ebfd63613e1b27b","unresolved":false,"context_lines":[{"line_number":373,"context_line":"                ra_mode \u003d getattr(subnet, \u0027ipv6_ra_mode\u0027, None)"},{"line_number":374,"context_line":"                if (addr_mode in [constants.DHCPV6_STATEFUL,"},{"line_number":375,"context_line":"                                 constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                    not addr_mode and not ra_mode):"},{"line_number":377,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":378,"context_line":"            set_tag \u003d \u0027set:\u0027"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_7066bbef","line":376,"updated":"2014-08-01 13:59:06.000000000","message":"Nitpick: indent +4 spaces to distinguish from the line below.","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ff2cc7b88d9c09dc131f08db440dc6becc75d8d4","unresolved":false,"context_lines":[{"line_number":373,"context_line":"                ra_mode \u003d getattr(subnet, \u0027ipv6_ra_mode\u0027, None)"},{"line_number":374,"context_line":"                if (addr_mode in [constants.DHCPV6_STATEFUL,"},{"line_number":375,"context_line":"                                 constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                    not addr_mode and not ra_mode):"},{"line_number":377,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":378,"context_line":"            set_tag \u003d \u0027set:\u0027"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_9f07c9c8","line":376,"in_reply_to":"baada198_7066bbef","updated":"2014-08-11 03:36:27.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7e82fbaf4b49dbb20820f0175ebfd63613e1b27b","unresolved":false,"context_lines":[{"line_number":574,"context_line":"                options.append("},{"line_number":575,"context_line":"                    self._format_option(subnet.ip_version, i, \u0027dns-server\u0027,"},{"line_number":576,"context_line":"                    \u0027,\u0027.join(self._convert_to_literal_addrs("},{"line_number":577,"context_line":"                             subnet.ip_version, subnet.dns_nameservers))))"},{"line_number":578,"context_line":"            else:"},{"line_number":579,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":580,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_d0fa27b9","line":577,"updated":"2014-08-01 13:59:06.000000000","message":"Nitpick: the argument indentations are a bit random and hard to follow by sight. May I suggest something like this:\n\n    options.append(\n        self._format_option(\n            subnet.ip_version, i, \u0027dns-server\u0027,\n            \u0027,\u0027.join(\n                self._convert_to_literal_addrs(\n                    subnet.ip_version, subnet.dns_nameservers))))","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ff2cc7b88d9c09dc131f08db440dc6becc75d8d4","unresolved":false,"context_lines":[{"line_number":574,"context_line":"                options.append("},{"line_number":575,"context_line":"                    self._format_option(subnet.ip_version, i, \u0027dns-server\u0027,"},{"line_number":576,"context_line":"                    \u0027,\u0027.join(self._convert_to_literal_addrs("},{"line_number":577,"context_line":"                             subnet.ip_version, subnet.dns_nameservers))))"},{"line_number":578,"context_line":"            else:"},{"line_number":579,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":580,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_1f457914","line":577,"in_reply_to":"baada198_d0fa27b9","updated":"2014-08-11 03:36:27.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7e82fbaf4b49dbb20820f0175ebfd63613e1b27b","unresolved":false,"context_lines":[{"line_number":582,"context_line":""},{"line_number":583,"context_line":"            if self.conf.dhcp_domain and subnet.ip_version \u003d\u003d 6:"},{"line_number":584,"context_line":"                options.append(\u0027tag:tag%s,option6:domain-search,%s\u0027 %"},{"line_number":585,"context_line":"                              (i, \u0027\u0027.join(self.conf.dhcp_domain)))"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"            gateway \u003d subnet.gateway_ip"},{"line_number":588,"context_line":"            host_routes \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_901b4f1b","line":585,"updated":"2014-08-01 13:59:06.000000000","message":"Nitpick: Indent +1 space","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ff2cc7b88d9c09dc131f08db440dc6becc75d8d4","unresolved":false,"context_lines":[{"line_number":582,"context_line":""},{"line_number":583,"context_line":"            if self.conf.dhcp_domain and subnet.ip_version \u003d\u003d 6:"},{"line_number":584,"context_line":"                options.append(\u0027tag:tag%s,option6:domain-search,%s\u0027 %"},{"line_number":585,"context_line":"                              (i, \u0027\u0027.join(self.conf.dhcp_domain)))"},{"line_number":586,"context_line":""},{"line_number":587,"context_line":"            gateway \u003d subnet.gateway_ip"},{"line_number":588,"context_line":"            host_routes \u003d []"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_dfb22104","line":585,"in_reply_to":"baada198_901b4f1b","updated":"2014-08-11 03:36:27.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3a1b948e51ad0efd94a8f4a1ff750e1728bdecf6","unresolved":false,"context_lines":[{"line_number":601,"context_line":"                    \u0027%s/32,%s\u0027 % (METADATA_DEFAULT_IP, subnet_dhcp_ip)"},{"line_number":602,"context_line":"                )"},{"line_number":603,"context_line":""},{"line_number":604,"context_line":"            if host_routes and subnet.ip_version \u003d\u003d 4:"},{"line_number":605,"context_line":"                if gateway:"},{"line_number":606,"context_line":"                    host_routes.append(\"%s,%s\" % (\"0.0.0.0/0\", gateway))"},{"line_number":607,"context_line":"                options.append("}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_f39a9511","line":604,"updated":"2014-08-04 14:27:18.000000000","message":"nit: how about moving that if under if located at line 616?","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ff2cc7b88d9c09dc131f08db440dc6becc75d8d4","unresolved":false,"context_lines":[{"line_number":601,"context_line":"                    \u0027%s/32,%s\u0027 % (METADATA_DEFAULT_IP, subnet_dhcp_ip)"},{"line_number":602,"context_line":"                )"},{"line_number":603,"context_line":""},{"line_number":604,"context_line":"            if host_routes and subnet.ip_version \u003d\u003d 4:"},{"line_number":605,"context_line":"                if gateway:"},{"line_number":606,"context_line":"                    host_routes.append(\"%s,%s\" % (\"0.0.0.0/0\", gateway))"},{"line_number":607,"context_line":"                options.append("}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_5f6c516b","line":604,"in_reply_to":"baada198_f39a9511","updated":"2014-08-11 03:36:27.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7e82fbaf4b49dbb20820f0175ebfd63613e1b27b","unresolved":false,"context_lines":[{"line_number":627,"context_line":"                for ip_version in (4, 6):"},{"line_number":628,"context_line":"                    if any("},{"line_number":629,"context_line":"                        netaddr.IPAddress(ip.ip_address).version \u003d\u003d ip_version"},{"line_number":630,"context_line":"                        for ip in port.fixed_ips):"},{"line_number":631,"context_line":"                        options.extend("},{"line_number":632,"context_line":"                            self._format_option(ip_version, port.id,"},{"line_number":633,"context_line":"                                                opt.opt_name, opt.opt_value)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_30944335","line":630,"updated":"2014-08-01 13:59:06.000000000","message":"Nitpick: Indent +4 spaces to distinguish from the line below.","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ff2cc7b88d9c09dc131f08db440dc6becc75d8d4","unresolved":false,"context_lines":[{"line_number":627,"context_line":"                for ip_version in (4, 6):"},{"line_number":628,"context_line":"                    if any("},{"line_number":629,"context_line":"                        netaddr.IPAddress(ip.ip_address).version \u003d\u003d ip_version"},{"line_number":630,"context_line":"                        for ip in port.fixed_ips):"},{"line_number":631,"context_line":"                        options.extend("},{"line_number":632,"context_line":"                            self._format_option(ip_version, port.id,"},{"line_number":633,"context_line":"                                                opt.opt_name, opt.opt_value)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_bf92cd47","line":630,"in_reply_to":"baada198_30944335","updated":"2014-08-11 03:36:27.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7e82fbaf4b49dbb20820f0175ebfd63613e1b27b","unresolved":false,"context_lines":[{"line_number":650,"context_line":"                if vx_ips:"},{"line_number":651,"context_line":"                    options.append(self._format_option(ip_version, i,"},{"line_number":652,"context_line":"                        \u0027dns-server\u0027, \u0027,\u0027.join(self._convert_to_literal_addrs("},{"line_number":653,"context_line":"                                               ip_version, vx_ips))))"},{"line_number":654,"context_line":""},{"line_number":655,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":656,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_10e1ffcf","line":653,"updated":"2014-08-01 13:59:06.000000000","message":"Nitpick: random argument alignment. May I suggest something like this:\n\n    options.append(\n        self._format_option(\n            ip_version, i, \u0027dns-server\u0027,\n            \u0027,\u0027.join(\n                self._convert_to_literal_addrs(ip_version,\n                                               vx_ips))))","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ff2cc7b88d9c09dc131f08db440dc6becc75d8d4","unresolved":false,"context_lines":[{"line_number":650,"context_line":"                if vx_ips:"},{"line_number":651,"context_line":"                    options.append(self._format_option(ip_version, i,"},{"line_number":652,"context_line":"                        \u0027dns-server\u0027, \u0027,\u0027.join(self._convert_to_literal_addrs("},{"line_number":653,"context_line":"                                               ip_version, vx_ips))))"},{"line_number":654,"context_line":""},{"line_number":655,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":656,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_ff9fe54e","line":653,"in_reply_to":"baada198_10e1ffcf","updated":"2014-08-11 03:36:27.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3a1b948e51ad0efd94a8f4a1ff750e1728bdecf6","unresolved":false,"context_lines":[{"line_number":688,"context_line":"            tag \u003d self._TAG_PREFIX % tag"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        if not option.isdigit():"},{"line_number":691,"context_line":"            option \u003d \u0027option:%s\u0027 % option if ("},{"line_number":692,"context_line":"                ip_version \u003d\u003d 4) else \u0027option6:%s\u0027 % option"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_734925b7","line":691,"updated":"2014-08-04 14:27:18.000000000","message":"can we avoid those tailed ifs? just plain if-else looks easier for eyes.","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"ff2cc7b88d9c09dc131f08db440dc6becc75d8d4","unresolved":false,"context_lines":[{"line_number":688,"context_line":"            tag \u003d self._TAG_PREFIX % tag"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        if not option.isdigit():"},{"line_number":691,"context_line":"            option \u003d \u0027option:%s\u0027 % option if ("},{"line_number":692,"context_line":"                ip_version \u003d\u003d 4) else \u0027option6:%s\u0027 % option"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_1fc4993f","line":691,"in_reply_to":"baada198_734925b7","updated":"2014-08-11 03:36:27.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"7e82fbaf4b49dbb20820f0175ebfd63613e1b27b","unresolved":false,"context_lines":[{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"    def _convert_to_literal_addrs(self, ip_version, ips):"},{"line_number":697,"context_line":"        if ip_version \u003d\u003d 4:"},{"line_number":698,"context_line":"            return ips"},{"line_number":699,"context_line":"        return [\u0027[\u0027 + ip + \u0027]\u0027 for ip in ips]"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_90726fe1","line":696,"updated":"2014-08-01 13:59:06.000000000","message":"You could make this a @staticmethod.","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a36ec05fac9a1d82eb727634c33e9cba682dd2ee","unresolved":false,"context_lines":[{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"    def _convert_to_literal_addrs(self, ip_version, ips):"},{"line_number":697,"context_line":"        if ip_version \u003d\u003d 4:"},{"line_number":698,"context_line":"            return ips"},{"line_number":699,"context_line":"        return [\u0027[\u0027 + ip + \u0027]\u0027 for ip in ips]"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_5f77f1d0","line":696,"in_reply_to":"baada198_6eb4de35","updated":"2014-08-11 03:37:10.000000000","message":"Done","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3a1b948e51ad0efd94a8f4a1ff750e1728bdecf6","unresolved":false,"context_lines":[{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"    def _convert_to_literal_addrs(self, ip_version, ips):"},{"line_number":697,"context_line":"        if ip_version \u003d\u003d 4:"},{"line_number":698,"context_line":"            return ips"},{"line_number":699,"context_line":"        return [\u0027[\u0027 + ip + \u0027]\u0027 for ip in ips]"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_6eb4de35","line":696,"in_reply_to":"baada198_90726fe1","updated":"2014-08-04 14:27:18.000000000","message":"+1.","commit_id":"fc2af9f509b6a2aef1c86305dbd3cbecddf2258f"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"11dc0e416bd8db67af7f5bc1f6525f70f19fdad6","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                if alloc.subnet_id in v6_nets:"},{"line_number":460,"context_line":"                    addr_mode \u003d v6_nets[alloc.subnet_id].ipv6_address_mode"},{"line_number":461,"context_line":"                    if addr_mode !\u003d constants.DHCPV6_STATEFUL:"},{"line_number":462,"context_line":"                        continue"},{"line_number":463,"context_line":"                hostname \u003d \u0027host-%s\u0027 % alloc.ip_address.replace("},{"line_number":464,"context_line":"                    \u0027.\u0027, \u0027-\u0027).replace(\u0027:\u0027, \u0027-\u0027)"},{"line_number":465,"context_line":"                fqdn \u003d hostname"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_015fc575","line":462,"updated":"2014-08-11 16:50:43.000000000","message":"Whoa, please do not change this code, you\u0027ll reintroduce\n\nhttps://bugs.launchpad.net/neutron/+bug/1316190","commit_id":"7c738d3928666fa48c1f8aa78df402dd804130ea"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a3b840e4112d7519d888324e26a1c272084d4500","unresolved":false,"context_lines":[{"line_number":459,"context_line":"                if alloc.subnet_id in v6_nets:"},{"line_number":460,"context_line":"                    addr_mode \u003d v6_nets[alloc.subnet_id].ipv6_address_mode"},{"line_number":461,"context_line":"                    if addr_mode !\u003d constants.DHCPV6_STATEFUL:"},{"line_number":462,"context_line":"                        continue"},{"line_number":463,"context_line":"                hostname \u003d \u0027host-%s\u0027 % alloc.ip_address.replace("},{"line_number":464,"context_line":"                    \u0027.\u0027, \u0027-\u0027).replace(\u0027:\u0027, \u0027-\u0027)"},{"line_number":465,"context_line":"                fqdn \u003d hostname"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_0734ebde","line":462,"in_reply_to":"baada198_015fc575","updated":"2014-08-13 05:20:33.000000000","message":"Sean, I think addr_mode !\u003d constants.DHCPV6_STATEFUL has a larger scope then then original condition (ra_mode is None and addr_mode \u003d\u003d constants.IPV6_SLAAC). So the bug won\u0027t be reintroduced, right?","commit_id":"7c738d3928666fa48c1f8aa78df402dd804130ea"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"8bcee49455dbf13e592b278e1cfe85218d9810d7","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":"            if self.conf.dhcp_domain and subnet.ip_version \u003d\u003d 6:"},{"line_number":586,"context_line":"                options.append(\u0027tag:tag%s,option6:domain-search,%s\u0027 %"},{"line_number":587,"context_line":"                               (i, \u0027\u0027.join(self.conf.dhcp_domain)))"},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"            gateway \u003d subnet.gateway_ip"},{"line_number":590,"context_line":"            host_routes \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_701e8d0e","line":587,"updated":"2014-08-11 15:41:47.000000000","message":"domain-search is applicable to both ipv4 and ipv6. Wonder why it\u0027s added for v6 but not for v4 in here.","commit_id":"7c738d3928666fa48c1f8aa78df402dd804130ea"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"e66a7081ee749f865b573286739f2760adff32fa","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":"            if self.conf.dhcp_domain and subnet.ip_version \u003d\u003d 6:"},{"line_number":586,"context_line":"                options.append(\u0027tag:tag%s,option6:domain-search,%s\u0027 %"},{"line_number":587,"context_line":"                               (i, \u0027\u0027.join(self.conf.dhcp_domain)))"},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"            gateway \u003d subnet.gateway_ip"},{"line_number":590,"context_line":"            host_routes \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_7487015c","line":587,"in_reply_to":"baada198_27d48f4a","updated":"2014-08-13 12:50:36.000000000","message":"Xuhan, I see. I\u0027m not sure that the one specified at the command line corresponds to dhcp option 15 (dhcp domain). But dhcp domain-search option has a code of 119. They are two different options. \n\nFor V6, only domain-search option is applicable. \n\nIt may take some tests to see how they interact with each other, in v6 only or v4+v6.","commit_id":"7c738d3928666fa48c1f8aa78df402dd804130ea"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a3b840e4112d7519d888324e26a1c272084d4500","unresolved":false,"context_lines":[{"line_number":584,"context_line":""},{"line_number":585,"context_line":"            if self.conf.dhcp_domain and subnet.ip_version \u003d\u003d 6:"},{"line_number":586,"context_line":"                options.append(\u0027tag:tag%s,option6:domain-search,%s\u0027 %"},{"line_number":587,"context_line":"                               (i, \u0027\u0027.join(self.conf.dhcp_domain)))"},{"line_number":588,"context_line":""},{"line_number":589,"context_line":"            gateway \u003d subnet.gateway_ip"},{"line_number":590,"context_line":"            host_routes \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_27d48f4a","line":587,"in_reply_to":"baada198_701e8d0e","updated":"2014-08-13 05:20:33.000000000","message":"Robert, IPv4 domain has been covered --domain option of dnsmasq. And from the man page, seems like domain-search is for DHCPv6 options: \"If provided, the DHCPv6 options dns-server and domain-search are used for RDNSS and DNSSL.\"\n\nDo you think we need to specify both domain-search and --domain for IPv4?","commit_id":"7c738d3928666fa48c1f8aa78df402dd804130ea"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"8bcee49455dbf13e592b278e1cfe85218d9810d7","unresolved":false,"context_lines":[{"line_number":633,"context_line":"                        options.extend("},{"line_number":634,"context_line":"                            self._format_option(ip_version, port.id,"},{"line_number":635,"context_line":"                                                opt.opt_name, opt.opt_value)"},{"line_number":636,"context_line":"                            for opt in port.extra_dhcp_opts)"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"            # provides all dnsmasq ip as dns-server if there is more than"},{"line_number":639,"context_line":"            # one dnsmasq for a subnet and there is no dns-server submitted"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_903321f6","line":636,"updated":"2014-08-11 15:41:47.000000000","message":"With the above logic, if the port has both ipv4 and ipv6 addresses, options defined in extra_dhcp_opts will be applied to both dhcp and dhcpv6. This is wrong given that dhcpv6 and dhcp define different options.\n\nIf you download dnsmasq source code, dhcp-common.c defines all the options for v4 and v6, respectively.","commit_id":"7c738d3928666fa48c1f8aa78df402dd804130ea"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"5c7f5563e1f446745b525ab0bd9fe7f6b1d9cc16","unresolved":false,"context_lines":[{"line_number":633,"context_line":"                        options.extend("},{"line_number":634,"context_line":"                            self._format_option(ip_version, port.id,"},{"line_number":635,"context_line":"                                                opt.opt_name, opt.opt_value)"},{"line_number":636,"context_line":"                            for opt in port.extra_dhcp_opts)"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"            # provides all dnsmasq ip as dns-server if there is more than"},{"line_number":639,"context_line":"            # one dnsmasq for a subnet and there is no dns-server submitted"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_e26d3703","line":636,"in_reply_to":"baada198_903321f6","updated":"2014-08-12 21:43:34.000000000","message":"Xuhan, can you insert a #TODO here and open a bug for addressing this separately?","commit_id":"7c738d3928666fa48c1f8aa78df402dd804130ea"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"a3b840e4112d7519d888324e26a1c272084d4500","unresolved":false,"context_lines":[{"line_number":633,"context_line":"                        options.extend("},{"line_number":634,"context_line":"                            self._format_option(ip_version, port.id,"},{"line_number":635,"context_line":"                                                opt.opt_name, opt.opt_value)"},{"line_number":636,"context_line":"                            for opt in port.extra_dhcp_opts)"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"            # provides all dnsmasq ip as dns-server if there is more than"},{"line_number":639,"context_line":"            # one dnsmasq for a subnet and there is no dns-server submitted"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_792b9132","line":636,"in_reply_to":"baada198_e26d3703","updated":"2014-08-13 05:20:33.000000000","message":"will do in next patch.","commit_id":"7c738d3928666fa48c1f8aa78df402dd804130ea"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e8dcdb9fa7ce8f52f90ae73db1813f53ce341833","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                            \u0027DHCP AGENT MAY NOT RUN CORRECTLY! \u0027"},{"line_number":318,"context_line":"                            \u0027Please ensure that its version is %s \u0027"},{"line_number":319,"context_line":"                            \u0027or above!\u0027), cls.MINIMUM_VERSION)"},{"line_number":320,"context_line":"                raise SystemExit(1)"},{"line_number":321,"context_line":"        except (OSError, RuntimeError, IndexError, ValueError):"},{"line_number":322,"context_line":"            LOG.error(_(\u0027Unable to determine dnsmasq version. \u0027"},{"line_number":323,"context_line":"                        \u0027Please ensure that its version is %s \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_069bf118","line":320,"updated":"2014-08-19 03:49:05.000000000","message":"Can\u0027t we disable features which require newer version of dnsmasq? This behavior requires operators to upgrade their operating system to have newer version of dnsmasq. I think it is not an easy requirement of Juno upgrade.\n\nI understand dnsmasq 2.63 is required for IPv4/v6 dual stack and it is highly suggested version. However, exiting dhcp-agent is too strong requirement to me.","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a0f13b6138c212e5fd5605fe34e7a6ba632b4c52","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                            \u0027DHCP AGENT MAY NOT RUN CORRECTLY! \u0027"},{"line_number":318,"context_line":"                            \u0027Please ensure that its version is %s \u0027"},{"line_number":319,"context_line":"                            \u0027or above!\u0027), cls.MINIMUM_VERSION)"},{"line_number":320,"context_line":"                raise SystemExit(1)"},{"line_number":321,"context_line":"        except (OSError, RuntimeError, IndexError, ValueError):"},{"line_number":322,"context_line":"            LOG.error(_(\u0027Unable to determine dnsmasq version. \u0027"},{"line_number":323,"context_line":"                        \u0027Please ensure that its version is %s \u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_bddeba3d","line":320,"in_reply_to":"1abeadc6_069bf118","updated":"2014-08-19 12:09:07.000000000","message":"I agree with approach after reading the ML thread pointed by the author.","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a0f13b6138c212e5fd5605fe34e7a6ba632b4c52","unresolved":false,"context_lines":[{"line_number":373,"context_line":"                ra_mode \u003d getattr(subnet, \u0027ipv6_ra_mode\u0027, None)"},{"line_number":374,"context_line":"                if (addr_mode in [constants.DHCPV6_STATEFUL,"},{"line_number":375,"context_line":"                                  constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                        not addr_mode and not ra_mode):"},{"line_number":377,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":378,"context_line":"            set_tag \u003d \u0027set:\u0027"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_18033c43","line":376,"updated":"2014-08-19 12:09:07.000000000","message":"Nit: Please consider changing the places of parenetheses.\n\n  if (addr_mode in [constants.DHCPV6_STATEFUL,\n                    constants.DHCPV6_STATELESS] or\n          not addr_mode and not ra_mode):\n\nIt passes PEP8 check, but it seems not natural to wrap lines with parentheses of sub-condition.","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"350c54901791fc1a47e35c46a01dab9e73336657","unresolved":false,"context_lines":[{"line_number":373,"context_line":"                ra_mode \u003d getattr(subnet, \u0027ipv6_ra_mode\u0027, None)"},{"line_number":374,"context_line":"                if (addr_mode in [constants.DHCPV6_STATEFUL,"},{"line_number":375,"context_line":"                                  constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                        not addr_mode and not ra_mode):"},{"line_number":377,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":378,"context_line":"            set_tag \u003d \u0027set:\u0027"},{"line_number":379,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_51964e4d","line":376,"in_reply_to":"1abeadc6_18033c43","updated":"2014-08-20 03:41:00.000000000","message":"Done","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9762638067c6e9214d2bd12c7031ccddd846b6c1","unresolved":false,"context_lines":[{"line_number":375,"context_line":"                                  constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                        not addr_mode and not ra_mode):"},{"line_number":377,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":378,"context_line":"            set_tag \u003d \u0027set:\u0027"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"            cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":381,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_1c75e797","line":378,"updated":"2014-08-19 16:14:10.000000000","message":"This is only used on line 390 below, so you can just move this \u0027set:\u0027 into the dhcp-range string there.","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"350c54901791fc1a47e35c46a01dab9e73336657","unresolved":false,"context_lines":[{"line_number":375,"context_line":"                                  constants.DHCPV6_STATELESS]) or ("},{"line_number":376,"context_line":"                        not addr_mode and not ra_mode):"},{"line_number":377,"context_line":"                    mode \u003d \u0027static\u0027"},{"line_number":378,"context_line":"            set_tag \u003d \u0027set:\u0027"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"            cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":381,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_71226a02","line":378,"in_reply_to":"1abeadc6_1c75e797","updated":"2014-08-20 03:41:00.000000000","message":"Done","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9762638067c6e9214d2bd12c7031ccddd846b6c1","unresolved":false,"context_lines":[{"line_number":501,"context_line":"                       \"ip\": ip_address})"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            if getattr(port, \u0027extra_dhcp_opts\u0027, False):"},{"line_number":504,"context_line":"                set_tag \u003d \u0027set:\u0027"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"                buf.write(\u0027%s,%s,%s,%s%s\\n\u0027 %"},{"line_number":507,"context_line":"                          (port.mac_address, name, ip_address,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_27b7f0d9","line":504,"updated":"2014-08-19 16:14:10.000000000","message":"This is only used on line 508 below, so you can move this there and remove the one at line 491","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"350c54901791fc1a47e35c46a01dab9e73336657","unresolved":false,"context_lines":[{"line_number":501,"context_line":"                       \"ip\": ip_address})"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            if getattr(port, \u0027extra_dhcp_opts\u0027, False):"},{"line_number":504,"context_line":"                set_tag \u003d \u0027set:\u0027"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"                buf.write(\u0027%s,%s,%s,%s%s\\n\u0027 %"},{"line_number":507,"context_line":"                          (port.mac_address, name, ip_address,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_1185b6cf","line":504,"in_reply_to":"1abeadc6_27b7f0d9","updated":"2014-08-20 03:41:00.000000000","message":"Done","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a0f13b6138c212e5fd5605fe34e7a6ba632b4c52","unresolved":false,"context_lines":[{"line_number":568,"context_line":"            if not subnet.enable_dhcp or ("},{"line_number":569,"context_line":"                subnet.ip_version \u003d\u003d 6 and"},{"line_number":570,"context_line":"                getattr(subnet, \u0027ipv6_address_mode\u0027,"},{"line_number":571,"context_line":"                        None) in [None, constants.IPV6_SLAAC]):"},{"line_number":572,"context_line":"                continue"},{"line_number":573,"context_line":"            if subnet.dns_nameservers:"},{"line_number":574,"context_line":"                options.append("}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_d86e2401","line":571,"updated":"2014-08-19 12:09:07.000000000","message":"Nit: Same comment on places of parentheses as the above\n\n  if (not subnet.enable_dhcp or\n      (subnet.ip_version \u003d\u003d 6 and\n       getattr(subnet, \u0027ipv6_address_mode\u0027, None)\n       in [None, constants.IPV6_SLAAC])):\n\nI believe it makes easier to read.","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"350c54901791fc1a47e35c46a01dab9e73336657","unresolved":false,"context_lines":[{"line_number":568,"context_line":"            if not subnet.enable_dhcp or ("},{"line_number":569,"context_line":"                subnet.ip_version \u003d\u003d 6 and"},{"line_number":570,"context_line":"                getattr(subnet, \u0027ipv6_address_mode\u0027,"},{"line_number":571,"context_line":"                        None) in [None, constants.IPV6_SLAAC]):"},{"line_number":572,"context_line":"                continue"},{"line_number":573,"context_line":"            if subnet.dns_nameservers:"},{"line_number":574,"context_line":"                options.append("}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_7150aa5e","line":571,"in_reply_to":"1abeadc6_d86e2401","updated":"2014-08-20 03:41:00.000000000","message":"Done","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9762638067c6e9214d2bd12c7031ccddd846b6c1","unresolved":false,"context_lines":[{"line_number":690,"context_line":""},{"line_number":691,"context_line":"    def _format_option(self, ip_version, tag, option, *args):"},{"line_number":692,"context_line":"        \"\"\"Format DHCP option by option name or code.\"\"\""},{"line_number":693,"context_line":"        set_tag \u003d \u0027tag:\u0027"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"        option \u003d str(option)"},{"line_number":696,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_a754e054","line":693,"updated":"2014-08-19 16:14:10.000000000","message":"This is only used on line 706 below as well.","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"350c54901791fc1a47e35c46a01dab9e73336657","unresolved":false,"context_lines":[{"line_number":690,"context_line":""},{"line_number":691,"context_line":"    def _format_option(self, ip_version, tag, option, *args):"},{"line_number":692,"context_line":"        \"\"\"Format DHCP option by option name or code.\"\"\""},{"line_number":693,"context_line":"        set_tag \u003d \u0027tag:\u0027"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"        option \u003d str(option)"},{"line_number":696,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_d1c89e24","line":693,"in_reply_to":"1abeadc6_a754e054","updated":"2014-08-20 03:41:00.000000000","message":"Done","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"}],"neutron/tests/unit/test_linux_dhcp.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a0f13b6138c212e5fd5605fe34e7a6ba632b4c52","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import contextlib"},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":"import os"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_934e4f6e","line":17,"updated":"2014-08-19 12:09:07.000000000","message":"netaddr is thirdparty module, so please move it around \"mock\" below.","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"350c54901791fc1a47e35c46a01dab9e73336657","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import contextlib"},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":"import os"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import mock"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_71734ae7","line":17,"in_reply_to":"1abeadc6_934e4f6e","updated":"2014-08-20 03:41:00.000000000","message":"Done","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a0f13b6138c212e5fd5605fe34e7a6ba632b4c52","unresolved":false,"context_lines":[{"line_number":1317,"context_line":""},{"line_number":1318,"context_line":"    def test_check_fail_version(self):"},{"line_number":1319,"context_line":"        with testtools.ExpectedException(SystemExit):"},{"line_number":1320,"context_line":"            self._check_version(\u0027Dnsmasq version 2.48 Copyright (c)...\u0027, 0)"},{"line_number":1321,"context_line":""},{"line_number":1322,"context_line":"    def test_check_version_failed_cmd_execution(self):"},{"line_number":1323,"context_line":"        with testtools.ExpectedException(SystemExit):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_d3a60710","line":1320,"updated":"2014-08-19 12:09:07.000000000","message":"It looks better if 2.62 is used.","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"350c54901791fc1a47e35c46a01dab9e73336657","unresolved":false,"context_lines":[{"line_number":1317,"context_line":""},{"line_number":1318,"context_line":"    def test_check_fail_version(self):"},{"line_number":1319,"context_line":"        with testtools.ExpectedException(SystemExit):"},{"line_number":1320,"context_line":"            self._check_version(\u0027Dnsmasq version 2.48 Copyright (c)...\u0027, 0)"},{"line_number":1321,"context_line":""},{"line_number":1322,"context_line":"    def test_check_version_failed_cmd_execution(self):"},{"line_number":1323,"context_line":"        with testtools.ExpectedException(SystemExit):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1abeadc6_b17de2b3","line":1320,"in_reply_to":"1abeadc6_d3a60710","updated":"2014-08-20 03:41:00.000000000","message":"Done","commit_id":"3d90e5afb31a3f7c38bff3b9ffda419f92d7ee8b"}]}
