)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"9f99913cc320a405a8da8fee19d2dc710cb3eac5","unresolved":false,"context_lines":[{"line_number":21,"context_line":"YouTube:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"https://www.youtube.com/watch?v\u003dwI830s881HQ"},{"line_number":24,"context_line":"https://www.youtube.com/watch?v\u003dzfsFyS01Fn0"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Co-Authored-By: Baodong (Robert) Li \u003cbaoli@cisco.com\u003e"},{"line_number":27,"context_line":"Co-Authored-By: Sam Betts \u003csam@code-smash.net\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"fa1b9901_723127a2","line":24,"updated":"2015-08-17 20:15:43.000000000","message":"I don\u0027t think L16-24 should be in a commit message. I don\u0027t think many end users read git logs, and lets assume they can use google.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":21,"context_line":"YouTube:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"https://www.youtube.com/watch?v\u003dwI830s881HQ"},{"line_number":24,"context_line":"https://www.youtube.com/watch?v\u003dzfsFyS01Fn0"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Co-Authored-By: Baodong (Robert) Li \u003cbaoli@cisco.com\u003e"},{"line_number":27,"context_line":"Co-Authored-By: Sam Betts \u003csam@code-smash.net\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"fa1b9901_184793bc","line":24,"in_reply_to":"fa1b9901_723127a2","updated":"2015-08-19 12:24:06.000000000","message":"These are here to help with the review process. I\u0027d rather leave them in as this is a large feature requiring a complex network setup to completely demonstrate the functionality.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"}],"etc/neutron.conf":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":170,"context_line":"# (StrOpt) Driver used for prefix delegation by the l3 agent. This needs to be"},{"line_number":171,"context_line":"# an entry point defined in the neutron.agent.linux.pd_drivers namespace. See"},{"line_number":172,"context_line":"# setup.cfg for entry points included with the neutron source."},{"line_number":173,"context_line":"# pd_dhcp_driver \u003d dibbler"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for MTU selection and advertisement \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":176,"context_line":"# Advertise MTU.  If True, effort is made to advertise MTU"}],"source_content_type":"text/plain","patch_set":16,"id":"1a4dcd0f_4d0c203b","line":173,"updated":"2015-08-05 22:49:27.000000000","message":"nit:  I know why dhcp is in the name but I wonder if it needs to be there.  It is implied by the term prefix delegation in my mind.  I wonder if prefix_delegation_driver would be a better name.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":170,"context_line":"# (StrOpt) Driver used for prefix delegation by the l3 agent. This needs to be"},{"line_number":171,"context_line":"# an entry point defined in the neutron.agent.linux.pd_drivers namespace. See"},{"line_number":172,"context_line":"# setup.cfg for entry points included with the neutron source."},{"line_number":173,"context_line":"# pd_dhcp_driver \u003d dibbler"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for MTU selection and advertisement \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":176,"context_line":"# Advertise MTU.  If True, effort is made to advertise MTU"}],"source_content_type":"text/plain","patch_set":16,"id":"1a4dcd0f_2d016605","line":173,"in_reply_to":"1a4dcd0f_4d0c203b","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"c5fdddada40a7b3f0753bbbe108bdc16f49c49ce","unresolved":false,"context_lines":[{"line_number":170,"context_line":"# (StrOpt) Driver used for prefix delegation by the l3 agent. This needs to be"},{"line_number":171,"context_line":"# an entry point defined in the neutron.agent.linux.pd_drivers namespace. See"},{"line_number":172,"context_line":"# setup.cfg for entry points included with the neutron source."},{"line_number":173,"context_line":"# prefix_delegation_driver \u003d dibbler"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for MTU selection and advertisement \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":176,"context_line":"# Advertise MTU.  If True, effort is made to advertise MTU"}],"source_content_type":"text/plain","patch_set":19,"id":"1a4dcd0f_711e5360","line":173,"updated":"2015-08-12 21:23:34.000000000","message":"why not in l3_agent.ini ?\n\nAlso where is this in the code? I see a cfg.CONF.pd_dhcp_driver","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0c4c6b97f1b1d34c7ee32b74ac4d84bdbd83c29","unresolved":false,"context_lines":[{"line_number":170,"context_line":"# (StrOpt) Driver used for prefix delegation by the l3 agent. This needs to be"},{"line_number":171,"context_line":"# an entry point defined in the neutron.agent.linux.pd_drivers namespace. See"},{"line_number":172,"context_line":"# setup.cfg for entry points included with the neutron source."},{"line_number":173,"context_line":"# prefix_delegation_driver \u003d dibbler"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for MTU selection and advertisement \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":176,"context_line":"# Advertise MTU.  If True, effort is made to advertise MTU"}],"source_content_type":"text/plain","patch_set":19,"id":"1a4dcd0f_df3e328a","line":173,"in_reply_to":"1a4dcd0f_711e5360","updated":"2015-08-13 11:19:45.000000000","message":"I renamed this option a few patchsets ago but I forgot to update the references elsewhere. Thanks for spotting this. And yes, l3_agent.ini is probably a better place for it to go.","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"}],"etc/neutron/rootwrap.d/dibbler.filters":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5246a74475b0ab3a8e6792695c44088143cf87c6","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# If installed from source the prefix will be"},{"line_number":18,"context_line":"# /usr/local/sbin instead of /usr/bin."},{"line_number":19,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"},{"line_number":20,"context_line":"dibbler-client_local: CommandFilter, /usr/local/sbin/dibbler-client, root"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"fa1b9901_c8e40d0f","line":20,"updated":"2015-08-17 15:51:05.000000000","message":"Just a nit that this is the only occurrence of /usr/local in the rootwrap files, and surprised to see there isn\u0027t even a 1.0.1 package in the unstable debian repo :(","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"9cf8b66069e25ef6c7ce36b06bf9b2b3167bb93b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# If installed from source the prefix will be"},{"line_number":18,"context_line":"# /usr/local/sbin instead of /usr/bin."},{"line_number":19,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"},{"line_number":20,"context_line":"dibbler-client_local: CommandFilter, /usr/local/sbin/dibbler-client, root"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"fa1b9901_eefd596f","line":20,"in_reply_to":"fa1b9901_c8e40d0f","updated":"2015-08-17 18:00:20.000000000","message":"Debian seems to be the only place that\u0027s lagging behind unfortunately. Tomek officially published the final version of 1.0.1 recently so hopefully that will change soon enough.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# If installed from source the prefix will be"},{"line_number":18,"context_line":"# /usr/local/sbin instead of /usr/bin."},{"line_number":19,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"},{"line_number":20,"context_line":"dibbler-client_local: CommandFilter, /usr/local/sbin/dibbler-client, root"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"fa1b9901_4b655743","line":20,"in_reply_to":"fa1b9901_c8e40d0f","updated":"2015-08-17 18:23:45.000000000","message":"Yeah, I would like to get Ihar\u0027s view on this too.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2a1d26f991ea1ca6eed4d4e04d94f239f6bfb300","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# If installed from source the prefix will be"},{"line_number":18,"context_line":"# /usr/local/sbin instead of /usr/bin."},{"line_number":19,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"},{"line_number":20,"context_line":"dibbler-client_local: CommandFilter, /usr/local/sbin/dibbler-client, root"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"fa1b9901_98eb4713","line":20,"updated":"2015-08-19 20:08:46.000000000","message":"Ihar - could we get your opinion on this ?","commit_id":"52dd24f0fb8a598aa4c6eaaa079b533ab3520f15"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"7fd944e9c039d4c5cf0e8ff1f5395a4fcf89eec5","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# If installed from source the prefix will be"},{"line_number":18,"context_line":"# /usr/local/sbin instead of /usr/bin."},{"line_number":19,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"},{"line_number":20,"context_line":"dibbler-client_local: CommandFilter, /usr/local/sbin/dibbler-client, root"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"fa1b9901_c32c5504","line":20,"in_reply_to":"fa1b9901_98eb4713","updated":"2015-08-20 09:08:54.000000000","message":"I guess it\u0027s YAGNI. neutron packagers will ship the version you need, in case you notify them properly, thru sanity check or release notes.","commit_id":"52dd24f0fb8a598aa4c6eaaa079b533ab3520f15"}],"etc/neutron/rootwrap.d/l3.filters":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"sysctl: CommandFilter, sysctl, root"},{"line_number":16,"context_line":"route: CommandFilter, route, root"},{"line_number":17,"context_line":"radvd: CommandFilter, radvd, root"},{"line_number":18,"context_line":"dibbler-client: CommandFilter, dibbler-client, root"},{"line_number":19,"context_line":"# If installed from source the prefix will be"},{"line_number":20,"context_line":"# /usr/local instead of /usr/bin."},{"line_number":21,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"}],"source_content_type":"application/octet-stream","patch_set":16,"id":"1a4dcd0f_6dd23c5e","line":18,"updated":"2015-08-05 22:49:27.000000000","message":"Since this is pluggable, I wonder if it should go in a new file.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":15,"context_line":"sysctl: CommandFilter, sysctl, root"},{"line_number":16,"context_line":"route: CommandFilter, route, root"},{"line_number":17,"context_line":"radvd: CommandFilter, radvd, root"},{"line_number":18,"context_line":"dibbler-client: CommandFilter, dibbler-client, root"},{"line_number":19,"context_line":"# If installed from source the prefix will be"},{"line_number":20,"context_line":"# /usr/local instead of /usr/bin."},{"line_number":21,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"}],"source_content_type":"application/octet-stream","patch_set":16,"id":"1a4dcd0f_6d2d2ea7","line":18,"in_reply_to":"1a4dcd0f_6dd23c5e","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":17,"context_line":"radvd: CommandFilter, radvd, root"},{"line_number":18,"context_line":"dibbler-client: CommandFilter, dibbler-client, root"},{"line_number":19,"context_line":"# If installed from source the prefix will be"},{"line_number":20,"context_line":"# /usr/local instead of /usr/bin."},{"line_number":21,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"},{"line_number":22,"context_line":"dibbler-client_local: CommandFilter, /usr/local/sbin/dibbler-client, root"},{"line_number":23,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":16,"id":"1a4dcd0f_2d0d14e8","line":20,"updated":"2015-08-05 22:49:27.000000000","message":"nit:  /usr/local/sbin\n\nBut, I wonder if it would it be better to not special case this in here and require operators installing from source to adjust $PATH accordingly when launching the agent?","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":17,"context_line":"radvd: CommandFilter, radvd, root"},{"line_number":18,"context_line":"dibbler-client: CommandFilter, dibbler-client, root"},{"line_number":19,"context_line":"# If installed from source the prefix will be"},{"line_number":20,"context_line":"# /usr/local instead of /usr/bin."},{"line_number":21,"context_line":"# TODO(john-davidge) - Remove once Dibbler v1.0.1 is more widely available"},{"line_number":22,"context_line":"dibbler-client_local: CommandFilter, /usr/local/sbin/dibbler-client, root"},{"line_number":23,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":16,"id":"1a4dcd0f_00a8f1d9","line":20,"in_reply_to":"1a4dcd0f_2d0d14e8","updated":"2015-08-11 12:19:31.000000000","message":"nit: done\n\nVersion 1.0.1 now seems to be available everywhere except for apt. I\u0027d like to leave this here for now as a convenience to operators.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"}],"neutron/agent/l3/agent.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        ri \u003d self._create_router(router_id, router)"},{"line_number":322,"context_line":"        registry.notify(resources.ROUTER, events.BEFORE_CREATE,"},{"line_number":323,"context_line":"                        self, router\u003dri)"},{"line_number":324,"context_line":"        self.pd.add_router(router_id, ri.ns_name)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        self.router_info[router_id] \u003d ri"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_4deae0ad","line":324,"updated":"2015-08-05 22:49:27.000000000","message":"These come right after calls to registry.notify.  Rather than change code here, could you register a callback?  It might reduce the coupling a bit.  But, I admit the callback system may not be robust enough yet to support it.  It is worth some thought though.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        ri \u003d self._create_router(router_id, router)"},{"line_number":322,"context_line":"        registry.notify(resources.ROUTER, events.BEFORE_CREATE,"},{"line_number":323,"context_line":"                        self, router\u003dri)"},{"line_number":324,"context_line":"        self.pd.add_router(router_id, ri.ns_name)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        self.router_info[router_id] \u003d ri"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_1a31beec","line":324,"in_reply_to":"1a4dcd0f_4deae0ad","updated":"2015-08-11 12:19:31.000000000","message":"Great suggestion, done.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":456,"context_line":"            LOG.debug(\"Starting router update for %s, action %s, priority %s\","},{"line_number":457,"context_line":"                      update.id, update.action, update.priority)"},{"line_number":458,"context_line":"            if update.action \u003d\u003d queue.PD_UPDATE:"},{"line_number":459,"context_line":"                self.pd.run_pd_client()"},{"line_number":460,"context_line":"                continue"},{"line_number":461,"context_line":"            router \u003d update.router"},{"line_number":462,"context_line":"            if update.action !\u003d queue.DELETE_ROUTER and not router:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_0d0cd83f","line":459,"updated":"2015-08-05 22:49:27.000000000","message":"Note to self:  I\u0027m wondering if this should go in the queue.  How often do we expect these changes to come?  Should it just be handled in the signal handler?","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":456,"context_line":"            LOG.debug(\"Starting router update for %s, action %s, priority %s\","},{"line_number":457,"context_line":"                      update.id, update.action, update.priority)"},{"line_number":458,"context_line":"            if update.action \u003d\u003d queue.PD_UPDATE:"},{"line_number":459,"context_line":"                self.pd.run_pd_client()"},{"line_number":460,"context_line":"                continue"},{"line_number":461,"context_line":"            router \u003d update.router"},{"line_number":462,"context_line":"            if update.action !\u003d queue.DELETE_ROUTER and not router:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_e6d8eb81","line":459,"in_reply_to":"1a4dcd0f_0d0cd83f","updated":"2015-08-11 12:19:31.000000000","message":"Without having this handled by the queue we run into blocking tasks in the main loop. I\u0027ve spent some time working on an alternative but I\u0027m not sure I see the advantage.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"f5dfc81a15c33b3cc33047441f53ee41af2f4700","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return cctxt.call(context, \u0027update_ha_routers_states\u0027,"},{"line_number":134,"context_line":"                          host\u003dself.host, states\u003dstates)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def send_prefix_update(self, context, prefix_update):"},{"line_number":137,"context_line":"        \"\"\"Send prefix update whenever prefixes get changed.\"\"\""},{"line_number":138,"context_line":"        cctxt \u003d self.client.prepare(version\u003d\u00271.6\u0027)"},{"line_number":139,"context_line":"        return cctxt.call(context, \u0027process_prefix_update\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_4e6325b2","line":136,"updated":"2015-08-17 16:25:46.000000000","message":"Can you rename this to process_prefix_update?  That\u0027s the general convention used (have the name match on client and server sides)\n\nAlso, in the future, I think it\u0027s better to introduce the client and server sides of a new interface in the same patch.  That helps ensure that the full path is correct.  In this case, the other side was in a previous patch.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"9cf8b66069e25ef6c7ce36b06bf9b2b3167bb93b","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        return cctxt.call(context, \u0027update_ha_routers_states\u0027,"},{"line_number":134,"context_line":"                          host\u003dself.host, states\u003dstates)"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def send_prefix_update(self, context, prefix_update):"},{"line_number":137,"context_line":"        \"\"\"Send prefix update whenever prefixes get changed.\"\"\""},{"line_number":138,"context_line":"        cctxt \u003d self.client.prepare(version\u003d\u00271.6\u0027)"},{"line_number":139,"context_line":"        return cctxt.call(context, \u0027process_prefix_update\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_0e11adac","line":136,"in_reply_to":"fa1b9901_4e6325b2","updated":"2015-08-17 18:00:20.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"}],"neutron/agent/l3/router_info.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        # Check if there is any pd prefix update"},{"line_number":409,"context_line":"        for p in internal_ports:"},{"line_number":410,"context_line":"            if (p[\u0027id\u0027] in current_port_ids and"},{"line_number":411,"context_line":"                p[\u0027id\u0027] in existing_port_ids):"},{"line_number":412,"context_line":"                if not p.get(\u0027subnets\u0027, None):"},{"line_number":413,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_9d91f149","line":410,"updated":"2015-08-05 22:49:27.000000000","message":"nit:\n\n  if p[\u0027id\u0027] in current_port_ids \u0026 existing_port_ids:","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        # Check if there is any pd prefix update"},{"line_number":409,"context_line":"        for p in internal_ports:"},{"line_number":410,"context_line":"            if (p[\u0027id\u0027] in current_port_ids and"},{"line_number":411,"context_line":"                p[\u0027id\u0027] in existing_port_ids):"},{"line_number":412,"context_line":"                if not p.get(\u0027subnets\u0027, None):"},{"line_number":413,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_e2af807b","line":410,"in_reply_to":"1a4dcd0f_9d91f149","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        for p in internal_ports:"},{"line_number":410,"context_line":"            if (p[\u0027id\u0027] in current_port_ids and"},{"line_number":411,"context_line":"                p[\u0027id\u0027] in existing_port_ids):"},{"line_number":412,"context_line":"                if not p.get(\u0027subnets\u0027, None):"},{"line_number":413,"context_line":"                    continue"},{"line_number":414,"context_line":"                for subnet in p[\u0027subnets\u0027]:"},{"line_number":415,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_7db3c5e9","line":412,"updated":"2015-08-05 22:49:27.000000000","message":"nit:  None is redundant.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        for p in internal_ports:"},{"line_number":410,"context_line":"            if (p[\u0027id\u0027] in current_port_ids and"},{"line_number":411,"context_line":"                p[\u0027id\u0027] in existing_port_ids):"},{"line_number":412,"context_line":"                if not p.get(\u0027subnets\u0027, None):"},{"line_number":413,"context_line":"                    continue"},{"line_number":414,"context_line":"                for subnet in p[\u0027subnets\u0027]:"},{"line_number":415,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a2cad84d","line":412,"in_reply_to":"1a4dcd0f_7db3c5e9","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"c5fdddada40a7b3f0753bbbe108bdc16f49c49ce","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        for p in internal_ports:"},{"line_number":410,"context_line":"            if (p[\u0027id\u0027] in set(current_port_ids) \u0026 set(existing_port_ids)):"},{"line_number":411,"context_line":"                if not p.get(\u0027subnets\u0027):"},{"line_number":412,"context_line":"                    continue"},{"line_number":413,"context_line":"                for subnet in p[\u0027subnets\u0027]:"},{"line_number":414,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"},{"line_number":415,"context_line":"                        old_prefix \u003d pd.update_subnet(self.router_id,"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_11ecafb9","line":412,"updated":"2015-08-12 21:23:34.000000000","message":"I think you can leave out the last 2 lines if the next is:\n\nfor subnet in p.get(\u0027subnets\u0027, []):","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0c4c6b97f1b1d34c7ee32b74ac4d84bdbd83c29","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        for p in internal_ports:"},{"line_number":410,"context_line":"            if (p[\u0027id\u0027] in set(current_port_ids) \u0026 set(existing_port_ids)):"},{"line_number":411,"context_line":"                if not p.get(\u0027subnets\u0027):"},{"line_number":412,"context_line":"                    continue"},{"line_number":413,"context_line":"                for subnet in p[\u0027subnets\u0027]:"},{"line_number":414,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"},{"line_number":415,"context_line":"                        old_prefix \u003d pd.update_subnet(self.router_id,"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_dfadd284","line":412,"in_reply_to":"1a4dcd0f_11ecafb9","updated":"2015-08-13 11:19:45.000000000","message":"That\u0027s neater, thanks.","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def _internal_network_updated(self, port, subnet_id, prefix, old_prefix):"},{"line_number":271,"context_line":"        port_id \u003d port[\u0027id\u0027]"},{"line_number":272,"context_line":"        interface_name \u003d self.get_internal_device_name(port_id)"},{"line_number":273,"context_line":"        if prefix !\u003d l3_constants.PROVISIONAL_IPV6_PD_PREFIX:"},{"line_number":274,"context_line":"            fixed_ips \u003d port[\u0027fixed_ips\u0027]"},{"line_number":275,"context_line":"            for fixed_ip in fixed_ips:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_2effd102","line":272,"updated":"2015-08-17 18:23:45.000000000","message":"Nit: don\u0027t really need the port_id variable","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def _internal_network_updated(self, port, subnet_id, prefix, old_prefix):"},{"line_number":271,"context_line":"        port_id \u003d port[\u0027id\u0027]"},{"line_number":272,"context_line":"        interface_name \u003d self.get_internal_device_name(port_id)"},{"line_number":273,"context_line":"        if prefix !\u003d l3_constants.PROVISIONAL_IPV6_PD_PREFIX:"},{"line_number":274,"context_line":"            fixed_ips \u003d port[\u0027fixed_ips\u0027]"},{"line_number":275,"context_line":"            for fixed_ip in fixed_ips:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_133214f2","line":272,"in_reply_to":"fa1b9901_2effd102","updated":"2015-08-19 12:23:53.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        # Check if there is any pd prefix update"},{"line_number":409,"context_line":"        for p in internal_ports:"},{"line_number":410,"context_line":"            if (p[\u0027id\u0027] in set(current_port_ids) \u0026 set(existing_port_ids)):"},{"line_number":411,"context_line":"                for subnet in p.get(\u0027subnets\u0027, []):"},{"line_number":412,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"},{"line_number":413,"context_line":"                        old_prefix \u003d pd.update_subnet(self.router_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_4eeec523","line":410,"updated":"2015-08-17 18:23:45.000000000","message":"Nit: outer parentheses not needed, but consider making the operator precedence explicit:\n\n    if x in (set(a) \u0026 set(b)):","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        # Check if there is any pd prefix update"},{"line_number":409,"context_line":"        for p in internal_ports:"},{"line_number":410,"context_line":"            if (p[\u0027id\u0027] in set(current_port_ids) \u0026 set(existing_port_ids)):"},{"line_number":411,"context_line":"                for subnet in p.get(\u0027subnets\u0027, []):"},{"line_number":412,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"},{"line_number":413,"context_line":"                        old_prefix \u003d pd.update_subnet(self.router_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_73a59002","line":410,"in_reply_to":"fa1b9901_4eeec523","updated":"2015-08-19 12:23:53.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        # Check if there is any pd prefix update"},{"line_number":410,"context_line":"        for p in internal_ports:"},{"line_number":411,"context_line":"            if (p[\u0027id\u0027] in set(current_port_ids) \u0026 set(existing_port_ids)):"},{"line_number":412,"context_line":"                for subnet in p.get(\u0027subnets\u0027, []):"},{"line_number":413,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"},{"line_number":414,"context_line":"                        old_prefix \u003d pd.update_subnet(self.router_id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_dd560906","line":411,"updated":"2015-08-17 18:49:48.000000000","message":"Three minor concerns here. One is that it\u0027s not really obvious the precedence between in and \u0026, so would be good to be explicit. Two, the parens around the entire if clause are not needed (better to use, if want to alter precedence). Three, \u0026 has higher precedence than \u0027in\u0027, so we are doing a set intersection on each pass of the for-loop. Not sure if the sets are large, but could calc the intersection (with a good name) and place outside the for loop.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        # Check if there is any pd prefix update"},{"line_number":410,"context_line":"        for p in internal_ports:"},{"line_number":411,"context_line":"            if (p[\u0027id\u0027] in set(current_port_ids) \u0026 set(existing_port_ids)):"},{"line_number":412,"context_line":"                for subnet in p.get(\u0027subnets\u0027, []):"},{"line_number":413,"context_line":"                    if ipv6_utils.is_ipv6_pd_enabled(subnet):"},{"line_number":414,"context_line":"                        old_prefix \u003d pd.update_subnet(self.router_id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_b39b28c9","line":411,"in_reply_to":"fa1b9901_dd560906","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"9f99913cc320a405a8da8fee19d2dc710cb3eac5","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                                                      subnet[\u0027id\u0027],"},{"line_number":416,"context_line":"                                                      subnet[\u0027cidr\u0027])"},{"line_number":417,"context_line":"                        if old_prefix:"},{"line_number":418,"context_line":"                            self._internal_network_updated(p, subnet[\u0027id\u0027],"},{"line_number":419,"context_line":"                                                           subnet[\u0027cidr\u0027],"},{"line_number":420,"context_line":"                                                           old_prefix)"},{"line_number":421,"context_line":"                            enable_ra \u003d True"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_282b3e32","line":418,"updated":"2015-08-17 20:15:43.000000000","message":"I see a stacktrace when restarting the l3-agent because L406 has already added the address","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                                                      subnet[\u0027id\u0027],"},{"line_number":416,"context_line":"                                                      subnet[\u0027cidr\u0027])"},{"line_number":417,"context_line":"                        if old_prefix:"},{"line_number":418,"context_line":"                            self._internal_network_updated(p, subnet[\u0027id\u0027],"},{"line_number":419,"context_line":"                                                           subnet[\u0027cidr\u0027],"},{"line_number":420,"context_line":"                                                           old_prefix)"},{"line_number":421,"context_line":"                            enable_ra \u003d True"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_2bb1dc8f","line":418,"in_reply_to":"fa1b9901_282b3e32","updated":"2015-08-19 12:24:06.000000000","message":"Great catch, thanks.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"}],"neutron/agent/linux/dibbler.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"SCRIPT_TEMPLATE \u003d jinja2.Template(\"\"\"\\"},{"line_number":59,"context_line":"#!/bin/bash"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"neutron-pd-notify $1 {{ prefix_path }} {{ l3_agent_pid }}"},{"line_number":62,"context_line":"\"\"\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_527a7078","line":61,"updated":"2015-08-05 22:49:27.000000000","message":"nit:\n\n  exec neutron-pd-notify $1 {{ prefix_path }} {{ l3_agent_pid }}\n\nNot a big deal but it avoids spawning two processes.  It is just a nit.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":58,"context_line":"SCRIPT_TEMPLATE \u003d jinja2.Template(\"\"\"\\"},{"line_number":59,"context_line":"#!/bin/bash"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"neutron-pd-notify $1 {{ prefix_path }} {{ l3_agent_pid }}"},{"line_number":62,"context_line":"\"\"\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_c2d604c3","line":61,"in_reply_to":"1a4dcd0f_527a7078","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class PDDibbler(pd_driver.PDDriverBase):"},{"line_number":66,"context_line":"    def _get_requestor_id(self):"},{"line_number":67,"context_line":"        return \"%s:%s:%s\" % (self.router_id, self.subnet_id, self.ri_ifname)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_f77cceb6","line":66,"updated":"2015-08-05 22:49:27.000000000","message":"nit:  This looks like something that could be assigned in __init__\n\n  self._requestor_id \u003d \"...","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class PDDibbler(pd_driver.PDDriverBase):"},{"line_number":66,"context_line":"    def _get_requestor_id(self):"},{"line_number":67,"context_line":"        return \"%s:%s:%s\" % (self.router_id, self.subnet_id, self.ri_ifname)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_4829b388","line":66,"in_reply_to":"1a4dcd0f_f77cceb6","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return \"%s:%s:%s\" % (self.router_id, self.subnet_id, self.ri_ifname)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"},{"line_number":70,"context_line":"    def _get_dibbler_client_working_area(requestor_id):"},{"line_number":71,"context_line":"        return \"%s/%s\" % (cfg.CONF.pd_confs, requestor_id)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _convert_subnet_id(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_b7516638","line":70,"updated":"2015-08-05 22:49:27.000000000","message":"ditto","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        return \"%s:%s:%s\" % (self.router_id, self.subnet_id, self.ri_ifname)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @staticmethod"},{"line_number":70,"context_line":"    def _get_dibbler_client_working_area(requestor_id):"},{"line_number":71,"context_line":"        return \"%s/%s\" % (cfg.CONF.pd_confs, requestor_id)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _convert_subnet_id(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_e81f5f59","line":70,"in_reply_to":"1a4dcd0f_b7516638","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _get_dibbler_client_working_area(requestor_id):"},{"line_number":71,"context_line":"        return \"%s/%s\" % (cfg.CONF.pd_confs, requestor_id)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _convert_subnet_id(self):"},{"line_number":74,"context_line":"        return \u0027\u0027.join(self.subnet_id.split(\u0027-\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_170ffa37","line":73,"updated":"2015-08-05 22:49:27.000000000","message":"ditto","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _get_dibbler_client_working_area(requestor_id):"},{"line_number":71,"context_line":"        return \"%s/%s\" % (cfg.CONF.pd_confs, requestor_id)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _convert_subnet_id(self):"},{"line_number":74,"context_line":"        return \u0027\u0027.join(self.subnet_id.split(\u0027-\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a83ab7cb","line":73,"in_reply_to":"1a4dcd0f_170ffa37","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        return \"%s/%s\" % (cfg.CONF.pd_confs, requestor_id)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _convert_subnet_id(self):"},{"line_number":74,"context_line":"        return \u0027\u0027.join(self.subnet_id.split(\u0027-\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @classmethod"},{"line_number":77,"context_line":"    def _get_prefix_path(cls, requestor_id):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_9201d807","line":74,"updated":"2015-08-05 22:49:27.000000000","message":"nit:\n\n  self.subnet_id.replace(\u0027-\u0027, \u0027\u0027)","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        return \"%s/%s\" % (cfg.CONF.pd_confs, requestor_id)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _convert_subnet_id(self):"},{"line_number":74,"context_line":"        return \u0027\u0027.join(self.subnet_id.split(\u0027-\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @classmethod"},{"line_number":77,"context_line":"    def _get_prefix_path(cls, requestor_id):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_6834afdd","line":74,"in_reply_to":"1a4dcd0f_9201d807","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return \u0027\u0027.join(self.subnet_id.split(\u0027-\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @classmethod"},{"line_number":77,"context_line":"    def _get_prefix_path(cls, requestor_id):"},{"line_number":78,"context_line":"        dcwa \u003d cls._get_dibbler_client_working_area(requestor_id)"},{"line_number":79,"context_line":"        return \"%s/prefix\" % dcwa"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_525590f7","line":77,"updated":"2015-08-05 22:49:27.000000000","message":"ditto (L66)","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return \u0027\u0027.join(self.subnet_id.split(\u0027-\u0027))"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @classmethod"},{"line_number":77,"context_line":"    def _get_prefix_path(cls, requestor_id):"},{"line_number":78,"context_line":"        dcwa \u003d cls._get_dibbler_client_working_area(requestor_id)"},{"line_number":79,"context_line":"        return \"%s/prefix\" % dcwa"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_06cab7a1","line":77,"in_reply_to":"1a4dcd0f_525590f7","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        return \"%s/prefix\" % dcwa"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @classmethod"},{"line_number":82,"context_line":"    def _get_pid_path(cls, requestor_id):"},{"line_number":83,"context_line":"        dcwa \u003d cls._get_dibbler_client_working_area(requestor_id)"},{"line_number":84,"context_line":"        return \"%s/client.pid\" % dcwa"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_1244e847","line":82,"updated":"2015-08-05 22:49:27.000000000","message":"ditto","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        return \"%s/prefix\" % dcwa"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    @classmethod"},{"line_number":82,"context_line":"    def _get_pid_path(cls, requestor_id):"},{"line_number":83,"context_line":"        dcwa \u003d cls._get_dibbler_client_working_area(requestor_id)"},{"line_number":84,"context_line":"        return \"%s/client.pid\" % dcwa"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_26cd73b7","line":82,"in_reply_to":"1a4dcd0f_1244e847","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        try:"},{"line_number":182,"context_line":"            requestor_ids \u003d os.listdir(cfg.CONF.pd_confs)"},{"line_number":183,"context_line":"        except OSError:"},{"line_number":184,"context_line":"            pass"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        for requestor_id in requestor_ids:"},{"line_number":187,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_b20bb48d","line":184,"updated":"2015-08-05 22:49:27.000000000","message":"nit:  More personal preference.  I just like a little more straight-forward approach:\n\n    @staticmethod\n    def get_sync_data():\n        try:\n            requestor_ids \u003d os.listdir(cfg.CONF.pd_confs)\n        except OSError:\n            return []\n\n        sync_data \u003d []\n        ...","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        try:"},{"line_number":182,"context_line":"            requestor_ids \u003d os.listdir(cfg.CONF.pd_confs)"},{"line_number":183,"context_line":"        except OSError:"},{"line_number":184,"context_line":"            pass"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        for requestor_id in requestor_ids:"},{"line_number":187,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_26aed398","line":184,"in_reply_to":"1a4dcd0f_b20bb48d","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            try:"},{"line_number":188,"context_line":"                router_id, subnet_id, ri_ifname \u003d requestor_id.split(\":\")"},{"line_number":189,"context_line":"            except ValueError:"},{"line_number":190,"context_line":"                router_id \u003d None"},{"line_number":191,"context_line":"                subnet_id \u003d None"},{"line_number":192,"context_line":"                ri_ifname \u003d None"},{"line_number":193,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_92b8f8c9","line":190,"updated":"2015-08-05 22:49:27.000000000","message":"I wouldn\u0027t bother assigning None to these if it were me.\n\nnit:  I\u0027d probably write L186 - L193 like below but it is just more of my personal preference.\n\n        requestors \u003d (r.split(\u0027:\u0027) for r in requestor_ids if r.count(\u0027:\u0027) \u003d\u003d 2)\n        for router_id, subnet_id, ri_ifname in requestors:","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            try:"},{"line_number":188,"context_line":"                router_id, subnet_id, ri_ifname \u003d requestor_id.split(\":\")"},{"line_number":189,"context_line":"            except ValueError:"},{"line_number":190,"context_line":"                router_id \u003d None"},{"line_number":191,"context_line":"                subnet_id \u003d None"},{"line_number":192,"context_line":"                ri_ifname \u003d None"},{"line_number":193,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_c177d9d2","line":190,"in_reply_to":"1a4dcd0f_92b8f8c9","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"c5fdddada40a7b3f0753bbbe108bdc16f49c49ce","unresolved":false,"context_lines":[{"line_number":37,"context_line":"duid-type duid-en {{ enterprise_number }} {{ va_id }}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# 8 (Debug) is most verbose. 7 (Info) is usually the best option"},{"line_number":40,"context_line":"log-level 8"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"# No automatic downlink address assignment"},{"line_number":43,"context_line":"downlink-prefix-ifaces \"none\""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_f156e328","line":40,"updated":"2015-08-12 21:23:34.000000000","message":"where do the dibbler-client logs go?","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0c4c6b97f1b1d34c7ee32b74ac4d84bdbd83c29","unresolved":false,"context_lines":[{"line_number":37,"context_line":"duid-type duid-en {{ enterprise_number }} {{ va_id }}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# 8 (Debug) is most verbose. 7 (Info) is usually the best option"},{"line_number":40,"context_line":"log-level 8"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"# No automatic downlink address assignment"},{"line_number":43,"context_line":"downlink-prefix-ifaces \"none\""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_7f427eac","line":40,"in_reply_to":"1a4dcd0f_f156e328","updated":"2015-08-13 11:19:45.000000000","message":"into the dibbler_client_working_area folder","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":62,"context_line":"\"\"\")"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class PDDibbler(pd_driver.PDDriverBase):"},{"line_number":66,"context_line":"    def __init__(self, router_id, subnet_id, ri_ifname):"},{"line_number":67,"context_line":"        self.router_id \u003d router_id"},{"line_number":68,"context_line":"        self.subnet_id \u003d subnet_id"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_bcad5b33","line":65,"updated":"2015-08-17 18:23:45.000000000","message":"We should really have a ProcessMonitor monitoring dibbler. We can figure out how to implement that in a follow-up.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def __init__(self, router_id, subnet_id, ri_ifname):"},{"line_number":67,"context_line":"        self.router_id \u003d router_id"},{"line_number":68,"context_line":"        self.subnet_id \u003d subnet_id"},{"line_number":69,"context_line":"        self.ri_ifname \u003d ri_ifname"},{"line_number":70,"context_line":"        self.requestor_id \u003d \"%s:%s:%s\" % (self.router_id,"},{"line_number":71,"context_line":"                                          self.subnet_id,"},{"line_number":72,"context_line":"                                          self.ri_ifname)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_9c72d77b","line":69,"updated":"2015-08-17 18:23:45.000000000","message":"Replace the above three lines with call to __init__ of super class.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def __init__(self, router_id, subnet_id, ri_ifname):"},{"line_number":67,"context_line":"        self.router_id \u003d router_id"},{"line_number":68,"context_line":"        self.subnet_id \u003d subnet_id"},{"line_number":69,"context_line":"        self.ri_ifname \u003d ri_ifname"},{"line_number":70,"context_line":"        self.requestor_id \u003d \"%s:%s:%s\" % (self.router_id,"},{"line_number":71,"context_line":"                                          self.subnet_id,"},{"line_number":72,"context_line":"                                          self.ri_ifname)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_2e424a3f","line":69,"in_reply_to":"fa1b9901_9c72d77b","updated":"2015-08-19 12:23:53.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5246a74475b0ab3a8e6792695c44088143cf87c6","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                        service_name\u003dPD_SERVICE_NAME)"},{"line_number":146,"context_line":"        pm \u003d external_process.ProcessManager("},{"line_number":147,"context_line":"                uuid\u003dself.requestor_id,"},{"line_number":148,"context_line":"                default_cmd_callback\u003dNone,"},{"line_number":149,"context_line":"                namespace\u003drouter_ns,"},{"line_number":150,"context_line":"                service\u003dPD_SERVICE_NAME,"},{"line_number":151,"context_line":"                conf\u003dcfg.CONF,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_86ca874e","line":148,"updated":"2015-08-17 15:51:05.000000000","message":"This does default to None, right?","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"9cf8b66069e25ef6c7ce36b06bf9b2b3167bb93b","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                        service_name\u003dPD_SERVICE_NAME)"},{"line_number":146,"context_line":"        pm \u003d external_process.ProcessManager("},{"line_number":147,"context_line":"                uuid\u003dself.requestor_id,"},{"line_number":148,"context_line":"                default_cmd_callback\u003dNone,"},{"line_number":149,"context_line":"                namespace\u003drouter_ns,"},{"line_number":150,"context_line":"                service\u003dPD_SERVICE_NAME,"},{"line_number":151,"context_line":"                conf\u003dcfg.CONF,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_0e5f6d73","line":148,"in_reply_to":"fa1b9901_86ca874e","updated":"2015-08-17 18:00:20.000000000","message":"Yes you\u0027re right. Removed.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            pd_info.router_id \u003d router_id"},{"line_number":177,"context_line":"            pd_info.subnet_id \u003d subnet_id"},{"line_number":178,"context_line":"            pd_info.ri_ifname \u003d ri_ifname"},{"line_number":179,"context_line":"            pd_info.driver \u003d PDDibbler(router_id, subnet_id, ri_ifname)"},{"line_number":180,"context_line":"            pd_info.client_started \u003d ("},{"line_number":181,"context_line":"                pd_info.driver._is_dibbler_client_running())"},{"line_number":182,"context_line":"            pd_info.prefix \u003d pd_info.driver.get_prefix()"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_f75bec2c","line":179,"updated":"2015-08-17 18:23:45.000000000","message":"I am a bit lost here. Why are we creating a new dibbler instance here?","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            pd_info.router_id \u003d router_id"},{"line_number":177,"context_line":"            pd_info.subnet_id \u003d subnet_id"},{"line_number":178,"context_line":"            pd_info.ri_ifname \u003d ri_ifname"},{"line_number":179,"context_line":"            pd_info.driver \u003d PDDibbler(router_id, subnet_id, ri_ifname)"},{"line_number":180,"context_line":"            pd_info.client_started \u003d ("},{"line_number":181,"context_line":"                pd_info.driver._is_dibbler_client_running())"},{"line_number":182,"context_line":"            pd_info.prefix \u003d pd_info.driver.get_prefix()"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_eef2129a","line":179,"in_reply_to":"fa1b9901_f75bec2c","updated":"2015-08-19 12:23:53.000000000","message":"One of the first things a PrefixDelegation object does after being created by the l3 agent is call get_sync_data. This allows the PDDriver to get any existing information about the subnets it\u0027s in charge of (for example, if the l3 agent was restarted with active PD subnets). The PDDibbler object is initialised as part of this process. It could happen immediately before get_sync_data is called, but I think it\u0027s more convenient to do it here.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":55,"context_line":"\"\"\")"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"# The first line must be #!/bin/bash"},{"line_number":58,"context_line":"SCRIPT_TEMPLATE \u003d jinja2.Template(\"\"\"\\"},{"line_number":59,"context_line":"#!/bin/bash"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"exec neutron-pd-notify $1 {{ prefix_path }} {{ l3_agent_pid }}"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_bdac75ee","line":58,"updated":"2015-08-17 18:49:48.000000000","message":"Could put L59 at L58 w/o backslash.\n\nShould it be:\n    #!/usr/bin/env bash","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":55,"context_line":"\"\"\")"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"# The first line must be #!/bin/bash"},{"line_number":58,"context_line":"SCRIPT_TEMPLATE \u003d jinja2.Template(\"\"\"\\"},{"line_number":59,"context_line":"#!/bin/bash"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"exec neutron-pd-notify $1 {{ prefix_path }} {{ l3_agent_pid }}"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_788c7635","line":58,"in_reply_to":"fa1b9901_bdac75ee","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return utils.get_value_from_file(self.pid_path)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _generate_dibbler_conf(self, ex_gw_ifname, lla):"},{"line_number":83,"context_line":"        dcwa \u003d self.dibbler_client_working_area"},{"line_number":84,"context_line":"        script_path \u003d utils.get_conf_file_name(dcwa, \u0027notify\u0027, \u0027sh\u0027, True)"},{"line_number":85,"context_line":"        buf \u003d six.StringIO()"},{"line_number":86,"context_line":"        buf.write(\u0027%s\u0027 % SCRIPT_TEMPLATE.render("}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_1d5ec1e9","line":83,"updated":"2015-08-17 18:49:48.000000000","message":"dcwa -\u003e work_area?","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return utils.get_value_from_file(self.pid_path)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _generate_dibbler_conf(self, ex_gw_ifname, lla):"},{"line_number":83,"context_line":"        dcwa \u003d self.dibbler_client_working_area"},{"line_number":84,"context_line":"        script_path \u003d utils.get_conf_file_name(dcwa, \u0027notify\u0027, \u0027sh\u0027, True)"},{"line_number":85,"context_line":"        buf \u003d six.StringIO()"},{"line_number":86,"context_line":"        buf.write(\u0027%s\u0027 % SCRIPT_TEMPLATE.render("}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_78e1d6cf","line":83,"in_reply_to":"fa1b9901_1d5ec1e9","updated":"2015-08-19 12:24:06.000000000","message":"dcwa is a straight acronym for dibbler_client_working_area, so I think it does the job nicely.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                      monitored_process\u003dpm)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def enable(self, pmon, router_ns, ex_gw_ifname, lla):"},{"line_number":124,"context_line":"        LOG.debug(\"Enable IPv6 PD for router %s subnet %s ri_ifname %s\","},{"line_number":125,"context_line":"                  self.router_id, self.subnet_id, self.ri_ifname)"},{"line_number":126,"context_line":"        if not self._is_dibbler_client_running():"},{"line_number":127,"context_line":"            dibbler_conf \u003d self._generate_dibbler_conf(ex_gw_ifname, lla)"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_3dd5c542","line":124,"updated":"2015-08-17 18:49:48.000000000","message":"nit: can use named parameters and dict for string formatting\n    ... router %(router)s ...   %(\u0027router\u0027: self.router_id)\n\nHere and other debugs.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                      monitored_process\u003dpm)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def enable(self, pmon, router_ns, ex_gw_ifname, lla):"},{"line_number":124,"context_line":"        LOG.debug(\"Enable IPv6 PD for router %s subnet %s ri_ifname %s\","},{"line_number":125,"context_line":"                  self.router_id, self.subnet_id, self.ri_ifname)"},{"line_number":126,"context_line":"        if not self._is_dibbler_client_running():"},{"line_number":127,"context_line":"            dibbler_conf \u003d self._generate_dibbler_conf(ex_gw_ifname, lla)"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_d8f90282","line":124,"in_reply_to":"fa1b9901_3dd5c542","updated":"2015-08-19 12:24:06.000000000","message":"You can, but this is more concise. I prefer to stick with this unless it\u0027s violating the hacking guide.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"455b5c82e8f601287d9dbd6f81081aa12fa654d5","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                      monitored_process\u003dpm)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def enable(self, pmon, router_ns, ex_gw_ifname, lla):"},{"line_number":124,"context_line":"        LOG.debug(\"Enable IPv6 PD for router %s subnet %s ri_ifname %s\","},{"line_number":125,"context_line":"                  self.router_id, self.subnet_id, self.ri_ifname)"},{"line_number":126,"context_line":"        if not self._is_dibbler_client_running():"},{"line_number":127,"context_line":"            dibbler_conf \u003d self._generate_dibbler_conf(ex_gw_ifname, lla)"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_3f122b0a","line":124,"in_reply_to":"fa1b9901_d8f90282","updated":"2015-08-24 15:58:48.000000000","message":"Afaik, the reason to use named parameters is to allow translations to reorder parameters to meet the needs of other languages.  Debugs don\u0027t have translations so I\u0027m not sure it matters.\n\nWhere it might become an issue is if someone decides to change the level of this log statement which would require translation.  They would have to be sure to convert it to name parameters.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"6ee601fa8eb33f9ee5714259146385da3c4be4fc","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                  self.router_id, self.subnet_id, self.ri_ifname)"},{"line_number":133,"context_line":"        dcwa \u003d self.dibbler_client_working_area"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        def callback(pid_file):"},{"line_number":136,"context_line":"            dibbler_cmd \u003d [\u0027dibbler-client\u0027,"},{"line_number":137,"context_line":"                           \u0027stop\u0027,"},{"line_number":138,"context_line":"                           \u0027-w\u0027, \u0027%s\u0027 % dcwa]"}],"source_content_type":"text/x-python","patch_set":24,"id":"fa1b9901_2bd4a645","line":135,"updated":"2015-08-21 21:21:12.000000000","message":"Nit: could name this \u0027get_dibbler_stop_command\u0027","commit_id":"ea81ade76dd03b94a164ff7613309de49be652d9"},{"author":{"_account_id":704,"name":"Edgar Magana","email":"emagana@gmail.com","username":"emagana"},"change_message_id":"875a4f482143e708c9f7cfb99bfb01ca03f740e5","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        dcwa \u003d self.dibbler_client_working_area"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        def callback(pid_file):"},{"line_number":136,"context_line":"            dibbler_cmd \u003d [\u0027dibbler-client\u0027,"},{"line_number":137,"context_line":"                           \u0027stop\u0027,"},{"line_number":138,"context_line":"                           \u0027-w\u0027, \u0027%s\u0027 % dcwa]"},{"line_number":139,"context_line":"            return dibbler_cmd"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa1b9901_3ef551ec","line":136,"updated":"2015-08-25 14:46:39.000000000","message":"You could have taken Henry\u0027s suggestion in this patch","commit_id":"4b329c345c7820ff12bf25a91228cdfbf99500df"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"6268df930d75a108396bf05f5dcb54d18cd2f1cc","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        dcwa \u003d self.dibbler_client_working_area"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        def callback(pid_file):"},{"line_number":136,"context_line":"            dibbler_cmd \u003d [\u0027dibbler-client\u0027,"},{"line_number":137,"context_line":"                           \u0027stop\u0027,"},{"line_number":138,"context_line":"                           \u0027-w\u0027, \u0027%s\u0027 % dcwa]"},{"line_number":139,"context_line":"            return dibbler_cmd"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa1b9901_27553dc1","line":136,"in_reply_to":"fa1b9901_3ef551ec","updated":"2015-08-25 16:18:46.000000000","message":"I saw it but I didn\u0027t feel it was worth jinxing the merge.","commit_id":"4b329c345c7820ff12bf25a91228cdfbf99500df"}],"neutron/agent/linux/external_process.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def reload_cfg(self):"},{"line_number":97,"context_line":"        self.disable(\u0027HUP\u0027)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def disable(self, sig\u003d\u00279\u0027, cmd_callback\u003dNone):"},{"line_number":100,"context_line":"        pid \u003d self.pid"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        if self.active:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_57e73840","line":99,"updated":"2015-08-17 18:23:45.000000000","message":"Nit: how about \u0027get_stop_command\u0027 instead of \u0027cmd_callback\u0027?","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def reload_cfg(self):"},{"line_number":97,"context_line":"        self.disable(\u0027HUP\u0027)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def disable(self, sig\u003d\u00279\u0027, cmd_callback\u003dNone):"},{"line_number":100,"context_line":"        pid \u003d self.pid"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        if self.active:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_52b7ea85","line":99,"in_reply_to":"fa1b9901_57e73840","updated":"2015-08-19 12:23:53.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"}],"neutron/agent/linux/interface.py":[{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"c5fdddada40a7b3f0753bbbe108bdc16f49c49ce","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                device.delete_addr_and_conntrack_state(address[\u0027cidr\u0027])"},{"line_number":162,"context_line":"                break"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def get_llas(self, device_name, namespace):"},{"line_number":165,"context_line":"        device \u003d ip_lib.IPDevice(device_name,"},{"line_number":166,"context_line":"                                 namespace\u003dnamespace)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_95a8aa21","line":164,"updated":"2015-08-12 21:23:34.000000000","message":"get_v6_llas","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0c4c6b97f1b1d34c7ee32b74ac4d84bdbd83c29","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                device.delete_addr_and_conntrack_state(address[\u0027cidr\u0027])"},{"line_number":162,"context_line":"                break"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def get_llas(self, device_name, namespace):"},{"line_number":165,"context_line":"        device \u003d ip_lib.IPDevice(device_name,"},{"line_number":166,"context_line":"                                 namespace\u003dnamespace)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_1f7b3af6","line":164,"in_reply_to":"1a4dcd0f_95a8aa21","updated":"2015-08-13 11:19:45.000000000","message":"Done","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5246a74475b0ab3a8e6792695c44088143cf87c6","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        for route in existing_onlink_routes - new_onlink_routes:"},{"line_number":139,"context_line":"            device.route.delete_onlink_route(route)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def add_v6addr(self, device_name, v6addr, namespace):"},{"line_number":142,"context_line":"        device \u003d ip_lib.IPDevice(device_name,"},{"line_number":143,"context_line":"                                 namespace\u003dnamespace)"},{"line_number":144,"context_line":"        net \u003d netaddr.IPNetwork(v6addr)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_0b4a0284","line":141,"updated":"2015-08-17 15:51:05.000000000","message":"nit: add_ipv6_addr, etc - fix if re-spinning","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"9cf8b66069e25ef6c7ce36b06bf9b2b3167bb93b","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        for route in existing_onlink_routes - new_onlink_routes:"},{"line_number":139,"context_line":"            device.route.delete_onlink_route(route)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def add_v6addr(self, device_name, v6addr, namespace):"},{"line_number":142,"context_line":"        device \u003d ip_lib.IPDevice(device_name,"},{"line_number":143,"context_line":"                                 namespace\u003dnamespace)"},{"line_number":144,"context_line":"        net \u003d netaddr.IPNetwork(v6addr)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_911ac06d","line":141,"in_reply_to":"fa1b9901_0b4a0284","updated":"2015-08-17 18:00:20.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"}],"neutron/agent/linux/pd.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            LOG.debug(\"LLA %s is active now\" % lla_with_mask)"},{"line_number":249,"context_line":"            self.pd_update_cb()"},{"line_number":250,"context_line":"            return True"},{"line_number":251,"context_line":"        return"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    @staticmethod"},{"line_number":254,"context_line":"    def _ensure_lla(lla_with_mask, llas):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a9f6eaf6","line":251,"updated":"2015-08-05 22:49:27.000000000","message":"nit:  This is implied","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            LOG.debug(\"LLA %s is active now\" % lla_with_mask)"},{"line_number":249,"context_line":"            self.pd_update_cb()"},{"line_number":250,"context_line":"            return True"},{"line_number":251,"context_line":"        return"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    @staticmethod"},{"line_number":254,"context_line":"    def _ensure_lla(lla_with_mask, llas):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_a153ad38","line":251,"in_reply_to":"1a4dcd0f_a9f6eaf6","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        return"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    @staticmethod"},{"line_number":254,"context_line":"    def _ensure_lla(lla_with_mask, llas):"},{"line_number":255,"context_line":"        for lla in llas:"},{"line_number":256,"context_line":"            if lla_with_mask \u003d\u003d lla[\u0027cidr\u0027]:"},{"line_number":257,"context_line":"                return not lla[\u0027tentative\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_69546252","line":254,"updated":"2015-08-05 22:49:27.000000000","message":"_ensure_lla is what?  From inspection of the method it looks like you want to ensure that the lla_with_mask is in the list llas and is not marked tentative.  Also, it returns a boolean.  A suggestion:\n\n  _is_lla_active","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        return"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    @staticmethod"},{"line_number":254,"context_line":"    def _ensure_lla(lla_with_mask, llas):"},{"line_number":255,"context_line":"        for lla in llas:"},{"line_number":256,"context_line":"            if lla_with_mask \u003d\u003d lla[\u0027cidr\u0027]:"},{"line_number":257,"context_line":"                return not lla[\u0027tentative\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_e84c3578","line":254,"in_reply_to":"1a4dcd0f_69546252","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        for lla in llas:"},{"line_number":256,"context_line":"            if lla_with_mask \u003d\u003d lla[\u0027cidr\u0027]:"},{"line_number":257,"context_line":"                return not lla[\u0027tentative\u0027]"},{"line_number":258,"context_line":"        return False"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    @utils.synchronized(\"l3-agent-pd\")"},{"line_number":261,"context_line":"    def run_pd_client(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_bca386b1","line":258,"updated":"2015-08-05 22:49:27.000000000","message":"A suggestion.  Instead of one call to get_llas and then this one, how about something like the following method (totally untested):\n\n  def _get_active_llas(self, gw_ifname, ns_name): \n      try:\n          llas \u003d self.intf_driver.get_llas(gw_ifname, ns_name)\n      except RuntimeError:\n          return set()\n      return set(lla[\u0027cidr\u0027] for lla in llas if not lla[\u0027tentative\u0027])\n\nThen, just check \"if lla in llas:\" everywhere you now call _ensure_lla.\n\nI only suggest this because it wraps the call to get_llas and the logic in _ensure_lla in to one tight little method.  A little better encapsulation IMHO.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        for lla in llas:"},{"line_number":256,"context_line":"            if lla_with_mask \u003d\u003d lla[\u0027cidr\u0027]:"},{"line_number":257,"context_line":"                return not lla[\u0027tentative\u0027]"},{"line_number":258,"context_line":"        return False"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    @utils.synchronized(\"l3-agent-pd\")"},{"line_number":261,"context_line":"    def run_pd_client(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_2890dd94","line":258,"in_reply_to":"1a4dcd0f_bca386b1","updated":"2015-08-11 12:19:31.000000000","message":"For the sake of avoiding code duplication on L247 and L282 I\u0027d like to keep the _ensure_lla() function, but I\u0027m renaming it to _is_lla_active() as suggested above.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                        prefix_update[subnet_id] \u003d prefix"},{"line_number":276,"context_line":"                else:"},{"line_number":277,"context_line":"                    if not llas:"},{"line_number":278,"context_line":"                        llas \u003d self.intf_driver.get_llas("},{"line_number":279,"context_line":"                                                router[\u0027gw_interface\u0027],"},{"line_number":280,"context_line":"                                                router[\u0027ns_name\u0027])"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_29f89a48","line":278,"updated":"2015-08-05 22:49:27.000000000","message":"The other call to this catches RuntimeError.  I\u0027m curious why this one doesn\u0027t.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                        prefix_update[subnet_id] \u003d prefix"},{"line_number":276,"context_line":"                else:"},{"line_number":277,"context_line":"                    if not llas:"},{"line_number":278,"context_line":"                        llas \u003d self.intf_driver.get_llas("},{"line_number":279,"context_line":"                                                router[\u0027gw_interface\u0027],"},{"line_number":280,"context_line":"                                                router[\u0027ns_name\u0027])"},{"line_number":281,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_e8cf55b1","line":278,"in_reply_to":"1a4dcd0f_29f89a48","updated":"2015-08-11 12:19:31.000000000","message":"Good catch, done.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        signal.signal(signal.SIGHUP, self._handle_sighup)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"    def _handle_sighup(self, signum, frame):"},{"line_number":301,"context_line":"        # The external DHCPv6 client uses SIGHUP to notify agent"},{"line_number":302,"context_line":"        # of prefix changes."},{"line_number":303,"context_line":"        LOG.debug(\u0027SIGHUP called\u0027)"},{"line_number":304,"context_line":"        self.pd_update_cb()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_69ca2250","line":301,"updated":"2015-08-05 22:49:27.000000000","message":"Does it need to be SIGHUP?  Maybe SIGUSR1 or SIGUSR2?  The hang up signal is often used to reread configuration.\n\nSending a unix signal seems a bit draconian but I\u0027m not sure I want to insist on doing something else yet.  Did you consider other approaches?  (I\u0027m getting deja vu like maybe we already went over this)","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":316,"context_line":"            subnets[pd_info.subnet_id] \u003d new_pd_info"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"class PDInfo(object):"},{"line_number":320,"context_line":"    def __init__(self, pd_info\u003dNone, ri_ifname\u003dNone, mac\u003dNone):"},{"line_number":321,"context_line":"        if pd_info is None:"},{"line_number":322,"context_line":"            self.prefix \u003d l3_constants.PROVISIONAL_IPV6_PD_PREFIX"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_6602513f","line":319,"updated":"2015-08-05 22:49:27.000000000","message":"A docstring to describe this object might help.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":316,"context_line":"            subnets[pd_info.subnet_id] \u003d new_pd_info"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"class PDInfo(object):"},{"line_number":320,"context_line":"    def __init__(self, pd_info\u003dNone, ri_ifname\u003dNone, mac\u003dNone):"},{"line_number":321,"context_line":"        if pd_info is None:"},{"line_number":322,"context_line":"            self.prefix \u003d l3_constants.PROVISIONAL_IPV6_PD_PREFIX"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_cb0b7323","line":319,"in_reply_to":"1a4dcd0f_6602513f","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"class PDInfo(object):"},{"line_number":320,"context_line":"    def __init__(self, pd_info\u003dNone, ri_ifname\u003dNone, mac\u003dNone):"},{"line_number":321,"context_line":"        if pd_info is None:"},{"line_number":322,"context_line":"            self.prefix \u003d l3_constants.PROVISIONAL_IPV6_PD_PREFIX"},{"line_number":323,"context_line":"            self.old_prefix \u003d l3_constants.PROVISIONAL_IPV6_PD_PREFIX"},{"line_number":324,"context_line":"            self.ri_ifname \u003d ri_ifname"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_c907b6c8","line":321,"updated":"2015-08-05 22:49:27.000000000","message":"This almost looks like two different classes (one type where sync is True and the other type.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"class PDInfo(object):"},{"line_number":320,"context_line":"    def __init__(self, pd_info\u003dNone, ri_ifname\u003dNone, mac\u003dNone):"},{"line_number":321,"context_line":"        if pd_info is None:"},{"line_number":322,"context_line":"            self.prefix \u003d l3_constants.PROVISIONAL_IPV6_PD_PREFIX"},{"line_number":323,"context_line":"            self.old_prefix \u003d l3_constants.PROVISIONAL_IPV6_PD_PREFIX"},{"line_number":324,"context_line":"            self.ri_ifname \u003d ri_ifname"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_0b3abb98","line":321,"in_reply_to":"1a4dcd0f_c907b6c8","updated":"2015-08-11 12:19:31.000000000","message":"The sync property is not fixed (see L118). The difference in initialisation here is just based on whether or not the PDInfo object is being created based on the properties of an existing one.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"470298790269a6e12cc1e574e882e55b08b93e3d","unresolved":false,"context_lines":[{"line_number":324,"context_line":"                            \u0027subnets\u0027: {}}"},{"line_number":325,"context_line":"    else:"},{"line_number":326,"context_line":"        # This will happen during l3 agent restart"},{"line_number":327,"context_line":"        router[\u0027ns_name\u0027] \u003d added_router.ns_name"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"class PDInfo(object):"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_000b1125","line":327,"updated":"2015-08-12 13:06:19.000000000","message":"The above two methods are missing @utils.synchronized(\"l3-agent-pd\")","commit_id":"f5cf02f600377cf4f1d378227b9755e1b12a5130"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"5d25907ee5e44e6662e19d760fc9c955aec21bfd","unresolved":false,"context_lines":[{"line_number":324,"context_line":"                            \u0027subnets\u0027: {}}"},{"line_number":325,"context_line":"    else:"},{"line_number":326,"context_line":"        # This will happen during l3 agent restart"},{"line_number":327,"context_line":"        router[\u0027ns_name\u0027] \u003d added_router.ns_name"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"class PDInfo(object):"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a4dcd0f_3d498731","line":327,"in_reply_to":"1a4dcd0f_000b1125","updated":"2015-08-12 16:17:06.000000000","message":"Done","commit_id":"f5cf02f600377cf4f1d378227b9755e1b12a5130"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"c5fdddada40a7b3f0753bbbe108bdc16f49c49ce","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                    del router[\u0027subnets\u0027][subnet_id]"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @utils.synchronized(\"l3-agent-pd\")"},{"line_number":178,"context_line":"    def handle_sighup(self):"},{"line_number":179,"context_line":"        self.pd_update_cb()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_b8fcbbb5","line":178,"updated":"2015-08-12 21:23:34.000000000","message":"i don\u0027t think this is used","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0c4c6b97f1b1d34c7ee32b74ac4d84bdbd83c29","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                    del router[\u0027subnets\u0027][subnet_id]"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @utils.synchronized(\"l3-agent-pd\")"},{"line_number":178,"context_line":"    def handle_sighup(self):"},{"line_number":179,"context_line":"        self.pd_update_cb()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_7a44cc45","line":178,"in_reply_to":"1a4dcd0f_b8fcbbb5","updated":"2015-08-13 11:19:45.000000000","message":"Quite right, removed.","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"c5fdddada40a7b3f0753bbbe108bdc16f49c49ce","unresolved":false,"context_lines":[{"line_number":291,"context_line":"    def _handle_sighup(self, signum, frame):"},{"line_number":292,"context_line":"        # The external DHCPv6 client uses SIGHUP to notify agent"},{"line_number":293,"context_line":"        # of prefix changes."},{"line_number":294,"context_line":"        LOG.debug(\u0027SIGHUP called\u0027)"},{"line_number":295,"context_line":"        self.pd_update_cb()"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def _get_sync_data(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_9891bff3","line":294,"updated":"2015-08-12 21:23:34.000000000","message":"maybe best not to log here - see\nhttps://bugs.launchpad.net/nova/+bug/1029727","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0c4c6b97f1b1d34c7ee32b74ac4d84bdbd83c29","unresolved":false,"context_lines":[{"line_number":291,"context_line":"    def _handle_sighup(self, signum, frame):"},{"line_number":292,"context_line":"        # The external DHCPv6 client uses SIGHUP to notify agent"},{"line_number":293,"context_line":"        # of prefix changes."},{"line_number":294,"context_line":"        LOG.debug(\u0027SIGHUP called\u0027)"},{"line_number":295,"context_line":"        self.pd_update_cb()"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"    def _get_sync_data(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_5ab79039","line":294,"in_reply_to":"1a4dcd0f_9891bff3","updated":"2015-08-13 11:19:45.000000000","message":"Thanks for the pointer, I\u0027ll remove this.","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"c5fdddada40a7b3f0753bbbe108bdc16f49c49ce","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            self.mac \u003d mac"},{"line_number":342,"context_line":"            self.bind_lla \u003d None"},{"line_number":343,"context_line":"            self.sync \u003d False"},{"line_number":344,"context_line":"            self.pdobject \u003d None"},{"line_number":345,"context_line":"            self.client_started \u003d False"},{"line_number":346,"context_line":"        else:"},{"line_number":347,"context_line":"            self.prefix \u003d pd_info.prefix"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_f86fa38f","line":344,"updated":"2015-08-12 21:23:34.000000000","message":"pdobject -  is hard to read. But pd_object is still uninformative. Maybe \"driver\" or \"pd_drv\" instead","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0c4c6b97f1b1d34c7ee32b74ac4d84bdbd83c29","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            self.mac \u003d mac"},{"line_number":342,"context_line":"            self.bind_lla \u003d None"},{"line_number":343,"context_line":"            self.sync \u003d False"},{"line_number":344,"context_line":"            self.pdobject \u003d None"},{"line_number":345,"context_line":"            self.client_started \u003d False"},{"line_number":346,"context_line":"        else:"},{"line_number":347,"context_line":"            self.prefix \u003d pd_info.prefix"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a4dcd0f_5a18f01d","line":344,"in_reply_to":"1a4dcd0f_f86fa38f","updated":"2015-08-13 11:19:45.000000000","message":"Done","commit_id":"75a3d7d80d9931537130be2d17cb64ed15229d5e"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    def remove_stale_ri_ifname(self, router_id, stale_ifname):"},{"line_number":171,"context_line":"        router \u003d self.routers.get(router_id)"},{"line_number":172,"context_line":"        if router is not None:"},{"line_number":173,"context_line":"            subnet_id \u003d None"},{"line_number":174,"context_line":"            for subnet_id, pd_info in router[\u0027subnets\u0027].items():"},{"line_number":175,"context_line":"                if pd_info.ri_ifname \u003d\u003d stale_ifname:"},{"line_number":176,"context_line":"                    self._delete_pd(router, pd_info)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_17b6a0dc","line":173,"updated":"2015-08-17 18:23:45.000000000","message":"Not needed","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    def remove_stale_ri_ifname(self, router_id, stale_ifname):"},{"line_number":171,"context_line":"        router \u003d self.routers.get(router_id)"},{"line_number":172,"context_line":"        if router is not None:"},{"line_number":173,"context_line":"            subnet_id \u003d None"},{"line_number":174,"context_line":"            for subnet_id, pd_info in router[\u0027subnets\u0027].items():"},{"line_number":175,"context_line":"                if pd_info.ri_ifname \u003d\u003d stale_ifname:"},{"line_number":176,"context_line":"                    self._delete_pd(router, pd_info)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_d2abfa1b","line":173,"in_reply_to":"fa1b9901_17b6a0dc","updated":"2015-08-19 12:23:53.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        new_mac \u003d mac.split(\u0027:\u0027)"},{"line_number":182,"context_line":"        byte0 \u003d int(new_mac[0], 16)"},{"line_number":183,"context_line":"        # Alter the first byte of the provided mac address so it doesn\u0027t"},{"line_number":184,"context_line":"        # match the mac of the router port"},{"line_number":185,"context_line":"        if byte0 \u003e 0x80:"},{"line_number":186,"context_line":"            new_mac[0] \u003d \"%02x\" % (byte0 - 1)"},{"line_number":187,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_179540e3","line":184,"updated":"2015-08-17 18:23:45.000000000","message":"Can you explain this some more? I don\u0027t follow why we need this.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        new_mac \u003d mac.split(\u0027:\u0027)"},{"line_number":182,"context_line":"        byte0 \u003d int(new_mac[0], 16)"},{"line_number":183,"context_line":"        # Alter the first byte of the provided mac address so it doesn\u0027t"},{"line_number":184,"context_line":"        # match the mac of the router port"},{"line_number":185,"context_line":"        if byte0 \u003e 0x80:"},{"line_number":186,"context_line":"            new_mac[0] \u003d \"%02x\" % (byte0 - 1)"},{"line_number":187,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_35da6079","line":184,"in_reply_to":"fa1b9901_179540e3","updated":"2015-08-19 12:23:53.000000000","message":"I actually don\u0027t think we need this any more either. Having it or not makes no difference in my testing. I\u0027ll remove it.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def _ensure_lla_task(self, gw_ifname, ns_name, lla_with_mask):"},{"line_number":225,"context_line":"        # It would be insane for taking so long unless DAD test failed"},{"line_number":226,"context_line":"        # In that case, the subnet would never be assigned a prefix."},{"line_number":227,"context_line":"        # Therefore, it\u0027s very important to choose a base MAC that won\u0027t"},{"line_number":228,"context_line":"        # cause conflict with the external network"},{"line_number":229,"context_line":"        linux_utils.wait_until_true(functools.partial(self._lla_task,"},{"line_number":230,"context_line":"                                                      gw_ifname,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_977710d4","line":227,"updated":"2015-08-17 18:23:45.000000000","message":"I am not sure I understand why we are \"choosing\" MACs?","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def _ensure_lla_task(self, gw_ifname, ns_name, lla_with_mask):"},{"line_number":225,"context_line":"        # It would be insane for taking so long unless DAD test failed"},{"line_number":226,"context_line":"        # In that case, the subnet would never be assigned a prefix."},{"line_number":227,"context_line":"        # Therefore, it\u0027s very important to choose a base MAC that won\u0027t"},{"line_number":228,"context_line":"        # cause conflict with the external network"},{"line_number":229,"context_line":"        linux_utils.wait_until_true(functools.partial(self._lla_task,"},{"line_number":230,"context_line":"                                                      gw_ifname,"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_95380ca2","line":227,"in_reply_to":"fa1b9901_977710d4","updated":"2015-08-19 12:23:53.000000000","message":"Removed","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                                    timeout\u003dl3_constants.LLA_TASK_TIMEOUT,"},{"line_number":234,"context_line":"                                    sleep\u003d2)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _lla_task(self, gw_ifname, ns_name, lla_with_mask):"},{"line_number":237,"context_line":"        llas \u003d self._get_llas(gw_ifname, ns_name)"},{"line_number":238,"context_line":"        if self._is_lla_active(lla_with_mask, llas):"},{"line_number":239,"context_line":"            LOG.debug(\"LLA %s is active now\" % lla_with_mask)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_422bf482","line":236,"updated":"2015-08-17 18:23:45.000000000","message":"IMO \"task\" is a bit misleading here. How about _lla_available?","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                                    timeout\u003dl3_constants.LLA_TASK_TIMEOUT,"},{"line_number":234,"context_line":"                                    sleep\u003d2)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _lla_task(self, gw_ifname, ns_name, lla_with_mask):"},{"line_number":237,"context_line":"        llas \u003d self._get_llas(gw_ifname, ns_name)"},{"line_number":238,"context_line":"        if self._is_lla_active(lla_with_mask, llas):"},{"line_number":239,"context_line":"            LOG.debug(\"LLA %s is active now\" % lla_with_mask)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_b2676624","line":236,"in_reply_to":"fa1b9901_422bf482","updated":"2015-08-19 12:23:53.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":307,"context_line":"@utils.synchronized(\"l3-agent-pd\")"},{"line_number":308,"context_line":"def remove_router(resource, event, l3_agent, **kwargs):"},{"line_number":309,"context_line":"    router \u003d l3_agent.pd.routers.get(kwargs[\u0027router\u0027].router_id)"},{"line_number":310,"context_line":"    l3_agent.pd._delete_router_pd(router)"},{"line_number":311,"context_line":"    del l3_agent.pd.routers[router[\u0027id\u0027]][\u0027subnets\u0027]"},{"line_number":312,"context_line":"    del l3_agent.pd.routers[router[\u0027id\u0027]]"},{"line_number":313,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_973f1025","line":310,"updated":"2015-08-17 18:23:45.000000000","message":"Nit: so you should make delete_router_pd non-private (remove the leading underscore).","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":307,"context_line":"@utils.synchronized(\"l3-agent-pd\")"},{"line_number":308,"context_line":"def remove_router(resource, event, l3_agent, **kwargs):"},{"line_number":309,"context_line":"    router \u003d l3_agent.pd.routers.get(kwargs[\u0027router\u0027].router_id)"},{"line_number":310,"context_line":"    l3_agent.pd._delete_router_pd(router)"},{"line_number":311,"context_line":"    del l3_agent.pd.routers[router[\u0027id\u0027]][\u0027subnets\u0027]"},{"line_number":312,"context_line":"    del l3_agent.pd.routers[router[\u0027id\u0027]]"},{"line_number":313,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_120e523b","line":310,"in_reply_to":"fa1b9901_973f1025","updated":"2015-08-19 12:23:53.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Cisco Systems"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_5d76793f","line":1,"updated":"2015-08-17 18:49:48.000000000","message":"more descriptive filename?","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Cisco Systems"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_f33bc736","line":1,"in_reply_to":"fa1b9901_5d76793f","updated":"2015-08-19 12:24:06.000000000","message":"Any suggestions? I think pd.py is just as descriptive as ra.py or dhcp.py","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"9f99913cc320a405a8da8fee19d2dc710cb3eac5","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                        prefix_update[\u0027subnet_id\u0027] \u003d pd_info.prefix"},{"line_number":133,"context_line":"                else:"},{"line_number":134,"context_line":"                    self._delete_lla_address(router, bind_lla_with_mask)"},{"line_number":135,"context_line":"                    self._add_lla_address(router, bind_lla_with_mask)"},{"line_number":136,"context_line":"            else:"},{"line_number":137,"context_line":"                self._add_lla_address(router, bind_lla_with_mask)"},{"line_number":138,"context_line":"        if prefix_update:"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_f23777e1","line":135,"updated":"2015-08-17 20:15:43.000000000","message":"why is it removed and readded?","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                        prefix_update[\u0027subnet_id\u0027] \u003d pd_info.prefix"},{"line_number":133,"context_line":"                else:"},{"line_number":134,"context_line":"                    self._delete_lla_address(router, bind_lla_with_mask)"},{"line_number":135,"context_line":"                    self._add_lla_address(router, bind_lla_with_mask)"},{"line_number":136,"context_line":"            else:"},{"line_number":137,"context_line":"                self._add_lla_address(router, bind_lla_with_mask)"},{"line_number":138,"context_line":"        if prefix_update:"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_9b991d22","line":135,"in_reply_to":"fa1b9901_f23777e1","updated":"2015-08-19 12:24:06.000000000","message":"Because we want to start a new PD client","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"9f99913cc320a405a8da8fee19d2dc710cb3eac5","unresolved":false,"context_lines":[{"line_number":177,"context_line":"                    del router[\u0027subnets\u0027][subnet_id]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    @staticmethod"},{"line_number":180,"context_line":"    def _get_lla(mac):"},{"line_number":181,"context_line":"        new_mac \u003d mac.split(\u0027:\u0027)"},{"line_number":182,"context_line":"        byte0 \u003d int(new_mac[0], 16)"},{"line_number":183,"context_line":"        # Alter the first byte of the provided mac address so it doesn\u0027t"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_b21a5f6d","line":180,"updated":"2015-08-17 20:15:43.000000000","message":"took me a while to figure out what all this was about. A more descriptive name like _get_lla_for_pd_client_bind and a docstring with what its purpose is. I guess it is because there will be a client process per pd subnet, and each one needs to bind to an unique address on the ext gw interface.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"9982dcbc04881dba50483e6bfce33e8f10322ccc","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        new_mac \u003d mac.split(\u0027:\u0027)"},{"line_number":182,"context_line":"        byte0 \u003d int(new_mac[0], 16)"},{"line_number":183,"context_line":"        # Alter the first byte of the provided mac address so it doesn\u0027t"},{"line_number":184,"context_line":"        # match the mac of the router port"},{"line_number":185,"context_line":"        if byte0 \u003e 0x80:"},{"line_number":186,"context_line":"            new_mac[0] \u003d \"%02x\" % (byte0 - 1)"},{"line_number":187,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_07e652b4","line":184,"updated":"2015-08-18 08:15:41.000000000","message":"Also it\u0027s not clear why this needs to be done. I did a quick test and was able to put the same lla on 2 different interfaces.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        new_mac \u003d mac.split(\u0027:\u0027)"},{"line_number":182,"context_line":"        byte0 \u003d int(new_mac[0], 16)"},{"line_number":183,"context_line":"        # Alter the first byte of the provided mac address so it doesn\u0027t"},{"line_number":184,"context_line":"        # match the mac of the router port"},{"line_number":185,"context_line":"        if byte0 \u003e 0x80:"},{"line_number":186,"context_line":"            new_mac[0] \u003d \"%02x\" % (byte0 - 1)"},{"line_number":187,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_3be811b4","line":184,"in_reply_to":"fa1b9901_07e652b4","updated":"2015-08-19 12:24:06.000000000","message":"This doesn\u0027t seem necessary to me any more either. Will remove it.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"9f99913cc320a405a8da8fee19d2dc710cb3eac5","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            # simply return and exit the thread"},{"line_number":200,"context_line":"            return"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def _add_lla_address(self, router, lla_with_mask):"},{"line_number":203,"context_line":"        if router[\u0027gw_interface\u0027]:"},{"line_number":204,"context_line":"            self.intf_driver.add_ipv6_addr(router[\u0027gw_interface\u0027],"},{"line_number":205,"context_line":"                                           lla_with_mask,"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_d26833bd","line":202,"updated":"2015-08-17 20:15:43.000000000","message":"address in lla_address is redundant","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":199,"context_line":"            # simply return and exit the thread"},{"line_number":200,"context_line":"            return"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def _add_lla_address(self, router, lla_with_mask):"},{"line_number":203,"context_line":"        if router[\u0027gw_interface\u0027]:"},{"line_number":204,"context_line":"            self.intf_driver.add_ipv6_addr(router[\u0027gw_interface\u0027],"},{"line_number":205,"context_line":"                                           lla_with_mask,"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_9b16fda5","line":202,"in_reply_to":"fa1b9901_d26833bd","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"9f99913cc320a405a8da8fee19d2dc710cb3eac5","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        if router[\u0027gw_interface\u0027]:"},{"line_number":204,"context_line":"            self.intf_driver.add_ipv6_addr(router[\u0027gw_interface\u0027],"},{"line_number":205,"context_line":"                                           lla_with_mask,"},{"line_number":206,"context_line":"                                           router[\u0027ns_name\u0027])"},{"line_number":207,"context_line":"            # There is a delay before the LLA becomes active."},{"line_number":208,"context_line":"            # This is because the kernal runs DAD to make sure LLA uniqueness"},{"line_number":209,"context_line":"            # Spawn a thread to wait for the interface to be ready"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_12f30b0c","line":206,"updated":"2015-08-17 20:15:43.000000000","message":"I don\u0027t see scope as a parameter, I think it defaults to global, but we want link here.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        if router[\u0027gw_interface\u0027]:"},{"line_number":204,"context_line":"            self.intf_driver.add_ipv6_addr(router[\u0027gw_interface\u0027],"},{"line_number":205,"context_line":"                                           lla_with_mask,"},{"line_number":206,"context_line":"                                           router[\u0027ns_name\u0027])"},{"line_number":207,"context_line":"            # There is a delay before the LLA becomes active."},{"line_number":208,"context_line":"            # This is because the kernal runs DAD to make sure LLA uniqueness"},{"line_number":209,"context_line":"            # Spawn a thread to wait for the interface to be ready"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_3b0d7190","line":206,"in_reply_to":"fa1b9901_12f30b0c","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":2733,"name":"Darragh O\u0027Reilly","email":"doreilly@suse.com","username":"darragh-oreilly"},"change_message_id":"9f99913cc320a405a8da8fee19d2dc710cb3eac5","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                             router[\u0027ns_name\u0027],"},{"line_number":213,"context_line":"                             lla_with_mask)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _delete_lla_address(self, router, lla_with_mask):"},{"line_number":216,"context_line":"        if lla_with_mask and router[\u0027gw_interface\u0027]:"},{"line_number":217,"context_line":"            try:"},{"line_number":218,"context_line":"                self.intf_driver.delete_ipv6_addr(router[\u0027gw_interface\u0027],"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_b25fbf0d","line":215,"updated":"2015-08-17 20:15:43.000000000","message":"ditto","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":212,"context_line":"                             router[\u0027ns_name\u0027],"},{"line_number":213,"context_line":"                             lla_with_mask)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def _delete_lla_address(self, router, lla_with_mask):"},{"line_number":216,"context_line":"        if lla_with_mask and router[\u0027gw_interface\u0027]:"},{"line_number":217,"context_line":"            try:"},{"line_number":218,"context_line":"                self.intf_driver.delete_ipv6_addr(router[\u0027gw_interface\u0027],"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_fb27f90f","line":215,"in_reply_to":"fa1b9901_b25fbf0d","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        return False"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @utils.synchronized(\"l3-agent-pd\")"},{"line_number":252,"context_line":"    def run_pd_client(self):"},{"line_number":253,"context_line":"        LOG.debug(\"Starting run_pd_client\")"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        prefix_update \u003d {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_7dd81d1e","line":252,"updated":"2015-08-17 18:49:48.000000000","message":"more descriptive name?","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        return False"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    @utils.synchronized(\"l3-agent-pd\")"},{"line_number":252,"context_line":"    def run_pd_client(self):"},{"line_number":253,"context_line":"        LOG.debug(\"Starting run_pd_client\")"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        prefix_update \u003d {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_3be9f180","line":252,"in_reply_to":"fa1b9901_7dd81d1e","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"}],"neutron/agent/linux/pd_driver.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.ri_ifname \u003d ri_ifname"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @abc.abstractmethod"},{"line_number":43,"context_line":"    def enable(self, pmon, router_ns, ex_gw_ifname, lla):"},{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_b2f094ff","line":43,"updated":"2015-08-05 22:49:27.000000000","message":"Is this ex_gw_ifname different than the ri_ifname passed to __init__?","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.ri_ifname \u003d ri_ifname"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @abc.abstractmethod"},{"line_number":43,"context_line":"    def enable(self, pmon, router_ns, ex_gw_ifname, lla):"},{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_ae087529","line":43,"in_reply_to":"1a4dcd0f_b2f094ff","updated":"2015-08-11 12:19:31.000000000","message":"Yes, one represents the external device name, while the other is the internal device name.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @abc.abstractmethod"},{"line_number":47,"context_line":"    def disable(self, pmon, router_ns):"},{"line_number":48,"context_line":"        pass"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_d218c020","line":47,"updated":"2015-08-05 22:49:27.000000000","message":"Would either of these make more sense passed to __init__?  Just wondering.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        pass"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    @abc.abstractmethod"},{"line_number":47,"context_line":"    def disable(self, pmon, router_ns):"},{"line_number":48,"context_line":"        pass"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_c3901898","line":47,"in_reply_to":"1a4dcd0f_d218c020","updated":"2015-08-11 12:19:31.000000000","message":"Anything that goes into __init__ has to be captured by get_sync_data. This might be doable for router_ns but I don\u0027t think it would work for pmon.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @staticmethod"},{"line_number":55,"context_line":"    @abc.abstractmethod"},{"line_number":56,"context_line":"    def get_sync_data():"},{"line_number":57,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_57b26207","line":56,"updated":"2015-08-05 22:49:27.000000000","message":"A docstring would be appropriate with these.\n\nIncidentally, I think if you have a docstring, you don\u0027t need \"pass\".","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @staticmethod"},{"line_number":55,"context_line":"    @abc.abstractmethod"},{"line_number":56,"context_line":"    def get_sync_data():"},{"line_number":57,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_6fea4bae","line":56,"in_reply_to":"1a4dcd0f_57b26207","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Cisco Systems"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_ddd049cc","line":1,"updated":"2015-08-17 18:49:48.000000000","message":"better filenaming?","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 Cisco Systems"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_f3c66748","line":1,"in_reply_to":"fa1b9901_ddd049cc","updated":"2015-08-19 12:24:06.000000000","message":"Do you have a suggestion? pd_driver seems fine to me.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    cfg.StrOpt(\u0027pd_confs\u0027,"},{"line_number":23,"context_line":"               default\u003d\u0027$state_path/pd\u0027,"},{"line_number":24,"context_line":"               help\u003d_(\u0027Location to store IPv6 PD files.\u0027)),"},{"line_number":25,"context_line":"    cfg.StrOpt(\u0027vrpen\u0027,"},{"line_number":26,"context_line":"               default\u003d\u00278888\u0027,"},{"line_number":27,"context_line":"               help\u003d_(\"A decimal value as Vendor\u0027s Registered Private \""},{"line_number":28,"context_line":"                      \"Enterprise Number as required by RFC3315 DUID-EN.\")),"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_7de25da1","line":25,"updated":"2015-08-17 18:49:48.000000000","message":"vrpen -\u003e vendor_pen?","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    cfg.StrOpt(\u0027pd_confs\u0027,"},{"line_number":23,"context_line":"               default\u003d\u0027$state_path/pd\u0027,"},{"line_number":24,"context_line":"               help\u003d_(\u0027Location to store IPv6 PD files.\u0027)),"},{"line_number":25,"context_line":"    cfg.StrOpt(\u0027vrpen\u0027,"},{"line_number":26,"context_line":"               default\u003d\u00278888\u0027,"},{"line_number":27,"context_line":"               help\u003d_(\"A decimal value as Vendor\u0027s Registered Private \""},{"line_number":28,"context_line":"                      \"Enterprise Number as required by RFC3315 DUID-EN.\")),"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_d3a483a7","line":25,"in_reply_to":"fa1b9901_7de25da1","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"}],"neutron/cmd/pd_notify.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def main():"},{"line_number":41,"context_line":"    operation \u003d sys.argv[1]"},{"line_number":42,"context_line":"    prefix_fname \u003d sys.argv[2]"},{"line_number":43,"context_line":"    agent_pid \u003d sys.argv[3]"},{"line_number":44,"context_line":"    prefix \u003d os.getenv(\u0027PREFIX1\u0027, \"::\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_17429aae","line":41,"updated":"2015-08-05 22:49:27.000000000","message":"A description of the expected args would be helpful.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def main():"},{"line_number":41,"context_line":"    operation \u003d sys.argv[1]"},{"line_number":42,"context_line":"    prefix_fname \u003d sys.argv[2]"},{"line_number":43,"context_line":"    agent_pid \u003d sys.argv[3]"},{"line_number":44,"context_line":"    prefix \u003d os.getenv(\u0027PREFIX1\u0027, \"::\")"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_ef497bb8","line":41,"in_reply_to":"1a4dcd0f_17429aae","updated":"2015-08-11 12:19:31.000000000","message":"Done","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e2668cc93b17ce947a7f7eba65926653439943c8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    os.kill(int(agent_pid), signal.SIGHUP)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"if __name__ \u003d\u003d \"__main__\":"},{"line_number":54,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_5797c239","line":53,"updated":"2015-08-05 22:49:27.000000000","message":"nit:  This file doesn\u0027t have execute permissions in the repo, could it ever be called this way?","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"3cebe4f0e1182220123e47ccfc686a0779247651","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    os.kill(int(agent_pid), signal.SIGHUP)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"if __name__ \u003d\u003d \"__main__\":"},{"line_number":54,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a4dcd0f_1df5fdc9","line":53,"in_reply_to":"1a4dcd0f_5797c239","updated":"2015-08-11 12:19:31.000000000","message":"Good point. setup.cfg already provides this hook for us.","commit_id":"aa9515daef930c7594cd93881b7d668bb0e512dd"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import tempfile"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def replace_file(file_name, data):"},{"line_number":23,"context_line":"    \"\"\"Replaces the contents of file_name with data in a safe manner."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    First write to a temp file and then rename. Since POSIX renames are"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_a2c45092","line":22,"updated":"2015-08-17 18:23:45.000000000","message":"Nit: this could probably go in common/utils.py","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import tempfile"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def replace_file(file_name, data):"},{"line_number":23,"context_line":"    \"\"\"Replaces the contents of file_name with data in a safe manner."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    First write to a temp file and then rename. Since POSIX renames are"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_9589ec28","line":22,"in_reply_to":"fa1b9901_a2c45092","updated":"2015-08-19 12:23:53.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"}],"neutron/cmd/sanity/checks.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"MINIMUM_DNSMASQ_VERSION \u003d 2.67"},{"line_number":45,"context_line":"MINIMUM_DIBBLER_VERSION \u003d \u00271.0.1\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def ovs_vxlan_supported(from_ip\u003d\u0027192.0.2.1\u0027, to_ip\u003d\u0027192.0.2.2\u0027):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_42bf74d0","line":45,"updated":"2015-08-17 18:23:45.000000000","message":"The dnsmasq sanity check is not a good example to follow. Rather than check for a specific version, we should test for a particular feature that we need. Can we do some check on bind-to-address?","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"MINIMUM_DNSMASQ_VERSION \u003d 2.67"},{"line_number":45,"context_line":"MINIMUM_DIBBLER_VERSION \u003d \u00271.0.1\u0027"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def ovs_vxlan_supported(from_ip\u003d\u0027192.0.2.1\u0027, to_ip\u003d\u0027192.0.2.2\u0027):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_75ebf8b0","line":45,"in_reply_to":"fa1b9901_42bf74d0","updated":"2015-08-19 12:23:53.000000000","message":"We don\u0027t check for a specific version, we\u0027re testing for the availability of the -w flag. The minimum version here is just for feedback to the user to tell them which version they need to upgrade to.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"}],"neutron/common/constants.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5246a74475b0ab3a8e6792695c44088143cf87c6","unresolved":false,"context_lines":[{"line_number":146,"context_line":"# Special provisional prefix for IPv6 Prefix Delegation"},{"line_number":147,"context_line":"PROVISIONAL_IPV6_PD_PREFIX \u003d \u0027::/64\u0027"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"IPV6_UNSPECIFIED_ADDR \u003d \u0027::\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"# Timeout in seconds for getting an IPv6 LLA"},{"line_number":152,"context_line":"LLA_TASK_TIMEOUT \u003d 40"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_6bee1eee","line":149,"updated":"2015-08-17 15:51:05.000000000","message":"This isn\u0027t used anywhere according to grep.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"9cf8b66069e25ef6c7ce36b06bf9b2b3167bb93b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"# Special provisional prefix for IPv6 Prefix Delegation"},{"line_number":147,"context_line":"PROVISIONAL_IPV6_PD_PREFIX \u003d \u0027::/64\u0027"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"IPV6_UNSPECIFIED_ADDR \u003d \u0027::\u0027"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"# Timeout in seconds for getting an IPv6 LLA"},{"line_number":152,"context_line":"LLA_TASK_TIMEOUT \u003d 40"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_5152e814","line":149,"in_reply_to":"fa1b9901_6bee1eee","updated":"2015-08-17 18:00:20.000000000","message":"Ah, this is left over from a much older patchset. Removed.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"}],"neutron/tests/unit/agent/l3/test_agent.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"5246a74475b0ab3a8e6792695c44088143cf87c6","unresolved":false,"context_lines":[{"line_number":1163,"context_line":"        self._process_router_instance_for_agent(agent, ri, router)"},{"line_number":1164,"context_line":"        return ri"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"    def _assert_ri_process_enabled(self, ri, process):"},{"line_number":1167,"context_line":"        \"\"\"Verify that process was enabled for a router instance.\"\"\""},{"line_number":1168,"context_line":"        expected_calls \u003d self._radvd_expected_call_external_process(ri)"},{"line_number":1169,"context_line":"        self.assertEqual(expected_calls, self.external_process.mock_calls)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_309ad515","line":1166,"updated":"2015-08-17 15:51:05.000000000","message":"The \u0027process\u0027 argument isn\u0027t used any more, but there are still callers passing \u0027radvd\u0027 along.  Same with below.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"9cf8b66069e25ef6c7ce36b06bf9b2b3167bb93b","unresolved":false,"context_lines":[{"line_number":1163,"context_line":"        self._process_router_instance_for_agent(agent, ri, router)"},{"line_number":1164,"context_line":"        return ri"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"    def _assert_ri_process_enabled(self, ri, process):"},{"line_number":1167,"context_line":"        \"\"\"Verify that process was enabled for a router instance.\"\"\""},{"line_number":1168,"context_line":"        expected_calls \u003d self._radvd_expected_call_external_process(ri)"},{"line_number":1169,"context_line":"        self.assertEqual(expected_calls, self.external_process.mock_calls)"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_b1a3449e","line":1166,"in_reply_to":"fa1b9901_309ad515","updated":"2015-08-17 18:00:20.000000000","message":"Done","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":2209,"context_line":"        for subnet in intf[\u0027subnets\u0027]:"},{"line_number":2210,"context_line":"            return dibbler.PDDibbler(router[\u0027id\u0027],"},{"line_number":2211,"context_line":"                       subnet[\u0027id\u0027], ifname).requestor_id"},{"line_number":2212,"context_line":"            break"},{"line_number":2213,"context_line":""},{"line_number":2214,"context_line":"    def _pd_assert_dibbler_calls(self, expected, actual):"},{"line_number":2215,"context_line":"        \u0027\u0027\u0027Check the external process calls for dibbler are expected"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_02bbbc73","line":2212,"updated":"2015-08-17 18:23:45.000000000","message":"Unreachable","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c0d5d2ae577d422e04471e4f371b48c8930e074e","unresolved":false,"context_lines":[{"line_number":2209,"context_line":"        for subnet in intf[\u0027subnets\u0027]:"},{"line_number":2210,"context_line":"            return dibbler.PDDibbler(router[\u0027id\u0027],"},{"line_number":2211,"context_line":"                       subnet[\u0027id\u0027], ifname).requestor_id"},{"line_number":2212,"context_line":"            break"},{"line_number":2213,"context_line":""},{"line_number":2214,"context_line":"    def _pd_assert_dibbler_calls(self, expected, actual):"},{"line_number":2215,"context_line":"        \u0027\u0027\u0027Check the external process calls for dibbler are expected"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_d5abe41b","line":2212,"in_reply_to":"fa1b9901_02bbbc73","updated":"2015-08-19 12:23:53.000000000","message":"Removed","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d4f323bf376f6fcc91e11083675d4f281fa9b210","unresolved":false,"context_lines":[{"line_number":2299,"context_line":"    @mock.patch.object(pd.PrefixDelegation, \u0027_is_lla_active\u0027,"},{"line_number":2300,"context_line":"                       return_value\u003dTrue)"},{"line_number":2301,"context_line":"    @mock.patch.object(dibbler.os, \u0027chmod\u0027)"},{"line_number":2302,"context_line":"    @mock.patch.object(dibbler.shutil, \u0027rmtree\u0027)"},{"line_number":2303,"context_line":"    @mock.patch.object(pd.PrefixDelegation, \u0027_get_sync_data\u0027)"},{"line_number":2304,"context_line":"    def test_pd_dibbler(self, mock1, mock2, mock3, mock4,"},{"line_number":2305,"context_line":"                        mock_getpid, mock_get_prefix):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa1b9901_bd3795e2","line":2302,"updated":"2015-08-17 18:23:45.000000000","message":"(No action required.) We should probably put os.* and shutil.* mocks in the base test class. It will make tests like this look less mocky and make neutron\u0027s unit tests in general a little safer.","commit_id":"481412c4c1d1b6faf361380e0f25f172592a1a69"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":2106,"context_line":"            assertFlag(managed_flag)(\u0027AdvManagedFlag on;\u0027,"},{"line_number":2107,"context_line":"                self.utils_replace_file.call_args[0][1])"},{"line_number":2108,"context_line":""},{"line_number":2109,"context_line":"    def _pd_expected_call_external_process(self, requestor, ri, enable\u003dTrue):"},{"line_number":2110,"context_line":"        expected_calls \u003d []"},{"line_number":2111,"context_line":"        if enable:"},{"line_number":2112,"context_line":"            expected_calls.append(mock.call(uuid\u003drequestor,"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_3d362504","line":2109,"updated":"2015-08-17 18:49:48.000000000","message":"Should all the prefix delegation methods be in a different module, and/or at least class? You can have the class name indicate prefix delegation, and then the individual test methods can indicate what is bing tested.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":2106,"context_line":"            assertFlag(managed_flag)(\u0027AdvManagedFlag on;\u0027,"},{"line_number":2107,"context_line":"                self.utils_replace_file.call_args[0][1])"},{"line_number":2108,"context_line":""},{"line_number":2109,"context_line":"    def _pd_expected_call_external_process(self, requestor, ri, enable\u003dTrue):"},{"line_number":2110,"context_line":"        expected_calls \u003d []"},{"line_number":2111,"context_line":"        if enable:"},{"line_number":2112,"context_line":"            expected_calls.append(mock.call(uuid\u003drequestor,"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_0a1a9c6e","line":2109,"in_reply_to":"fa1b9901_3d362504","updated":"2015-08-19 12:24:06.000000000","message":"I\u0027m not sure if they should. To me it\u0027s no different than any other test with a different set of parameters.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":2307,"context_line":"    @mock.patch.object(dibbler.os, \u0027chmod\u0027)"},{"line_number":2308,"context_line":"    @mock.patch.object(dibbler.shutil, \u0027rmtree\u0027)"},{"line_number":2309,"context_line":"    @mock.patch.object(pd.PrefixDelegation, \u0027_get_sync_data\u0027)"},{"line_number":2310,"context_line":"    def test_pd_dibbler(self, mock1, mock2, mock3, mock4,"},{"line_number":2311,"context_line":"                        mock_getpid, mock_get_prefix):"},{"line_number":2312,"context_line":"        \u0027\u0027\u0027Add and remove one pd-enabled subnet"},{"line_number":2313,"context_line":"        Remove the interface by deleting it from the router"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_7da7bd4f","line":2310,"updated":"2015-08-17 18:49:48.000000000","message":"more descriptive name? test_add_and_remove_prefix_delegation_enabled_subnet","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":2307,"context_line":"    @mock.patch.object(dibbler.os, \u0027chmod\u0027)"},{"line_number":2308,"context_line":"    @mock.patch.object(dibbler.shutil, \u0027rmtree\u0027)"},{"line_number":2309,"context_line":"    @mock.patch.object(pd.PrefixDelegation, \u0027_get_sync_data\u0027)"},{"line_number":2310,"context_line":"    def test_pd_dibbler(self, mock1, mock2, mock3, mock4,"},{"line_number":2311,"context_line":"                        mock_getpid, mock_get_prefix):"},{"line_number":2312,"context_line":"        \u0027\u0027\u0027Add and remove one pd-enabled subnet"},{"line_number":2313,"context_line":"        Remove the interface by deleting it from the router"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_c0ba4023","line":2310,"in_reply_to":"fa1b9901_7da7bd4f","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1aedf95a6d831abc93feb1b43ce85b327c4f5246","unresolved":false,"context_lines":[{"line_number":2346,"context_line":"    @mock.patch.object(dibbler.os, \u0027chmod\u0027)"},{"line_number":2347,"context_line":"    @mock.patch.object(dibbler.shutil, \u0027rmtree\u0027)"},{"line_number":2348,"context_line":"    @mock.patch.object(pd.PrefixDelegation, \u0027_get_sync_data\u0027)"},{"line_number":2349,"context_line":"    def test_pd_dibbler1(self, mock1, mock2, mock3, mock4,"},{"line_number":2350,"context_line":"                        mock_getpid, mock_get_prefix):"},{"line_number":2351,"context_line":"        \u0027\u0027\u0027Add one pd-enabled subnet and remove the gateway port"},{"line_number":2352,"context_line":"        Remove the gateway port and check the prefix is removed"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_3d6865f5","line":2349,"updated":"2015-08-17 18:49:48.000000000","message":"better method name. Here and others.","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"bbe76307aa42042ad19213d8afe1ca99eb5bb4af","unresolved":false,"context_lines":[{"line_number":2346,"context_line":"    @mock.patch.object(dibbler.os, \u0027chmod\u0027)"},{"line_number":2347,"context_line":"    @mock.patch.object(dibbler.shutil, \u0027rmtree\u0027)"},{"line_number":2348,"context_line":"    @mock.patch.object(pd.PrefixDelegation, \u0027_get_sync_data\u0027)"},{"line_number":2349,"context_line":"    def test_pd_dibbler1(self, mock1, mock2, mock3, mock4,"},{"line_number":2350,"context_line":"                        mock_getpid, mock_get_prefix):"},{"line_number":2351,"context_line":"        \u0027\u0027\u0027Add one pd-enabled subnet and remove the gateway port"},{"line_number":2352,"context_line":"        Remove the gateway port and check the prefix is removed"}],"source_content_type":"text/x-python","patch_set":21,"id":"fa1b9901_00b11847","line":2349,"in_reply_to":"fa1b9901_3d6865f5","updated":"2015-08-19 12:24:06.000000000","message":"Done","commit_id":"bb72992ee422796f17c2c8af03e32ff463c8f976"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"78488d9f1eabc94074138fc30cd6aabc8171ae29","unresolved":false,"context_lines":[{"line_number":2326,"context_line":"    @mock.patch.object(dibbler.os, \u0027chmod\u0027)"},{"line_number":2327,"context_line":"    @mock.patch.object(dibbler.shutil, \u0027rmtree\u0027)"},{"line_number":2328,"context_line":"    @mock.patch.object(pd.PrefixDelegation, \u0027_get_sync_data\u0027)"},{"line_number":2329,"context_line":"    def test_pd_add_remove_subnet(self, mock1, mock2, mock3, mock4,"},{"line_number":2330,"context_line":"                                  mock_getpid, mock_get_prefix):"},{"line_number":2331,"context_line":"        \u0027\u0027\u0027Add and remove one pd-enabled subnet"},{"line_number":2332,"context_line":"        Remove the interface by deleting it from the router"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa1b9901_c8946944","line":2329,"updated":"2015-08-20 12:35:14.000000000","message":"There are four test cases with the same set of mock decorators. You could consider creating a new class with setUp() that does the mocking once, to remove duplication. Side benefit of grouping like tests.","commit_id":"eda9c7f6f2f66bd7e67f8da4c569bb0d8dba0347"}]}
