)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"b7287ee807852905e8ad9fc23854ff4da652e010","unresolved":false,"context_lines":[{"line_number":8,"context_line":"This patch fixed all formating issue."},{"line_number":9,"context_line":"pep8 returns no errors now."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Implements: blueprint ipv6-two-attributes"},{"line_number":12,"context_line":"Implements: blueprint dnsmasq-ipv6-slaac"},{"line_number":13,"context_line":"Implements: blueprint dnsmasq-ipv6-dhcpv6-stateful"},{"line_number":14,"context_line":"Implements: blueprint dnsmasq-ipv6-dhcpv6-stateless"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAUH%2F90js%3D","line":11,"updated":"2014-02-03 16:34:10.000000000","message":"This patch does not implement this blueprint. Please rebase this patch on top of https://review.openstack.org/#/c/52983/","commit_id":"1200df4c3d8f0eb99823126fd19df587891da36d"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"70c05575604976d1d1e16edee317e82d719ce22b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shixiong Shang \u003csparkofwisdom.cloud@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-02-18 10:04:29 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix format issues"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add support to DHCP agent for BP ipv6-two-attributes"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAAUX%2F%2ByZE%3D","line":7,"updated":"2014-02-19 02:51:46.000000000","message":"Shi Xiong, this line should not be the first line of commit message, since it doesn\u0027t indicate the real purpose of this patch. \n\nSee this wiki page about how to write commit message:\nhttps://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"81649f2a55d2694718341034ee8581a54bc54c6f"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shixiong Shang \u003csparkofwisdom.cloud@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-02-19 09:53:03 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support to DHCP agent for BP ipv6-two-attributes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements: blueprint dnsmasq-ipv6-slaac"},{"line_number":10,"context_line":"Implements: blueprint dnsmasq-ipv6-dhcpv6-stateful"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAUX%2F%2BaPw%3D","line":7,"updated":"2014-02-21 11:00:56.000000000","message":"Commit messages are supposed to stay in the git history.\nPerhaps it might worth adding as well a reference to the commit-id implementing this blueprint.","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"176cd8a488ac9c50f5ecb29665a9971af998bae1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shixiong Shang \u003csparkofwisdom.cloud@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-02-19 09:53:03 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add support to DHCP agent for BP ipv6-two-attributes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements: blueprint dnsmasq-ipv6-slaac"},{"line_number":10,"context_line":"Implements: blueprint dnsmasq-ipv6-dhcpv6-stateful"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"AAAAVX%2F%2F4T0%3D","line":7,"in_reply_to":"AAAAUX%2F%2BaPw%3D","updated":"2014-02-27 16:20:15.000000000","message":"OK - we\u0027ll have to remember that once my review gets merged, since we\u0027re chasing alembic migrations and the sha will change.","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"ece2861140bcff67d216b9a0ea83d7f1c3058759","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Patch 11 added internal gw port enhance test cases"},{"line_number":18,"context_line":"Patch 12 added internal gw port enhance python file"},{"line_number":19,"context_line":"Patch 13 fixed Jenkins errors (I think...)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I5a0f2a696cd7a3ec59d0ece375a7a658e1853032"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAVX%2F%2FrMY%3D","line":20,"updated":"2014-03-01 07:22:42.000000000","message":"This needs to be removed. Also, if you get the chance try and read up on good commit messages - I plan on fixing the commit message for my patch to explain what we are doing in more depth.\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71c69632ff1cc2b4de82e8961b71de76b3154e60","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Patch 11 added internal gw port enhance test cases"},{"line_number":18,"context_line":"Patch 12 added internal gw port enhance python file"},{"line_number":19,"context_line":"Patch 13 fixed Jenkins errors (I think...)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I5a0f2a696cd7a3ec59d0ece375a7a658e1853032"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"AAAAVn%2F%2F%2Fgs%3D","line":20,"in_reply_to":"AAAAVX%2F%2FrMY%3D","updated":"2014-03-02 21:47:04.000000000","message":"Agreed. Thanks for the history anyway!\n\nI have a feeling some comments from patch set 7 (the one before the rebase) were never looked at, as I\u0027ve never seen a reply to them. Perhaps I missed it since there has been a lot of activity on this patch in the past few days.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"}],"neutron/agent/l3_agent.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        if (net.version \u003d\u003d 4):"},{"line_number":646,"context_line":"            ip_address \u003d internal_cidr.split(\u0027/\u0027)[0]"},{"line_number":647,"context_line":"            self._send_gratuitous_arp_packet(ri, interface_name, ip_address)"},{"line_number":648,"context_line":"        else:"},{"line_number":649,"context_line":"            parm \u003d \u0027net.ipv6.conf.all.forwarding\u003d1\u0027"},{"line_number":650,"context_line":"            cmd \u003d [\u0027sysctl\u0027, parm]"},{"line_number":651,"context_line":"            if self.conf.use_namespaces:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqys%3D","line":648,"updated":"2014-03-01 12:52:08.000000000","message":"There is no need to instantiate IPWrapper every time. Consider sharing the code.\n\n  def run_commands(self, cmds, namespace\u003dNone):\n      if namespace:\n          ip_wrapper \u003d ip_lib.IPWrapper(self.conf.root_helper,\n                       namespace\u003dnamespace)\n          for cmd in cmds:\n              jp_wrapper.netns.execute(cmd, check_exit_code\u003dFalse)\n      else:\n          for cmd in cmds:\n              utils.execute(cmd, check_exit_code\u003dFalse, root_helper\u003dself.conf.root_helper)\n\n  def \u003c\u003cthis_method\u003e\u003e(self, ...):\n       ...\n      cmds \u003d [[\u0027sysctl\u0027, \u0027net.ipv6.conf.all.forwarding\u003d1\u0027],\n              [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.forwarding\u003d1\u0027 % str(interface_name)],\n              [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.accept_ra_defrtr\u003d0\u0027 % str(interface_name),\n      ]\n      self.run_commands(cmds, namespace\u003dself.conf.use_namespaces or ri.ns_name())","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71c69632ff1cc2b4de82e8961b71de76b3154e60","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        if (net.version \u003d\u003d 4):"},{"line_number":646,"context_line":"            ip_address \u003d internal_cidr.split(\u0027/\u0027)[0]"},{"line_number":647,"context_line":"            self._send_gratuitous_arp_packet(ri, interface_name, ip_address)"},{"line_number":648,"context_line":"        else:"},{"line_number":649,"context_line":"            parm \u003d \u0027net.ipv6.conf.all.forwarding\u003d1\u0027"},{"line_number":650,"context_line":"            cmd \u003d [\u0027sysctl\u0027, parm]"},{"line_number":651,"context_line":"            if self.conf.use_namespaces:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2F%2Fgg%3D","line":648,"in_reply_to":"AAAAVX%2F%2Fqys%3D","updated":"2014-03-02 21:47:04.000000000","message":"agreed\n\nAlso (I don\u0027t know if this applies here), in case of failures during one of the commands below, the others which were successfully executed should probably be undone.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"3e92cec0ff0d9d8d1b461aa2686b65aa13a136cc","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        if (net.version \u003d\u003d 4):"},{"line_number":646,"context_line":"            ip_address \u003d internal_cidr.split(\u0027/\u0027)[0]"},{"line_number":647,"context_line":"            self._send_gratuitous_arp_packet(ri, interface_name, ip_address)"},{"line_number":648,"context_line":"        else:"},{"line_number":649,"context_line":"            parm \u003d \u0027net.ipv6.conf.all.forwarding\u003d1\u0027"},{"line_number":650,"context_line":"            cmd \u003d [\u0027sysctl\u0027, parm]"},{"line_number":651,"context_line":"            if self.conf.use_namespaces:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2FoyM%3D","line":648,"in_reply_to":"AAAAVn%2F%2F%2Fgg%3D","updated":"2014-03-04 22:47:58.000000000","message":"Also look at this review which will merge today.\n\nhttps://review.openstack.org/#/c/77788/\n\nThe patch has simplified namespace handling.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":679,"context_line":"            ip_wrapper \u003d ip_lib.IPWrapper(self.conf.root_helper,"},{"line_number":680,"context_line":"                                          namespace\u003dri.ns_name())"},{"line_number":681,"context_line":"            for cmd in cmds:"},{"line_number":682,"context_line":"                ip_wrapper.netns.execute(cmd, check_exit_code\u003dFalse)"},{"line_number":683,"context_line":"        else:"},{"line_number":684,"context_line":"            for cmd in cmds:"},{"line_number":685,"context_line":"                utils.execute(cmd, check_exit_code\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Fasc%3D","line":682,"updated":"2014-03-06 08:48:15.000000000","message":"Repost a comment from salvatore in the previous patch set.\n\ncheck_exit_code\u003dFalse means even if one command fails other commands will be executed. Is it intended? Don\u0027t we need to handle an error?","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":679,"context_line":"            ip_wrapper \u003d ip_lib.IPWrapper(self.conf.root_helper,"},{"line_number":680,"context_line":"                                          namespace\u003dri.ns_name())"},{"line_number":681,"context_line":"            for cmd in cmds:"},{"line_number":682,"context_line":"                ip_wrapper.netns.execute(cmd, check_exit_code\u003dFalse)"},{"line_number":683,"context_line":"        else:"},{"line_number":684,"context_line":"            for cmd in cmds:"},{"line_number":685,"context_line":"                utils.execute(cmd, check_exit_code\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIeQ%3D","line":682,"in_reply_to":"AAAAVn%2F%2Fasc%3D","updated":"2014-03-13 18:48:22.000000000","message":"This part came from the original code, and I didn\u0027t change it except putting them into a standalone method to avoid duplicating code. I am not sure whether the author intended to do and why he/she put \"check_exit_code\u003dFalse\".","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":683,"context_line":"        else:"},{"line_number":684,"context_line":"            for cmd in cmds:"},{"line_number":685,"context_line":"                utils.execute(cmd, check_exit_code\u003dFalse,"},{"line_number":686,"context_line":"                              root_helper\u003dself.conf.root_helper)"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    def internal_network_ipv6(self, interface_name, ri):"},{"line_number":689,"context_line":"        cmds \u003d [[\u0027sysctl\u0027, \u0027net.ipv6.conf.all.forwarding\u003d1\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Fas0%3D","line":686,"updated":"2014-03-06 08:48:15.000000000","message":"Look at the change by https://review.openstack.org/#/c/77788/\nIt simplifies the namespace handling. I prefer to following the change.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":683,"context_line":"        else:"},{"line_number":684,"context_line":"            for cmd in cmds:"},{"line_number":685,"context_line":"                utils.execute(cmd, check_exit_code\u003dFalse,"},{"line_number":686,"context_line":"                              root_helper\u003dself.conf.root_helper)"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    def internal_network_ipv6(self, interface_name, ri):"},{"line_number":689,"context_line":"        cmds \u003d [[\u0027sysctl\u0027, \u0027net.ipv6.conf.all.forwarding\u003d1\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FId4%3D","line":686,"in_reply_to":"AAAAVn%2F%2Fas0%3D","updated":"2014-03-13 18:48:22.000000000","message":"Done. Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":707,"context_line":"                            namespace\u003dri.ns_name())"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":"        net \u003d netaddr.IPNetwork(internal_cidr)"},{"line_number":710,"context_line":"        if (net.version \u003d\u003d 4):"},{"line_number":711,"context_line":"            ip_address \u003d internal_cidr.split(\u0027/\u0027)[0]"},{"line_number":712,"context_line":"            self._send_gratuitous_arp_packet(ri, interface_name, ip_address)"},{"line_number":713,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FasU%3D","line":710,"updated":"2014-03-06 08:48:15.000000000","message":"Parentheses are unnecessary.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":707,"context_line":"                            namespace\u003dri.ns_name())"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":"        net \u003d netaddr.IPNetwork(internal_cidr)"},{"line_number":710,"context_line":"        if (net.version \u003d\u003d 4):"},{"line_number":711,"context_line":"            ip_address \u003d internal_cidr.split(\u0027/\u0027)[0]"},{"line_number":712,"context_line":"            self._send_gratuitous_arp_packet(ri, interface_name, ip_address)"},{"line_number":713,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIdY%3D","line":710,"in_reply_to":"AAAAVn%2F%2FasU%3D","updated":"2014-03-13 18:48:22.000000000","message":"Good catch! Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":6908,"name":"Simon Leinen","email":"simon.leinen@gmail.com","username":"simon-leinen"},"change_message_id":"6e858d0df4865c5bcbaf151457e7ceea7d2fead6","unresolved":false,"context_lines":[{"line_number":672,"context_line":"            ip_wrapper.netns.execute(cmd, check_exit_code\u003dFalse)"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"    def internal_network_ipv6(self, interface_name, ri):"},{"line_number":675,"context_line":"        cmds \u003d [[\u0027sysctl\u0027, \u0027net.ipv6.conf.all.forwarding\u003d1\u0027],"},{"line_number":676,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.forwarding\u003d1\u0027 %"},{"line_number":677,"context_line":"                 str(interface_name)],"},{"line_number":678,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.accept_ra_defrtr\u003d0\u0027 %"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAW3%2F%2F0l4%3D","line":675,"updated":"2014-04-10 07:30:48.000000000","message":"I think you want sysctl -w var\u003dvalue, i.e.\n  [[\u0027sysctl\u0027, \u0027-w\u0027, \u0027net.ipv6.conf.all.forwarding\u003d1\u0027],\netc.  It does seem to work without \"-w\", but the man page says that you need \"-w\" to set variables, so we should honor that.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":676,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.forwarding\u003d1\u0027 %"},{"line_number":677,"context_line":"                 str(interface_name)],"},{"line_number":678,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.accept_ra_defrtr\u003d0\u0027 %"},{"line_number":679,"context_line":"                 str(interface_name)], ]"},{"line_number":680,"context_line":"        self.run_commands(cmds, ri)"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"    def internal_network_added(self, ri, network_id, port_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FPQw%3D","line":679,"updated":"2014-03-19 10:47:56.000000000","message":"According to the Kernel Documentation, IPV6 forwarding is activated when it is configured globally (i.e., net.ipv6.conf.all.forwarding) at the same time it recommends to keep the same settings on all the interfaces. So I agree with you on this change. Do you think we should also be doing this when an external network is added to the router (i.e., when qgxxxx interface is added)?","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"9dc79a2f1e634ad6ed4a1f13d32abae9b8593f27","unresolved":false,"context_lines":[{"line_number":676,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.forwarding\u003d1\u0027 %"},{"line_number":677,"context_line":"                 str(interface_name)],"},{"line_number":678,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.accept_ra_defrtr\u003d0\u0027 %"},{"line_number":679,"context_line":"                 str(interface_name)], ]"},{"line_number":680,"context_line":"        self.run_commands(cmds, ri)"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"    def internal_network_added(self, ri, network_id, port_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2F8Yg%3D","line":679,"in_reply_to":"AAAAWH%2F%2FIVI%3D","updated":"2014-04-16 13:48:39.000000000","message":"Randy\u0027s Patch seems to be focused on External Gateway. Reviewers may not like the idea of clubbing this along with Randy\u0027s patch. But I see your point :-)\n\nAs Sean mentioned in Neutron-IPV6 meeting it may be a good idea to break this patch into smaller patches so that reviewers can consider if the patch[es] is/are complete and if all the edge cases are handled while reviewing. \n\nShixiong, hope you are fine to split this patch into smaller entities? Please let us know if you need any help. Thanks.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c203779b727895f7169ac623f506e09eed446784","unresolved":false,"context_lines":[{"line_number":676,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.forwarding\u003d1\u0027 %"},{"line_number":677,"context_line":"                 str(interface_name)],"},{"line_number":678,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.accept_ra_defrtr\u003d0\u0027 %"},{"line_number":679,"context_line":"                 str(interface_name)], ]"},{"line_number":680,"context_line":"        self.run_commands(cmds, ri)"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"    def internal_network_added(self, ri, network_id, port_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FIVI%3D","line":679,"in_reply_to":"AAAAWH%2F%2FPQw%3D","updated":"2014-03-20 03:13:14.000000000","message":"I believe this has been done in Randy\u0027s patch https://review.openstack.org/#/c/77471/, which deals with L3 changes for IPv6. \n\nI wonder if the sysctl calls here should go to that patch as well since these commands are common code.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":676,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.forwarding\u003d1\u0027 %"},{"line_number":677,"context_line":"                 str(interface_name)],"},{"line_number":678,"context_line":"                [\u0027sysctl\u0027, \u0027net.ipv6.conf.%s.accept_ra_defrtr\u003d0\u0027 %"},{"line_number":679,"context_line":"                 str(interface_name)], ]"},{"line_number":680,"context_line":"        self.run_commands(cmds, ri)"},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"    def internal_network_added(self, ri, network_id, port_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_6adbc74f","line":679,"in_reply_to":"AAAAXH%2F%2F8Yg%3D","updated":"2014-06-16 03:14:38.000000000","message":"I will remove this file from the code review in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"}],"neutron/agent/linux/dhcp.py":[{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"7094332e521927bd107cd0d10a126d2df48285eb","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                #    Update namespace to qrouter- namespace"},{"line_number":396,"context_line":"                #    Update binding interface to qr- interface"},{"line_number":397,"context_line":"                #    Update binding IP to gateway IP"},{"line_number":398,"context_line":"                #    Switch the flag \"is_public\" to TRUE"},{"line_number":399,"context_line":"                for port in self.network.ports:"},{"line_number":400,"context_line":"                    for fixed_ips in port.fixed_ips:"},{"line_number":401,"context_line":"                        if (fixed_ips.subnet_id \u003d\u003d subnet.id and"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F90S0%3D","line":398,"updated":"2014-02-03 17:04:46.000000000","message":"One question regarding this: Initially a subnet doesn\u0027t have a gw_port in a router. And later it\u0027s added to a router. or vice versa. Should this transition be handled?","commit_id":"1200df4c3d8f0eb99823126fd19df587891da36d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"5ce9761bbd83fe5c40c221deedcccfbc9bb9a416","unresolved":false,"context_lines":[{"line_number":37,"context_line":"from neutron.openstack.common import log as logging"},{"line_number":38,"context_line":"from neutron.openstack.common import uuidutils"},{"line_number":39,"context_line":"# Import l3_agent for NS_PREFIX definition"},{"line_number":40,"context_line":"from neutron.agent import l3_agent"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9pU8%3D","line":40,"updated":"2014-02-05 11:48:11.000000000","message":"It\u0027s not a very good dependency. It\u0027s better to move NS_PREFIX in some more common place","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":8278,"name":"Dazhao Yu","email":"dazhaoyu@gmail.com","username":"Dazhao"},"change_message_id":"5a7191488648fc54f584ec69193479333e74e015","unresolved":false,"context_lines":[{"line_number":37,"context_line":"from neutron.openstack.common import log as logging"},{"line_number":38,"context_line":"from neutron.openstack.common import uuidutils"},{"line_number":39,"context_line":"# Import l3_agent for NS_PREFIX definition"},{"line_number":40,"context_line":"from neutron.agent import l3_agent"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FGhc%3D","line":40,"updated":"2014-02-17 05:32:37.000000000","message":"Move the import to line#31 for pep8 check","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c092cfef1d145e9dbe3169241213a75ec8691bd9","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    # There are two pid files."},{"line_number":181,"context_line":"    # One for IPv4 subnet saved in \u0027pid\u0027 file"},{"line_number":182,"context_line":"    # One for IPv6 subnet saved in \"ipv6pid\u0027 file"},{"line_number":183,"context_line":"    # Both should be processed to terminate dnsmasq process"},{"line_number":184,"context_line":"    def disable(self, retain_port\u003dFalse):"},{"line_number":185,"context_line":"        \"\"\"Disable DHCP for this network by killing the local process.\"\"\""},{"line_number":186,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2F1r4%3D","line":183,"updated":"2014-02-10 14:01:31.000000000","message":"NIT: better to move these comments into docstring.","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c092cfef1d145e9dbe3169241213a75ec8691bd9","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    def disable(self, retain_port\u003dFalse):"},{"line_number":185,"context_line":"        \"\"\"Disable DHCP for this network by killing the local process.\"\"\""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":188,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":189,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":190,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2F1qM%3D","line":187,"updated":"2014-02-10 14:01:31.000000000","message":"I don\u0027t see i is used below. Why not just use \"for subnet in self.network.subnets\"?  Maybe I miss something?","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c092cfef1d145e9dbe3169241213a75ec8691bd9","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":189,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":190,"context_line":"            else:"},{"line_number":191,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027ipv6pid\u0027)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"            if pid:"},{"line_number":194,"context_line":"                cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, pid.strip(\u0027\\n\u0027)]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2F1nM%3D","line":191,"updated":"2014-02-10 14:01:31.000000000","message":"if pid can be read from two files now. The pid property should be changed to reflect this.\n\nHere is the original pid property:\n    @property\n    def pid(self):\n        \"\"\"Last known pid for the DHCP process spawned for this network.\"\"\"\n        return self._get_value_from_conf_file(\u0027pid\u0027, int)","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":8278,"name":"Dazhao Yu","email":"dazhaoyu@gmail.com","username":"Dazhao"},"change_message_id":"3e2e7f184d659410d95c7db4dd10d74d2168e523","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            interface_name \u003d self.interface_name"},{"line_number":359,"context_line":"            subnet_to_interface_ip \u003d self._make_subnet_interface_ip_map()"},{"line_number":360,"context_line":"            listen_address \u003d subnet_to_interface_ip[subnet.id]"},{"line_number":361,"context_line":"            is_public \u003d \u0027FALSE\u0027"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":364,"context_line":"                # if a subnet is specified to have dhcp disabled"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FGqM%3D","line":361,"updated":"2014-02-17 05:07:28.000000000","message":"Should be False as boolean type?","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":8278,"name":"Dazhao Yu","email":"dazhaoyu@gmail.com","username":"Dazhao"},"change_message_id":"a06ea2d22df9948edf7eb578d7963986bd8b92f6","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            else:"},{"line_number":384,"context_line":"                # If ipv6_ra_mode and ipv6_address_mode are OFF,"},{"line_number":385,"context_line":"                # then don\u0027t launch dnsmasq"},{"line_number":386,"context_line":"                if (subnet.ipv6_ra_mode not in constants.IPV6_MODES and"},{"line_number":387,"context_line":"                        subnet.ipv6_address_mode not in constants.IPV6_MODES):"},{"line_number":388,"context_line":"                    continue"},{"line_number":389,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FGlI%3D","line":386,"updated":"2014-02-17 05:31:18.000000000","message":"The ipv6_ra_mode value if can be \"off\"?","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"5ce9761bbd83fe5c40c221deedcccfbc9bb9a416","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                # If ipv6_ra_mode and ipv6_address_mode are OFF,"},{"line_number":385,"context_line":"                # then don\u0027t launch dnsmasq"},{"line_number":386,"context_line":"                if (subnet.ipv6_ra_mode not in constants.IPV6_MODES and"},{"line_number":387,"context_line":"                        subnet.ipv6_address_mode not in constants.IPV6_MODES):"},{"line_number":388,"context_line":"                    continue"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"                pid_file \u003d \u0027ipv6pid\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9pSE%3D","line":387,"updated":"2014-02-05 11:48:11.000000000","message":"nit: additional indentation?","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"5ce9761bbd83fe5c40c221deedcccfbc9bb9a416","unresolved":false,"context_lines":[{"line_number":399,"context_line":"                    for fixed_ips in port.fixed_ips:"},{"line_number":400,"context_line":"                        if (fixed_ips.subnet_id \u003d\u003d subnet.id and"},{"line_number":401,"context_line":"                                fixed_ips.ip_address \u003d\u003d subnet.gateway_ip):"},{"line_number":402,"context_line":"                            namespace \u003d (l3_agent.NS_PREFIX +"},{"line_number":403,"context_line":"                                         str(port.device_id))"},{"line_number":404,"context_line":"                            interface_name \u003d (l3_agent.INTERNAL_DEV_PREFIX +"},{"line_number":405,"context_line":"                                              str(port.id)[:11])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9pRg%3D","line":402,"updated":"2014-02-05 11:48:11.000000000","message":"please make it a method","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"d2be72e970be517a84c5e8f337233df5dbf532fc","unresolved":false,"context_lines":[{"line_number":404,"context_line":"                            interface_name \u003d (l3_agent.INTERNAL_DEV_PREFIX +"},{"line_number":405,"context_line":"                                              str(port.id)[:11])"},{"line_number":406,"context_line":"                            listen_address \u003d subnet.gateway_ip"},{"line_number":407,"context_line":"                            is_public \u003d \u0027TRUE\u0027"},{"line_number":408,"context_line":"                            break"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"                # If the subnet has gateway port on neutron router"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FWog%3D","line":407,"updated":"2014-02-13 19:18:58.000000000","message":"This should be a boolean, not a string equal to \"TRUE\"","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":8278,"name":"Dazhao Yu","email":"dazhaoyu@gmail.com","username":"Dazhao"},"change_message_id":"3e2e7f184d659410d95c7db4dd10d74d2168e523","unresolved":false,"context_lines":[{"line_number":462,"context_line":"                        continue"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"                # If the subnet does NOT have gateway port on neutron router,"},{"line_number":465,"context_line":"                # then dnsmasq should NOT send RA"},{"line_number":466,"context_line":"                else:"},{"line_number":467,"context_line":"                    # If ipv6_address_mode is set to DHCPV6_STATEFUL,"},{"line_number":468,"context_line":"                    # then dnsmasq simply acts as DHCPV6_STATEFUL server"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FGo8%3D","line":465,"updated":"2014-02-17 05:07:28.000000000","message":"typo error onsmasq -\u003e dnsmasq","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"4b9afe651bfda0d657a964c01d245fcbab4e4c6d","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                                   \u00270\u0027))"},{"line_number":498,"context_line":"                        cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":499,"context_line":"                                   self._output_opts_file())"},{"line_number":500,"context_line":"                    else:"},{"line_number":501,"context_line":"                        continue"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"            cmd.append(\u0027--interface\u003d%s\u0027 % interface_name.strip(\u0027\\n\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUX%2F%2FWl4%3D","line":500,"updated":"2014-02-13 19:24:52.000000000","message":"We should comment this here, that we are assuming that the network has another router upstream announcing RAs - I know you state something to this effect on 464 - but it\u0027s worth repeating it here so too.","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"5ce9761bbd83fe5c40c221deedcccfbc9bb9a416","unresolved":false,"context_lines":[{"line_number":925,"context_line":"            ip_cidrs.append(ip_cidr)"},{"line_number":926,"context_line":""},{"line_number":927,"context_line":"        if (self.conf.enable_isolated_metadata and"},{"line_number":928,"context_line":"                self.conf.use_namespaces):"},{"line_number":929,"context_line":"                ip_cidrs.append(METADATA_DEFAULT_CIDR)"},{"line_number":930,"context_line":""},{"line_number":931,"context_line":"        self.driver.init_l3(interface_name, ip_cidrs,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9pPk%3D","line":928,"updated":"2014-02-05 11:48:11.000000000","message":"why adding indentation?","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"5ce9761bbd83fe5c40c221deedcccfbc9bb9a416","unresolved":false,"context_lines":[{"line_number":926,"context_line":""},{"line_number":927,"context_line":"        if (self.conf.enable_isolated_metadata and"},{"line_number":928,"context_line":"                self.conf.use_namespaces):"},{"line_number":929,"context_line":"                ip_cidrs.append(METADATA_DEFAULT_CIDR)"},{"line_number":930,"context_line":""},{"line_number":931,"context_line":"        self.driver.init_l3(interface_name, ip_cidrs,"},{"line_number":932,"context_line":"                            namespace\u003dnetwork.namespace)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F9pPM%3D","line":929,"updated":"2014-02-05 11:48:11.000000000","message":"ditto","commit_id":"f3e2509e3c228f2427378308865315ddf69b3084"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":30,"context_line":"import six"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# Import l3_agent for NS_PREFIX definition"},{"line_number":33,"context_line":"from neutron.agent import l3_agent"},{"line_number":34,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":35,"context_line":"from neutron.agent.linux import utils"},{"line_number":36,"context_line":"from neutron.common import constants"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BaN4%3D","line":33,"updated":"2014-02-21 11:00:56.000000000","message":"I would suggest to move the definition in neutron.common.constants\n\nI understand you might see this as an unrelated change, but at least I would welcome it.","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"31edf692b1adc7238947ef0e4342564df05379ab","unresolved":false,"context_lines":[{"line_number":30,"context_line":"import six"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# Import l3_agent for NS_PREFIX definition"},{"line_number":33,"context_line":"from neutron.agent import l3_agent"},{"line_number":34,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":35,"context_line":"from neutron.agent.linux import utils"},{"line_number":36,"context_line":"from neutron.common import constants"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2Fnek%3D","line":33,"in_reply_to":"AAAAUX%2F%2BaN4%3D","updated":"2014-02-25 17:32:19.000000000","message":"+1 for moving it to neutron.common.constants.","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    \"\"\" There are two pid files."},{"line_number":179,"context_line":"    One for IPv4 subnet saved in \u0027pid\u0027 file"},{"line_number":180,"context_line":"    One for IPv6 subnet saved in \"ipv6pid\u0027 file"},{"line_number":181,"context_line":"    Both should be processed to terminate dnsmasq process \"\"\""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def disable(self, retain_port\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BaNI%3D","line":180,"updated":"2014-02-21 11:00:56.000000000","message":"pedant note: \"ipv6pid\u0027 -\u003e \u0027ipv6pid\u0027","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    \"\"\" There are two pid files."},{"line_number":179,"context_line":"    One for IPv4 subnet saved in \u0027pid\u0027 file"},{"line_number":180,"context_line":"    One for IPv6 subnet saved in \"ipv6pid\u0027 file"},{"line_number":181,"context_line":"    Both should be processed to terminate dnsmasq process \"\"\""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def disable(self, retain_port\u003dFalse):"},{"line_number":184,"context_line":"        \"\"\"Disable DHCP for this network by killing the local process.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BaNg%3D","line":181,"updated":"2014-02-21 11:00:56.000000000","message":"Would it be possible associate this docstring to some function rather than have it floating?","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"31edf692b1adc7238947ef0e4342564df05379ab","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    def disable(self, retain_port\u003dFalse):"},{"line_number":184,"context_line":"        \"\"\"Disable DHCP for this network by killing the local process.\"\"\""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":187,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":188,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":189,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FncA%3D","line":186,"updated":"2014-02-25 17:32:19.000000000","message":"\"i\" is not used anywhere. Consider:\n\n  for subnet in self.network.subnets:","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"31edf692b1adc7238947ef0e4342564df05379ab","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            if uuidutils.is_uuid_like(c)"},{"line_number":320,"context_line":"        ]"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def spawn_process(self):"},{"line_number":323,"context_line":"        \"\"\"Spawns a Dnsmasq process for the network.\"\"\""},{"line_number":324,"context_line":"        env \u003d {"},{"line_number":325,"context_line":"            self.NEUTRON_NETWORK_ID_KEY: self.network.id,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAU3%2F%2FnAU%3D","line":322,"updated":"2014-02-25 17:32:19.000000000","message":"The method becomes very very long. Please consider splitting IPv4 and IPv6 parts into separate methods.","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":351,"context_line":"            By default, binding interface is set to ns- interface"},{"line_number":352,"context_line":"            By default, binding IP address is the one for ns- interface"},{"line_number":353,"context_line":"            These are the values IPv4 subnet adopts"},{"line_number":354,"context_line":"            However, for IPv6 subnet, these parameters may be updated\"\"\""},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"            cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":357,"context_line":"            namespace \u003d self.network.namespace"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BaMs%3D","line":354,"updated":"2014-02-21 11:00:56.000000000","message":"again, same comment about hanging docstrings.\n\nYou might consider also making them code comments prefixed by #","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                # then don\u0027t launch dnsmasq"},{"line_number":416,"context_line":"                if (subnet.ipv6_ra_mode not in constants.IPV6_MODES and"},{"line_number":417,"context_line":"                        subnet.ipv6_address_mode not in constants.IPV6_MODES):"},{"line_number":418,"context_line":"                    continue"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"                pid_file \u003d \u0027ipv6pid\u0027"},{"line_number":421,"context_line":"                hosts_file \u003d ipv6_hosts_file"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BaL0%3D","line":418,"updated":"2014-02-21 11:00:56.000000000","message":"It seems like we\u0027re doing anyway some operation which would be spared if the enable_dhcp/ra_mode/address_mode checks were done at the beginning of this function","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":429,"context_line":"                for port in self.network.ports:"},{"line_number":430,"context_line":"                    for fixed_ips in port.fixed_ips:"},{"line_number":431,"context_line":"                        if (fixed_ips.subnet_id \u003d\u003d subnet.id and"},{"line_number":432,"context_line":"                                fixed_ips.ip_address \u003d\u003d subnet.gateway_ip):"},{"line_number":433,"context_line":"                            namespace \u003d (l3_agent.NS_PREFIX +"},{"line_number":434,"context_line":"                                         str(port.device_id))"},{"line_number":435,"context_line":"                            interface_name \u003d (l3_agent.INTERNAL_DEV_PREFIX +"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BaJ4%3D","line":432,"updated":"2014-02-21 11:00:56.000000000","message":"I\u0027m not sure if checking there is a port with a gateway IP is enough. It is possible, I think, to craft with the neutron API a network when there is such port but no router connection.\n\nA check on device_owner\u003dnetwork:router_interface perhaps might be better\n\nAlso, it is perhaps worth considering that the API allows to attach router interfaces by port. In that case the IP of the router port won\u0027t be the gateway IP (but that IP also won\u0027t be the default gateway). I\u0027m not sure if this is something you might want to consider; I\u0027m just lying all the options on the table.","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":4656,"name":"Sean M. Collins","email":"sean@coreitpro.com","username":"scollins"},"change_message_id":"ce7ea0459f176b98d48e7d98ad5ce8a177d77b68","unresolved":false,"context_lines":[{"line_number":429,"context_line":"                for port in self.network.ports:"},{"line_number":430,"context_line":"                    for fixed_ips in port.fixed_ips:"},{"line_number":431,"context_line":"                        if (fixed_ips.subnet_id \u003d\u003d subnet.id and"},{"line_number":432,"context_line":"                                fixed_ips.ip_address \u003d\u003d subnet.gateway_ip):"},{"line_number":433,"context_line":"                            namespace \u003d (l3_agent.NS_PREFIX +"},{"line_number":434,"context_line":"                                         str(port.device_id))"},{"line_number":435,"context_line":"                            interface_name \u003d (l3_agent.INTERNAL_DEV_PREFIX +"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2Fs%2FI%3D","line":432,"in_reply_to":"AAAAUX%2F%2BaJ4%3D","updated":"2014-03-04 15:45:14.000000000","message":"Salvatore - Shixiong and I were discussing this - would an example of this case be where there is a Neutron router that connects two Tenant subnets - so that there is east to west traffic between the two subnets? I agree - we should probably change the query to look for ports with the ownership set.","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"8a9d8afb082e791eabdb22e673497d0899a2271f","unresolved":false,"context_lines":[{"line_number":468,"context_line":"                    elif subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_STATELESS:"},{"line_number":469,"context_line":"                        cmd.append(\u0027--dhcp-range\u003d%s%s,%s,%s,%ss\u0027 %"},{"line_number":470,"context_line":"                                  (set_tag, self._TAG_PREFIX % i,"},{"line_number":471,"context_line":"                                   cidr.network,"},{"line_number":472,"context_line":"                                   \u0027ra-stateless\u0027,"},{"line_number":473,"context_line":"                                   self.conf.dhcp_lease_duration))"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2Bcxo%3D","line":471,"updated":"2014-02-21 03:54:48.000000000","message":"Question: what is this subnet cidr provided for? By dnsmasq man page, it seems optional.","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":497,"context_line":"                        continue"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"                # If the subnet does NOT have gateway port on neutron router,"},{"line_number":500,"context_line":"                # then dnsmasq should NOT send RA"},{"line_number":501,"context_line":"                else:"},{"line_number":502,"context_line":"                    # If ipv6_address_mode is set to DHCPV6_STATEFUL,"},{"line_number":503,"context_line":"                    # then dnsmasq simply acts as DHCPV6_STATEFUL server"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BaFE%3D","line":500,"updated":"2014-02-21 11:00:56.000000000","message":"Then what should happen here? Is it right to do just nothing, or is it a condition to log? Or, we should even trigger an exception at the API layer for invalid configuration?\n\nThis is just a question because I\u0027d like to understand better","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a9f05dbac4924d557f8356a65c735b4ade3c1366","unresolved":false,"context_lines":[{"line_number":657,"context_line":"            self._release_lease(mac, ip)"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"        ipv6name \u003d self.get_conf_file_name(\u0027ipv6host\u0027)"},{"line_number":660,"context_line":"        utils.replace_file(ipv6name, buf6.getvalue())"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"        return name, ipv6name"},{"line_number":663,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUX%2F%2BaDI%3D","line":660,"updated":"2014-02-21 11:00:56.000000000","message":"as pep8 correctly points out, buf6 is undefined","commit_id":"848ccb91106b72315b63a6bf98fec78b8051cf82"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"cb928d63cc931410a483c6c65e0a7be0c0e42c13","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                    self.device_manager.destroy(self.network,"},{"line_number":195,"context_line":"                                                self.interface_name)"},{"line_number":196,"context_line":"            else:"},{"line_number":197,"context_line":"                LOG.debug(_(\u0027Cannot find DHCP pid for %s\u0027), self.network.id)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"            if not retain_port:"},{"line_number":200,"context_line":"                if self.conf.dhcp_delete_namespaces and self.network.namespace:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVX%2F%2Fryc%3D","line":197,"updated":"2014-03-01 03:40:10.000000000","message":"This change of log message causes unit test failure:\nneutron/tests/unit/test_linux_dhcp.py  test_disable_unknown_network","commit_id":"d6f707d377b82fce02a54934a72c6014c9f8407b"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"cb928d63cc931410a483c6c65e0a7be0c0e42c13","unresolved":false,"context_lines":[{"line_number":353,"context_line":"            cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":354,"context_line":"            namespace \u003d self.network.namespace"},{"line_number":355,"context_line":"            interface_name \u003d self.interface_name"},{"line_number":356,"context_line":"            subnet_to_interface_ip \u003d self._make_subnet_interface_ip_map()"},{"line_number":357,"context_line":"            listen_address \u003d subnet_to_interface_ip[subnet.id]"},{"line_number":358,"context_line":"            is_public \u003d False"},{"line_number":359,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAVX%2F%2FruY%3D","line":356,"updated":"2014-03-01 03:40:10.000000000","message":"this method need to be mocked in many test cases (such as test_spawn_cfg_config_file) in test_dhcp_agent to make the unit tests passed.","commit_id":"d6f707d377b82fce02a54934a72c6014c9f8407b"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":410,"context_line":"    def _output_hosts_file(self):"},{"line_number":411,"context_line":"        \"\"\"Writes a dnsmasq compatible hosts file.\"\"\""},{"line_number":412,"context_line":"        r \u003d re.compile(\u0027[:.]\u0027)"},{"line_number":413,"context_line":"        buf \u003d six.StringIO()"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        for port in self.network.ports:"},{"line_number":416,"context_line":"            for alloc in port.fixed_ips:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2FqyM%3D","side":"PARENT","line":413,"updated":"2014-03-01 12:52:08.000000000","message":"Why do you remove six? six.StringIO is introduced for python 3 compatibility. Please keep it.","commit_id":"4ab2b55b33f7b0ca7ca7abc9a02e6df53341859c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":30,"context_line":"import six"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# Import l3_agent for NS_PREFIX definition"},{"line_number":33,"context_line":"from neutron.agent import l3_agent"},{"line_number":34,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":35,"context_line":"from neutron.agent.linux import utils"},{"line_number":36,"context_line":"from neutron.common import constants"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2FqyE%3D","line":33,"updated":"2014-03-01 12:52:08.000000000","message":"I would suggest to move the definition in neutron.common.constants.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71c69632ff1cc2b4de82e8961b71de76b3154e60","unresolved":false,"context_lines":[{"line_number":30,"context_line":"import six"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"# Import l3_agent for NS_PREFIX definition"},{"line_number":33,"context_line":"from neutron.agent import l3_agent"},{"line_number":34,"context_line":"from neutron.agent.linux import ip_lib"},{"line_number":35,"context_line":"from neutron.agent.linux import utils"},{"line_number":36,"context_line":"from neutron.common import constants"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2F%2Fbg%3D","line":33,"in_reply_to":"AAAAVX%2F%2FqyE%3D","updated":"2014-03-02 21:47:04.000000000","message":"I know that might appear as unrelated to this patch, but it\u0027s better than importing a module because of a constant","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":187,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":188,"context_line":"            else:"},{"line_number":189,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027ipv6pid\u0027)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if pid is None:"},{"line_number":192,"context_line":"                pid \u003d self.pid"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqx8%3D","line":189,"updated":"2014-03-01 12:52:08.000000000","message":"Why do we need to run two dnsmasq processes? Doesn\u0027t a single process of dnsmasq support ipv4 and ipv6 at the same time?","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e4510334131e057d2a1fc9a3b576f26c07b46950","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":187,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":188,"context_line":"            else:"},{"line_number":189,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027ipv6pid\u0027)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if pid is None:"},{"line_number":192,"context_line":"                pid \u003d self.pid"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2FyN8%3D","line":189,"in_reply_to":"AAAAVX%2F%2Fqx8%3D","updated":"2014-03-04 05:24:57.000000000","message":"[reply from Shixiong]\n\nIPv6 requires Router Advertisement to be sent from the gateway port so VM can point the default gateway to the link-local address of the gateway port.\nThe default behavior of IPv4 subnet is that, dnsmasq is launched in qdhcp- namespace and bound to ns- interface, which is separated from qr- interface in qrouter- namespace.\nHence, we need to launch two dnsmasq processes, one for IPv4 subnet, and one for IPv6 subnet.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"3e92cec0ff0d9d8d1b461aa2686b65aa13a136cc","unresolved":false,"context_lines":[{"line_number":326,"context_line":"            if uuidutils.is_uuid_like(c)"},{"line_number":327,"context_line":"        ]"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    def spawn_process(self):"},{"line_number":330,"context_line":"        \"\"\"Spawns a Dnsmasq process for the network.\"\"\""},{"line_number":331,"context_line":"        env \u003d {"},{"line_number":332,"context_line":"            self.NEUTRON_NETWORK_ID_KEY: self.network.id,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2Fowo%3D","line":329,"updated":"2014-03-04 22:47:58.000000000","message":"This method is 200+ lines long should be abstracted better.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        }"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        # Host file for IPv4 subnet and IPv6 subnet are separated"},{"line_number":336,"context_line":"        ipv4_hosts_file, ipv6_hosts_file \u003d self._output_hosts_file()"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        possible_leases \u003d 0"},{"line_number":339,"context_line":"        for i, subnet in enumerate(self.network.subnets):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqx4%3D","line":336,"updated":"2014-03-01 12:52:08.000000000","message":"Could you explain why we need to use separated host files for IPv4 and IPv6? I am not sure why.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e4510334131e057d2a1fc9a3b576f26c07b46950","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        }"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        # Host file for IPv4 subnet and IPv6 subnet are separated"},{"line_number":336,"context_line":"        ipv4_hosts_file, ipv6_hosts_file \u003d self._output_hosts_file()"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        possible_leases \u003d 0"},{"line_number":339,"context_line":"        for i, subnet in enumerate(self.network.subnets):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2FyNw%3D","line":336,"in_reply_to":"AAAAVX%2F%2Fqx4%3D","updated":"2014-03-04 05:24:57.000000000","message":"[Reply from Shixiong]\n\nMixing IPv4 and IPv6 entries in the same file doesn’t work based on my testing. IPv6 entries have different syntax, for example, IPv6 address should be in [address] format. Dnsmasq will be confused.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            By default, binding interface is set to ns- interface"},{"line_number":359,"context_line":"            By default, binding IP address is the one for ns- interface"},{"line_number":360,"context_line":"            These are the values IPv4 subnet adopts"},{"line_number":361,"context_line":"            However, for IPv6 subnet, these parameters may be updated\"\"\""},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"            cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":364,"context_line":"            namespace \u003d self.network.namespace"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqxk%3D","line":361,"updated":"2014-03-01 12:52:08.000000000","message":"Triple quotes is usually used for docstring. For usual comment inline, please use # instead. It applies to a whole file.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":385,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":386,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%d\u0027 %"},{"line_number":387,"context_line":"                           min(possible_leases, self.conf.dnsmasq_lease_max))"},{"line_number":388,"context_line":"            else:"},{"line_number":389,"context_line":"                # If ipv6_ra_mode and ipv6_address_mode are OFF,"},{"line_number":390,"context_line":"                # then don\u0027t launch dnsmasq"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqwc%3D","line":387,"updated":"2014-03-01 12:52:08.000000000","message":"Previously it is outside of for-loop. Why did you move it to inside of the loop?","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e4510334131e057d2a1fc9a3b576f26c07b46950","unresolved":false,"context_lines":[{"line_number":384,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":385,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":386,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%d\u0027 %"},{"line_number":387,"context_line":"                           min(possible_leases, self.conf.dnsmasq_lease_max))"},{"line_number":388,"context_line":"            else:"},{"line_number":389,"context_line":"                # If ipv6_ra_mode and ipv6_address_mode are OFF,"},{"line_number":390,"context_line":"                # then don\u0027t launch dnsmasq"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2FyNY%3D","line":387,"in_reply_to":"AAAAVX%2F%2Fqwc%3D","updated":"2014-03-04 05:24:57.000000000","message":"[Reply from Shixiong]\n\nThis section can be different depending on IP version, and different combination of ipv6_ra_mode and ipv6_address_mode. \nIn this case, the line you refer to is only applicable for IPv4 subnet. The values for IPv6 will be updated later.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":386,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%d\u0027 %"},{"line_number":387,"context_line":"                           min(possible_leases, self.conf.dnsmasq_lease_max))"},{"line_number":388,"context_line":"            else:"},{"line_number":389,"context_line":"                # If ipv6_ra_mode and ipv6_address_mode are OFF,"},{"line_number":390,"context_line":"                # then don\u0027t launch dnsmasq"},{"line_number":391,"context_line":"                if (subnet.ipv6_ra_mode not in constants.IPV6_MODES and"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqxg%3D","line":388,"updated":"2014-03-01 12:52:08.000000000","message":"The code for IPv6 is too long for one method. Could you split the code in separate methods?","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":399,"context_line":"                Update namespace to qrouter- namespace"},{"line_number":400,"context_line":"                Update binding interface to qr- interface"},{"line_number":401,"context_line":"                Update binding IP to gateway IP"},{"line_number":402,"context_line":"                Switch the flag \"is_public\" to True\"\"\""},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"                for port in self.network.ports:"},{"line_number":405,"context_line":"                    for fixed_ips in port.fixed_ips:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqxc%3D","line":402,"updated":"2014-03-01 12:52:08.000000000","message":"Same comment as the above.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":516,"context_line":"            cmd.append(\u0027--interface\u003d%s\u0027 % interface_name.strip(\u0027\\n\u0027))"},{"line_number":517,"context_line":"            cmd.append(\u0027--pid-file\u003d%s\u0027 % self.get_conf_file_name("},{"line_number":518,"context_line":"                       pid_file, ensure_conf_dir\u003dTrue))"},{"line_number":519,"context_line":"            cmd.append(\u0027--conf-file\u003d%s\u0027 % self.conf.dnsmasq_config_file)"},{"line_number":520,"context_line":"            if self.conf.dnsmasq_dns_servers:"},{"line_number":521,"context_line":"                cmd.extend("},{"line_number":522,"context_line":"                    \u0027--server\u003d%s\u0027 % server"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqv8%3D","line":519,"updated":"2014-03-01 12:52:08.000000000","message":"L.519-535 was outside of the loop. Is there any reason to move it to inside of the loop? At least we should keep the behavior of IPv4 code. It changes the behavior of IPv4 part if we have multiple IPv4 subnets.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e4510334131e057d2a1fc9a3b576f26c07b46950","unresolved":false,"context_lines":[{"line_number":516,"context_line":"            cmd.append(\u0027--interface\u003d%s\u0027 % interface_name.strip(\u0027\\n\u0027))"},{"line_number":517,"context_line":"            cmd.append(\u0027--pid-file\u003d%s\u0027 % self.get_conf_file_name("},{"line_number":518,"context_line":"                       pid_file, ensure_conf_dir\u003dTrue))"},{"line_number":519,"context_line":"            cmd.append(\u0027--conf-file\u003d%s\u0027 % self.conf.dnsmasq_config_file)"},{"line_number":520,"context_line":"            if self.conf.dnsmasq_dns_servers:"},{"line_number":521,"context_line":"                cmd.extend("},{"line_number":522,"context_line":"                    \u0027--server\u003d%s\u0027 % server"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2FyMc%3D","line":519,"in_reply_to":"AAAAVX%2F%2Fqv8%3D","updated":"2014-03-04 05:24:57.000000000","message":"[Reply from Shixiong]\n\nThis section L.519 - 535 are the parameters shared between IPv4 and IPv6 subnets. The previous sections are IPv4 and IPv6 specific. To avoid duplicating the code, I left them to the end of the method.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4f24dc835795dca5d7f74de1e21f5a02f83b2d80","unresolved":false,"context_lines":[{"line_number":516,"context_line":"            cmd.append(\u0027--interface\u003d%s\u0027 % interface_name.strip(\u0027\\n\u0027))"},{"line_number":517,"context_line":"            cmd.append(\u0027--pid-file\u003d%s\u0027 % self.get_conf_file_name("},{"line_number":518,"context_line":"                       pid_file, ensure_conf_dir\u003dTrue))"},{"line_number":519,"context_line":"            cmd.append(\u0027--conf-file\u003d%s\u0027 % self.conf.dnsmasq_config_file)"},{"line_number":520,"context_line":"            if self.conf.dnsmasq_dns_servers:"},{"line_number":521,"context_line":"                cmd.extend("},{"line_number":522,"context_line":"                    \u0027--server\u003d%s\u0027 % server"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2FyH0%3D","line":519,"in_reply_to":"AAAAVn%2F%2FyMc%3D","updated":"2014-03-04 05:31:56.000000000","message":"There is one point needs to be added.\n\nL.519-535 was moved inside the loop @L.339. If a network has multiple IPv4 subnets, the behavior will be changed. If two IPv4 subnets for a network, two dnsmasq processes will be launched.\nI think it is not intended. While I understand parameters are different between IPv4 and IPv6, we need to keep IPv4 behavior.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":665,"context_line":"                else:"},{"line_number":666,"context_line":"                    options.append(\u0027tag:tag%s,option6:dns-server,%s\u0027 %"},{"line_number":667,"context_line":"                                  (i, \u0027,\u0027.join([\u0027[\u0027 + ns + \u0027]\u0027"},{"line_number":668,"context_line":"                                   for ns in subnet.dns_nameservers])))"},{"line_number":669,"context_line":"            else:"},{"line_number":670,"context_line":"                # use the dnsmasq ip as nameservers only if there is no"},{"line_number":671,"context_line":"                # dns-server submitted by the server"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2Fqvc%3D","line":668,"updated":"2014-03-01 12:52:08.000000000","message":"Please use _format_option method or prepare a similar method?","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"0eb590834fc43bfade1ff98186a04e2a68927000","unresolved":false,"context_lines":[{"line_number":990,"context_line":""},{"line_number":991,"context_line":"        if (self.conf.enable_isolated_metadata and"},{"line_number":992,"context_line":"                self.conf.use_namespaces):"},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"            ip_cidrs.append(METADATA_DEFAULT_CIDR)"},{"line_number":995,"context_line":""},{"line_number":996,"context_line":"        self.driver.init_l3(interface_name, ip_cidrs,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVX%2F%2FqvY%3D","line":993,"updated":"2014-03-01 12:52:08.000000000","message":"It looks unrelated to this patch.","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        # Both should be processed to terminate dnsmasq process"},{"line_number":180,"context_line":"        # as part of \u0027disable\u0027 function\"\"\""},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":183,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":184,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":185,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaqI%3D","line":182,"updated":"2014-03-06 08:48:15.000000000","message":"There is a case where a network has multiple IPv4 subnets. It is better that this loop is for IPv4 and IPv6 rather than looping per subnet. In my understanding, one dnsmasq is launched per IP version.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        # Both should be processed to terminate dnsmasq process"},{"line_number":180,"context_line":"        # as part of \u0027disable\u0027 function\"\"\""},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":183,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":184,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":185,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIb4%3D","line":182,"in_reply_to":"AAAAVn%2F%2FaqI%3D","updated":"2014-03-13 18:48:22.000000000","message":"As you pointed out in the last review, dnsmasq will launch one process for all IPv4 subnets. However, dnsmasq will launch one process for each IPv6 subnet. So here, I use a single pid file for IPv4 subnets, but unique pid file for each IPv6 subnet.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"b87fbf90621b705cf7bb4c8e69d39b97ac1aff97","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"            elif pid:"},{"line_number":200,"context_line":"                cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, str(pid).strip(\u0027\\n\u0027)]"},{"line_number":201,"context_line":"                utils.execute(cmd, self.root_helper)"},{"line_number":202,"context_line":"                if not retain_port:"},{"line_number":203,"context_line":"                    self.device_manager.destroy(self.network,"},{"line_number":204,"context_line":"                                                self.interface_name)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FCNo%3D","line":201,"updated":"2014-03-10 14:53:04.000000000","message":"I am bit confused here.\nIf self.active \u003d False I assume the process has been already killed. I guess in IPv6 there is a compelling reason for doing kill again. However, for IPv4 this is a change in behaviour, and I\u0027m not sure how that would work if a network has multiple IPv4 subnets","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                    self.device_manager.destroy(self.network,"},{"line_number":204,"context_line":"                                                self.interface_name)"},{"line_number":205,"context_line":"                LOG.debug(_(\u0027DHCP for %(net_id)s pid %(pid)d is stale,\u0027"},{"line_number":206,"context_line":"                          \u0027 ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027net_id\u0027: self.network.id, \u0027pid\u0027: pid})"},{"line_number":208,"context_line":"            else:"},{"line_number":209,"context_line":"                LOG.debug(_(\u0027No DHCP started for %s\u0027), self.network.id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Faps%3D","line":206,"updated":"2014-03-06 08:48:15.000000000","message":"Now we can have multiple dnsmasq processes for one network. The message can be confusing. It is better to add more information to the message: e.g., IP version or subnet.\nPer my comment above, IP version is enough.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":203,"context_line":"                    self.device_manager.destroy(self.network,"},{"line_number":204,"context_line":"                                                self.interface_name)"},{"line_number":205,"context_line":"                LOG.debug(_(\u0027DHCP for %(net_id)s pid %(pid)d is stale,\u0027"},{"line_number":206,"context_line":"                          \u0027 ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027net_id\u0027: self.network.id, \u0027pid\u0027: pid})"},{"line_number":208,"context_line":"            else:"},{"line_number":209,"context_line":"                LOG.debug(_(\u0027No DHCP started for %s\u0027), self.network.id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIbo%3D","line":206,"in_reply_to":"AAAAVn%2F%2Faps%3D","updated":"2014-03-13 18:48:22.000000000","message":"Excellent point! Done. Changed it to \"DHCP for subnet + subnet_id with pid + pid_id is stale. Ignoring command\u0027. Will be included in Patch 15.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                          \u0027 ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027net_id\u0027: self.network.id, \u0027pid\u0027: pid})"},{"line_number":208,"context_line":"            else:"},{"line_number":209,"context_line":"                LOG.debug(_(\u0027No DHCP started for %s\u0027), self.network.id)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"            if not retain_port:"},{"line_number":212,"context_line":"                if self.conf.dhcp_delete_namespaces and self.network.namespace:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Fapo%3D","line":209,"updated":"2014-03-06 08:48:15.000000000","message":"same comment as the above.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                          \u0027 ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027net_id\u0027: self.network.id, \u0027pid\u0027: pid})"},{"line_number":208,"context_line":"            else:"},{"line_number":209,"context_line":"                LOG.debug(_(\u0027No DHCP started for %s\u0027), self.network.id)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"            if not retain_port:"},{"line_number":212,"context_line":"                if self.conf.dhcp_delete_namespaces and self.network.namespace:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIaU%3D","line":209,"in_reply_to":"AAAAVn%2F%2Fapo%3D","updated":"2014-03-13 18:48:22.000000000","message":"Done. Changed it to \"No DHCP started for + ip_version + subnet + subnet_id\u0027. Will be included in Patch 15.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":329,"context_line":"            if uuidutils.is_uuid_like(c)"},{"line_number":330,"context_line":"        ]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def spawn_process_ipv4(self, subnet, set_tag, i):"},{"line_number":333,"context_line":"        cmd \u003d []"},{"line_number":334,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":335,"context_line":"        mode \u003d \u0027static\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaT4%3D","line":332,"updated":"2014-03-06 08:48:15.000000000","message":"This method only constructs the command line parameter and it actually does not spawn a process. The method name needs to be reconsidered.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":329,"context_line":"            if uuidutils.is_uuid_like(c)"},{"line_number":330,"context_line":"        ]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def spawn_process_ipv4(self, subnet, set_tag, i):"},{"line_number":333,"context_line":"        cmd \u003d []"},{"line_number":334,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":335,"context_line":"        mode \u003d \u0027static\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIZw%3D","line":332,"in_reply_to":"AAAAVn%2F%2FaT4%3D","updated":"2014-03-13 18:48:22.000000000","message":"Good point....Changed it to dnsmasq_options_ipv4. Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        return (cmd, cidr.size)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def spawn_process_ipv6_public(self, subnet, set_tag, i, hosts_file):"},{"line_number":346,"context_line":"        cmd \u003d []"},{"line_number":347,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":348,"context_line":"        cmd.append(\u0027--enable-ra\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaTs%3D","line":345,"updated":"2014-03-06 08:48:15.000000000","message":"Same as for IPv4 above.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        return (cmd, cidr.size)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def spawn_process_ipv6_public(self, subnet, set_tag, i, hosts_file):"},{"line_number":346,"context_line":"        cmd \u003d []"},{"line_number":347,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":348,"context_line":"        cmd.append(\u0027--enable-ra\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIZE%3D","line":345,"in_reply_to":"AAAAVn%2F%2FaTs%3D","updated":"2014-03-13 18:48:22.000000000","message":"Done. Changed it to dnsmasq_options_ipv6_public","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f59044331aa8a7f43ade66863b5431c26e7c7234","unresolved":false,"context_lines":[{"line_number":395,"context_line":"        cmd \u003d []"},{"line_number":396,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        if (subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_OFF"},{"line_number":399,"context_line":"                and subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL):"},{"line_number":400,"context_line":"            # If the subnet does NOT have gateway port on neutron router,"},{"line_number":401,"context_line":"            # then dnsmasq should NOT send RA"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FSCU%3D","line":398,"updated":"2014-03-07 03:20:57.000000000","message":"ipv6_ra_mode will never be set to OFF based on parent code https://review.openstack.org/#/c/52983/. ipv6_ra_mode\u003d\u003dNone is treated as OFF.\n\nNeed to change this to if (subnet.ipv6_ra_mode and ....)","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":395,"context_line":"        cmd \u003d []"},{"line_number":396,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        if (subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_OFF"},{"line_number":399,"context_line":"                and subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL):"},{"line_number":400,"context_line":"            # If the subnet does NOT have gateway port on neutron router,"},{"line_number":401,"context_line":"            # then dnsmasq should NOT send RA"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIYo%3D","line":398,"in_reply_to":"AAAAVn%2F%2FSCU%3D","updated":"2014-03-13 18:48:22.000000000","message":"I had a long discussion with Sean on this topic. Will change the logic and submit it in Patch 16. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"b87fbf90621b705cf7bb4c8e69d39b97ac1aff97","unresolved":false,"context_lines":[{"line_number":395,"context_line":"        cmd \u003d []"},{"line_number":396,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        if (subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_OFF"},{"line_number":399,"context_line":"                and subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL):"},{"line_number":400,"context_line":"            # If the subnet does NOT have gateway port on neutron router,"},{"line_number":401,"context_line":"            # then dnsmasq should NOT send RA"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FCMg%3D","line":398,"in_reply_to":"AAAAVn%2F%2FSCU%3D","updated":"2014-03-10 14:53:04.000000000","message":"This is correct and also related to my comments on path 52983","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f59044331aa8a7f43ade66863b5431c26e7c7234","unresolved":false,"context_lines":[{"line_number":413,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":414,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%s\u0027 % cidr.size)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        elif (subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_OFF"},{"line_number":417,"context_line":"                and subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS):"},{"line_number":418,"context_line":"            # If ipv6_address_mode is set to DHCPV6_STATELESS,"},{"line_number":419,"context_line":"            # then dnsmasq simply acts as DHCPV6_STATELESS server"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FSCQ%3D","line":416,"updated":"2014-03-07 03:20:57.000000000","message":"Same as above.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":413,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":414,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%s\u0027 % cidr.size)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        elif (subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_OFF"},{"line_number":417,"context_line":"                and subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS):"},{"line_number":418,"context_line":"            # If ipv6_address_mode is set to DHCPV6_STATELESS,"},{"line_number":419,"context_line":"            # then dnsmasq simply acts as DHCPV6_STATELESS server"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIYk%3D","line":416,"in_reply_to":"AAAAVn%2F%2FSCQ%3D","updated":"2014-03-13 18:48:22.000000000","message":"I had a long discussion with Sean on this topic. Will change the logic and submit it in Patch 16. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        return cmd"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def subnet_type(self, subnet):"},{"line_number":436,"context_line":"        # If router has gateway port for the subnet, then"},{"line_number":437,"context_line":"        # Update namespace to qrouter- namespace"},{"line_number":438,"context_line":"        # Update binding interface to qr- interface"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaVU%3D","line":435,"updated":"2014-03-06 08:48:15.000000000","message":"The method name needs to be improved. This method looks for router_interface for the subnet and returns the found interface information.\n\n  get_interface_for_dnsmasq() ?","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        return cmd"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    def subnet_type(self, subnet):"},{"line_number":436,"context_line":"        # If router has gateway port for the subnet, then"},{"line_number":437,"context_line":"        # Update namespace to qrouter- namespace"},{"line_number":438,"context_line":"        # Update binding interface to qr- interface"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIYc%3D","line":435,"in_reply_to":"AAAAVn%2F%2FaVU%3D","updated":"2014-03-13 18:48:22.000000000","message":"I changed it to \"check_gw_port\". Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":452,"context_line":"                    break"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        if is_public:"},{"line_number":455,"context_line":"            return (namespace, interface_name, is_public)"},{"line_number":456,"context_line":"        else:"},{"line_number":457,"context_line":"            return (self.network.namespace, self.interface_name, is_public)"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Fank%3D","line":455,"updated":"2014-03-06 08:48:15.000000000","message":"I prefer:\n\n  if not public:\n      namespace \u003d self.network.namespace\n      interface_name \u003d self.interface_name\n  return (namespace, interface_name, is_public)","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":452,"context_line":"                    break"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        if is_public:"},{"line_number":455,"context_line":"            return (namespace, interface_name, is_public)"},{"line_number":456,"context_line":"        else:"},{"line_number":457,"context_line":"            return (self.network.namespace, self.interface_name, is_public)"},{"line_number":458,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIXU%3D","line":455,"in_reply_to":"AAAAVn%2F%2Fank%3D","updated":"2014-03-13 18:48:22.000000000","message":"Good point. Done! Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":481,"context_line":""},{"line_number":482,"context_line":"        cmdv4 \u003d list(cmd_base)"},{"line_number":483,"context_line":"        cmdv4.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":484,"context_line":"        cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":487,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaXU%3D","line":484,"updated":"2014-03-06 08:48:15.000000000","message":"why is cmdv4 outside of for-loop and is cmdv6 not?","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":481,"context_line":""},{"line_number":482,"context_line":"        cmdv4 \u003d list(cmd_base)"},{"line_number":483,"context_line":"        cmdv4.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":484,"context_line":"        cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":487,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIWg%3D","line":484,"in_reply_to":"AAAAVn%2F%2FaXU%3D","updated":"2014-03-13 18:48:22.000000000","message":"For IPv4 subnets belonging to the same network, we can launch one dnsmasq process and append multiple dhcp_ranges to it; In other words, we don\u0027t need to spawn up multiple processes for IPv4 subnets in the same way as it did before; However, for IPv6 subnets, we need to launch a unique dnsmasq process for each of them and bind it to each IPv6 subnet\u0027s gateway interface. Hence, I kept cmdv4 outside of for-loop to avoid multiple instances for IPv4 subnets.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        cmdv4.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":484,"context_line":"        cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":489,"context_line":"                # if a subnet is specified to have dhcp disabled"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Fao4%3D","line":486,"updated":"2014-03-06 08:48:15.000000000","message":"Same comments as for disable() above.\n\nThere is a case where a network has multiple IPv4 subnets. It is better that this loop is for IPv4 and IPv6 rather than looping per subnet. In my understanding, one dnsmasq is launched per IP version.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        cmdv4.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":484,"context_line":"        cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"},{"line_number":485,"context_line":""},{"line_number":486,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":489,"context_line":"                # if a subnet is specified to have dhcp disabled"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIWU%3D","line":486,"in_reply_to":"AAAAVn%2F%2Fao4%3D","updated":"2014-03-13 18:48:22.000000000","message":"For IPv6 subnets, we need to launch dnsmasq for each of them. We cannot use one dnsmasq process to handle all IPv6 subnets because they need to bind to default gateway to ensure Router Advertisement works properly.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                    cmdv4.append(command)"},{"line_number":496,"context_line":"                ipv4_size +\u003d size"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"            else:"},{"line_number":499,"context_line":"                namespace, interface_name, is_public \u003d self.subnet_type(subnet)"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"                if is_public:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaSc%3D","line":498,"updated":"2014-03-06 08:48:15.000000000","message":"IPv6 section is still long. Can we make L.499-536 a separate method?","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":495,"context_line":"                    cmdv4.append(command)"},{"line_number":496,"context_line":"                ipv4_size +\u003d size"},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"            else:"},{"line_number":499,"context_line":"                namespace, interface_name, is_public \u003d self.subnet_type(subnet)"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"                if is_public:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIUo%3D","line":498,"in_reply_to":"AAAAVn%2F%2FaSc%3D","updated":"2014-03-13 18:48:22.000000000","message":"Done. Made them as a separate method. Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":"            else:"},{"line_number":499,"context_line":"                namespace, interface_name, is_public \u003d self.subnet_type(subnet)"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"                if is_public:"},{"line_number":502,"context_line":"                    if ([subnet.ipv6_ra_mode, subnet.ipv6_address_mode]"},{"line_number":503,"context_line":"                        in constants.DNSMASQ_PUBLIC_MODES):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Falc%3D","line":500,"updated":"2014-03-06 08:48:15.000000000","message":"Please consider changing L501-527 to the following:\n\n  if (is_public and\n      [subnet.ipv6_ra_mode, subnet.ipv6_address_mode]\n      in (onstants.DNSMASQ_PUBLIC_MODES):\n      commands \u003d self.spawn_process_ipv6_public(...)\n  elif (not is_public and\n        [subnet.ipv6_ra_mode, subnet.ipv6_address_mode]\n        in constants.DNSMASQ_NON_PUBLIC_MODES):\n      commands \u003d self.spawn_process_ipv6_non_public(...(\n  else:\n      LOG.debug(...)\n      continue\n\nIt can avoid the duplicated code.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":497,"context_line":""},{"line_number":498,"context_line":"            else:"},{"line_number":499,"context_line":"                namespace, interface_name, is_public \u003d self.subnet_type(subnet)"},{"line_number":500,"context_line":""},{"line_number":501,"context_line":"                if is_public:"},{"line_number":502,"context_line":"                    if ([subnet.ipv6_ra_mode, subnet.ipv6_address_mode]"},{"line_number":503,"context_line":"                        in constants.DNSMASQ_PUBLIC_MODES):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIUk%3D","line":500,"in_reply_to":"AAAAVn%2F%2Falc%3D","updated":"2014-03-13 18:48:22.000000000","message":"Good point! Done. Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                self._launch_dnsmasq(namespace,"},{"line_number":534,"context_line":"                                     cmdv6,"},{"line_number":535,"context_line":"                                     interface_name,"},{"line_number":536,"context_line":"                                     \u0027\u0027.join([\u0027ipv6-pid\u0027, str(i)]))"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        self._launch_dnsmasq(self.network.namespace,"},{"line_number":539,"context_line":"                             cmdv4,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaWM%3D","line":536,"updated":"2014-03-06 08:48:15.000000000","message":"If there is multiple IPv6 subnets, multiple dnsmasq processes for IPv6 will be launched. In my understading one dnsmasq process will be launched for IPv6. right?","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                self._launch_dnsmasq(namespace,"},{"line_number":534,"context_line":"                                     cmdv6,"},{"line_number":535,"context_line":"                                     interface_name,"},{"line_number":536,"context_line":"                                     \u0027\u0027.join([\u0027ipv6-pid\u0027, str(i)]))"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        self._launch_dnsmasq(self.network.namespace,"},{"line_number":539,"context_line":"                             cmdv4,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIUM%3D","line":536,"in_reply_to":"AAAAVn%2F%2FaWM%3D","updated":"2014-03-13 18:48:22.000000000","message":"There will be on dnsmasq process launched for each IPv6 subnet.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":535,"context_line":"                                     interface_name,"},{"line_number":536,"context_line":"                                     \u0027\u0027.join([\u0027ipv6-pid\u0027, str(i)]))"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        self._launch_dnsmasq(self.network.namespace,"},{"line_number":539,"context_line":"                             cmdv4,"},{"line_number":540,"context_line":"                             self.interface_name,"},{"line_number":541,"context_line":"                             \u0027pid\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaWg%3D","line":538,"updated":"2014-03-06 08:48:15.000000000","message":"It is outside of for-loop. It should be launched only if there is at least one IPv4 subnet.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":535,"context_line":"                                     interface_name,"},{"line_number":536,"context_line":"                                     \u0027\u0027.join([\u0027ipv6-pid\u0027, str(i)]))"},{"line_number":537,"context_line":""},{"line_number":538,"context_line":"        self._launch_dnsmasq(self.network.namespace,"},{"line_number":539,"context_line":"                             cmdv4,"},{"line_number":540,"context_line":"                             self.interface_name,"},{"line_number":541,"context_line":"                             \u0027pid\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FITY%3D","line":538,"in_reply_to":"AAAAVn%2F%2FaWg%3D","updated":"2014-03-13 18:48:22.000000000","message":"Hmm...Good point. I added a checkpoint before launching dnsmasq to make sure there is at least one IPv4 subnet available in the same network. Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":617,"context_line":"                                       self.conf.dhcp_domain)"},{"line_number":618,"context_line":"                set_tag \u003d \u0027\u0027"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"                for subnet in self.network.subnets:"},{"line_number":621,"context_line":"                    if (subnet.id \u003d\u003d alloc.subnet_id and"},{"line_number":622,"context_line":"                            subnet.ip_version \u003d\u003d 4):"},{"line_number":623,"context_line":"                        if getattr(port, \u0027extra_dhcp_opts\u0027, False):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FaVw%3D","line":620,"updated":"2014-03-06 08:48:15.000000000","message":"Same comments as the above.\nDo we want to prepare one hosts files per ip version?","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":617,"context_line":"                                       self.conf.dhcp_domain)"},{"line_number":618,"context_line":"                set_tag \u003d \u0027\u0027"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"                for subnet in self.network.subnets:"},{"line_number":621,"context_line":"                    if (subnet.id \u003d\u003d alloc.subnet_id and"},{"line_number":622,"context_line":"                            subnet.ip_version \u003d\u003d 4):"},{"line_number":623,"context_line":"                        if getattr(port, \u0027extra_dhcp_opts\u0027, False):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIRs%3D","line":620,"in_reply_to":"AAAAVn%2F%2FaVw%3D","updated":"2014-03-13 18:48:22.000000000","message":"Yes, We need separate hosts file for IPv4 and IPv6 subnet. The hosts file syntax is different. For example, IPv6 address should be presented as \"[ipv6_address]\".","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f59044331aa8a7f43ade66863b5431c26e7c7234","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"            ip_cidrs.append(ip_cidr)"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        if (self.conf.enable_isolated_metadata and"},{"line_number":1056,"context_line":"                self.conf.use_namespaces):"},{"line_number":1057,"context_line":"            ip_cidrs.append(METADATA_DEFAULT_CIDR)"},{"line_number":1058,"context_line":""},{"line_number":1059,"context_line":"        self.driver.init_l3(interface_name, ip_cidrs,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FSFE%3D","line":1056,"updated":"2014-03-07 03:20:57.000000000","message":"this change this not relevant.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"            ip_cidrs.append(ip_cidr)"},{"line_number":1054,"context_line":""},{"line_number":1055,"context_line":"        if (self.conf.enable_isolated_metadata and"},{"line_number":1056,"context_line":"                self.conf.use_namespaces):"},{"line_number":1057,"context_line":"            ip_cidrs.append(METADATA_DEFAULT_CIDR)"},{"line_number":1058,"context_line":""},{"line_number":1059,"context_line":"        self.driver.init_l3(interface_name, ip_cidrs,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FISk%3D","line":1056,"in_reply_to":"AAAAVn%2F%2FSFE%3D","updated":"2014-03-13 18:48:22.000000000","message":"Good catch! Not sure how come these spaces are added...Removed them in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        # There are two pid files."},{"line_number":177,"context_line":"        # One for IPv4 subnet saved in \u0027pid\u0027 file"},{"line_number":178,"context_line":"        # One for IPv6 subnet saved in \u0027pid-subnet.id\u0027 file"},{"line_number":179,"context_line":"        # Both should be processed to terminate dnsmasq process"},{"line_number":180,"context_line":"        # as part of \u0027disable\u0027 function\"\"\""},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FO4o%3D","line":178,"updated":"2014-03-19 10:47:56.000000000","message":"I hope you meant, \"ipv6-pid\" instead of \"pid-subnet\"","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        # There are two pid files."},{"line_number":177,"context_line":"        # One for IPv4 subnet saved in \u0027pid\u0027 file"},{"line_number":178,"context_line":"        # One for IPv6 subnet saved in \u0027pid-subnet.id\u0027 file"},{"line_number":179,"context_line":"        # Both should be processed to terminate dnsmasq process"},{"line_number":180,"context_line":"        # as part of \u0027disable\u0027 function\"\"\""},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_5e1ed160","line":178,"in_reply_to":"AAAAWH%2F%2FO4o%3D","updated":"2014-06-16 03:14:38.000000000","message":"That is correct. It should be \"ipv6-pidX\", which X is a number. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        # Both should be processed to terminate dnsmasq process"},{"line_number":180,"context_line":"        # as part of \u0027disable\u0027 function\"\"\""},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":183,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":184,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":185,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1m4%3D","line":182,"updated":"2014-03-13 14:01:02.000000000","message":"dnsmasq processes are stopped inside for-loop. Doesn\u0027t it mean dnsmasq for IPv4 is stopped multiple times? If one dnsmasq for IPv6, dnsmasq for IPv6 also needs to be outside of for-loop.\n\nI need to revisit the logic after I get a reply about launching dnsmasq processes below.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        # Both should be processed to terminate dnsmasq process"},{"line_number":180,"context_line":"        # as part of \u0027disable\u0027 function\"\"\""},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        for i, subnet in enumerate(self.network.subnets):"},{"line_number":183,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":184,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":185,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_5e6c11d1","line":182,"in_reply_to":"AAAAWH%2F%2F1m4%3D","updated":"2014-06-16 03:14:38.000000000","message":"Excellent point. I added a flag for ipv4 subnets so dnsmasq process is only bounced once. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":185,"context_line":"            else:"},{"line_number":186,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027\u0027.join([\u0027ipv6-pid\u0027,"},{"line_number":187,"context_line":"                                                     str(i)]))"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            if pid is None:"},{"line_number":190,"context_line":"                pid \u003d self.pid"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1mY%3D","line":187,"updated":"2014-03-13 14:01:02.000000000","message":"Consider \"ipv6-pid%s\" % i  instead.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"61a5bc9bad16b68c610a16e3d694102ba3096a0b","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":185,"context_line":"            else:"},{"line_number":186,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027\u0027.join([\u0027ipv6-pid\u0027,"},{"line_number":187,"context_line":"                                                     str(i)]))"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            if pid is None:"},{"line_number":190,"context_line":"                pid \u003d self.pid"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2Fiow%3D","line":187,"in_reply_to":"AAAAWH%2F%2F1mY%3D","updated":"2014-03-17 08:04:46.000000000","message":"+1","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027pid\u0027)"},{"line_number":185,"context_line":"            else:"},{"line_number":186,"context_line":"                pid \u003d self._get_value_from_conf_file(\u0027\u0027.join([\u0027ipv6-pid\u0027,"},{"line_number":187,"context_line":"                                                     str(i)]))"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            if pid is None:"},{"line_number":190,"context_line":"                pid \u003d self.pid"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_be6275d7","line":187,"in_reply_to":"AAAAWH%2F%2F1mY%3D","updated":"2014-06-16 03:14:38.000000000","message":"I like it. Done. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"61a5bc9bad16b68c610a16e3d694102ba3096a0b","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                pid \u003d self.pid"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"            if self.active:"},{"line_number":193,"context_line":"                cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, str(pid).strip(\u0027\\n\u0027)]"},{"line_number":194,"context_line":"                utils.execute(cmd, self.root_helper)"},{"line_number":195,"context_line":"                if not retain_port:"},{"line_number":196,"context_line":"                    self.device_manager.destroy(self.network,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2Finc%3D","line":193,"updated":"2014-03-17 08:04:46.000000000","message":"nit: may be it\u0027s more clear if you .strip(\u0027\\n\u0027) at your _get_value_from_conf_file above,\n instead of doing it at each kill..","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                pid \u003d self.pid"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"            if self.active:"},{"line_number":193,"context_line":"                cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, str(pid).strip(\u0027\\n\u0027)]"},{"line_number":194,"context_line":"                utils.execute(cmd, self.root_helper)"},{"line_number":195,"context_line":"                if not retain_port:"},{"line_number":196,"context_line":"                    self.device_manager.destroy(self.network,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_3e9e65b9","line":193,"in_reply_to":"AAAAWH%2F%2Finc%3D","updated":"2014-06-16 03:14:38.000000000","message":"I changed it to int value. So this string operation is gone. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"61a5bc9bad16b68c610a16e3d694102ba3096a0b","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                                                self.interface_name)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"            elif pid:"},{"line_number":200,"context_line":"                cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, str(pid).strip(\u0027\\n\u0027)]"},{"line_number":201,"context_line":"                utils.execute(cmd, self.root_helper)"},{"line_number":202,"context_line":"                if not retain_port:"},{"line_number":203,"context_line":"                    self.device_manager.destroy(self.network,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FinY%3D","line":200,"updated":"2014-03-17 08:04:46.000000000","message":"same nit ^","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                                                self.interface_name)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"            elif pid:"},{"line_number":200,"context_line":"                cmd \u003d [\u0027kill\u0027, \u0027-9\u0027, str(pid).strip(\u0027\\n\u0027)]"},{"line_number":201,"context_line":"                utils.execute(cmd, self.root_helper)"},{"line_number":202,"context_line":"                if not retain_port:"},{"line_number":203,"context_line":"                    self.device_manager.destroy(self.network,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_5ea33100","line":200,"in_reply_to":"AAAAWH%2F%2FinY%3D","updated":"2014-06-16 03:14:38.000000000","message":"I changed it to int value. So this string operation is gone. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                if not retain_port:"},{"line_number":203,"context_line":"                    self.device_manager.destroy(self.network,"},{"line_number":204,"context_line":"                                                self.interface_name)"},{"line_number":205,"context_line":"                LOG.debug(_(\u0027DHCP for IPv%(ip_version)s subnet %(subnet_id)s\u0027"},{"line_number":206,"context_line":"                            \u0027with pid %(pid)d is stale. Ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027ip_version\u0027: subnet.ip_version,"},{"line_number":208,"context_line":"                           \u0027subnet_id\u0027: self.network.id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FOng%3D","line":205,"updated":"2014-03-19 10:47:56.000000000","message":"This is not true. You are terminating the dnsmasq process associated to the pid in line number 200.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                if not retain_port:"},{"line_number":203,"context_line":"                    self.device_manager.destroy(self.network,"},{"line_number":204,"context_line":"                                                self.interface_name)"},{"line_number":205,"context_line":"                LOG.debug(_(\u0027DHCP for IPv%(ip_version)s subnet %(subnet_id)s\u0027"},{"line_number":206,"context_line":"                            \u0027with pid %(pid)d is stale. Ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027ip_version\u0027: subnet.ip_version,"},{"line_number":208,"context_line":"                           \u0027subnet_id\u0027: self.network.id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_af5b2154","line":205,"in_reply_to":"AAAAWH%2F%2FOng%3D","updated":"2014-06-16 03:14:38.000000000","message":"I rewrote this part of the code. Should fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"bc95ed5794a590be4a4669107f129b09498d5df8","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                            \u0027with pid %(pid)d is stale. Ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027ip_version\u0027: subnet.ip_version,"},{"line_number":208,"context_line":"                           \u0027subnet_id\u0027: self.network.id,"},{"line_number":209,"context_line":"                           \u0027pid\u0027: pid})"},{"line_number":210,"context_line":"            else:"},{"line_number":211,"context_line":"                LOG.debug(_(\u0027No DHCP started for IPv%(ip_version)s subnet\u0027"},{"line_number":212,"context_line":"                            \u0027 %(subnet_id)s\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F%2BGA%3D","line":209,"updated":"2014-03-14 13:41:07.000000000","message":"the code is identical to the \"if\" part with an addition of log msg. If the change is necessary, suggest to rearrange it. One way is to come up with a routine such as kill_dnsmasq().","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"61a5bc9bad16b68c610a16e3d694102ba3096a0b","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                            \u0027with pid %(pid)d is stale. Ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027ip_version\u0027: subnet.ip_version,"},{"line_number":208,"context_line":"                           \u0027subnet_id\u0027: self.network.id,"},{"line_number":209,"context_line":"                           \u0027pid\u0027: pid})"},{"line_number":210,"context_line":"            else:"},{"line_number":211,"context_line":"                LOG.debug(_(\u0027No DHCP started for IPv%(ip_version)s subnet\u0027"},{"line_number":212,"context_line":"                            \u0027 %(subnet_id)s\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2Fim4%3D","line":209,"in_reply_to":"AAAAWH%2F%2F%2BGA%3D","updated":"2014-03-17 08:04:46.000000000","message":"+1","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                            \u0027with pid %(pid)d is stale. Ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027ip_version\u0027: subnet.ip_version,"},{"line_number":208,"context_line":"                           \u0027subnet_id\u0027: self.network.id,"},{"line_number":209,"context_line":"                           \u0027pid\u0027: pid})"},{"line_number":210,"context_line":"            else:"},{"line_number":211,"context_line":"                LOG.debug(_(\u0027No DHCP started for IPv%(ip_version)s subnet\u0027"},{"line_number":212,"context_line":"                            \u0027 %(subnet_id)s\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_0ab40334","line":209,"in_reply_to":"AAAAWH%2F%2F%2BGA%3D","updated":"2014-06-16 03:14:38.000000000","message":"Created kill_dnsmasq method. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                            \u0027with pid %(pid)d is stale. Ignoring command\u0027),"},{"line_number":207,"context_line":"                          {\u0027ip_version\u0027: subnet.ip_version,"},{"line_number":208,"context_line":"                           \u0027subnet_id\u0027: self.network.id,"},{"line_number":209,"context_line":"                           \u0027pid\u0027: pid})"},{"line_number":210,"context_line":"            else:"},{"line_number":211,"context_line":"                LOG.debug(_(\u0027No DHCP started for IPv%(ip_version)s subnet\u0027"},{"line_number":212,"context_line":"                            \u0027 %(subnet_id)s\u0027),"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_2a80df48","line":209,"in_reply_to":"AAAAWH%2F%2Fim4%3D","updated":"2014-06-16 03:14:38.000000000","message":"Created kill_dnsmasq method. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                          {\u0027ip_version\u0027: subnet.ip_version,"},{"line_number":214,"context_line":"                           \u0027subnet_id\u0027: self.network.id})"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"            if not retain_port:"},{"line_number":217,"context_line":"                if self.conf.dhcp_delete_namespaces and self.network.namespace:"},{"line_number":218,"context_line":"                    ns_ip \u003d ip_lib.IPWrapper(self.root_helper,"},{"line_number":219,"context_line":"                                             self.network.namespace)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FOjE%3D","line":216,"updated":"2014-03-19 10:47:56.000000000","message":"This part of code cannot be in a loop as we would be deleting the namespace here. It would trigger an exception.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                          {\u0027ip_version\u0027: subnet.ip_version,"},{"line_number":214,"context_line":"                           \u0027subnet_id\u0027: self.network.id})"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"            if not retain_port:"},{"line_number":217,"context_line":"                if self.conf.dhcp_delete_namespaces and self.network.namespace:"},{"line_number":218,"context_line":"                    ns_ip \u003d ip_lib.IPWrapper(self.root_helper,"},{"line_number":219,"context_line":"                                             self.network.namespace)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_6a7ae778","line":216,"in_reply_to":"AAAAWH%2F%2FOjE%3D","updated":"2014-06-16 03:14:38.000000000","message":"I rewrote this code. Now it is out of the loop. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def dnsmasq_options_ipv6_public(self, subnet, set_tag, i, hosts_file):"},{"line_number":351,"context_line":"        cmd \u003d []"},{"line_number":352,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":353,"context_line":"        cmd.append(\u0027--enable-ra\u0027)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        if subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_STATEFUL:"},{"line_number":356,"context_line":"            for pool in subnet.allocation_pools:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FOWI%3D","line":353,"updated":"2014-03-19 10:47:56.000000000","message":"--enable-ra should be added only when dnsmasq is providing the Router Advts.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def dnsmasq_options_ipv6_public(self, subnet, set_tag, i, hosts_file):"},{"line_number":351,"context_line":"        cmd \u003d []"},{"line_number":352,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":353,"context_line":"        cmd.append(\u0027--enable-ra\u0027)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        if subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_STATEFUL:"},{"line_number":356,"context_line":"            for pool in subnet.allocation_pools:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_9eacd9f0","line":353,"in_reply_to":"AAAAWH%2F%2FOWI%3D","updated":"2014-06-16 03:14:38.000000000","message":"The function \"dnsmasq_options_ipv6_public\" is written to cover the use cases where dnsmasq provides RA.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c203779b727895f7169ac623f506e09eed446784","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def dnsmasq_options_ipv6_public(self, subnet, set_tag, i, hosts_file):"},{"line_number":351,"context_line":"        cmd \u003d []"},{"line_number":352,"context_line":"        cidr \u003d netaddr.IPNetwork(subnet.cidr)"},{"line_number":353,"context_line":"        cmd.append(\u0027--enable-ra\u0027)"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        if subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_STATEFUL:"},{"line_number":356,"context_line":"            for pool in subnet.allocation_pools:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FIQE%3D","line":353,"in_reply_to":"AAAAWH%2F%2FOWI%3D","updated":"2014-03-20 03:13:14.000000000","message":"This parameter will be overrided by the following --dhcp-range setting in each branch according to the man page:\nhttp://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html\n\nBut I agree we should only set this when RA is set to be provided by dnsmasq to make the code clearer.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"bc95ed5794a590be4a4669107f129b09498d5df8","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                          (set_tag, self._TAG_PREFIX % i,"},{"line_number":359,"context_line":"                           pool.start,"},{"line_number":360,"context_line":"                           pool.end,"},{"line_number":361,"context_line":"                           \u0027static\u0027,"},{"line_number":362,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F%2BAw%3D","line":361,"updated":"2014-03-14 13:41:07.000000000","message":"Extracted from the dnsmasq man page:\n\"The optional \u003cmode\u003e keyword may be static which tells dnsmasq to enable DHCP for the network specified, but not to dynamically allocate IP addresses: only hosts which have static addresses given via dhcp-host or from /etc/ethers will be served\"\n\nIt seems that with the \u0027static\u0027 keyword, start and end addresses are not needed\n\nAccording to https://www.dropbox.com/s/9bojvv9vywsz8sd/IPv6%20Two%20Modes%20v3.0.pdf\n ra-mode \u003d stateful, address-mode \u003d off: openstack sends RA only. So in this case, only the prefix (not the range) matters.\n ra-mode\u003d stateful, address-mode \u003d stateful: openstack allocates addresses, dnsmasq sends RA + stateful dhcp. that\u0027s why the use of \u0027static\u0027 mode, I guess.\n\nThe code can be simplified a lot as a result.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":358,"context_line":"                          (set_tag, self._TAG_PREFIX % i,"},{"line_number":359,"context_line":"                           pool.start,"},{"line_number":360,"context_line":"                           pool.end,"},{"line_number":361,"context_line":"                           \u0027static\u0027,"},{"line_number":362,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_fe8a3d63","line":361,"in_reply_to":"AAAAWH%2F%2F%2BAw%3D","updated":"2014-06-16 03:14:38.000000000","message":"I would like to point out that the dnsmasq MAN page has a lot of misleading information. The \u003cmode\u003e keyword is not really controlling the IPv6 flags in RA. I found a series of problem during my test based on sniffer trace and exchanged email with the author. I suggest everybody verify it by looking at the packets on the wire, instead of MAN page.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                           pool.start,"},{"line_number":360,"context_line":"                           pool.end,"},{"line_number":361,"context_line":"                           \u0027static\u0027,"},{"line_number":362,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL:"},{"line_number":365,"context_line":"                # If ipv6_address_mode is also DHCPv6_STATEFUL,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FPJY%3D","line":362,"updated":"2014-03-19 10:47:56.000000000","message":"I agree with Robert on the point that when mode is set to static, dnsmasq uses the mapping in the host file for allocations and does not dynamically allocate addresses for other clients.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                           pool.start,"},{"line_number":360,"context_line":"                           pool.end,"},{"line_number":361,"context_line":"                           \u0027static\u0027,"},{"line_number":362,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL:"},{"line_number":365,"context_line":"                # If ipv6_address_mode is also DHCPv6_STATEFUL,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_3eeca529","line":362,"in_reply_to":"AAAAWH%2F%2FIPM%3D","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to Robert\u0027s comment.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c203779b727895f7169ac623f506e09eed446784","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                           pool.start,"},{"line_number":360,"context_line":"                           pool.end,"},{"line_number":361,"context_line":"                           \u0027static\u0027,"},{"line_number":362,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL:"},{"line_number":365,"context_line":"                # If ipv6_address_mode is also DHCPv6_STATEFUL,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FIPM%3D","line":362,"in_reply_to":"AAAAWH%2F%2FPJY%3D","updated":"2014-03-20 03:13:14.000000000","message":"+1","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":359,"context_line":"                           pool.start,"},{"line_number":360,"context_line":"                           pool.end,"},{"line_number":361,"context_line":"                           \u0027static\u0027,"},{"line_number":362,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATEFUL:"},{"line_number":365,"context_line":"                # If ipv6_address_mode is also DHCPv6_STATEFUL,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_1ee7e947","line":362,"in_reply_to":"AAAAWH%2F%2FPJY%3D","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to Robert\u0027s comment.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":370,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":371,"context_line":"                           self._output_opts_file())"},{"line_number":372,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%s\u0027 % cidr.size)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        elif subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_STATELESS:"},{"line_number":375,"context_line":"            cmd.append(\u0027--dhcp-range\u003d%s%s,%s,%s,%ss\u0027 %"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FOaM%3D","line":372,"updated":"2014-03-19 10:47:56.000000000","message":"For IPV4 we are restricting the max leases to min(ipv4_size, self.conf.dnsmasq_lease_max) as a safety measure against DOS attacks.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":370,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":371,"context_line":"                           self._output_opts_file())"},{"line_number":372,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%s\u0027 % cidr.size)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"        elif subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_STATELESS:"},{"line_number":375,"context_line":"            cmd.append(\u0027--dhcp-range\u003d%s%s,%s,%s,%ss\u0027 %"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_0ab96315","line":372,"in_reply_to":"AAAAWH%2F%2FOaM%3D","updated":"2014-06-16 03:14:38.000000000","message":"Is there any way to lift this restriction? Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"bc95ed5794a590be4a4669107f129b09498d5df8","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            cmd.append(\u0027--dhcp-range\u003d%s%s,%s,%s,%ss\u0027 %"},{"line_number":376,"context_line":"                      (set_tag, self._TAG_PREFIX % i,"},{"line_number":377,"context_line":"                       cidr.network,"},{"line_number":378,"context_line":"                       \u0027ra-stateless\u0027,"},{"line_number":379,"context_line":"                       self.conf.dhcp_lease_duration))"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FsPQ%3D","line":378,"updated":"2014-03-14 13:41:07.000000000","message":"Extracted from the man page again:\n\"ra-stateless sends router advertisements with the O and A bits set, and provides a stateless DHCP service. The client will use a SLAAC address, and use DHCP for other configuration information.\"\n\nThis indicates that --dhcp-optsfile should be provided. But it seems to be used differently in here","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            cmd.append(\u0027--dhcp-range\u003d%s%s,%s,%s,%ss\u0027 %"},{"line_number":376,"context_line":"                      (set_tag, self._TAG_PREFIX % i,"},{"line_number":377,"context_line":"                       cidr.network,"},{"line_number":378,"context_line":"                       \u0027ra-stateless\u0027,"},{"line_number":379,"context_line":"                       self.conf.dhcp_lease_duration))"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_9eda1978","line":378,"in_reply_to":"AAAAWH%2F%2FsPQ%3D","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to line #361","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c203779b727895f7169ac623f506e09eed446784","unresolved":false,"context_lines":[{"line_number":375,"context_line":"            cmd.append(\u0027--dhcp-range\u003d%s%s,%s,%s,%ss\u0027 %"},{"line_number":376,"context_line":"                      (set_tag, self._TAG_PREFIX % i,"},{"line_number":377,"context_line":"                       cidr.network,"},{"line_number":378,"context_line":"                       \u0027ra-stateless\u0027,"},{"line_number":379,"context_line":"                       self.conf.dhcp_lease_duration))"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"            if subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FIOs%3D","line":378,"in_reply_to":"AAAAWH%2F%2FsPQ%3D","updated":"2014-03-20 03:13:14.000000000","message":"the optsfile is provided in line 386 but only when address mode is stateless at the same time.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"bc95ed5794a590be4a4669107f129b09498d5df8","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                          (set_tag, self._TAG_PREFIX % i,"},{"line_number":411,"context_line":"                           pool.start,"},{"line_number":412,"context_line":"                           pool.end,"},{"line_number":413,"context_line":"                           \u0027static\u0027,"},{"line_number":414,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":415,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":416,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FsKQ%3D","line":413,"updated":"2014-03-14 13:41:07.000000000","message":"again, I think that the start and end is not needed.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c203779b727895f7169ac623f506e09eed446784","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                          (set_tag, self._TAG_PREFIX % i,"},{"line_number":411,"context_line":"                           pool.start,"},{"line_number":412,"context_line":"                           pool.end,"},{"line_number":413,"context_line":"                           \u0027static\u0027,"},{"line_number":414,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":415,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":416,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FINQ%3D","line":413,"in_reply_to":"AAAAWH%2F%2Filw%3D","updated":"2014-03-20 03:13:14.000000000","message":"see comment at line 361","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                          (set_tag, self._TAG_PREFIX % i,"},{"line_number":411,"context_line":"                           pool.start,"},{"line_number":412,"context_line":"                           pool.end,"},{"line_number":413,"context_line":"                           \u0027static\u0027,"},{"line_number":414,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":415,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":416,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_bed7d54e","line":413,"in_reply_to":"AAAAWH%2F%2FsKQ%3D","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to line #361. I suggest you really try dnsmasq, instead of just relying on MAN page.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"61a5bc9bad16b68c610a16e3d694102ba3096a0b","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                          (set_tag, self._TAG_PREFIX % i,"},{"line_number":411,"context_line":"                           pool.start,"},{"line_number":412,"context_line":"                           pool.end,"},{"line_number":413,"context_line":"                           \u0027static\u0027,"},{"line_number":414,"context_line":"                           self.conf.dhcp_lease_duration))"},{"line_number":415,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":416,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2Filw%3D","line":413,"in_reply_to":"AAAAWH%2F%2FsKQ%3D","updated":"2014-03-17 08:04:46.000000000","message":"why not needed?","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"bc95ed5794a590be4a4669107f129b09498d5df8","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":416,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":417,"context_line":"                           self._output_opts_file())"},{"line_number":418,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%s\u0027 % cidr.size)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        elif subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS:"},{"line_number":421,"context_line":"            # If ipv6_address_mode is set to DHCPV6_STATELESS,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F%2FFE%3D","line":418,"updated":"2014-03-14 13:41:07.000000000","message":"line 415-418, outside the loop?","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":416,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":417,"context_line":"                           self._output_opts_file())"},{"line_number":418,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%s\u0027 % cidr.size)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        elif subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS:"},{"line_number":421,"context_line":"            # If ipv6_address_mode is set to DHCPV6_STATELESS,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_ea5277dd","line":418,"in_reply_to":"AAAAWH%2F%2F%2FFE%3D","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to line #361","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c203779b727895f7169ac623f506e09eed446784","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":416,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":417,"context_line":"                           self._output_opts_file())"},{"line_number":418,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%s\u0027 % cidr.size)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        elif subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS:"},{"line_number":421,"context_line":"            # If ipv6_address_mode is set to DHCPV6_STATELESS,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FINg%3D","line":418,"in_reply_to":"AAAAWH%2F%2F%2FFE%3D","updated":"2014-03-20 03:13:14.000000000","message":"if we don\u0027t need pool.start and pool.end, we don\u0027t even need the for loop, right?","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                cmd.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % hosts_file)"},{"line_number":416,"context_line":"                cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":417,"context_line":"                           self._output_opts_file())"},{"line_number":418,"context_line":"                cmd.append(\u0027--dhcp-lease-max\u003d%s\u0027 % cidr.size)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"        elif subnet.ipv6_address_mode \u003d\u003d constants.DHCPV6_STATELESS:"},{"line_number":421,"context_line":"            # If ipv6_address_mode is set to DHCPV6_STATELESS,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_0a5083d3","line":418,"in_reply_to":"AAAAWH%2F%2FINg%3D","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to line #361","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"0af12c44c57cb3038891d2ccc76ffd103d9e8b82","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            cmd.append(\u0027--dhcp-range\u003d%s%s,%s,%s,%ss\u0027 %"},{"line_number":424,"context_line":"                      (set_tag, self._TAG_PREFIX % i,"},{"line_number":425,"context_line":"                       cidr.network,"},{"line_number":426,"context_line":"                       \u0027static\u0027,"},{"line_number":427,"context_line":"                       self.conf.dhcp_lease_duration))"},{"line_number":428,"context_line":"            cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":429,"context_line":"                       self._output_opts_file())"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2Bnd8%3D","line":426,"updated":"2014-06-13 05:48:46.000000000","message":"Should the input to dnsmsq \"static\" when it acts as stateless server?","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":423,"context_line":"            cmd.append(\u0027--dhcp-range\u003d%s%s,%s,%s,%ss\u0027 %"},{"line_number":424,"context_line":"                      (set_tag, self._TAG_PREFIX % i,"},{"line_number":425,"context_line":"                       cidr.network,"},{"line_number":426,"context_line":"                       \u0027static\u0027,"},{"line_number":427,"context_line":"                       self.conf.dhcp_lease_duration))"},{"line_number":428,"context_line":"            cmd.append(\u0027--dhcp-optsfile\u003d%s\u0027 %"},{"line_number":429,"context_line":"                       self._output_opts_file())"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_2a5c5ff0","line":426,"in_reply_to":"AAAAWH%2F%2Bnd8%3D","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to line #361","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        # Switch the flag \"is_public\" to True"},{"line_number":439,"context_line":"        is_public \u003d False"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"        for port in self.network.ports:"},{"line_number":442,"context_line":"            for fixed_ips in port.fixed_ips:"},{"line_number":443,"context_line":"                if (fixed_ips.subnet_id \u003d\u003d subnet.id and"},{"line_number":444,"context_line":"                        port.device_owner \u003d\u003d \u0027network:router_interface\u0027):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1jk%3D","line":441,"updated":"2014-03-13 14:01:02.000000000","message":"Consider the following for L.442-456. It reduces for-loop for fixed_ips per port.\n\n  if port.device_owner !\u003d constants.DEVICE_OWNER_ROUTER_INTF:\n      continue\n  for fixed_ips in port.fixed_ips:\n      if fixed_ips.subnet_id \u003d\u003d subnet.id:\n          namespace \u003d ...\n          ....\n          return (namespace, interface_name, True)\n  # non public\n  return (self.network.namespace,\n          self.interface_name, False)","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        # Switch the flag \"is_public\" to True"},{"line_number":439,"context_line":"        is_public \u003d False"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"        for port in self.network.ports:"},{"line_number":442,"context_line":"            for fixed_ips in port.fixed_ips:"},{"line_number":443,"context_line":"                if (fixed_ips.subnet_id \u003d\u003d subnet.id and"},{"line_number":444,"context_line":"                        port.device_owner \u003d\u003d \u0027network:router_interface\u0027):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_2a037fbf","line":441,"in_reply_to":"AAAAWH%2F%2F1jk%3D","updated":"2014-06-16 03:14:38.000000000","message":"Good point! I adopted your recommendations in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        for port in self.network.ports:"},{"line_number":442,"context_line":"            for fixed_ips in port.fixed_ips:"},{"line_number":443,"context_line":"                if (fixed_ips.subnet_id \u003d\u003d subnet.id and"},{"line_number":444,"context_line":"                        port.device_owner \u003d\u003d \u0027network:router_interface\u0027):"},{"line_number":445,"context_line":"                    namespace \u003d (constants.ROUTER_NS_PREFIX +"},{"line_number":446,"context_line":"                                 str(port.device_id))"},{"line_number":447,"context_line":"                    interface_name \u003d (constants.ROUTER_INTERNAL_GW_PREFIX +"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1ls%3D","line":444,"updated":"2014-03-13 14:01:02.000000000","message":"Please use constants.DEVICE_OWNER_ROUTER_INTF instead.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":441,"context_line":"        for port in self.network.ports:"},{"line_number":442,"context_line":"            for fixed_ips in port.fixed_ips:"},{"line_number":443,"context_line":"                if (fixed_ips.subnet_id \u003d\u003d subnet.id and"},{"line_number":444,"context_line":"                        port.device_owner \u003d\u003d \u0027network:router_interface\u0027):"},{"line_number":445,"context_line":"                    namespace \u003d (constants.ROUTER_NS_PREFIX +"},{"line_number":446,"context_line":"                                 str(port.device_id))"},{"line_number":447,"context_line":"                    interface_name \u003d (constants.ROUTER_INTERNAL_GW_PREFIX +"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2Fy7E%3D","line":444,"in_reply_to":"AAAAWH%2F%2F1ls%3D","updated":"2014-06-16 03:14:38.000000000","message":"Good point! I adopted your recommendations in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":465,"context_line":"            \u0027--strict-order\u0027,"},{"line_number":466,"context_line":"            \u0027--bind-interfaces\u0027,"},{"line_number":467,"context_line":"            \u0027--leasefile-ro\u0027,"},{"line_number":468,"context_line":"            \u0027--port\u003d0\u0027,"},{"line_number":469,"context_line":"            \u0027--except-interface\u003dlo\u0027,"},{"line_number":470,"context_line":"        ]"},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1w4%3D","line":468,"updated":"2014-03-13 14:01:02.000000000","message":"This changes IPv4 behavior. Is it specific to IPv6?","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":465,"context_line":"            \u0027--strict-order\u0027,"},{"line_number":466,"context_line":"            \u0027--bind-interfaces\u0027,"},{"line_number":467,"context_line":"            \u0027--leasefile-ro\u0027,"},{"line_number":468,"context_line":"            \u0027--port\u003d0\u0027,"},{"line_number":469,"context_line":"            \u0027--except-interface\u003dlo\u0027,"},{"line_number":470,"context_line":"        ]"},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_3ed3c560","line":468,"in_reply_to":"AAAAWH%2F%2F1w4%3D","updated":"2014-06-16 03:14:38.000000000","message":"This will turn off DNS functions on dnsmasq. Not specific to IPv6","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":466,"context_line":"            \u0027--bind-interfaces\u0027,"},{"line_number":467,"context_line":"            \u0027--leasefile-ro\u0027,"},{"line_number":468,"context_line":"            \u0027--port\u003d0\u0027,"},{"line_number":469,"context_line":"            \u0027--except-interface\u003dlo\u0027,"},{"line_number":470,"context_line":"        ]"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FOUY%3D","line":469,"updated":"2014-03-19 10:47:56.000000000","message":"Setting the port to 0 disables the DNS functionality in dnsmasq.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            \u0027--except-interface\u003dlo\u0027,"},{"line_number":470,"context_line":"        ]"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":473,"context_line":"            set_tag \u003d \u0027set:\u0027"},{"line_number":474,"context_line":"        else:"},{"line_number":475,"context_line":"            set_tag \u003d \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FON8%3D","line":472,"updated":"2014-03-19 10:47:56.000000000","message":"We are making this check at multiple places in the code. Please consider storing it in some variable and use it instead of making this check.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                                          set_tag,"},{"line_number":499,"context_line":"                                          i,"},{"line_number":500,"context_line":"                                          ipv6_hosts_file,"},{"line_number":501,"context_line":"                                          cmdv6)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        if ipv4_size \u003e 0:"},{"line_number":504,"context_line":"            cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1uI%3D","line":501,"updated":"2014-03-13 14:01:02.000000000","message":"Why do we need dnsmasq process per IPv6 subnet? Is there a case we need to launch multiple IPv6 dnsmasq processes?","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                                          set_tag,"},{"line_number":499,"context_line":"                                          i,"},{"line_number":500,"context_line":"                                          ipv6_hosts_file,"},{"line_number":501,"context_line":"                                          cmdv6)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        if ipv4_size \u003e 0:"},{"line_number":504,"context_line":"            cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_1e3529a8","line":501,"in_reply_to":"AAAAWH%2F%2F1uI%3D","updated":"2014-06-16 03:14:38.000000000","message":"For IPv6 VM, it needs to install default route pointing to the Link Local Address by which RA is sent. So when dnsmasq sends RA, we need to make sure it is bounded to the right default gateway for that IPv6 subnet. For the same reason, we cannot use a single dnsmasq process for all IPv6 subnets.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c203779b727895f7169ac623f506e09eed446784","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                                          set_tag,"},{"line_number":499,"context_line":"                                          i,"},{"line_number":500,"context_line":"                                          ipv6_hosts_file,"},{"line_number":501,"context_line":"                                          cmdv6)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        if ipv4_size \u003e 0:"},{"line_number":504,"context_line":"            cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FILc%3D","line":501,"in_reply_to":"AAAAWH%2F%2F1uI%3D","updated":"2014-03-20 03:13:14.000000000","message":"maybe we can just combine the --dhcp-range of each subnet and spawn only one dnsmasq like IPv4. I also don\u0027t see the need to launch multiple dnsmasq.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                                          set_tag,"},{"line_number":499,"context_line":"                                          i,"},{"line_number":500,"context_line":"                                          ipv6_hosts_file,"},{"line_number":501,"context_line":"                                          cmdv6)"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        if ipv4_size \u003e 0:"},{"line_number":504,"context_line":"            cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_7e446d1b","line":501,"in_reply_to":"AAAAWH%2F%2FILc%3D","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to line #501","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        if ipv4_size \u003e 0:"},{"line_number":504,"context_line":"            cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"},{"line_number":505,"context_line":"            cmdv4.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":506,"context_line":"            self._launch_dnsmasq_ipv4(self.network.namespace,"},{"line_number":507,"context_line":"                                      cmdv4,"},{"line_number":508,"context_line":"                                      self.interface_name,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1oA%3D","line":505,"updated":"2014-03-13 14:01:02.000000000","message":"It seems L.504-505 should be a part of _launch_dnsmasq_ipv4.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":502,"context_line":""},{"line_number":503,"context_line":"        if ipv4_size \u003e 0:"},{"line_number":504,"context_line":"            cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"},{"line_number":505,"context_line":"            cmdv4.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":506,"context_line":"            self._launch_dnsmasq_ipv4(self.network.namespace,"},{"line_number":507,"context_line":"                                      cmdv4,"},{"line_number":508,"context_line":"                                      self.interface_name,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_fe66bdba","line":505,"in_reply_to":"AAAAWH%2F%2F1oA%3D","updated":"2014-06-16 03:14:38.000000000","message":"Done. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        if ipv4_size \u003e 0:"},{"line_number":504,"context_line":"            cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"},{"line_number":505,"context_line":"            cmdv4.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":506,"context_line":"            self._launch_dnsmasq_ipv4(self.network.namespace,"},{"line_number":507,"context_line":"                                      cmdv4,"},{"line_number":508,"context_line":"                                      self.interface_name,"},{"line_number":509,"context_line":"                                      \u0027pid\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FONQ%3D","line":506,"updated":"2014-03-19 10:47:56.000000000","message":"+1","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        if ipv4_size \u003e 0:"},{"line_number":504,"context_line":"            cmdv4.append(\u0027--dhcp-hostsfile\u003d%s\u0027 % ipv4_hosts_file)"},{"line_number":505,"context_line":"            cmdv4.append(\u0027--dhcp-optsfile\u003d%s\u0027 % self._output_opts_file())"},{"line_number":506,"context_line":"            self._launch_dnsmasq_ipv4(self.network.namespace,"},{"line_number":507,"context_line":"                                      cmdv4,"},{"line_number":508,"context_line":"                                      self.interface_name,"},{"line_number":509,"context_line":"                                      \u0027pid\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_1e0369bf","line":506,"in_reply_to":"AAAAWH%2F%2FONQ%3D","updated":"2014-06-16 03:14:38.000000000","message":"Agree. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self._launch_dnsmasq(namespace,"},{"line_number":545,"context_line":"                             cmdv6,"},{"line_number":546,"context_line":"                             interface_name,"},{"line_number":547,"context_line":"                             \u0027\u0027.join([\u0027ipv6-pid\u0027, str(i)]))"},{"line_number":548,"context_line":"        return True"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    def _launch_dnsmasq(self, namespace, cmd, interface_name,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1oc%3D","line":547,"updated":"2014-03-13 14:01:02.000000000","message":"Consider \u0027ipv6-pid%s\u0027 % i\n\nHonestly speaking, it seems better to delegate dnsmasq process managment to externalProcess module.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self._launch_dnsmasq(namespace,"},{"line_number":545,"context_line":"                             cmdv6,"},{"line_number":546,"context_line":"                             interface_name,"},{"line_number":547,"context_line":"                             \u0027\u0027.join([\u0027ipv6-pid\u0027, str(i)]))"},{"line_number":548,"context_line":"        return True"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"    def _launch_dnsmasq(self, namespace, cmd, interface_name,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_9ef699d7","line":547,"in_reply_to":"AAAAWH%2F%2F1oc%3D","updated":"2014-06-16 03:14:38.000000000","message":"Done. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"bc95ed5794a590be4a4669107f129b09498d5df8","unresolved":false,"context_lines":[{"line_number":569,"context_line":"            cmd.append(\u0027--domain\u003d%s\u0027 % self.conf.dhcp_domain)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(self.root_helper,"},{"line_number":572,"context_line":"                                      self.network.namespace)"},{"line_number":573,"context_line":"        ip_wrapper.netns.execute(cmd, addl_env\u003denv)"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"    def _release_lease(self, mac_address, ip):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FwGM%3D","line":572,"updated":"2014-03-14 13:41:07.000000000","message":"it should be the \u0027namespace\u0027 from the method\u0027s input argument.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":569,"context_line":"            cmd.append(\u0027--domain\u003d%s\u0027 % self.conf.dhcp_domain)"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"        ip_wrapper \u003d ip_lib.IPWrapper(self.root_helper,"},{"line_number":572,"context_line":"                                      self.network.namespace)"},{"line_number":573,"context_line":"        ip_wrapper.netns.execute(cmd, addl_env\u003denv)"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"    def _release_lease(self, mac_address, ip):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_bef355e6","line":572,"in_reply_to":"AAAAWH%2F%2FwGM%3D","updated":"2014-06-16 03:14:38.000000000","message":"Good catch! Fixed it! Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7515,"name":"Jian LI","email":"ljianbj@cn.ibm.com","username":"leejian0612"},"change_message_id":"59de0fba66f8691ddebd227d464ee015d14b1901","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        self._release_unused_leases()"},{"line_number":593,"context_line":"        self._output_hosts_file()"},{"line_number":594,"context_line":"        self._output_opts_file()"},{"line_number":595,"context_line":"        if self.active:"},{"line_number":596,"context_line":"            cmd \u003d [\u0027kill\u0027, \u0027-HUP\u0027, str(self.pid)]"},{"line_number":597,"context_line":"            utils.execute(cmd, self.root_helper)"},{"line_number":598,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7adec928_6579aac7","line":595,"updated":"2014-05-19 03:41:14.000000000","message":"if an ipv6 network works on dhcpv6 stateful mode, when a VM created,the function-- reload_allocations() will be called, and some changes will be made to bind its mac address and ipv6 address in its dhcp-hostsfile, then reload the dnsmasq to make these change work,  but at this time, self.active will return false,since it based on ipv4\u0027s pid file,not the ipv6\u0027s,so the cmd \"kill -HBP self.pid\" won\u0027t execute, dnsmasq won\u0027t be reloaded,and the error no address available will be produced.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        self._release_unused_leases()"},{"line_number":593,"context_line":"        self._output_hosts_file()"},{"line_number":594,"context_line":"        self._output_opts_file()"},{"line_number":595,"context_line":"        if self.active:"},{"line_number":596,"context_line":"            cmd \u003d [\u0027kill\u0027, \u0027-HUP\u0027, str(self.pid)]"},{"line_number":597,"context_line":"            utils.execute(cmd, self.root_helper)"},{"line_number":598,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_1e2a892f","line":595,"in_reply_to":"7adec928_45c8e354","updated":"2014-06-16 03:14:38.000000000","message":"See my reply to line #595","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        self._release_unused_leases()"},{"line_number":593,"context_line":"        self._output_hosts_file()"},{"line_number":594,"context_line":"        self._output_opts_file()"},{"line_number":595,"context_line":"        if self.active:"},{"line_number":596,"context_line":"            cmd \u003d [\u0027kill\u0027, \u0027-HUP\u0027, str(self.pid)]"},{"line_number":597,"context_line":"            utils.execute(cmd, self.root_helper)"},{"line_number":598,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_fefdddb2","line":595,"in_reply_to":"7adec928_6579aac7","updated":"2014-06-16 03:14:38.000000000","message":"Every good point, Jian! I had a meeting with Xu Han and she mentioned it too. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"0bc02cd8d907280c8573c0c38d2a64b6b0773d93","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        self._release_unused_leases()"},{"line_number":593,"context_line":"        self._output_hosts_file()"},{"line_number":594,"context_line":"        self._output_opts_file()"},{"line_number":595,"context_line":"        if self.active:"},{"line_number":596,"context_line":"            cmd \u003d [\u0027kill\u0027, \u0027-HUP\u0027, str(self.pid)]"},{"line_number":597,"context_line":"            utils.execute(cmd, self.root_helper)"},{"line_number":598,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7adec928_45c8e354","line":595,"in_reply_to":"7adec928_6579aac7","updated":"2014-05-19 14:20:59.000000000","message":"I\u0027ve seen similar issues during my test. \nThe design of this module is based on one instance per network. This suggests that for ipv6, the change made to launch one instance per subnet doesn\u0027t fit the design.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    # Save host information to to different files"},{"line_number":604,"context_line":"    # File \u0027host\" for IPv4 subnet"},{"line_number":605,"context_line":"    # File \u0027ipv6host\" for IPv6 subnet"},{"line_number":606,"context_line":"    def _output_hosts_file(self):"},{"line_number":607,"context_line":"        \"\"\"Writes a dnsmasq compatible hosts file.\"\"\""},{"line_number":608,"context_line":"        r \u003d re.compile(\u0027[:.]\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F12A%3D","line":605,"updated":"2014-03-13 14:01:02.000000000","message":"Please consider moving it to the docstring below.\n\n  \"\"\"Writes a dnsmasq compatible file.\n\n  Store IPv4 and IPv6 host information to different file.\n  ....\n  \"\"\"","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    # Save host information to to different files"},{"line_number":604,"context_line":"    # File \u0027host\" for IPv4 subnet"},{"line_number":605,"context_line":"    # File \u0027ipv6host\" for IPv6 subnet"},{"line_number":606,"context_line":"    def _output_hosts_file(self):"},{"line_number":607,"context_line":"        \"\"\"Writes a dnsmasq compatible hosts file.\"\"\""},{"line_number":608,"context_line":"        r \u003d re.compile(\u0027[:.]\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_7e29cd36","line":605,"in_reply_to":"AAAAWH%2F%2F12A%3D","updated":"2014-06-16 03:14:38.000000000","message":"Done. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":614,"context_line":"                name \u003d \u0027host-%s.%s\u0027 % (r.sub(\u0027-\u0027, alloc.ip_address),"},{"line_number":615,"context_line":"                                       self.conf.dhcp_domain)"},{"line_number":616,"context_line":"                set_tag \u003d \u0027\u0027"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"                for subnet in self.network.subnets:"},{"line_number":619,"context_line":"                    if (subnet.id \u003d\u003d alloc.subnet_id and"},{"line_number":620,"context_line":"                            subnet.ip_version \u003d\u003d 4):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F1yQ%3D","line":617,"updated":"2014-03-13 14:01:02.000000000","message":"Almost all of L.621-633 and L.638-656 are duplicated. Please consider changing L.618-657 to the following:\n\n  ip_address \u003d alloc.ip_address\n  is_ipv6 \u003d netaddr.valid_ipv6(ip_address)\n  if is_ipv6:\n      ip_address \u003d \u0027[%s]\u0027 % ip_address\n  if getattr(port, \u0027extra_dhcp_opts\u0027, False):\n      if self.version \u003e\u003d self.MINIMUM_VERSION:\n          set_tag \u003d \u0027set:\u0027\n      host_data \u003d \u0027%s,%s,%s,%s%s\\n\u0027 % (port.mac_address, ....)\n  else:\n      host_data \u003d \u0027%s,%s,%s\\n\u0027 % (port.mac_address, name, alloc.ip_address)\n  if is_ipv6:\n    buf6.write(host_data)\n  else:\n    buf.write(host_data)","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":614,"context_line":"                name \u003d \u0027host-%s.%s\u0027 % (r.sub(\u0027-\u0027, alloc.ip_address),"},{"line_number":615,"context_line":"                                       self.conf.dhcp_domain)"},{"line_number":616,"context_line":"                set_tag \u003d \u0027\u0027"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"                for subnet in self.network.subnets:"},{"line_number":619,"context_line":"                    if (subnet.id \u003d\u003d alloc.subnet_id and"},{"line_number":620,"context_line":"                            subnet.ip_version \u003d\u003d 4):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_e4a7104f","line":617,"in_reply_to":"AAAAWH%2F%2F1yQ%3D","updated":"2014-06-16 03:14:38.000000000","message":"This is great tip! Done! Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        for ip, mac in old_leases - new_leases:"},{"line_number":686,"context_line":"            self._release_lease(mac, ip)"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    # Separate IPv4 and IPv6 entries in opts file"},{"line_number":689,"context_line":"    def _output_opts_file(self):"},{"line_number":690,"context_line":"        \"\"\"Write a dnsmasq compatible options file.\"\"\""},{"line_number":691,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F12g%3D","line":688,"updated":"2014-03-13 14:01:02.000000000","message":"Please consider moving it in the docstring below.\n\n \"\"\"Write a dnsmasq compatible options file.\n\n IPv4 and IPv6 entries are stored in different files.\n \"\"\"","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        for ip, mac in old_leases - new_leases:"},{"line_number":686,"context_line":"            self._release_lease(mac, ip)"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    # Separate IPv4 and IPv6 entries in opts file"},{"line_number":689,"context_line":"    def _output_opts_file(self):"},{"line_number":690,"context_line":"        \"\"\"Write a dnsmasq compatible options file.\"\"\""},{"line_number":691,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_646b00f2","line":688,"in_reply_to":"AAAAWH%2F%2F12g%3D","updated":"2014-06-16 03:14:38.000000000","message":"Done. Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":819,"context_line":"        \"\"\"Format DHCP option by option name or code.\"\"\""},{"line_number":820,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":821,"context_line":"            set_tag \u003d \u0027tag:\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F13k%3D","line":818,"updated":"2014-03-13 14:01:02.000000000","message":"The only different from _format_option above is a option keyword name: option vs option6. Please consider passing IP version to _format_option. It requires to change the existing signature of _format_option but it is a private method and I think it is no problem.\n\n  def _format_option(self, tag, option, ip_version, *args)","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":815,"context_line":""},{"line_number":816,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":819,"context_line":"        \"\"\"Format DHCP option by option name or code.\"\"\""},{"line_number":820,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":821,"context_line":"            set_tag \u003d \u0027tag:\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_ef8d297e","line":818,"in_reply_to":"AAAAWH%2F%2F13k%3D","updated":"2014-06-16 03:14:38.000000000","message":"Good point. Fixed it in the Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"563b4b70d8acb66f33876f9f9c06c7a3651ce2fc","unresolved":false,"context_lines":[{"line_number":816,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":819,"context_line":"        \"\"\"Format DHCP option by option name or code.\"\"\""},{"line_number":820,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":821,"context_line":"            set_tag \u003d \u0027tag:\u0027"},{"line_number":822,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FOPk%3D","line":819,"updated":"2014-03-19 10:47:56.000000000","message":"Please consider having a single API for framing the options. May be you can consider passing the string (option/option6) depending on the type of subnet.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":816,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":817,"context_line":""},{"line_number":818,"context_line":"    def _format_option6(self, tag, option, *args):"},{"line_number":819,"context_line":"        \"\"\"Format DHCP option by option name or code.\"\"\""},{"line_number":820,"context_line":"        if self.version \u003e\u003d self.MINIMUM_VERSION:"},{"line_number":821,"context_line":"            set_tag \u003d \u0027tag:\u0027"},{"line_number":822,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_4fec5d2a","line":819,"in_reply_to":"AAAAWH%2F%2FOPk%3D","updated":"2014-06-16 03:14:38.000000000","message":"I passed in the ip_version value. Fixed it in the Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"61a5bc9bad16b68c610a16e3d694102ba3096a0b","unresolved":false,"context_lines":[{"line_number":830,"context_line":"        if not option.isdigit():"},{"line_number":831,"context_line":"            option \u003d \u0027option6:%s\u0027 % option"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":834,"context_line":""},{"line_number":835,"context_line":"    def _enable_metadata(self, subnet):"},{"line_number":836,"context_line":"        \u0027\u0027\u0027Determine if the metadata route will be pushed to hosts on subnet."}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2Fiic%3D","line":833,"updated":"2014-03-17 08:04:46.000000000","message":"\u0027%s\u0027 % option  -\u003e   option\n\nno need for \u0027%s\u0027, right?.","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":830,"context_line":"        if not option.isdigit():"},{"line_number":831,"context_line":"            option \u003d \u0027option6:%s\u0027 % option"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"        return \u0027,\u0027.join((set_tag + tag, \u0027%s\u0027 % option) + args)"},{"line_number":834,"context_line":""},{"line_number":835,"context_line":"    def _enable_metadata(self, subnet):"},{"line_number":836,"context_line":"        \u0027\u0027\u0027Determine if the metadata route will be pushed to hosts on subnet."}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_efbb690d","line":833,"in_reply_to":"AAAAWH%2F%2Fiic%3D","updated":"2014-06-16 03:14:38.000000000","message":"Good catch! Fixed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"}],"neutron/common/constants.py":[{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"f59044331aa8a7f43ade66863b5431c26e7c7234","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"DHCPV6_STATEFUL \u003d \u0027dhcpv6-stateful\u0027"},{"line_number":114,"context_line":"DHCPV6_STATELESS \u003d \u0027dhcpv6-stateless\u0027"},{"line_number":115,"context_line":"DHCPV6_OFF \u003d \u0027off\u0027"},{"line_number":116,"context_line":"IPV6_SLAAC \u003d \u0027slaac\u0027"},{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FSB8%3D","line":115,"updated":"2014-03-07 03:20:57.000000000","message":"This will never be set based on parent patch https://review.openstack.org/#/c/52983/. None is equal to off. See my comments in dhcp.py.","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"DHCPV6_STATEFUL \u003d \u0027dhcpv6-stateful\u0027"},{"line_number":114,"context_line":"DHCPV6_STATELESS \u003d \u0027dhcpv6-stateless\u0027"},{"line_number":115,"context_line":"DHCPV6_OFF \u003d \u0027off\u0027"},{"line_number":116,"context_line":"IPV6_SLAAC \u003d \u0027slaac\u0027"},{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIc0%3D","line":115,"in_reply_to":"AAAAVn%2F%2FSB8%3D","updated":"2014-03-13 18:48:22.000000000","message":"I prefer we use \u0027off\u0027 instead of None, simply for easier coding, validation, and testing. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":116,"context_line":"IPV6_SLAAC \u003d \u0027slaac\u0027"},{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"NS_PREFIX \u003d \u0027qrouter-\u0027"},{"line_number":120,"context_line":"INTERNAL_DEV_PREFIX \u003d \u0027qr-\u0027"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"DNSMASQ_NON_PUBLIC_MODES \u003d [[DHCPV6_OFF, DHCPV6_STATEFUL],"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2Farc%3D","line":119,"updated":"2014-03-06 08:48:15.000000000","message":"It should have a prefix indicating a router namespace: ROUTER_NS_PREFIX","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":116,"context_line":"IPV6_SLAAC \u003d \u0027slaac\u0027"},{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"NS_PREFIX \u003d \u0027qrouter-\u0027"},{"line_number":120,"context_line":"INTERNAL_DEV_PREFIX \u003d \u0027qr-\u0027"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"DNSMASQ_NON_PUBLIC_MODES \u003d [[DHCPV6_OFF, DHCPV6_STATEFUL],"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIcw%3D","line":119,"in_reply_to":"AAAAVn%2F%2Farc%3D","updated":"2014-03-13 18:48:22.000000000","message":"Done. Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a07d7995ddf491787e2a9263aba41f2ab8545f67","unresolved":false,"context_lines":[{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"NS_PREFIX \u003d \u0027qrouter-\u0027"},{"line_number":120,"context_line":"INTERNAL_DEV_PREFIX \u003d \u0027qr-\u0027"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"DNSMASQ_NON_PUBLIC_MODES \u003d [[DHCPV6_OFF, DHCPV6_STATEFUL],"},{"line_number":123,"context_line":"                            [DHCPV6_OFF, DHCPV6_STATELESS], ]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FarY%3D","line":120,"updated":"2014-03-06 08:48:15.000000000","message":"Ditto","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"706cd9fae3ba732b3408ee5efc42252bed8e8649","unresolved":false,"context_lines":[{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"NS_PREFIX \u003d \u0027qrouter-\u0027"},{"line_number":120,"context_line":"INTERNAL_DEV_PREFIX \u003d \u0027qr-\u0027"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"DNSMASQ_NON_PUBLIC_MODES \u003d [[DHCPV6_OFF, DHCPV6_STATEFUL],"},{"line_number":123,"context_line":"                            [DHCPV6_OFF, DHCPV6_STATELESS], ]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAVn%2F%2FIck%3D","line":120,"in_reply_to":"AAAAVn%2F%2FarY%3D","updated":"2014-03-13 18:48:22.000000000","message":"Done. Changed it to \"ROUTER_INTERNAL_GW_PREFIX\". Will be included in Patch 15. Thanks!","commit_id":"ec96bf548f7bb6b83741cf202687bf504aa5576a"},{"author":{"_account_id":8278,"name":"Dazhao Yu","email":"dazhaoyu@gmail.com","username":"Dazhao"},"change_message_id":"f749c303842799bd285b9e1e1f5201e92ca0668d","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"DHCPV6_STATEFUL \u003d \u0027dhcpv6-stateful\u0027"},{"line_number":114,"context_line":"DHCPV6_STATELESS \u003d \u0027dhcpv6-stateless\u0027"},{"line_number":115,"context_line":"DHCPV6_OFF \u003d \u0027off\u0027"},{"line_number":116,"context_line":"IPV6_SLAAC \u003d \u0027slaac\u0027"},{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2FXg8%3D","line":115,"updated":"2014-04-22 09:25:38.000000000","message":"DHCPV6_OFF should be None","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"DHCPV6_STATEFUL \u003d \u0027dhcpv6-stateful\u0027"},{"line_number":114,"context_line":"DHCPV6_STATELESS \u003d \u0027dhcpv6-stateless\u0027"},{"line_number":115,"context_line":"DHCPV6_OFF \u003d \u0027off\u0027"},{"line_number":116,"context_line":"IPV6_SLAAC \u003d \u0027slaac\u0027"},{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1ae5cdf2_ea17d7ec","line":115,"in_reply_to":"AAAAXH%2F%2FXg8%3D","updated":"2014-06-16 03:14:38.000000000","message":"True. Changed it in Patch 16. Thanks!","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f25be430829a65b78d72172d5a332d66958c69ab","unresolved":false,"context_lines":[{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"ROUTER_NS_PREFIX \u003d \u0027qrouter-\u0027"},{"line_number":120,"context_line":"ROUTER_INTERNAL_GW_PREFIX \u003d \u0027qr-\u0027"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"DNSMASQ_NON_PUBLIC_MODES \u003d [[DHCPV6_OFF, DHCPV6_STATEFUL],"},{"line_number":123,"context_line":"                            [DHCPV6_OFF, DHCPV6_STATELESS], ]"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2F18c%3D","line":120,"updated":"2014-03-13 14:01:02.000000000","message":"GW sounds odd because router gateway port is different from router internal interface. gateway port has a different prefix \"qg-\".","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":9464,"name":"Shixiong Shang","email":"sparkofwisdom.cloud@gmail.com","username":"sparkofwisdom.cloud"},"change_message_id":"360ded79a17435f484f8f6d1acc6999a0bdfeee7","unresolved":false,"context_lines":[{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"ROUTER_NS_PREFIX \u003d \u0027qrouter-\u0027"},{"line_number":120,"context_line":"ROUTER_INTERNAL_GW_PREFIX \u003d \u0027qr-\u0027"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"DNSMASQ_NON_PUBLIC_MODES \u003d [[DHCPV6_OFF, DHCPV6_STATEFUL],"},{"line_number":123,"context_line":"                            [DHCPV6_OFF, DHCPV6_STATELESS], ]"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2Fy8U%3D","line":120,"in_reply_to":"AAAAWH%2F%2F18c%3D","updated":"2014-06-16 03:14:38.000000000","message":"Done. I will replace it with \"ROUTER_INTERNAL_INTF_PREFIX\"","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c203779b727895f7169ac623f506e09eed446784","unresolved":false,"context_lines":[{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"ROUTER_NS_PREFIX \u003d \u0027qrouter-\u0027"},{"line_number":120,"context_line":"ROUTER_INTERNAL_GW_PREFIX \u003d \u0027qr-\u0027"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"DNSMASQ_NON_PUBLIC_MODES \u003d [[DHCPV6_OFF, DHCPV6_STATEFUL],"},{"line_number":123,"context_line":"                            [DHCPV6_OFF, DHCPV6_STATELESS], ]"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAWH%2F%2FIS8%3D","line":120,"in_reply_to":"AAAAWH%2F%2F18c%3D","updated":"2014-03-20 03:13:14.000000000","message":"Maybe just move the constants in l3_agent.py here?\n\nINTERNAL_DEV_PREFIX \u003d \u0027qr-\u0027\nEXTERNAL_DEV_PREFIX \u003d \u0027qg-\u0027","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"},{"author":{"_account_id":10257,"name":"Sridhar Gaddam","email":"sgaddam@redhat.com","username":"sridhargaddam"},"change_message_id":"9dc79a2f1e634ad6ed4a1f13d32abae9b8593f27","unresolved":false,"context_lines":[{"line_number":117,"context_line":"IPV6_MODES \u003d [DHCPV6_STATEFUL, DHCPV6_STATELESS, IPV6_SLAAC]"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"ROUTER_NS_PREFIX \u003d \u0027qrouter-\u0027"},{"line_number":120,"context_line":"ROUTER_INTERNAL_GW_PREFIX \u003d \u0027qr-\u0027"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"DNSMASQ_NON_PUBLIC_MODES \u003d [[DHCPV6_OFF, DHCPV6_STATEFUL],"},{"line_number":123,"context_line":"                            [DHCPV6_OFF, DHCPV6_STATELESS], ]"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAXH%2F%2F7HY%3D","line":120,"in_reply_to":"AAAAWH%2F%2FIS8%3D","updated":"2014-04-16 13:48:39.000000000","message":"+1","commit_id":"21832bb19bd5bff2820fda5d72082de41fce4cbe"}],"neutron/tests/unit/test_linux_dhcp.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"3e92cec0ff0d9d8d1b461aa2686b65aa13a136cc","unresolved":false,"context_lines":[{"line_number":684,"context_line":"        for i, subnet in enumerate(network.subnets):"},{"line_number":685,"context_line":"            if subnet.ip_version \u003d\u003d 4:"},{"line_number":686,"context_line":"                expected4 \u003d list(expected_base)"},{"line_number":687,"context_line":"                expected4.append("},{"line_number":688,"context_line":"                    \u0027--dhcp-range\u003dset:tag%s,%s,static,86400s\u0027 %"},{"line_number":689,"context_line":"                    (i, subnet.cidr.split(\u0027/\u0027)[0]))"},{"line_number":690,"context_line":"                expected4.append(\u0027--dhcp-optsfile\u003d/dhcp/%s/opts\u0027 % network.id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2Fovg%3D","line":687,"updated":"2014-03-04 22:47:58.000000000","message":"Please use extend vs calling append\n\nexpected4.extend([\n\u003clist of options here\u003e\n])","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"3e92cec0ff0d9d8d1b461aa2686b65aa13a136cc","unresolved":false,"context_lines":[{"line_number":689,"context_line":"                    (i, subnet.cidr.split(\u0027/\u0027)[0]))"},{"line_number":690,"context_line":"                expected4.append(\u0027--dhcp-optsfile\u003d/dhcp/%s/opts\u0027 % network.id)"},{"line_number":691,"context_line":"                expected4.append(\u0027--dhcp-hostsfile\u003d/dhcp/%s/host\u0027 % network.id)"},{"line_number":692,"context_line":"                expected4.append(\u0027--dhcp-lease-max\u003d256\u0027)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"                expected4.append(\u0027--interface\u003dtap0\u0027)"},{"line_number":695,"context_line":"                expected4.append(\u0027--pid-file\u003d/dhcp/%s/pid\u0027 % network.id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2Fot8%3D","line":692,"updated":"2014-03-04 22:47:58.000000000","message":"Why is max leases now capped?","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"3e92cec0ff0d9d8d1b461aa2686b65aa13a136cc","unresolved":false,"context_lines":[{"line_number":696,"context_line":"                expected4.extend(extra_options)"},{"line_number":697,"context_line":""},{"line_number":698,"context_line":"            else:"},{"line_number":699,"context_line":"                expected6 \u003d list(expected_base)"},{"line_number":700,"context_line":"                expected6.append(\u0027--enable-ra\u0027)"},{"line_number":701,"context_line":"                if subnet.ipv6_ra_mode \u003d\u003d constants.DHCPV6_STATEFUL:"},{"line_number":702,"context_line":"                    for pool in subnet.allocation_pools:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAVn%2F%2Fosc%3D","line":699,"updated":"2014-03-04 22:47:58.000000000","message":"Why all of this extra logic?  Seems like this should be broken out into discrete methods that return the list of options.\n\ndef _make_expected_v4_options(subnet):\n\ndef _make_expected_v6_options(subnet):","commit_id":"2d3e6ed58f481824912a324309a4904d4453fd13"}]}
