)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"5a304dfe4f10408b87fd30cfa7bbb9922e691fdb","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support Extra DHCP Options for IPv4 and IPv6"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add API and DB change for Blueprint extra-dhcp-opts-ipv4-ipv6."},{"line_number":10,"context_line":"Add unit tests for this change."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The validation of input extr dhcp options is not included"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a961159_441aa7c6","line":9,"updated":"2014-12-15 09:37:10.000000000","message":"Is this link correct? As it goes to nowhere.","commit_id":"1f1fd0547cb19f198c180eab24f069e0888ff073"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"960ba82891e031f4014e1bcdc805540cc2d9722b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support Extra DHCP Options for IPv4 and IPv6"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add API and DB change for Blueprint extra-dhcp-opts-ipv4-ipv6."},{"line_number":10,"context_line":"Add unit tests for this change."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The validation of input extr dhcp options is not included"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a961159_e7cff255","line":9,"in_reply_to":"3a961159_441aa7c6","updated":"2014-12-16 06:45:19.000000000","message":"Thanks for the checking! I modified the BP link. Should work now:-)","commit_id":"1f1fd0547cb19f198c180eab24f069e0888ff073"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"d0f55f822fa29ec224360cbc7774c334df40fc75","unresolved":false,"context_lines":[{"line_number":12,"context_line":"The validation of input extr dhcp options is not included"},{"line_number":13,"context_line":"in this commit. A follow-up commit will be added for"},{"line_number":14,"context_line":"validation."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I346334568929e50e51dd577cde6a257f4bce8e77"},{"line_number":17,"context_line":"Partially-implements: Blueprint extra-dhcp-opts-ipv4-ipv6"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a961159_b1115d55","line":15,"updated":"2015-01-02 10:51:36.000000000","message":"This probably needs DocImpact and APIImpact tags","commit_id":"be14b50ea68b694983c27c5a303935f331b9dd77"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"7e239792eb195517184f01df5264f2a9bccbe77f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"The validation of input extr dhcp options is not included"},{"line_number":13,"context_line":"in this commit. A follow-up commit will be added for"},{"line_number":14,"context_line":"validation."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I346334568929e50e51dd577cde6a257f4bce8e77"},{"line_number":17,"context_line":"Partially-implements: Blueprint extra-dhcp-opts-ipv4-ipv6"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"3a961159_1d4ddb99","line":15,"in_reply_to":"3a961159_b1115d55","updated":"2015-01-04 02:17:11.000000000","message":"Done","commit_id":"be14b50ea68b694983c27c5a303935f331b9dd77"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"e407fb5acdc7d68132e2494ce06c841d54b6f58e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add API and DB change for Blueprint extra-dhcp-opts-ipv4-ipv6."},{"line_number":10,"context_line":"Add unit tests for this change."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The validation of input extr dhcp options is not included"},{"line_number":13,"context_line":"in this commit. A follow-up commit will be added for"},{"line_number":14,"context_line":"validation."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a961159_61d8351f","line":12,"updated":"2015-01-12 15:04:04.000000000","message":"Nit: s/extr/extra/","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add API and DB change for Blueprint extra-dhcp-opts-ipv4-ipv6."},{"line_number":10,"context_line":"Add unit tests for this change."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"The validation of input extr dhcp options is not included"},{"line_number":13,"context_line":"in this commit. A follow-up commit will be added for"},{"line_number":14,"context_line":"validation."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"3a961159_47661f2a","line":12,"in_reply_to":"3a961159_61d8351f","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"}],"neutron/agent/linux/dhcp.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1869caf83bfe4e328ab6426139f8cdc0013e644e","unresolved":false,"context_lines":[{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        for port in self.network.ports:"},{"line_number":643,"context_line":"            if getattr(port, \u0027extra_dhcp_opts\u0027, False):"},{"line_number":644,"context_line":"                port_ip_versions \u003d set([netaddr.IPAddress(ip.ip_address).version"},{"line_number":645,"context_line":"                                       for ip in port.fixed_ips])"},{"line_number":646,"context_line":"                for opt in port.extra_dhcp_opts:"},{"line_number":647,"context_line":"                    opt_ip_version \u003d getattr(opt, \u0027ip_version\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_4299e977","line":644,"updated":"2014-11-25 02:42:47.000000000","message":"This function is now getting really long. Can you separate some of this into a helper function that just gets the options for a set of versions given a set of options? That will make it much easier to write a unit test for as well.","commit_id":"87abd72d135bdb1c84d064838bf237efde4c7755"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"480c94c1fcf4c33ebd39de57606005fd3c4efced","unresolved":false,"context_lines":[{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        for port in self.network.ports:"},{"line_number":643,"context_line":"            if getattr(port, \u0027extra_dhcp_opts\u0027, False):"},{"line_number":644,"context_line":"                port_ip_versions \u003d set([netaddr.IPAddress(ip.ip_address).version"},{"line_number":645,"context_line":"                                       for ip in port.fixed_ips])"},{"line_number":646,"context_line":"                for opt in port.extra_dhcp_opts:"},{"line_number":647,"context_line":"                    opt_ip_version \u003d getattr(opt, \u0027ip_version\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_b87d346f","line":644,"in_reply_to":"5a890539_4299e977","updated":"2014-11-26 02:10:31.000000000","message":"Still working in progress and waiting for the blueprint to be approved. Will improve this function and add unit test in next patches.","commit_id":"87abd72d135bdb1c84d064838bf237efde4c7755"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":574,"context_line":"    def _output_opts_file(self):"},{"line_number":575,"context_line":"        \"\"\"Write a dnsmasq compatible options file.\"\"\""},{"line_number":576,"context_line":"        options \u003d []"},{"line_number":577,"context_line":"        subnet_idx_map \u003d {}"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"        self._output_opts_per_subnet(options, subnet_idx_map)"},{"line_number":580,"context_line":"        self._output_opts_per_port(options, subnet_idx_map)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_ac11b454","line":577,"updated":"2015-01-15 14:21:32.000000000","message":"subnet_idx_map -\u003e subnet_index_map\n\nbecause sub mehtods _output_opts_per_* use subnet_index_map and there is no need to use abbrev version here.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":574,"context_line":"    def _output_opts_file(self):"},{"line_number":575,"context_line":"        \"\"\"Write a dnsmasq compatible options file.\"\"\""},{"line_number":576,"context_line":"        options \u003d []"},{"line_number":577,"context_line":"        subnet_idx_map \u003d {}"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"        self._output_opts_per_subnet(options, subnet_idx_map)"},{"line_number":580,"context_line":"        self._output_opts_per_port(options, subnet_idx_map)"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_876c8708","line":577,"in_reply_to":"3a961159_ac11b454","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":663,"context_line":"                            self._format_option(opt_ip_version, port.id,"},{"line_number":664,"context_line":"                                                opt.opt_name, opt.opt_value))"},{"line_number":665,"context_line":"                    else:"},{"line_number":666,"context_line":"                        LOG.warning(_LW(\"Cannot apply dhcp option %(opt)s \""},{"line_number":667,"context_line":"                                      \"because it\u0027s ip_version %(version)d \""},{"line_number":668,"context_line":"                                      \"is not in port\u0027s address IP versions\"),"},{"line_number":669,"context_line":"                                    {\u0027opt\u0027: opt.opt_name,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_8c41580c","line":666,"updated":"2015-01-15 14:21:32.000000000","message":"Is this a warning? It is assumed that warnings in dhcp agent is a kind of system-side problem. I don\u0027t think this is the case.\nIt is a kind of faults of user side, so it is better to be warned to users in the server side if we need a warning to this. At least I think it is not a right place to warn this.\n\nIn addition, can\u0027t we set a whole set of dhcp opts for both ipv4 and ipv6 though a port has only either of IPv4 or IPv6 addresses? I think it is also a valid case. In general, I don\u0027t think we need this warning.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":663,"context_line":"                            self._format_option(opt_ip_version, port.id,"},{"line_number":664,"context_line":"                                                opt.opt_name, opt.opt_value))"},{"line_number":665,"context_line":"                    else:"},{"line_number":666,"context_line":"                        LOG.warning(_LW(\"Cannot apply dhcp option %(opt)s \""},{"line_number":667,"context_line":"                                      \"because it\u0027s ip_version %(version)d \""},{"line_number":668,"context_line":"                                      \"is not in port\u0027s address IP versions\"),"},{"line_number":669,"context_line":"                                    {\u0027opt\u0027: opt.opt_name,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_a70b4329","line":666,"in_reply_to":"3a961159_8c41580c","updated":"2015-01-19 06:21:46.000000000","message":"Akihiro, we allow user to set the dhcp opts for both ipv4 and ipv6 though a port has only either of IPv4 or IPv6 addresses. But we cannot\"apply\" it to dnsmasq because it doesn\u0027t work. This is exactly why I didn\u0027t prompt error message or warning from API side but only record it in agent log. \n\nI hope this makes sense and let me know if you still think it\u0027s a problem.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d52ba9e811feeeaefb966a9624b1eeebc05d5939","unresolved":false,"context_lines":[{"line_number":663,"context_line":"                            self._format_option(opt_ip_version, port.id,"},{"line_number":664,"context_line":"                                                opt.opt_name, opt.opt_value))"},{"line_number":665,"context_line":"                    else:"},{"line_number":666,"context_line":"                        LOG.warning(_LW(\"Cannot apply dhcp option %(opt)s \""},{"line_number":667,"context_line":"                                      \"because it\u0027s ip_version %(version)d \""},{"line_number":668,"context_line":"                                      \"is not in port\u0027s address IP versions\"),"},{"line_number":669,"context_line":"                                    {\u0027opt\u0027: opt.opt_name,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a930d6b_21da0d4c","line":666,"in_reply_to":"3a961159_a70b4329","updated":"2015-01-27 07:17:01.000000000","message":"Sorry I missed your this reply.\n\nGenerally I agree with you. Extra dhcp opts for IPv6 has no meaning if a port has only IPv4 address and vice versa. Thus I think we simply ignore dhcp options of non-related IP version without warning messages. At least it sounds a debug or info level message to me.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"3cfa008f7986984f22fcbe8ef69a554d7235b582","unresolved":false,"context_lines":[{"line_number":591,"context_line":"        options \u003d []"},{"line_number":592,"context_line":"        subnet_index_map \u003d {}"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        self._output_opts_per_subnet(options, subnet_index_map)"},{"line_number":595,"context_line":"        self._output_opts_per_port(options, subnet_index_map)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_3b7d55e8","line":594,"updated":"2015-01-22 19:33:11.000000000","message":"_generate_opts_for_subnets()?\n\nI think that it would be better to have options and subnet_index_map as output values such as:\n  options, subent_index_map \u003d _generate_opts_for_subnets()","commit_id":"43421621e36e8b286b5a275651a8e7e87fa4ea61"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"262195befd2a06531cbc4ee0723a10349e2ac49a","unresolved":false,"context_lines":[{"line_number":591,"context_line":"        options \u003d []"},{"line_number":592,"context_line":"        subnet_index_map \u003d {}"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        self._output_opts_per_subnet(options, subnet_index_map)"},{"line_number":595,"context_line":"        self._output_opts_per_port(options, subnet_index_map)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_b0f232d0","line":594,"in_reply_to":"1a930d6b_3b7d55e8","updated":"2015-01-23 06:07:33.000000000","message":"Done","commit_id":"43421621e36e8b286b5a275651a8e7e87fa4ea61"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"3cfa008f7986984f22fcbe8ef69a554d7235b582","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        subnet_index_map \u003d {}"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        self._output_opts_per_subnet(options, subnet_index_map)"},{"line_number":595,"context_line":"        self._output_opts_per_port(options, subnet_index_map)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":598,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_9b548955","line":595,"updated":"2015-01-22 19:33:11.000000000","message":"options \u003d options +  _generate_opts_for_ports(subnet_index_map)","commit_id":"43421621e36e8b286b5a275651a8e7e87fa4ea61"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"262195befd2a06531cbc4ee0723a10349e2ac49a","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        subnet_index_map \u003d {}"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        self._output_opts_per_subnet(options, subnet_index_map)"},{"line_number":595,"context_line":"        self._output_opts_per_port(options, subnet_index_map)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        name \u003d self.get_conf_file_name(\u0027opts\u0027)"},{"line_number":598,"context_line":"        utils.replace_file(name, \u0027\\n\u0027.join(options))"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_d0edfef0","line":595,"in_reply_to":"1a930d6b_9b548955","updated":"2015-01-23 06:07:33.000000000","message":"Done","commit_id":"43421621e36e8b286b5a275651a8e7e87fa4ea61"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"65427641a5981c5769f04acfd39f97079bda7558","unresolved":false,"context_lines":[{"line_number":589,"context_line":"    def _output_opts_file(self):"},{"line_number":590,"context_line":"        \"\"\"Write a dnsmasq compatible options file.\"\"\""},{"line_number":591,"context_line":"        options \u003d []"},{"line_number":592,"context_line":"        subnet_index_map \u003d {}"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        options, subnet_index_map \u003d self._generate_opts_per_subnet()"},{"line_number":595,"context_line":"        options +\u003d self._generate_opts_per_port(subnet_index_map)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a930d6b_d9351df8","line":592,"updated":"2015-01-23 13:20:29.000000000","message":"these two lines are not needed.","commit_id":"d5a50e35c95888456f362dff6ec77c0e14679f52"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f267e7b21e9ca5b8f41c38e8491e8cdcb366c8bc","unresolved":false,"context_lines":[{"line_number":589,"context_line":"    def _output_opts_file(self):"},{"line_number":590,"context_line":"        \"\"\"Write a dnsmasq compatible options file.\"\"\""},{"line_number":591,"context_line":"        options \u003d []"},{"line_number":592,"context_line":"        subnet_index_map \u003d {}"},{"line_number":593,"context_line":""},{"line_number":594,"context_line":"        options, subnet_index_map \u003d self._generate_opts_per_subnet()"},{"line_number":595,"context_line":"        options +\u003d self._generate_opts_per_port(subnet_index_map)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a930d6b_cc18d420","line":592,"in_reply_to":"1a930d6b_d9351df8","updated":"2015-01-26 01:59:15.000000000","message":"Done","commit_id":"d5a50e35c95888456f362dff6ec77c0e14679f52"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3bf0e775ccbde1f0ef8d2ac1008ec49b1a397164","unresolved":false,"context_lines":[{"line_number":657,"context_line":"                            self._format_option(opt_ip_version, port.id,"},{"line_number":658,"context_line":"                                                opt.opt_name, opt.opt_value))"},{"line_number":659,"context_line":"                    else:"},{"line_number":660,"context_line":"                        LOG.warning(_LW(\"Cannot apply dhcp option %(opt)s \""},{"line_number":661,"context_line":"                                      \"because it\u0027s ip_version %(version)d \""},{"line_number":662,"context_line":"                                      \"is not in port\u0027s address IP versions\"),"},{"line_number":663,"context_line":"                                    {\u0027opt\u0027: opt.opt_name,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a930d6b_81fca1b9","line":660,"updated":"2015-01-27 07:26:25.000000000","message":"I think we can simply ignore dhcp option for IPv4 for IPv6 only port and vice versa because it seems clear to all that dhcp option of non-related IP version has no effect. Is it a problem?\n\nWARNING means a system warning and operators need to take some action. There is no way to deal with the message in this case, , so it seems better to use INFO or DEBUG level because it is triggered by user settings.","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"592e83e46ff8e4de40f0d75809f7a713348a4bbd","unresolved":false,"context_lines":[{"line_number":657,"context_line":"                            self._format_option(opt_ip_version, port.id,"},{"line_number":658,"context_line":"                                                opt.opt_name, opt.opt_value))"},{"line_number":659,"context_line":"                    else:"},{"line_number":660,"context_line":"                        LOG.warning(_LW(\"Cannot apply dhcp option %(opt)s \""},{"line_number":661,"context_line":"                                      \"because it\u0027s ip_version %(version)d \""},{"line_number":662,"context_line":"                                      \"is not in port\u0027s address IP versions\"),"},{"line_number":663,"context_line":"                                    {\u0027opt\u0027: opt.opt_name,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa81d914_c1cf36af","line":660,"in_reply_to":"1a930d6b_81fca1b9","updated":"2015-01-28 03:46:08.000000000","message":"OK. I will change to INFO here.","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"}],"neutron/db/extradhcpopt_db.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"62329ad6aa38ffb3c42a059223b4799402bc80ce","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                            break"},{"line_number":117,"context_line":"                    else:"},{"line_number":118,"context_line":"                        if upd_rec[\u0027opt_value\u0027] is not None:"},{"line_number":119,"context_line":"                            if dopt.get(\u0027ip_version\u0027):"},{"line_number":120,"context_line":"                                db \u003d ExtraDhcpOpt("},{"line_number":121,"context_line":"                                    port_id\u003dport[\u0027id\u0027],"},{"line_number":122,"context_line":"                                    opt_name\u003ddopt[\u0027opt_name\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a890539_f8728e7a","line":119,"updated":"2014-11-24 21:15:54.000000000","message":"typo: opt","commit_id":"29809ce643fa5a198a3eaceb298b18385edeea85"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                        nullable\u003dFalse)"},{"line_number":40,"context_line":"    opt_name \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":41,"context_line":"    opt_value \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":42,"context_line":"    ip_version \u003d sa.Column(sa.Integer, server_default\u003d\u00274\u0027, nullable\u003dTrue)"},{"line_number":43,"context_line":"    __table_args__ \u003d (sa.UniqueConstraint(\u0027port_id\u0027,"},{"line_number":44,"context_line":"                                          \u0027opt_name\u0027,"},{"line_number":45,"context_line":"                                          name\u003d\u0027uidx_portid_optname\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_5199c71d","line":42,"updated":"2015-01-15 14:21:32.000000000","message":"As I comment in db migration script, there is no need nullable\u003dTrue.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                        nullable\u003dFalse)"},{"line_number":40,"context_line":"    opt_name \u003d sa.Column(sa.String(64), nullable\u003dFalse)"},{"line_number":41,"context_line":"    opt_value \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":42,"context_line":"    ip_version \u003d sa.Column(sa.Integer, server_default\u003d\u00274\u0027, nullable\u003dTrue)"},{"line_number":43,"context_line":"    __table_args__ \u003d (sa.UniqueConstraint(\u0027port_id\u0027,"},{"line_number":44,"context_line":"                                          \u0027opt_name\u0027,"},{"line_number":45,"context_line":"                                          name\u003d\u0027uidx_portid_optname\u0027),"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_25ff4b02","line":42,"in_reply_to":"3a961159_5199c71d","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":64,"context_line":"            for dopt in extra_dhcp_opts:"},{"line_number":65,"context_line":"                if dopt[\u0027opt_value\u0027]:"},{"line_number":66,"context_line":"                    if dopt.get(\u0027ip_version\u0027):"},{"line_number":67,"context_line":"                        db \u003d ExtraDhcpOpt("},{"line_number":68,"context_line":"                            port_id\u003dport[\u0027id\u0027],"},{"line_number":69,"context_line":"                            opt_name\u003ddopt[\u0027opt_name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_5b1c8877","line":66,"updated":"2015-01-15 14:21:32.000000000","message":"If ip_version defaults to 4 in the extension definition (as I commented in the other file), it is ensured ip_version always has a valid value. If so, we don\u0027t need to use if-else clause here.\n\nIf default in the extension definition does not work, the following logic can simplify the code. I prefer to set ip_version in any case.\n\n  ip_version \u003d upd_rec.get(\u0027ip_version\u0027, 4)\n  db \u003d ExtraDhcpOpt(....,\n                       ip_version\u003dip_version)\n\nIf so, if-else clause is no longer needed.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"901da86bc18a7241afdfcf3f39ecdaadcd5622eb","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":64,"context_line":"            for dopt in extra_dhcp_opts:"},{"line_number":65,"context_line":"                if dopt[\u0027opt_value\u0027]:"},{"line_number":66,"context_line":"                    if dopt.get(\u0027ip_version\u0027):"},{"line_number":67,"context_line":"                        db \u003d ExtraDhcpOpt("},{"line_number":68,"context_line":"                            port_id\u003dport[\u0027id\u0027],"},{"line_number":69,"context_line":"                            opt_name\u003ddopt[\u0027opt_name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_f212b25f","line":66,"in_reply_to":"3a961159_5b1c8877","updated":"2015-01-15 14:46:56.000000000","message":"+1","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":64,"context_line":"            for dopt in extra_dhcp_opts:"},{"line_number":65,"context_line":"                if dopt[\u0027opt_value\u0027]:"},{"line_number":66,"context_line":"                    if dopt.get(\u0027ip_version\u0027):"},{"line_number":67,"context_line":"                        db \u003d ExtraDhcpOpt("},{"line_number":68,"context_line":"                            port_id\u003dport[\u0027id\u0027],"},{"line_number":69,"context_line":"                            opt_name\u003ddopt[\u0027opt_name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_05b08f3e","line":66,"in_reply_to":"3a961159_f212b25f","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                                if opt[\u0027opt_value\u0027] !\u003d upd_rec[\u0027opt_value\u0027]:"},{"line_number":111,"context_line":"                                    opt.update("},{"line_number":112,"context_line":"                                        {\u0027opt_value\u0027: upd_rec[\u0027opt_value\u0027]})"},{"line_number":113,"context_line":"                                if (upd_rec.get(\u0027ip_version\u0027) and"},{"line_number":114,"context_line":"                                    (opt[\u0027ip_version\u0027] !\u003d"},{"line_number":115,"context_line":"                                     upd_rec[\u0027ip_version\u0027])):"},{"line_number":116,"context_line":"                                    opt.update("}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_b1ccab8b","line":113,"updated":"2015-01-15 14:21:32.000000000","message":"I think it is better to default ip_version to 4:\n\n  upd_rec.get(\u0027ip_version\u0027, 4)","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                                if opt[\u0027opt_value\u0027] !\u003d upd_rec[\u0027opt_value\u0027]:"},{"line_number":111,"context_line":"                                    opt.update("},{"line_number":112,"context_line":"                                        {\u0027opt_value\u0027: upd_rec[\u0027opt_value\u0027]})"},{"line_number":113,"context_line":"                                if (upd_rec.get(\u0027ip_version\u0027) and"},{"line_number":114,"context_line":"                                    (opt[\u0027ip_version\u0027] !\u003d"},{"line_number":115,"context_line":"                                     upd_rec[\u0027ip_version\u0027])):"},{"line_number":116,"context_line":"                                    opt.update("}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_656a33b6","line":113,"in_reply_to":"3a961159_b1ccab8b","updated":"2015-01-19 06:21:46.000000000","message":"what if user only wants to update the opt_value of an existing ipv6 opt? setting default to 4 may force the unintended update of ip_version.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                                        {\u0027opt_value\u0027: upd_rec[\u0027opt_value\u0027]})"},{"line_number":113,"context_line":"                                if (upd_rec.get(\u0027ip_version\u0027) and"},{"line_number":114,"context_line":"                                    (opt[\u0027ip_version\u0027] !\u003d"},{"line_number":115,"context_line":"                                     upd_rec[\u0027ip_version\u0027])):"},{"line_number":116,"context_line":"                                    opt.update("},{"line_number":117,"context_line":"                                        {\u0027ip_version\u0027: upd_rec[\u0027ip_version\u0027]})"},{"line_number":118,"context_line":"                            break"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_7121634e","line":115,"updated":"2015-01-15 14:21:32.000000000","message":"I am not sure this condition is correct.\nDo we have a case where an option name is same but a option value is different for IPv4 and IPv6? If we have, this logic is insufficinet and instead we need to look for an entry by using a combination of opt_name and ip_version. Thought?","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                                        {\u0027opt_value\u0027: upd_rec[\u0027opt_value\u0027]})"},{"line_number":113,"context_line":"                                if (upd_rec.get(\u0027ip_version\u0027) and"},{"line_number":114,"context_line":"                                    (opt[\u0027ip_version\u0027] !\u003d"},{"line_number":115,"context_line":"                                     upd_rec[\u0027ip_version\u0027])):"},{"line_number":116,"context_line":"                                    opt.update("},{"line_number":117,"context_line":"                                        {\u0027ip_version\u0027: upd_rec[\u0027ip_version\u0027]})"},{"line_number":118,"context_line":"                            break"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_05b5ef17","line":115,"in_reply_to":"3a961159_7121634e","updated":"2015-01-19 06:21:46.000000000","message":"Yes. There could be a case that option name is same but option value is different for IPv4 and IPv6. dns-server is one example. \n\nI need to change the UniqueConstraint at line 43 to be able to allow two entries having same option name. \n\nAfter this change, updating with both ip_version and opt_value changed will create a new option.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                                if (upd_rec.get(\u0027ip_version\u0027) and"},{"line_number":114,"context_line":"                                    (opt[\u0027ip_version\u0027] !\u003d"},{"line_number":115,"context_line":"                                     upd_rec[\u0027ip_version\u0027])):"},{"line_number":116,"context_line":"                                    opt.update("},{"line_number":117,"context_line":"                                        {\u0027ip_version\u0027: upd_rec[\u0027ip_version\u0027]})"},{"line_number":118,"context_line":"                            break"},{"line_number":119,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_f1e1d32b","line":116,"updated":"2015-01-15 14:21:32.000000000","message":"I am not very sure we may have two opt.update. Instead I prefer to constructing a dict containing a new value and using opt.update(xx) once.\n\nIn this case:\n\n  new_opts \u003d {}\n  if opt[\u0027opt_value\u0027] !\u003d upd_rec[\u0027opt_value\u0027]:\n      new_opts[\u0027opt_value\u0027] \u003d upd_rec[\u0027opt_value\u0027]\n  if \u003cip_version update is required\u003e:\n      new_opts[\u0027ip_version\u0027] \u003d upd_rec[\u0027ip_version\u0027]\n  if new_opts:\n     opt.update(new_opts)","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                                if (upd_rec.get(\u0027ip_version\u0027) and"},{"line_number":114,"context_line":"                                    (opt[\u0027ip_version\u0027] !\u003d"},{"line_number":115,"context_line":"                                     upd_rec[\u0027ip_version\u0027])):"},{"line_number":116,"context_line":"                                    opt.update("},{"line_number":117,"context_line":"                                        {\u0027ip_version\u0027: upd_rec[\u0027ip_version\u0027]})"},{"line_number":118,"context_line":"                            break"},{"line_number":119,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_453a9798","line":116,"in_reply_to":"3a961159_f1e1d32b","updated":"2015-01-19 06:21:46.000000000","message":"Will modify in next patch.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                            break"},{"line_number":119,"context_line":"                    else:"},{"line_number":120,"context_line":"                        if upd_rec[\u0027opt_value\u0027] is not None:"},{"line_number":121,"context_line":"                            if upd_rec.get(\u0027ip_version\u0027):"},{"line_number":122,"context_line":"                                db \u003d ExtraDhcpOpt("},{"line_number":123,"context_line":"                                    port_id\u003did,"},{"line_number":124,"context_line":"                                    opt_name\u003dupd_rec[\u0027opt_name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_d1c5b73d","line":121,"updated":"2015-01-15 14:21:32.000000000","message":"I prefer to set ip_version in any case.\n\n  ip_version \u003d upd_rec.get(\u0027ip_version\u0027, 4)\n  db \u003d ExtraDhcpOpt(....,\n                       ip_version\u003dip_version)\n\nIf so, if-else clause is no longer needed.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                            break"},{"line_number":119,"context_line":"                    else:"},{"line_number":120,"context_line":"                        if upd_rec[\u0027opt_value\u0027] is not None:"},{"line_number":121,"context_line":"                            if upd_rec.get(\u0027ip_version\u0027):"},{"line_number":122,"context_line":"                                db \u003d ExtraDhcpOpt("},{"line_number":123,"context_line":"                                    port_id\u003did,"},{"line_number":124,"context_line":"                                    opt_name\u003dupd_rec[\u0027opt_name\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_c534c7e0","line":121,"in_reply_to":"3a961159_d1c5b73d","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"ef34615d8fec82e033b4a707c2f19dd756e19c08","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \u0027port_id\u0027,"},{"line_number":45,"context_line":"        \u0027opt_name\u0027,"},{"line_number":46,"context_line":"        \u0027ip_version\u0027,"},{"line_number":47,"context_line":"        name\u003d\u0027uidx_portid_optname_ipversion\u0027),"},{"line_number":48,"context_line":"                      model_base.BASEV2.__table_args__,)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # Add a relationship to the Port model in order to instruct SQLAlchemy to"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a930d6b_cb508334","line":47,"updated":"2015-01-27 09:03:10.000000000","message":"Change name of the index here too.","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"592e83e46ff8e4de40f0d75809f7a713348a4bbd","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        \u0027port_id\u0027,"},{"line_number":45,"context_line":"        \u0027opt_name\u0027,"},{"line_number":46,"context_line":"        \u0027ip_version\u0027,"},{"line_number":47,"context_line":"        name\u003d\u0027uidx_portid_optname_ipversion\u0027),"},{"line_number":48,"context_line":"                      model_base.BASEV2.__table_args__,)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    # Add a relationship to the Port model in order to instruct SQLAlchemy to"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa81d914_016f8e93","line":47,"in_reply_to":"1a930d6b_cb508334","updated":"2015-01-28 03:46:08.000000000","message":"Done","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"}],"neutron/db/migration/alembic_migrations/versions/16cdf118d31d_extra_dhcp_options_ipv6_support.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.add_column(\u0027extradhcpopts\u0027, sa.Column(\u0027ip_version\u0027, sa.Integer(),"},{"line_number":34,"context_line":"                  server_default\u003d\u00274\u0027, nullable\u003dTrue))"},{"line_number":35,"context_line":"    op.execute(\"UPDATE extradhcpopts SET ip_version \u003d 4\")"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_51646748","line":34,"updated":"2015-01-15 14:21:32.000000000","message":"I think we can set nullable to False because UPDATE SQL at the next line ensures existing entries have ip_version field. If so we can expect ip_version is always non-null.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.add_column(\u0027extradhcpopts\u0027, sa.Column(\u0027ip_version\u0027, sa.Integer(),"},{"line_number":34,"context_line":"                  server_default\u003d\u00274\u0027, nullable\u003dTrue))"},{"line_number":35,"context_line":"    op.execute(\"UPDATE extradhcpopts SET ip_version \u003d 4\")"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_ca069620","line":34,"in_reply_to":"3a961159_51646748","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"868023ef7a6134f2e3eccc98dfa5b1745ffd4994","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_65652eb4","line":1,"updated":"2015-01-26 10:08:22.000000000","message":"2015","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"3d23aa4eda4e0e7a6e37d643eb8ed2ee51d14e9e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_92a15596","line":1,"in_reply_to":"1a930d6b_65652eb4","updated":"2015-01-27 05:14:38.000000000","message":"Done","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"868023ef7a6134f2e3eccc98dfa5b1745ffd4994","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from neutron.db import migration"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONSTRAINT_NAME_OLD \u003d \u0027uidx_portid_optname\u0027"},{"line_number":34,"context_line":"CONSTRAINT_NAME_NEW \u003d \u0027uidx_portid_optname_ipversion\u0027"},{"line_number":35,"context_line":"FOREIGN_KEY_NAME \u003d \u0027extradhcpopts_ibfk_1\u0027"},{"line_number":36,"context_line":"TABLE_NAME \u003d \u0027extradhcpopts\u0027"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_e5491e32","line":34,"updated":"2015-01-26 10:08:22.000000000","message":"Unique constraints always named unique_(table_name)0(columns), like here https://github.com/openstack/neutron/blob/master/neutron/db/migration/alembic_migrations/versions/e197124d4b9_add_unique_constrain.py#L33.","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"3d23aa4eda4e0e7a6e37d643eb8ed2ee51d14e9e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from neutron.db import migration"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONSTRAINT_NAME_OLD \u003d \u0027uidx_portid_optname\u0027"},{"line_number":34,"context_line":"CONSTRAINT_NAME_NEW \u003d \u0027uidx_portid_optname_ipversion\u0027"},{"line_number":35,"context_line":"FOREIGN_KEY_NAME \u003d \u0027extradhcpopts_ibfk_1\u0027"},{"line_number":36,"context_line":"TABLE_NAME \u003d \u0027extradhcpopts\u0027"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_5201ad68","line":34,"in_reply_to":"1a930d6b_49c3d256","updated":"2015-01-27 05:14:38.000000000","message":"Done","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":704,"name":"Edgar Magana","email":"emagana@gmail.com","username":"emagana"},"change_message_id":"e32ec79edfc21b7bf67400be90160b6c8e964aa4","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from neutron.db import migration"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONSTRAINT_NAME_OLD \u003d \u0027uidx_portid_optname\u0027"},{"line_number":34,"context_line":"CONSTRAINT_NAME_NEW \u003d \u0027uidx_portid_optname_ipversion\u0027"},{"line_number":35,"context_line":"FOREIGN_KEY_NAME \u003d \u0027extradhcpopts_ibfk_1\u0027"},{"line_number":36,"context_line":"TABLE_NAME \u003d \u0027extradhcpopts\u0027"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_49c3d256","line":34,"in_reply_to":"1a930d6b_e5491e32","updated":"2015-01-26 20:22:31.000000000","message":"I second this one","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"ef34615d8fec82e033b4a707c2f19dd756e19c08","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from neutron.db import migration"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONSTRAINT_NAME_OLD \u003d \u0027uidx_portid_optname\u0027"},{"line_number":34,"context_line":"CONSTRAINT_NAME_NEW \u003d \u0027uidx_portid_optname_ipversion\u0027"},{"line_number":35,"context_line":"FOREIGN_KEY_NAME \u003d \u0027extradhcpopts_ibfk_1\u0027"},{"line_number":36,"context_line":"TABLE_NAME \u003d \u0027extradhcpopts\u0027"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1a930d6b_0b70cbda","line":34,"updated":"2015-01-27 09:03:10.000000000","message":"Is it done there?","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"592e83e46ff8e4de40f0d75809f7a713348a4bbd","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from neutron.db import migration"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONSTRAINT_NAME_OLD \u003d \u0027uidx_portid_optname\u0027"},{"line_number":34,"context_line":"CONSTRAINT_NAME_NEW \u003d \u0027uidx_portid_optname_ipversion\u0027"},{"line_number":35,"context_line":"FOREIGN_KEY_NAME \u003d \u0027extradhcpopts_ibfk_1\u0027"},{"line_number":36,"context_line":"TABLE_NAME \u003d \u0027extradhcpopts\u0027"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"fa81d914_419c266a","line":34,"in_reply_to":"1a930d6b_0b70cbda","updated":"2015-01-28 03:46:08.000000000","message":"sorry I uploaded the wrong patch. You will see it in next patch.","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"00f504b3bd18cfdf1e47887c21dee4ef2c496c04","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONSTRAINT_NAME_OLD \u003d \u0027uidx_portid_optname\u0027"},{"line_number":34,"context_line":"CONSTRAINT_NAME_NEW \u003d \u0027uniq_extradhcpopts0portid0optname0ipversion\u0027"},{"line_number":35,"context_line":"FOREIGN_KEY_NAME \u003d \u0027extradhcpopts_ibfk_1\u0027"},{"line_number":36,"context_line":"TABLE_NAME \u003d \u0027extradhcpopts\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_ff83e3c9","line":35,"updated":"2015-02-02 09:09:08.000000000","message":"Where is this value used?","commit_id":"5ed59fc693d3bf69cf8c9db07142549c8d9605ed"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"cc4ad99b61fa73a53c0a96904e998d3bf7550ec8","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"CONSTRAINT_NAME_OLD \u003d \u0027uidx_portid_optname\u0027"},{"line_number":34,"context_line":"CONSTRAINT_NAME_NEW \u003d \u0027uniq_extradhcpopts0portid0optname0ipversion\u0027"},{"line_number":35,"context_line":"FOREIGN_KEY_NAME \u003d \u0027extradhcpopts_ibfk_1\u0027"},{"line_number":36,"context_line":"TABLE_NAME \u003d \u0027extradhcpopts\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"da86d52c_8510aca9","line":35,"in_reply_to":"da86d52c_ff83e3c9","updated":"2015-02-03 02:01:39.000000000","message":"Done","commit_id":"5ed59fc693d3bf69cf8c9db07142549c8d9605ed"}],"neutron/extensions/extra_dhcp_opt.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                               \u0027required\u0027: True},"},{"line_number":59,"context_line":"                 \u0027ip_version\u0027: {\u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":60,"context_line":"                                \u0027type:values\u0027: [4, 6],"},{"line_number":61,"context_line":"                                \u0027required\u0027: False}}}}}}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class Extra_dhcp_opt(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_5b4e4897","line":61,"updated":"2015-01-15 14:21:32.000000000","message":"I think it is better to default to 4.\n\n \u0027default\u0027: 4,","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                               \u0027required\u0027: True},"},{"line_number":59,"context_line":"                 \u0027ip_version\u0027: {\u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":60,"context_line":"                                \u0027type:values\u0027: [4, 6],"},{"line_number":61,"context_line":"                                \u0027required\u0027: False}}}}}}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class Extra_dhcp_opt(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_c567674f","line":61,"in_reply_to":"3a961159_5b4e4897","updated":"2015-01-19 06:21:46.000000000","message":"What confused me at first is all the id, opt_name, and opt_value are under \u0027validate\u0027 and I could not find the code to make the default value take effect (after test, the default value doesn\u0027t take effect). I am not sure if this is by design of the original code. Thoughts?","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"d52ba9e811feeeaefb966a9624b1eeebc05d5939","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                               \u0027required\u0027: True},"},{"line_number":59,"context_line":"                 \u0027ip_version\u0027: {\u0027convert_to\u0027: attr.convert_to_int,"},{"line_number":60,"context_line":"                                \u0027type:values\u0027: [4, 6],"},{"line_number":61,"context_line":"                                \u0027required\u0027: False}}}}}}"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"class Extra_dhcp_opt(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a930d6b_a13d1d2d","line":61,"in_reply_to":"3a961159_c567674f","updated":"2015-01-27 07:17:01.000000000","message":"You are right. There is no way to specify a default value to sub-level field. The implementation is a bit ad-hoc and setting a default value is only supported at the top level. I think we can leave the current logic as-is and it can be addressed in a new API framework being designed.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"}],"neutron/tests/unit/test_extension_extradhcpopts.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"901da86bc18a7241afdfcf3f39ecdaadcd5622eb","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            for exp in expected:"},{"line_number":67,"context_line":"                if name \u003d\u003d exp[\u0027opt_name\u0027]:"},{"line_number":68,"context_line":"                    val \u003d exp[\u0027opt_value\u0027]"},{"line_number":69,"context_line":"                    if exp.get(\u0027ip_version\u0027):"},{"line_number":70,"context_line":"                        ip_version \u003d exp[\u0027ip_version\u0027]"},{"line_number":71,"context_line":"                    else:"},{"line_number":72,"context_line":"                        ip_version \u003d 4"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_f558dcfa","line":69,"updated":"2015-01-15 14:46:56.000000000","message":"lines 69-72:\nip_version \u003d exp.get(\u0027ip_version\u0027, 4)","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            for exp in expected:"},{"line_number":67,"context_line":"                if name \u003d\u003d exp[\u0027opt_name\u0027]:"},{"line_number":68,"context_line":"                    val \u003d exp[\u0027opt_value\u0027]"},{"line_number":69,"context_line":"                    if exp.get(\u0027ip_version\u0027):"},{"line_number":70,"context_line":"                        ip_version \u003d exp[\u0027ip_version\u0027]"},{"line_number":71,"context_line":"                    else:"},{"line_number":72,"context_line":"                        ip_version \u003d 4"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_85571fc8","line":69,"in_reply_to":"3a961159_f558dcfa","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"901da86bc18a7241afdfcf3f39ecdaadcd5622eb","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                    else:"},{"line_number":72,"context_line":"                        ip_version \u003d 4"},{"line_number":73,"context_line":"                    break"},{"line_number":74,"context_line":"            self.assertEqual(opt[\u0027opt_value\u0027], val)"},{"line_number":75,"context_line":"            self.assertEqual(opt[\u0027ip_version\u0027], ip_version)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_create_port_with_extradhcpopts(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_35f504cb","line":74,"updated":"2015-01-15 14:46:56.000000000","message":"val and ip_version are expected values,, so they should go first in L74-75","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                    else:"},{"line_number":72,"context_line":"                        ip_version \u003d 4"},{"line_number":73,"context_line":"                    break"},{"line_number":74,"context_line":"            self.assertEqual(opt[\u0027opt_value\u0027], val)"},{"line_number":75,"context_line":"            self.assertEqual(opt[\u0027ip_version\u0027], ip_version)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def test_create_port_with_extradhcpopts(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_e56703b6","line":74,"in_reply_to":"3a961159_35f504cb","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4205f2cb6722d27c94895c770f592d2cb1095d6a","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        for i in expected_opts:"},{"line_number":314,"context_line":"            if i[\u0027opt_name\u0027] \u003d\u003d upd_opts[0][\u0027opt_name\u0027]:"},{"line_number":315,"context_line":"                i[\u0027opt_value\u0027] \u003d upd_opts[0][\u0027opt_value\u0027]"},{"line_number":316,"context_line":"                break"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        params \u003d {edo_ext.EXTRADHCPOPTS: opt_list,"},{"line_number":319,"context_line":"                  \u0027arg_list\u0027: (edo_ext.EXTRADHCPOPTS,)}"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_2cdce417","line":316,"updated":"2015-01-15 14:21:32.000000000","message":"Why we need to break here? upd_opts can have multiple entries.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":313,"context_line":"        for i in expected_opts:"},{"line_number":314,"context_line":"            if i[\u0027opt_name\u0027] \u003d\u003d upd_opts[0][\u0027opt_name\u0027]:"},{"line_number":315,"context_line":"                i[\u0027opt_value\u0027] \u003d upd_opts[0][\u0027opt_value\u0027]"},{"line_number":316,"context_line":"                break"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        params \u003d {edo_ext.EXTRADHCPOPTS: opt_list,"},{"line_number":319,"context_line":"                  \u0027arg_list\u0027: (edo_ext.EXTRADHCPOPTS,)}"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_8581dffb","line":316,"in_reply_to":"3a961159_2cdce417","updated":"2015-01-19 06:21:46.000000000","message":"upd_opts only has one entry in this case here. Line 310.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"901da86bc18a7241afdfcf3f39ecdaadcd5622eb","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"            req \u003d self.new_update_request(\u0027ports\u0027, update_port,"},{"line_number":325,"context_line":"                                          port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":326,"context_line":"            port \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":327,"context_line":"            self._check_opts(expected_opts,"},{"line_number":328,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":329,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_b5d73422","line":326,"updated":"2015-01-15 14:46:56.000000000","message":"I\u0027d add status_int check of response before deserializing.","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"901da86bc18a7241afdfcf3f39ecdaadcd5622eb","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"            req \u003d self.new_update_request(\u0027ports\u0027, update_port,"},{"line_number":354,"context_line":"                                          port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":355,"context_line":"            port \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":356,"context_line":"            self._check_opts(expected_opts,"},{"line_number":357,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_f5dd3c42","line":355,"updated":"2015-01-15 14:46:56.000000000","message":"same on checking status code","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"bef06afaa52f33817cd061a9886a214fc93512b0","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"            req \u003d self.new_update_request(\u0027ports\u0027, update_port,"},{"line_number":354,"context_line":"                                          port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":355,"context_line":"            port \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":356,"context_line":"            self._check_opts(expected_opts,"},{"line_number":357,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a961159_e5bf03a9","line":355,"in_reply_to":"3a961159_f5dd3c42","updated":"2015-01-19 06:21:46.000000000","message":"Done","commit_id":"d9bb8bb3c54ddbafa01c57696212e17c3cdae13f"},{"author":{"_account_id":704,"name":"Edgar Magana","email":"emagana@gmail.com","username":"emagana"},"change_message_id":"e32ec79edfc21b7bf67400be90160b6c8e964aa4","unresolved":false,"context_lines":[{"line_number":298,"context_line":"            self.assertEqual(res.status_int, webob.exc.HTTPBadRequest.code)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_update_port_with_extradhcpopts_ipv6_change_value(self):"},{"line_number":301,"context_line":"        opt_list \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027,"},{"line_number":302,"context_line":"                     \u0027opt_value\u0027: \u0027pxelinux.0\u0027,"},{"line_number":303,"context_line":"                     \u0027ip_version\u0027: 6},"},{"line_number":304,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_29d92622","line":301,"updated":"2015-01-26 20:22:31.000000000","message":"Let\u0027s avoid to duplicate code in these two tests","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"3d23aa4eda4e0e7a6e37d643eb8ed2ee51d14e9e","unresolved":false,"context_lines":[{"line_number":298,"context_line":"            self.assertEqual(res.status_int, webob.exc.HTTPBadRequest.code)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def test_update_port_with_extradhcpopts_ipv6_change_value(self):"},{"line_number":301,"context_line":"        opt_list \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027,"},{"line_number":302,"context_line":"                     \u0027opt_value\u0027: \u0027pxelinux.0\u0027,"},{"line_number":303,"context_line":"                     \u0027ip_version\u0027: 6},"},{"line_number":304,"context_line":"                    {\u0027opt_name\u0027: \u0027tftp-server\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_35588bf9","line":301,"in_reply_to":"1a930d6b_29d92622","updated":"2015-01-27 05:14:38.000000000","message":"Done","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3bf0e775ccbde1f0ef8d2ac1008ec49b1a397164","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                  \u0027arg_list\u0027: (edo_ext.EXTRADHCPOPTS,)}"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        with self.port(**params) as port:"},{"line_number":86,"context_line":"            self._check_opts(opt_list,"},{"line_number":87,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def test_create_port_with_none_extradhcpopts(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a930d6b_211f6d6d","line":86,"updated":"2015-01-27 07:26:25.000000000","message":"I would like to see ip_version check in this test too. ip_version should be set to 4 in this case.","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"592e83e46ff8e4de40f0d75809f7a713348a4bbd","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                  \u0027arg_list\u0027: (edo_ext.EXTRADHCPOPTS,)}"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        with self.port(**params) as port:"},{"line_number":86,"context_line":"            self._check_opts(opt_list,"},{"line_number":87,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def test_create_port_with_none_extradhcpopts(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa81d914_c1bbb670","line":86,"in_reply_to":"1a930d6b_211f6d6d","updated":"2015-01-28 03:46:08.000000000","message":"I added opt[\u0027ip_version\u0027] \u003d\u003d exp.get(\u0027ip_version\u0027, 4) to _check_opts. So if no version is specified in expected, 4 is used. Is it enough?","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3bf0e775ccbde1f0ef8d2ac1008ec49b1a397164","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            req \u003d self.new_update_request(\u0027ports\u0027, update_port,"},{"line_number":161,"context_line":"                                          port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":162,"context_line":"            port \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":163,"context_line":"            self._check_opts(expected_opts,"},{"line_number":164,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def test_update_port_with_additional_extradhcpopt(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a930d6b_8128219b","line":163,"updated":"2015-01-27 07:26:25.000000000","message":"Hopefully we have a check if ip_version is 4 here.","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3bf0e775ccbde1f0ef8d2ac1008ec49b1a397164","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            req \u003d self.new_update_request(\u0027ports\u0027, update_port,"},{"line_number":181,"context_line":"                                          port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":182,"context_line":"            port \u003d self.deserialize(\u0027json\u0027, req.get_response(self.api))"},{"line_number":183,"context_line":"            self._check_opts(expected_opts,"},{"line_number":184,"context_line":"                             port[\u0027port\u0027][edo_ext.EXTRADHCPOPTS])"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def test_update_port_with_extradhcpopts(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a930d6b_21384dee","line":183,"updated":"2015-01-27 07:26:25.000000000","message":"Can you add a check ip_version too? we need to check ip_version  defaults to 4 if not specified.","commit_id":"640c73b6eddd1d1810c986df6f50e86595fa7ec2"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"82962d0fdf481d942b73fba58d8f32b0fede2079","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        self._test_update_port_with_extradhcpopts(opt_list, upd_opts,"},{"line_number":284,"context_line":"                                                  expected_opts)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def test_update_port_with_extradhcpopts_change_opt_version(self):"},{"line_number":287,"context_line":"        opt_list \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027,"},{"line_number":288,"context_line":"                     \u0027opt_value\u0027: \u0027pxelinux.0\u0027,"},{"line_number":289,"context_line":"                     \u0027ip_version\u0027: 6},"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa81d914_c3fa5342","line":286,"updated":"2015-01-30 17:02:23.000000000","message":"Nit: (Please update if you have another chance to update the patch) The test does not change the version. Instead this adds an option with the same name but the different version. I think the better method name is \"...._extradhcpopts_add_another_ver_opt\" or similar one.","commit_id":"e9c2d4d32f034f5cccc84696be77fcf9a4816a19"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"0aa63b96244486ff40fdf3fc843f5a24ac49eda2","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        self._test_update_port_with_extradhcpopts(opt_list, upd_opts,"},{"line_number":284,"context_line":"                                                  expected_opts)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def test_update_port_with_extradhcpopts_change_opt_version(self):"},{"line_number":287,"context_line":"        opt_list \u003d [{\u0027opt_name\u0027: \u0027bootfile-name\u0027,"},{"line_number":288,"context_line":"                     \u0027opt_value\u0027: \u0027pxelinux.0\u0027,"},{"line_number":289,"context_line":"                     \u0027ip_version\u0027: 6},"}],"source_content_type":"text/x-python","patch_set":15,"id":"da86d52c_a8185785","line":286,"in_reply_to":"fa81d914_c3fa5342","updated":"2015-02-02 06:38:55.000000000","message":"Done","commit_id":"e9c2d4d32f034f5cccc84696be77fcf9a4816a19"}],"neutron/tests/unit/test_linux_dhcp.py":[{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"3cfa008f7986984f22fcbe8ef69a554d7235b582","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        if port_detail \u003d\u003d \"portsSame\":"},{"line_number":379,"context_line":"            self.ports[0].extra_dhcp_opts \u003d ["},{"line_number":380,"context_line":"                DhcpOpt(opt_name\u003d\u0027tftp-server\u0027,"},{"line_number":381,"context_line":"                        opt_value\u003d\u0027192.168.0.3\u0027, ip_version\u003d4),"},{"line_number":382,"context_line":"                DhcpOpt(opt_name\u003d\u0027server-ip-address\u0027,"},{"line_number":383,"context_line":"                        opt_value\u003d\u0027192.168.0.2\u0027, ip_version\u003d4),"},{"line_number":384,"context_line":"                DhcpOpt(opt_name\u003d\u0027bootfile-name\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_49a09b43","line":381,"updated":"2015-01-22 19:33:11.000000000","message":"is it necessary to make this change (and similar changes in below) since the default is 4?","commit_id":"43421621e36e8b286b5a275651a8e7e87fa4ea61"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"262195befd2a06531cbc4ee0723a10349e2ac49a","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        if port_detail \u003d\u003d \"portsSame\":"},{"line_number":379,"context_line":"            self.ports[0].extra_dhcp_opts \u003d ["},{"line_number":380,"context_line":"                DhcpOpt(opt_name\u003d\u0027tftp-server\u0027,"},{"line_number":381,"context_line":"                        opt_value\u003d\u0027192.168.0.3\u0027, ip_version\u003d4),"},{"line_number":382,"context_line":"                DhcpOpt(opt_name\u003d\u0027server-ip-address\u0027,"},{"line_number":383,"context_line":"                        opt_value\u003d\u0027192.168.0.2\u0027, ip_version\u003d4),"},{"line_number":384,"context_line":"                DhcpOpt(opt_name\u003d\u0027bootfile-name\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_d0725e48","line":381,"in_reply_to":"1a930d6b_49a09b43","updated":"2015-01-23 06:07:33.000000000","message":"DhcpOpt here is a fake class defined in test_linux_dhcp. It\u0027s not the same with extra_dhcp_opts attribute of port. Without adding ip_version here will result \"AttributeError: \u0027DhcpOpt\u0027 object has no attribute \u0027ip_version\u0027\" from dhcp.py _generate_opts_per_port.","commit_id":"43421621e36e8b286b5a275651a8e7e87fa4ea61"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"63b1e8d19b2a18016133b4d882b565846d5686f5","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        if port_detail \u003d\u003d \"portsSame\":"},{"line_number":379,"context_line":"            self.ports[0].extra_dhcp_opts \u003d ["},{"line_number":380,"context_line":"                DhcpOpt(opt_name\u003d\u0027tftp-server\u0027,"},{"line_number":381,"context_line":"                        opt_value\u003d\u0027192.168.0.3\u0027, ip_version\u003d4),"},{"line_number":382,"context_line":"                DhcpOpt(opt_name\u003d\u0027server-ip-address\u0027,"},{"line_number":383,"context_line":"                        opt_value\u003d\u0027192.168.0.2\u0027, ip_version\u003d4),"},{"line_number":384,"context_line":"                DhcpOpt(opt_name\u003d\u0027bootfile-name\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a930d6b_bc9cbfc1","line":381,"in_reply_to":"1a930d6b_d0725e48","updated":"2015-01-23 13:19:52.000000000","message":"I see. Maybe DhcpOpt can be made to behave the same as the real one by checking the inputs and default ip_version if one doesn\u0027t exist.","commit_id":"43421621e36e8b286b5a275651a8e7e87fa4ea61"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"240987c932a87132327083b6bdfce431488d49c1","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        if port_detail \u003d\u003d \"portsSame\":"},{"line_number":380,"context_line":"            self.ports[0].extra_dhcp_opts \u003d ["},{"line_number":381,"context_line":"                DhcpOpt(opt_name\u003d\u0027tftp-server\u0027,"},{"line_number":382,"context_line":"                        opt_value\u003d\u0027192.168.0.3\u0027, ip_version\u003d4),"},{"line_number":383,"context_line":"                DhcpOpt(opt_name\u003d\u0027server-ip-address\u0027,"},{"line_number":384,"context_line":"                        opt_value\u003d\u0027192.168.0.2\u0027, ip_version\u003d4),"},{"line_number":385,"context_line":"                DhcpOpt(opt_name\u003d\u0027bootfile-name\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_33127009","line":382,"updated":"2015-01-26 21:38:31.000000000","message":"I still think that these comments can be avoided, see comments in patch 10.","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"3d23aa4eda4e0e7a6e37d643eb8ed2ee51d14e9e","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        if port_detail \u003d\u003d \"portsSame\":"},{"line_number":380,"context_line":"            self.ports[0].extra_dhcp_opts \u003d ["},{"line_number":381,"context_line":"                DhcpOpt(opt_name\u003d\u0027tftp-server\u0027,"},{"line_number":382,"context_line":"                        opt_value\u003d\u0027192.168.0.3\u0027, ip_version\u003d4),"},{"line_number":383,"context_line":"                DhcpOpt(opt_name\u003d\u0027server-ip-address\u0027,"},{"line_number":384,"context_line":"                        opt_value\u003d\u0027192.168.0.2\u0027, ip_version\u003d4),"},{"line_number":385,"context_line":"                DhcpOpt(opt_name\u003d\u0027bootfile-name\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"1a930d6b_32d181cd","line":382,"in_reply_to":"1a930d6b_33127009","updated":"2015-01-27 05:14:38.000000000","message":"Done","commit_id":"2ebcaa9cce000e7aa9c1904d27c0eda9e1ca5023"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"ef43d45d87efd6a6f788436f7928011bfb9957bd","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class DhcpOpt(object):"},{"line_number":42,"context_line":"    def __init__(self, **kwargs):"},{"line_number":43,"context_line":"        self.__dict__.update(ip_version\u003d4)"},{"line_number":44,"context_line":"        self.__dict__.update(kwargs)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def __str__(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa81d914_9bcbbfa4","line":43,"updated":"2015-01-28 22:55:56.000000000","message":"Nit: \n\nif ip_version not in kwargs:\n    self.__dict__.update(ip_version\u003d4)\n\nin case you\u0027d load another patch.","commit_id":"e9c2d4d32f034f5cccc84696be77fcf9a4816a19"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"0aa63b96244486ff40fdf3fc843f5a24ac49eda2","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class DhcpOpt(object):"},{"line_number":42,"context_line":"    def __init__(self, **kwargs):"},{"line_number":43,"context_line":"        self.__dict__.update(ip_version\u003d4)"},{"line_number":44,"context_line":"        self.__dict__.update(kwargs)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def __str__(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"da86d52c_881713ed","line":43,"in_reply_to":"fa81d914_9bcbbfa4","updated":"2015-02-02 06:38:55.000000000","message":"Robert, if ip_version is in kwargs, self.__dict__.update(kwargs) on line 44 will update the ip_version. do you still think \"if ip_version not in kwargs:\" is needed?","commit_id":"e9c2d4d32f034f5cccc84696be77fcf9a4816a19"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"ef43d45d87efd6a6f788436f7928011bfb9957bd","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"            \u0027option6:bootfile-name,pxelinux.0\u0027)"},{"line_number":1078,"context_line":"        expected \u003d expected.lstrip()"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"        with mock.patch.object(dhcp.Dnsmasq, \u0027get_conf_file_name\u0027) as conf_fn:"},{"line_number":1081,"context_line":"            conf_fn.return_value \u003d \u0027/foo/opts\u0027"},{"line_number":1082,"context_line":"            dm \u003d self._get_dnsmasq(FakeV6NetworkPxePort())"},{"line_number":1083,"context_line":"            dm._output_opts_file()"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa81d914_fb591b5c","line":1080,"updated":"2015-01-28 22:55:56.000000000","message":"new test cases are encouraged to use decorator instead of \u0027with\u0027 statement such as:\n   @mock.patch(\u0027dhcp.Dnsmasq.get_conf_file_name\u0027, return_value\u003d\u0027/foo/opts\u0027)\n   def test_output_opts_file_pxe_ipv6_port_with_ipv6_opt(self, mock_get_conf_fn):\n\nBut not sure it\u0027s required.","commit_id":"e9c2d4d32f034f5cccc84696be77fcf9a4816a19"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"0aa63b96244486ff40fdf3fc843f5a24ac49eda2","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"            \u0027option6:bootfile-name,pxelinux.0\u0027)"},{"line_number":1078,"context_line":"        expected \u003d expected.lstrip()"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"        with mock.patch.object(dhcp.Dnsmasq, \u0027get_conf_file_name\u0027) as conf_fn:"},{"line_number":1081,"context_line":"            conf_fn.return_value \u003d \u0027/foo/opts\u0027"},{"line_number":1082,"context_line":"            dm \u003d self._get_dnsmasq(FakeV6NetworkPxePort())"},{"line_number":1083,"context_line":"            dm._output_opts_file()"}],"source_content_type":"text/x-python","patch_set":15,"id":"da86d52c_285e2746","line":1080,"in_reply_to":"fa81d914_fb591b5c","updated":"2015-02-02 06:38:55.000000000","message":"Done","commit_id":"e9c2d4d32f034f5cccc84696be77fcf9a4816a19"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"ef43d45d87efd6a6f788436f7928011bfb9957bd","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"            \u0027option6:bootfile-name,pxelinux.0\u0027)"},{"line_number":1093,"context_line":"        expected \u003d expected.lstrip()"},{"line_number":1094,"context_line":""},{"line_number":1095,"context_line":"        with mock.patch.object(dhcp.Dnsmasq, \u0027get_conf_file_name\u0027) as conf_fn:"},{"line_number":1096,"context_line":"            conf_fn.return_value \u003d \u0027/foo/opts\u0027"},{"line_number":1097,"context_line":"            dm \u003d self._get_dnsmasq(FakeV6NetworkPxePortWrongOptVersion())"},{"line_number":1098,"context_line":"            dm._output_opts_file()"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa81d914_5b322711","line":1095,"updated":"2015-01-28 22:55:56.000000000","message":"ditto","commit_id":"e9c2d4d32f034f5cccc84696be77fcf9a4816a19"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"0aa63b96244486ff40fdf3fc843f5a24ac49eda2","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"            \u0027option6:bootfile-name,pxelinux.0\u0027)"},{"line_number":1093,"context_line":"        expected \u003d expected.lstrip()"},{"line_number":1094,"context_line":""},{"line_number":1095,"context_line":"        with mock.patch.object(dhcp.Dnsmasq, \u0027get_conf_file_name\u0027) as conf_fn:"},{"line_number":1096,"context_line":"            conf_fn.return_value \u003d \u0027/foo/opts\u0027"},{"line_number":1097,"context_line":"            dm \u003d self._get_dnsmasq(FakeV6NetworkPxePortWrongOptVersion())"},{"line_number":1098,"context_line":"            dm._output_opts_file()"}],"source_content_type":"text/x-python","patch_set":15,"id":"da86d52c_485b5b54","line":1095,"in_reply_to":"fa81d914_5b322711","updated":"2015-02-02 06:38:55.000000000","message":"Done","commit_id":"e9c2d4d32f034f5cccc84696be77fcf9a4816a19"}]}
