)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"02b08f764b0945ad60a479a749dab430d029176f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"associated with floating ips, ports and networks. As a consequence, the"},{"line_number":13,"context_line":"floating ips and networks api is extended to manage dns_name and dns_domain"},{"line_number":14,"context_line":"attributes. The dns_name attribute was added to ports in a preceding commit"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"DocImpact"},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"Implements: blueprint external-dns-resolution"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da20952f_2b32e85e","line":15,"updated":"2015-09-03 23:08:46.000000000","message":"Can you mention in the commit message that the reference implementation is based on designate just so it\u0027s easy to find searching through the commit logs?","commit_id":"fec0065c7b2827a118b8d62e345ff0414e38bb77"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3b069ff1e75e83d97d019e3c157faab746eac96","unresolved":false,"context_lines":[{"line_number":12,"context_line":"associated with floating ips, ports and networks. As a consequence, the"},{"line_number":13,"context_line":"floating ips and networks api is extended to manage dns_name and dns_domain"},{"line_number":14,"context_line":"attributes. The dns_name attribute was added to ports in a preceding commit"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"DocImpact"},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"Implements: blueprint external-dns-resolution"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da20952f_ca83bdc9","line":15,"in_reply_to":"da20952f_2b32e85e","updated":"2015-09-08 01:00:30.000000000","message":"Done","commit_id":"fec0065c7b2827a118b8d62e345ff0414e38bb77"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"02b08f764b0945ad60a479a749dab430d029176f","unresolved":false,"context_lines":[{"line_number":14,"context_line":"attributes. The dns_name attribute was added to ports in a preceding commit"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"DocImpact"},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"Implements: blueprint external-dns-resolution"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ic298ad2558410ab9a614f22e1757d1fc8b22c482"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da20952f_4b371c4d","line":17,"updated":"2015-09-03 23:08:46.000000000","message":"I don\u0027t think this particular patch impacts the API so you can remove this tag.","commit_id":"fec0065c7b2827a118b8d62e345ff0414e38bb77"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3b069ff1e75e83d97d019e3c157faab746eac96","unresolved":false,"context_lines":[{"line_number":14,"context_line":"attributes. The dns_name attribute was added to ports in a preceding commit"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"DocImpact"},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"Implements: blueprint external-dns-resolution"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ic298ad2558410ab9a614f22e1757d1fc8b22c482"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da20952f_2a7599f8","line":17,"in_reply_to":"da20952f_4b371c4d","updated":"2015-09-08 01:00:30.000000000","message":"There is API impact. Just hadn\u0027t gotten to that point in PS6. PS7 already includes this impact","commit_id":"fec0065c7b2827a118b8d62e345ff0414e38bb77"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"937e9713a1d49adbf1eab11697701f3a92d85c09","unresolved":false,"context_lines":[{"line_number":14,"context_line":"and dns_domain attributes. The dns_name attribute was added to ports in a"},{"line_number":15,"context_line":"preceding commit"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"},{"line_number":18,"context_line":"APIImpact"},{"line_number":19,"context_line":"Implements: blueprint external-dns-resolution"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":31,"id":"7a740942_e86c560a","line":17,"updated":"2015-12-04 01:16:54.000000000","message":"Please follow guidelines as detailed here:\n\nhttp://lists.openstack.org/pipermail/openstack-dev/2015-November/080294.html\n\n\"you will need to add a description whenever you add a DocImpact flag in your commit message.\"","commit_id":"fb5ecf7d66db2a37e619f409e74c567fd1294002"}],"doc/source/devref/external_dns_integration.rst":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":28,"context_line":"This interface is based on an abstract driver that can be used as the base"},{"line_number":29,"context_line":"class to implement concrete drivers to interact with various DNS services. The"},{"line_number":30,"context_line":"reference concrete implementation of such a driver integrates Neutron with"},{"line_number":31,"context_line":"`OpenStack Designate \u003chttp://docs.openstack.org/developer/designate/index.html\u003e`_. "},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"With this intergration, users are able to publish in the external DNS service"},{"line_number":34,"context_line":"the dns_name and dns_domain attributes associated with floating ip\u0027s, ports and"}],"source_content_type":"text/x-rst","patch_set":33,"id":"7a740942_7f09a6dc","line":31,"updated":"2015-12-07 09:28:00.000000000","message":"whitespace","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":28,"context_line":"This interface is based on an abstract driver that can be used as the base"},{"line_number":29,"context_line":"class to implement concrete drivers to interact with various DNS services. The"},{"line_number":30,"context_line":"reference concrete implementation of such a driver integrates Neutron with"},{"line_number":31,"context_line":"`OpenStack Designate \u003chttp://docs.openstack.org/developer/designate/index.html\u003e`_. "},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"With this intergration, users are able to publish in the external DNS service"},{"line_number":34,"context_line":"the dns_name and dns_domain attributes associated with floating ip\u0027s, ports and"}],"source_content_type":"text/x-rst","patch_set":33,"id":"7a740942_409edeb9","line":31,"in_reply_to":"7a740942_7f09a6dc","updated":"2015-12-09 01:29:31.000000000","message":"Done","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":42,"context_line":"*dns_domain* attributes were added to floating ip\u0027s, ports and networks. The"},{"line_number":43,"context_line":"*dns_name* specifies the name to be associated with a corresponding ip address,"},{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"},{"line_number":45,"context_line":"*dns_domain* in the external DNS service. "},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Specifically, floating ip\u0027s, ports and networks are extended as follows:"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"7a740942_df73fa7e","line":45,"updated":"2015-12-07 09:28:00.000000000","message":"whitespace","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":42,"context_line":"*dns_domain* attributes were added to floating ip\u0027s, ports and networks. The"},{"line_number":43,"context_line":"*dns_name* specifies the name to be associated with a corresponding ip address,"},{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"},{"line_number":45,"context_line":"*dns_domain* in the external DNS service. "},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Specifically, floating ip\u0027s, ports and networks are extended as follows:"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":33,"id":"7a740942_00a45605","line":45,"in_reply_to":"7a740942_df73fa7e","updated":"2015-12-09 01:29:31.000000000","message":"Done","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":12,"context_line":"      under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"      Convention for heading levels in Neutron devref:"},{"line_number":16,"context_line":"      \u003d\u003d\u003d\u003d\u003d\u003d\u003d  Heading 0 (reserved for the title in a document)"},{"line_number":17,"context_line":"      -------  Heading 1"},{"line_number":18,"context_line":"      ~~~~~~~  Heading 2"}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_bae56a09","line":15,"updated":"2015-12-09 01:58:58.000000000","message":"Do the conventions need to stay here?","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":12,"context_line":"      under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"      Convention for heading levels in Neutron devref:"},{"line_number":16,"context_line":"      \u003d\u003d\u003d\u003d\u003d\u003d\u003d  Heading 0 (reserved for the title in a document)"},{"line_number":17,"context_line":"      -------  Heading 1"},{"line_number":18,"context_line":"      ~~~~~~~  Heading 2"}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_f978a42d","line":15,"in_reply_to":"7a740942_bae56a09","updated":"2015-12-11 01:22:32.000000000","message":"Probably not. It was present in the example I used as template. I just removed it","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Integration with external DNS services"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Neutron has now an interface defined to interact with an external DNS service."},{"line_number":28,"context_line":"This interface is based on an abstract driver that can be used as the base"},{"line_number":29,"context_line":"class to implement concrete drivers to interact with various DNS services. The"},{"line_number":30,"context_line":"reference concrete implementation of such a driver integrates Neutron with"}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_daa396fe","line":27,"updated":"2015-12-09 01:58:58.000000000","message":"The word \"now\" is relative. Suggest referencing a specific release. For example:\n\nSince the Mitaka release, ...","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Integration with external DNS services"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Neutron has now an interface defined to interact with an external DNS service."},{"line_number":28,"context_line":"This interface is based on an abstract driver that can be used as the base"},{"line_number":29,"context_line":"class to implement concrete drivers to interact with various DNS services. The"},{"line_number":30,"context_line":"reference concrete implementation of such a driver integrates Neutron with"}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_39b4eccf","line":27,"in_reply_to":"7a740942_daa396fe","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Neutron has now an interface defined to interact with an external DNS service."},{"line_number":28,"context_line":"This interface is based on an abstract driver that can be used as the base"},{"line_number":29,"context_line":"class to implement concrete drivers to interact with various DNS services. The"},{"line_number":30,"context_line":"reference concrete implementation of such a driver integrates Neutron with"},{"line_number":31,"context_line":"`OpenStack Designate \u003chttp://docs.openstack.org/developer/designate/index.html\u003e`_."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"With this intergration, users are able to publish in the external DNS service"}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_daa95691","line":30,"updated":"2015-12-09 01:58:58.000000000","message":"The central documentation uses lower-case for service code-names... not sure if that applies here.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Neutron has now an interface defined to interact with an external DNS service."},{"line_number":28,"context_line":"This interface is based on an abstract driver that can be used as the base"},{"line_number":29,"context_line":"class to implement concrete drivers to interact with various DNS services. The"},{"line_number":30,"context_line":"reference concrete implementation of such a driver integrates Neutron with"},{"line_number":31,"context_line":"`OpenStack Designate \u003chttp://docs.openstack.org/developer/designate/index.html\u003e`_."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"With this intergration, users are able to publish in the external DNS service"}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_595f7875","line":30,"in_reply_to":"7a740942_daa95691","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":30,"context_line":"reference concrete implementation of such a driver integrates Neutron with"},{"line_number":31,"context_line":"`OpenStack Designate \u003chttp://docs.openstack.org/developer/designate/index.html\u003e`_."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"With this intergration, users are able to publish in the external DNS service"},{"line_number":34,"context_line":"the dns_name and dns_domain attributes associated with floating ip\u0027s, ports and"},{"line_number":35,"context_line":"networks."},{"line_number":36,"context_line":""}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_7ab86211","line":33,"updated":"2015-12-09 01:58:58.000000000","message":"intergration -\u003e integration\n\nSuggestion:\n\nThis integration allows users to publish ``dns_name`` and ``dns_domain`` attributes associated with floating IP addresses, ports, and networks in an external DNS service.\n\n(or *thing* instead of ``thing``)","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":30,"context_line":"reference concrete implementation of such a driver integrates Neutron with"},{"line_number":31,"context_line":"`OpenStack Designate \u003chttp://docs.openstack.org/developer/designate/index.html\u003e`_."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"With this intergration, users are able to publish in the external DNS service"},{"line_number":34,"context_line":"the dns_name and dns_domain attributes associated with floating ip\u0027s, ports and"},{"line_number":35,"context_line":"networks."},{"line_number":36,"context_line":""}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_7964b448","line":33,"in_reply_to":"7a740942_7ab86211","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":38,"context_line":"Changes to the Neutron API"},{"line_number":39,"context_line":"--------------------------"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"To support integration with an external DNS service, *dns_name* and"},{"line_number":42,"context_line":"*dns_domain* attributes were added to floating ip\u0027s, ports and networks. The"},{"line_number":43,"context_line":"*dns_name* specifies the name to be associated with a corresponding ip address,"},{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_3a641ab7","line":41,"updated":"2015-12-09 01:58:58.000000000","message":"... the *dns_name* and...","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":38,"context_line":"Changes to the Neutron API"},{"line_number":39,"context_line":"--------------------------"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"To support integration with an external DNS service, *dns_name* and"},{"line_number":42,"context_line":"*dns_domain* attributes were added to floating ip\u0027s, ports and networks. The"},{"line_number":43,"context_line":"*dns_name* specifies the name to be associated with a corresponding ip address,"},{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_99e400ad","line":41,"in_reply_to":"7a740942_3a641ab7","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":39,"context_line":"--------------------------"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"To support integration with an external DNS service, *dns_name* and"},{"line_number":42,"context_line":"*dns_domain* attributes were added to floating ip\u0027s, ports and networks. The"},{"line_number":43,"context_line":"*dns_name* specifies the name to be associated with a corresponding ip address,"},{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"},{"line_number":45,"context_line":"*dns_domain* in the external DNS service."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_7afdc2af","line":42,"updated":"2015-12-09 01:58:58.000000000","message":"Not possessive... use floating IPs or floating IP addresses.\n\n... ports, and networks.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":39,"context_line":"--------------------------"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"To support integration with an external DNS service, *dns_name* and"},{"line_number":42,"context_line":"*dns_domain* attributes were added to floating ip\u0027s, ports and networks. The"},{"line_number":43,"context_line":"*dns_name* specifies the name to be associated with a corresponding ip address,"},{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"},{"line_number":45,"context_line":"*dns_domain* in the external DNS service."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_199ed007","line":42,"in_reply_to":"7a740942_7afdc2af","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"To support integration with an external DNS service, *dns_name* and"},{"line_number":42,"context_line":"*dns_domain* attributes were added to floating ip\u0027s, ports and networks. The"},{"line_number":43,"context_line":"*dns_name* specifies the name to be associated with a corresponding ip address,"},{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"},{"line_number":45,"context_line":"*dns_domain* in the external DNS service."},{"line_number":46,"context_line":""}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_3a32daa7","line":43,"updated":"2015-12-09 01:58:58.000000000","message":"IP","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"To support integration with an external DNS service, *dns_name* and"},{"line_number":42,"context_line":"*dns_domain* attributes were added to floating ip\u0027s, ports and networks. The"},{"line_number":43,"context_line":"*dns_name* specifies the name to be associated with a corresponding ip address,"},{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"},{"line_number":45,"context_line":"*dns_domain* in the external DNS service."},{"line_number":46,"context_line":""}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_59bbf875","line":43,"in_reply_to":"7a740942_3a32daa7","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"},{"line_number":45,"context_line":"*dns_domain* in the external DNS service."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Specifically, floating ip\u0027s, ports and networks are extended as follows:"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Floating ip\u0027s have a *dns_name* and a *dns_domain* attribute."},{"line_number":50,"context_line":"* Ports have a *dns_name* attribute."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_5a19e620","line":47,"updated":"2015-12-09 01:58:58.000000000","message":"Same issue with floating IPs and missing comma.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":44,"context_line":"both of which will be published to an existing domain with the name"},{"line_number":45,"context_line":"*dns_domain* in the external DNS service."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Specifically, floating ip\u0027s, ports and networks are extended as follows:"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Floating ip\u0027s have a *dns_name* and a *dns_domain* attribute."},{"line_number":50,"context_line":"* Ports have a *dns_name* attribute."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_196c9007","line":47,"in_reply_to":"7a740942_5a19e620","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Specifically, floating ip\u0027s, ports and networks are extended as follows:"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Floating ip\u0027s have a *dns_name* and a *dns_domain* attribute."},{"line_number":50,"context_line":"* Ports have a *dns_name* attribute."},{"line_number":51,"context_line":"* Networks have a *dns_domain* attributes."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_dadb964d","line":49,"updated":"2015-12-09 01:58:58.000000000","message":"Same issue with floating IPs.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Specifically, floating ip\u0027s, ports and networks are extended as follows:"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Floating ip\u0027s have a *dns_name* and a *dns_domain* attribute."},{"line_number":50,"context_line":"* Ports have a *dns_name* attribute."},{"line_number":51,"context_line":"* Networks have a *dns_domain* attributes."}],"source_content_type":"text/x-rst","patch_set":34,"id":"7a740942_39714ce1","line":49,"in_reply_to":"7a740942_dadb964d","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":30,"context_line":"Changes to the neutron API"},{"line_number":31,"context_line":"--------------------------"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"To support integration with an external DNS service, the  *dns_name* and"},{"line_number":34,"context_line":"*dns_domain* attributes were added to floating ips, ports and networks. The"},{"line_number":35,"context_line":"*dns_name* specifies the name to be associated with a corresponding IP address,"},{"line_number":36,"context_line":"both of which will be published to an existing domain with the name"}],"source_content_type":"text/x-rst","patch_set":37,"id":"fa69d971_cb31a5a3","line":33,"range":{"start_line":33,"start_character":56,"end_line":33,"end_character":58},"updated":"2016-01-12 16:49:49.000000000","message":"super tiny pico nit not even worth mentioning: double space.  lol","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":30,"context_line":"Changes to the neutron API"},{"line_number":31,"context_line":"--------------------------"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"To support integration with an external DNS service, the  *dns_name* and"},{"line_number":34,"context_line":"*dns_domain* attributes were added to floating ips, ports and networks. The"},{"line_number":35,"context_line":"*dns_name* specifies the name to be associated with a corresponding IP address,"},{"line_number":36,"context_line":"both of which will be published to an existing domain with the name"}],"source_content_type":"text/x-rst","patch_set":37,"id":"da6ed579_31be38d5","line":33,"range":{"start_line":33,"start_character":56,"end_line":33,"end_character":58},"in_reply_to":"fa69d971_cb31a5a3","updated":"2016-01-18 23:57:04.000000000","message":"Every little bit helps :-) Thanks","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"}],"etc/neutron.conf":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"a0429107704c976902aabecfdd3fb1ff09b542d8","unresolved":false,"context_lines":[{"line_number":118,"context_line":"# dns_domain \u003d openstacklocal"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# External DNS driver"},{"line_number":121,"context_line":"# external_dns_driver \u003d "},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"# Allow sending resource operation notification to DHCP agent"},{"line_number":124,"context_line":"# dhcp_agent_notification \u003d True"}],"source_content_type":"text/plain","patch_set":3,"id":"fa1b9901_154a95ac","line":121,"updated":"2015-08-20 00:57:48.000000000","message":"whoops","commit_id":"8a97f6dfa4bbeb2f7e09a36a9fef645cb940e1ef"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8dd2707dc26e75d26e93dcffb01d6bda6d66c6fa","unresolved":false,"context_lines":[{"line_number":118,"context_line":"# dns_domain \u003d openstacklocal"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# External DNS driver"},{"line_number":121,"context_line":"# external_dns_driver \u003d "},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"# Allow sending resource operation notification to DHCP agent"},{"line_number":124,"context_line":"# dhcp_agent_notification \u003d True"}],"source_content_type":"text/plain","patch_set":3,"id":"fa1b9901_ed884673","line":121,"in_reply_to":"fa1b9901_154a95ac","updated":"2015-08-20 19:22:48.000000000","message":"Thanks! Fixed","commit_id":"8a97f6dfa4bbeb2f7e09a36a9fef645cb940e1ef"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"da20952f_fb666bed","updated":"2015-09-08 22:43:51.000000000","message":"How does Neutron authenticate to designate?  Is there some sort of credential needed?  I can\u0027t remember how we talked about that working.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ba15a1d1_7be4bb0c","in_reply_to":"da20952f_fb666bed","updated":"2015-09-16 20:20:31.000000000","message":"We will use the auth token that comes in the request\u0027s context. In the case of nova talking to neutron, sometimes, when creating some ports, admin privileges are required. That is why nova.conf contains authentication data for Neutron. In our case, we will just be creating recordsets on behalf of the user sending us the request. For this, the user\u0027s auth token contained in the request\u0027s context is suffcient","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":117,"context_line":"# Domain to use for building the hostnames"},{"line_number":118,"context_line":"# dns_domain \u003d openstacklocal"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# External DNS driver"},{"line_number":121,"context_line":"# external_dns_driver \u003d"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"# Allow sending resource operation notification to DHCP agent"}],"source_content_type":"text/plain","patch_set":7,"id":"da20952f_b8c23933","line":120,"updated":"2015-09-08 22:43:51.000000000","message":"Maybe add an example for the designate driver.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":117,"context_line":"# Domain to use for building the hostnames"},{"line_number":118,"context_line":"# dns_domain \u003d openstacklocal"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# External DNS driver"},{"line_number":121,"context_line":"# external_dns_driver \u003d"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"# Allow sending resource operation notification to DHCP agent"}],"source_content_type":"text/plain","patch_set":7,"id":"ba15a1d1_3b73a34f","line":120,"in_reply_to":"da20952f_b8c23933","updated":"2015-09-16 20:20:31.000000000","message":"Done","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":804,"context_line":""},{"line_number":805,"context_line":"[designate]"},{"line_number":806,"context_line":"# Designate\u0027s endpoint"},{"line_number":807,"context_line":"# url \u003d http://127.0.0.1:9001/v2"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"[oslo_concurrency]"},{"line_number":810,"context_line":""}],"source_content_type":"text/plain","patch_set":7,"id":"da20952f_98a415ba","line":807,"updated":"2015-09-08 22:43:51.000000000","message":"This looks like \"http://127.0.0.1:9001/v2\" is the default.  I think the following is more correct.\n\n # Designate\u0027s endpoint\n # Example: url \u003d http://127.0.0.1:9001/v2\n # url \u003d","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":804,"context_line":""},{"line_number":805,"context_line":"[designate]"},{"line_number":806,"context_line":"# Designate\u0027s endpoint"},{"line_number":807,"context_line":"# url \u003d http://127.0.0.1:9001/v2"},{"line_number":808,"context_line":""},{"line_number":809,"context_line":"[oslo_concurrency]"},{"line_number":810,"context_line":""}],"source_content_type":"text/plain","patch_set":7,"id":"ba15a1d1_bb9d735b","line":807,"in_reply_to":"da20952f_98a415ba","updated":"2015-09-16 20:20:31.000000000","message":"Done","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":118,"context_line":"# dns_domain \u003d openstacklocal"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# External DNS driver"},{"line_number":121,"context_line":"# Example: external_dns_driver \u003d neutron.services.externaldns.drivers.designate.driver.Designate"},{"line_number":122,"context_line":"# external_dns_driver \u003d"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Allow sending resource operation notification to DHCP agent"}],"source_content_type":"text/plain","patch_set":30,"id":"ba8a016a_9e5fec74","line":121,"updated":"2015-11-22 23:59:24.000000000","message":"i would prefer we use stevedore","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":118,"context_line":"# dns_domain \u003d openstacklocal"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"# External DNS driver"},{"line_number":121,"context_line":"# Example: external_dns_driver \u003d neutron.services.externaldns.drivers.designate.driver.Designate"},{"line_number":122,"context_line":"# external_dns_driver \u003d"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"# Allow sending resource operation notification to DHCP agent"}],"source_content_type":"text/plain","patch_set":30,"id":"9a8ffd7b_3c509c31","line":121,"in_reply_to":"ba8a016a_9e5fec74","updated":"2015-11-29 23:05:55.000000000","message":"Done","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":819,"context_line":"# admin_tenant_name \u003d"},{"line_number":820,"context_line":"#"},{"line_number":821,"context_line":"# Allow (True or False) the creation of PTR records in Designate by Neutron"},{"line_number":822,"context_line":"# allow_reverse_dns_lookup \u003d"},{"line_number":823,"context_line":"#"},{"line_number":824,"context_line":"# Number of bits in ipv4 PTR zones that will be considered network prefix. It"},{"line_number":825,"context_line":"# has to align to byte boundary. Default is 24. Minimum value is 8. Maximum"}],"source_content_type":"text/plain","patch_set":30,"id":"ba8a016a_fe739813","line":822,"updated":"2015-11-22 23:59:24.000000000","message":"you should set the default value.\n\nWhy defining one driver with an option instead of 2 drivers (it would highlight that the 2 last options concerned the driver with lookup feature).","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":819,"context_line":"# admin_tenant_name \u003d"},{"line_number":820,"context_line":"#"},{"line_number":821,"context_line":"# Allow (True or False) the creation of PTR records in Designate by Neutron"},{"line_number":822,"context_line":"# allow_reverse_dns_lookup \u003d"},{"line_number":823,"context_line":"#"},{"line_number":824,"context_line":"# Number of bits in ipv4 PTR zones that will be considered network prefix. It"},{"line_number":825,"context_line":"# has to align to byte boundary. Default is 24. Minimum value is 8. Maximum"}],"source_content_type":"text/plain","patch_set":30,"id":"9a8ffd7b_f82313bb","line":822,"in_reply_to":"ba8a016a_fe739813","updated":"2015-11-29 23:05:55.000000000","message":"I put the default value. Didn\u0027t understand the rest of the comment","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"}],"neutron/common/config.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d8a9a97bf9f1415cc2102a8c26a5f14c950f57a1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    cfg.StrOpt(\u0027dns_domain\u0027,"},{"line_number":86,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":87,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":88,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027, default\u003dNone,"},{"line_number":89,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":90,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":91,"context_line":"                help\u003d_(\"Allow sending resource operation\""}],"source_content_type":"text/x-python","patch_set":28,"id":"fa80f949_de599136","line":88,"updated":"2015-11-06 14:56:43.000000000","message":"by default you do not need to specific that this is None. The default value is None","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fd5ec23123b44311495870a899c639b644882c53","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    cfg.StrOpt(\u0027dns_domain\u0027,"},{"line_number":86,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":87,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":88,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027, default\u003dNone,"},{"line_number":89,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":90,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":91,"context_line":"                help\u003d_(\"Allow sending resource operation\""}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_3c8bfa69","line":88,"in_reply_to":"fa80f949_de599136","updated":"2015-11-19 00:19:13.000000000","message":"Done","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":128,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":129,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":130,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027,"},{"line_number":131,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":133,"context_line":"                help\u003d_(\"Allow sending resource operation\""},{"line_number":134,"context_line":"                       \" notification to DHCP agent\")),"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_df21ba4e","line":131,"updated":"2015-12-07 09:28:00.000000000","message":"please add a release note\n\nthis requires a DocImpact flag in the commit message","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":128,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":129,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":130,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027,"},{"line_number":131,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":133,"context_line":"                help\u003d_(\"Allow sending resource operation\""},{"line_number":134,"context_line":"                       \" notification to DHCP agent\")),"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_d7e5afdb","line":131,"in_reply_to":"7a740942_df21ba4e","updated":"2015-12-09 01:29:31.000000000","message":"Done","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt(\u0027dns_domain\u0027,"},{"line_number":128,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":129,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":130,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027,"},{"line_number":131,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":133,"context_line":"                help\u003d_(\"Allow sending resource operation\""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_231ce368","line":130,"updated":"2015-12-09 10:08:28.000000000","message":"in the commit message you should write DocImpact and add that there is a new configuration variable and add the details there.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d54348778d019431f23b4892dae586277053536b","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt(\u0027dns_domain\u0027,"},{"line_number":128,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":129,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":130,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027,"},{"line_number":131,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":133,"context_line":"                help\u003d_(\"Allow sending resource operation\""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_7e112451","line":130,"in_reply_to":"7a740942_231ce368","updated":"2015-12-09 10:09:37.000000000","message":"sorry my bad here - you did that. please just add the name of the config var to the commit message and to the release note","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    cfg.StrOpt(\u0027dns_domain\u0027,"},{"line_number":128,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":129,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":130,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027,"},{"line_number":131,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":133,"context_line":"                help\u003d_(\"Allow sending resource operation\""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_fc3df2bb","line":130,"in_reply_to":"7a740942_7e112451","updated":"2015-12-11 01:22:32.000000000","message":"Please see last line of release note. Parameter name is already indicated there. Adding to commit message as well","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":128,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":129,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":130,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027,"},{"line_number":131,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":133,"context_line":"                help\u003d_(\"Allow sending resource operation\""},{"line_number":134,"context_line":"                       \" notification to DHCP agent\")),"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_3a0ada8a","line":131,"updated":"2015-12-09 01:58:58.000000000","message":"Suggestions:\n\nExternal DNS driver name.\nDriver name for external DNS integration.\nName of external DNS driver.\nDriver for external DNS integration.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":128,"context_line":"               default\u003d\u0027openstacklocal\u0027,"},{"line_number":129,"context_line":"               help\u003d_(\u0027Domain to use for building the hostnames\u0027)),"},{"line_number":130,"context_line":"    cfg.StrOpt(\u0027external_dns_driver\u0027,"},{"line_number":131,"context_line":"               help\u003d_(\u0027External DNS driver to use.\u0027)),"},{"line_number":132,"context_line":"    cfg.BoolOpt(\u0027dhcp_agent_notification\u0027, default\u003dTrue,"},{"line_number":133,"context_line":"                help\u003d_(\"Allow sending resource operation\""},{"line_number":134,"context_line":"                       \" notification to DHCP agent\")),"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_39162c56","line":131,"in_reply_to":"7a740942_3a0ada8a","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"}],"neutron/common/constants.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":209,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# DNS related constants"},{"line_number":212,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_87595837","line":212,"updated":"2015-11-19 12:31:34.000000000","message":"why do we need this - there is https://github.com/openstack/neutron/blob/master/neutron/common/config.py#L90","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":209,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# DNS related constants"},{"line_number":212,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_305482fd","line":212,"in_reply_to":"9a8ffd7b_df901098","updated":"2015-11-29 23:05:55.000000000","message":"Removed","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":209,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# DNS related constants"},{"line_number":212,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_df901098","line":212,"in_reply_to":"ba8a016a_87595837","updated":"2015-11-25 10:50:39.000000000","message":"+1, seems no need.","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":209,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"# DNS related constants"},{"line_number":212,"context_line":"DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_503266f3","line":212,"in_reply_to":"ba8a016a_87595837","updated":"2015-11-29 23:05:55.000000000","message":"Removed","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"}],"neutron/db/db_base_plugin_common.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                shared \u003d True"},{"line_number":280,"context_line":"                break"},{"line_number":281,"context_line":"        res[\u0027shared\u0027] \u003d shared"},{"line_number":282,"context_line":"        if (\u0027dns_domain\u0027 in network):"},{"line_number":283,"context_line":"            res[\u0027dns_domain\u0027] \u003d network[\u0027dns_domain\u0027]"},{"line_number":284,"context_line":"        # TODO(pritesh): Move vlan_transparent to the extension module."},{"line_number":285,"context_line":"        # vlan_transparent here is only added if the vlantransparent"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_7b99fbcf","line":282,"updated":"2015-09-08 22:43:51.000000000","message":"pico-nit:  parens are not necessary.  But, if you like them in there then I\u0027m okay.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                shared \u003d True"},{"line_number":280,"context_line":"                break"},{"line_number":281,"context_line":"        res[\u0027shared\u0027] \u003d shared"},{"line_number":282,"context_line":"        if (\u0027dns_domain\u0027 in network):"},{"line_number":283,"context_line":"            res[\u0027dns_domain\u0027] \u003d network[\u0027dns_domain\u0027]"},{"line_number":284,"context_line":"        # TODO(pritesh): Move vlan_transparent to the extension module."},{"line_number":285,"context_line":"        # vlan_transparent here is only added if the vlantransparent"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_dbb5c7d0","line":282,"in_reply_to":"da20952f_7b99fbcf","updated":"2015-09-16 20:20:31.000000000","message":"Done","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d8a9a97bf9f1415cc2102a8c26a5f14c950f57a1","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                shared \u003d True"},{"line_number":280,"context_line":"                break"},{"line_number":281,"context_line":"        res[\u0027shared\u0027] \u003d shared"},{"line_number":282,"context_line":"        if \u0027dns_domain\u0027 in network:"},{"line_number":283,"context_line":"            res[\u0027dns_domain\u0027] \u003d network[\u0027dns_domain\u0027]"},{"line_number":284,"context_line":"        # TODO(pritesh): Move vlan_transparent to the extension module."},{"line_number":285,"context_line":"        # vlan_transparent here is only added if the vlantransparent"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa80f949_be328d5c","line":282,"updated":"2015-11-06 14:56:43.000000000","message":"this is not defined in the base resource https://github.com/openstack/neutron/blob/master/neutron/api/v2/attributes.py#L672\nWhy is there not an extension that is dong the update of the dns value?","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fd5ec23123b44311495870a899c639b644882c53","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                shared \u003d True"},{"line_number":280,"context_line":"                break"},{"line_number":281,"context_line":"        res[\u0027shared\u0027] \u003d shared"},{"line_number":282,"context_line":"        if \u0027dns_domain\u0027 in network:"},{"line_number":283,"context_line":"            res[\u0027dns_domain\u0027] \u003d network[\u0027dns_domain\u0027]"},{"line_number":284,"context_line":"        # TODO(pritesh): Move vlan_transparent to the extension module."},{"line_number":285,"context_line":"        # vlan_transparent here is only added if the vlantransparent"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_9cb1c603","line":282,"in_reply_to":"fa80f949_be328d5c","updated":"2015-11-19 00:19:13.000000000","message":"I have been implementing the DNS work under the concept of a \"shim\" extension, just like \u0027vlan_transparent\u0027 a few lines below","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                shared \u003d True"},{"line_number":281,"context_line":"                break"},{"line_number":282,"context_line":"        res[\u0027shared\u0027] \u003d shared"},{"line_number":283,"context_line":"        if \u0027dns_domain\u0027 in network:"},{"line_number":284,"context_line":"            res[\u0027dns_domain\u0027] \u003d network[\u0027dns_domain\u0027]"},{"line_number":285,"context_line":"        # TODO(pritesh): Move vlan_transparent to the extension module."},{"line_number":286,"context_line":"        # vlan_transparent here is only added if the vlantransparent"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_cc18e7d5","line":283,"updated":"2015-11-19 12:31:34.000000000","message":"i do not think that this code should be part of the base plugin. it should be done as part of the extension and updated there.\nthe extension should have hooks that update the network accordingly","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                shared \u003d True"},{"line_number":281,"context_line":"                break"},{"line_number":282,"context_line":"        res[\u0027shared\u0027] \u003d shared"},{"line_number":283,"context_line":"        if \u0027dns_domain\u0027 in network:"},{"line_number":284,"context_line":"            res[\u0027dns_domain\u0027] \u003d network[\u0027dns_domain\u0027]"},{"line_number":285,"context_line":"        # TODO(pritesh): Move vlan_transparent to the extension module."},{"line_number":286,"context_line":"        # vlan_transparent here is only added if the vlantransparent"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_48f54e81","line":283,"in_reply_to":"ba8a016a_cc18e7d5","updated":"2015-11-29 23:05:55.000000000","message":"OK, moving this code to the extension. I am using the external networks extension as a guide on how to implement this. It is very similar to what I am trying to accomplish: add an attribute to networks. http://git.openstack.org/cgit/openstack/neutron/tree/neutron/db/external_net_db.py","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d8a9a97bf9f1415cc2102a8c26a5f14c950f57a1","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            if (\u0027vlan_transparent\u0027 in n and n[\u0027vlan_transparent\u0027] !\u003d"},{"line_number":329,"context_line":"                attributes.ATTR_NOT_SPECIFIED):"},{"line_number":330,"context_line":"                args[\u0027vlan_transparent\u0027] \u003d n[\u0027vlan_transparent\u0027]"},{"line_number":331,"context_line":"            if \u0027dns_domain\u0027 in n:"},{"line_number":332,"context_line":"                args[\u0027dns_domain\u0027] \u003d n[\u0027dns_domain\u0027]"},{"line_number":333,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":334,"context_line":"            if n[\u0027shared\u0027]:"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa80f949_9e25490a","line":331,"updated":"2015-11-06 14:56:43.000000000","message":"same as before","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fd5ec23123b44311495870a899c639b644882c53","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            if (\u0027vlan_transparent\u0027 in n and n[\u0027vlan_transparent\u0027] !\u003d"},{"line_number":329,"context_line":"                attributes.ATTR_NOT_SPECIFIED):"},{"line_number":330,"context_line":"                args[\u0027vlan_transparent\u0027] \u003d n[\u0027vlan_transparent\u0027]"},{"line_number":331,"context_line":"            if \u0027dns_domain\u0027 in n:"},{"line_number":332,"context_line":"                args[\u0027dns_domain\u0027] \u003d n[\u0027dns_domain\u0027]"},{"line_number":333,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":334,"context_line":"            if n[\u0027shared\u0027]:"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_9c7f8616","line":331,"in_reply_to":"fa80f949_9e25490a","updated":"2015-11-19 00:19:13.000000000","message":"I have been implementing the DNS work under the concept of a \"shim\" extension just like \u0027vlan_transparent\u0027 in the preceding 3 lines","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            if (\u0027vlan_transparent\u0027 in n and n[\u0027vlan_transparent\u0027] !\u003d"},{"line_number":329,"context_line":"                attributes.ATTR_NOT_SPECIFIED):"},{"line_number":330,"context_line":"                args[\u0027vlan_transparent\u0027] \u003d n[\u0027vlan_transparent\u0027]"},{"line_number":331,"context_line":"            if \u0027dns_domain\u0027 in n:"},{"line_number":332,"context_line":"                args[\u0027dns_domain\u0027] \u003d n[\u0027dns_domain\u0027]"},{"line_number":333,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":334,"context_line":"            if n[\u0027shared\u0027]:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_4767f0e8","line":331,"updated":"2015-11-19 12:31:34.000000000","message":"same point as before - this code should be part of the network extension update","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            if (\u0027vlan_transparent\u0027 in n and n[\u0027vlan_transparent\u0027] !\u003d"},{"line_number":329,"context_line":"                attributes.ATTR_NOT_SPECIFIED):"},{"line_number":330,"context_line":"                args[\u0027vlan_transparent\u0027] \u003d n[\u0027vlan_transparent\u0027]"},{"line_number":331,"context_line":"            if \u0027dns_domain\u0027 in n:"},{"line_number":332,"context_line":"                args[\u0027dns_domain\u0027] \u003d n[\u0027dns_domain\u0027]"},{"line_number":333,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":334,"context_line":"            if n[\u0027shared\u0027]:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_e848c2ce","line":331,"in_reply_to":"ba8a016a_4767f0e8","updated":"2015-11-29 23:05:55.000000000","message":"OK, moving this code to the extension. I am using the external networks extension as a guide on how to implement this. It is very similar to what I am trying to accomplish: add an attribute to networks. http://git.openstack.org/cgit/openstack/neutron/tree/neutron/db/external_net_db.py","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                elif not update_shared and entry:"},{"line_number":357,"context_line":"                    context.session.delete(entry)"},{"line_number":358,"context_line":"                    context.session.expire(network, [\u0027rbac_entries\u0027])"},{"line_number":359,"context_line":"            network.update(self._filter_non_model_columns(n,"},{"line_number":360,"context_line":"                                                          models_v2.Network))"},{"line_number":361,"context_line":"        return self._make_network_dict(network, context\u003dcontext)"},{"line_number":362,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_7fd76623","line":359,"updated":"2015-12-07 09:28:00.000000000","message":"can you please let me know why we need this?","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":356,"context_line":"                elif not update_shared and entry:"},{"line_number":357,"context_line":"                    context.session.delete(entry)"},{"line_number":358,"context_line":"                    context.session.expire(network, [\u0027rbac_entries\u0027])"},{"line_number":359,"context_line":"            network.update(self._filter_non_model_columns(n,"},{"line_number":360,"context_line":"                                                          models_v2.Network))"},{"line_number":361,"context_line":"        return self._make_network_dict(network, context\u003dcontext)"},{"line_number":362,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_60bc3abb","line":359,"in_reply_to":"7a740942_7fd76623","updated":"2015-12-09 01:29:31.000000000","message":"The dictionary n, which comes from the user / API, might include a \u0027dns_domain\u0027 attribute. That attribute is not part of the Network db model. We added another table, NetworkDNSDomain in the extension neutron/db/dns_db.py, to store the \u0027dns_domain\u0027 attribute. So here I only update network with the attributes in n that belong to the Network db model. The \u0027dns_domain\u0027 attribute, if present, will be processed / stored by the extension a little further down the road when it is called by the ml2 plugin.\n\nIf we just do network.update(n) and \u0027dns_domain\u0027 is present in n, we get an SQLAlchemy exception","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                    context.session.delete(entry)"},{"line_number":358,"context_line":"                    context.session.expire(network, [\u0027rbac_entries\u0027])"},{"line_number":359,"context_line":"            network.update(self._filter_non_model_columns(n,"},{"line_number":360,"context_line":"                                                          models_v2.Network))"},{"line_number":361,"context_line":"        return self._make_network_dict(network, context\u003dcontext)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def delete_network(self, context, id):"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_225d1d15","line":360,"updated":"2015-12-11 19:34:56.000000000","message":"I am a bit confused by this statement. what is it doing exactly? The docstring say:\n\nRemove all the attributes from data which are not columns of the model passed as second parameter: so are you adding the dns_* fields here? Shouldn\u0027t that happen through process_extensions (which is True by default?)","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"24a59f4ca3c610fc6975d67819b185dde0468bea","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                    context.session.delete(entry)"},{"line_number":358,"context_line":"                    context.session.expire(network, [\u0027rbac_entries\u0027])"},{"line_number":359,"context_line":"            network.update(self._filter_non_model_columns(n,"},{"line_number":360,"context_line":"                                                          models_v2.Network))"},{"line_number":361,"context_line":"        return self._make_network_dict(network, context\u003dcontext)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def delete_network(self, context, id):"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a7e1126_c1976246","line":360,"in_reply_to":"7a740942_225d1d15","updated":"2015-12-21 01:40:35.000000000","message":"I removed this.","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"}],"neutron/db/dns_db.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from neutron.api.v2 import attributes"},{"line_number":23,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":24,"context_line":"from neutron.common import utils"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_1fb502ed","line":21,"updated":"2015-12-07 09:28:00.000000000","message":"please add the import of neutron._i18n to use the _LE and others.,.","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from oslo_log import log as logging"},{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from neutron.api.v2 import attributes"},{"line_number":23,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":24,"context_line":"from neutron.common import utils"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_a07b02bd","line":21,"in_reply_to":"7a740942_1fb502ed","updated":"2015-12-09 01:29:31.000000000","message":"Done","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":398,"context_line":"                return True"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def _is_tunnel_tenant_network(self, provider_net):"},{"line_number":401,"context_line":"        if provider_net[\u0027network_type\u0027] \u003d\u003d \u0027geneve\u0027:"},{"line_number":402,"context_line":"            tunnel_ranges \u003d cfg.CONF.ml2_type_geneve.vni_ranges"},{"line_number":403,"context_line":"        elif provider_net[\u0027network_type\u0027] \u003d\u003d \u0027vxlan\u0027:"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_ff9fd64d","line":400,"updated":"2015-12-07 09:28:00.000000000","message":"this code should be part of the plugins and not generic","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":398,"context_line":"                return True"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def _is_tunnel_tenant_network(self, provider_net):"},{"line_number":401,"context_line":"        if provider_net[\u0027network_type\u0027] \u003d\u003d \u0027geneve\u0027:"},{"line_number":402,"context_line":"            tunnel_ranges \u003d cfg.CONF.ml2_type_geneve.vni_ranges"},{"line_number":403,"context_line":"        elif provider_net[\u0027network_type\u0027] \u003d\u003d \u0027vxlan\u0027:"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_037b007c","line":400,"in_reply_to":"7a740942_ff9fd64d","updated":"2015-12-09 01:29:31.000000000","message":"Ok, moved it to ml2 plugin","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        elif provider_net[\u0027network_type\u0027] \u003d\u003d \u0027gre\u0027:"},{"line_number":406,"context_line":"            tunnel_ranges \u003d cfg.CONF.ml2_type_gre.tunnel_id_ranges"},{"line_number":407,"context_line":"        else:"},{"line_number":408,"context_line":"            raise ml2_exc.UnknownNetworkType("},{"line_number":409,"context_line":"                network_type\u003dprovider_net[\u0027network_type\u0027])"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        segmentation_id \u003d int(provider_net[\u0027segmentation_id\u0027])"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_5f906a43","line":408,"updated":"2015-12-07 09:28:00.000000000","message":"i do not think that we should be using ml2 exceptions here. maybe one day that may be spun out of tree, for example when the new black, ovn, takes over as the reference architecture...","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        elif provider_net[\u0027network_type\u0027] \u003d\u003d \u0027gre\u0027:"},{"line_number":406,"context_line":"            tunnel_ranges \u003d cfg.CONF.ml2_type_gre.tunnel_id_ranges"},{"line_number":407,"context_line":"        else:"},{"line_number":408,"context_line":"            raise ml2_exc.UnknownNetworkType("},{"line_number":409,"context_line":"                network_type\u003dprovider_net[\u0027network_type\u0027])"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"        segmentation_id \u003d int(provider_net[\u0027segmentation_id\u0027])"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_03f22006","line":408,"in_reply_to":"7a740942_5f906a43","updated":"2015-12-09 01:29:31.000000000","message":"Since I moved this method to the ml2 plugin, left the exception as is","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from neutron._i18n import _LE"},{"line_number":23,"context_line":"from neutron.api.v2 import attributes"},{"line_number":24,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":25,"context_line":"from neutron.common import utils"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_03d9a756","line":22,"updated":"2015-12-09 10:08:28.000000000","message":"please update this:\nfrom neutron._i18n import _, _LE\nas we are using the _ below and we want it to be used form this file","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import sqlalchemy as sa"},{"line_number":20,"context_line":"from sqlalchemy import orm"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from neutron._i18n import _LE"},{"line_number":23,"context_line":"from neutron.api.v2 import attributes"},{"line_number":24,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":25,"context_line":"from neutron.common import utils"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_dee9dcb8","line":22,"in_reply_to":"7a740942_03d9a756","updated":"2015-12-11 01:22:32.000000000","message":"Good catch. Thanks!","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d2706932713e3a39a734df0c5df8ac71dcd656ca","unresolved":false,"context_lines":[{"line_number":41,"context_line":"class NetworkDNSDomain(model_base.BASEV2):"},{"line_number":42,"context_line":"    network_id \u003d sa.Column(sa.String(36),"},{"line_number":43,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":44,"context_line":"                           primary_key\u003dTrue)"},{"line_number":45,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    # Add a relationship to the Network model in order to instruct"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_380e2de6","line":44,"updated":"2015-12-09 21:53:31.000000000","message":"missing index\u003dTrue","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":41,"context_line":"class NetworkDNSDomain(model_base.BASEV2):"},{"line_number":42,"context_line":"    network_id \u003d sa.Column(sa.String(36),"},{"line_number":43,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":44,"context_line":"                           primary_key\u003dTrue)"},{"line_number":45,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    # Add a relationship to the Network model in order to instruct"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_3be707ae","line":44,"in_reply_to":"7a740942_380e2de6","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d2706932713e3a39a734df0c5df8ac71dcd656ca","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    floatingip_id \u003d sa.Column(sa.String(36),"},{"line_number":60,"context_line":"                              sa.ForeignKey(\u0027floatingips.id\u0027,"},{"line_number":61,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":62,"context_line":"                              primary_key\u003dTrue)"},{"line_number":63,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":64,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":65,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_f81f4507","line":62,"updated":"2015-12-09 21:53:31.000000000","message":"ditto","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    floatingip_id \u003d sa.Column(sa.String(36),"},{"line_number":60,"context_line":"                              sa.ForeignKey(\u0027floatingips.id\u0027,"},{"line_number":61,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":62,"context_line":"                              primary_key\u003dTrue)"},{"line_number":63,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":64,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":65,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_1bffab35","line":62,"in_reply_to":"7a740942_f81f4507","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"d2706932713e3a39a734df0c5df8ac71dcd656ca","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    port_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":80,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":81,"context_line":"                        primary_key\u003dTrue)"},{"line_number":82,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":83,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_98d72123","line":81,"updated":"2015-12-09 21:53:31.000000000","message":"ditto","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    port_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":80,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":81,"context_line":"                        primary_key\u003dTrue)"},{"line_number":82,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":83,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_bbfbf746","line":81,"in_reply_to":"7a740942_98d72123","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            LOG.debug(\"External DNS driver loaded: %s\","},{"line_number":106,"context_line":"                      cfg.CONF.external_dns_driver)"},{"line_number":107,"context_line":"            return self._dns_driver"},{"line_number":108,"context_line":"        except ImportError:"},{"line_number":109,"context_line":"            LOG.exception(_LE(\"ImportError exception occurred while loading \""},{"line_number":110,"context_line":"                              \"the external DNS service driver\"))"},{"line_number":111,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_0353e717","line":108,"updated":"2015-12-09 10:08:28.000000000","message":"in the event that the external driver is unable to be loaded do we want to continue to allow the service to run? why not raise an exception here?","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            LOG.debug(\"External DNS driver loaded: %s\","},{"line_number":106,"context_line":"                      cfg.CONF.external_dns_driver)"},{"line_number":107,"context_line":"            return self._dns_driver"},{"line_number":108,"context_line":"        except ImportError:"},{"line_number":109,"context_line":"            LOG.exception(_LE(\"ImportError exception occurred while loading \""},{"line_number":110,"context_line":"                              \"the external DNS service driver\"))"},{"line_number":111,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_feedb88e","line":108,"in_reply_to":"7a740942_0353e717","updated":"2015-12-11 01:22:32.000000000","message":"I actually wasn\u0027t sure what to do here. So I wanted to hear feedback. Mission accomplished. I\u0027ll raise an exception","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            return"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def _extend_network_dict_dns(self, network_res, network_db):"},{"line_number":114,"context_line":"        network_res[dns.DNSDOMAIN] \u003d \u0027\u0027"},{"line_number":115,"context_line":"        if network_db.dns_domain:"},{"line_number":116,"context_line":"            network_res[dns.DNSDOMAIN] \u003d network_db.dns_domain[\u0027dns_domain\u0027]"},{"line_number":117,"context_line":"        return network_res"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_435c8f18","line":114,"updated":"2015-12-09 10:08:28.000000000","message":"nit - but this could be done in the else in addition to this this is the default value set in neutron/extensions/dns.py. So do we actually need this","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            return"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def _extend_network_dict_dns(self, network_res, network_db):"},{"line_number":114,"context_line":"        network_res[dns.DNSDOMAIN] \u003d \u0027\u0027"},{"line_number":115,"context_line":"        if network_db.dns_domain:"},{"line_number":116,"context_line":"            network_res[dns.DNSDOMAIN] \u003d network_db.dns_domain[\u0027dns_domain\u0027]"},{"line_number":117,"context_line":"        return network_res"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_cf84c40c","line":114,"in_reply_to":"7a740942_435c8f18","updated":"2015-12-11 01:22:32.000000000","message":"We actually need this. In the line right below this one, when I refer to \u0027network_db.dns_domain\u0027 I am not referring to an attribute of \u0027network_db\u0027. I am asking SQLAlchemy to load a row in table \u0027NetworkDNSDomain\u0027, from which I intend to extract the value of \u0027dns_domain\u0027. If that row doesn\u0027t exist (is None),  per this line I return \u0027\u0027 in network_res[dns.DNSDOMAIN]","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                                                 dns_domain\u003dnew_value))"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _extend_floatingip_dict_dns(self, floatingip_res, floatingip_db):"},{"line_number":158,"context_line":"        floatingip_res[\u0027dns_domain\u0027] \u003d \u0027\u0027"},{"line_number":159,"context_line":"        floatingip_res[\u0027dns_name\u0027] \u003d \u0027\u0027"},{"line_number":160,"context_line":"        if floatingip_db.dns:"},{"line_number":161,"context_line":"            floatingip_res[\u0027dns_domain\u0027] \u003d floatingip_db.dns[\u0027dns_domain\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_63998bc3","line":158,"updated":"2015-12-09 10:08:28.000000000","message":"same comments here","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                                                 dns_domain\u003dnew_value))"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _extend_floatingip_dict_dns(self, floatingip_res, floatingip_db):"},{"line_number":158,"context_line":"        floatingip_res[\u0027dns_domain\u0027] \u003d \u0027\u0027"},{"line_number":159,"context_line":"        floatingip_res[\u0027dns_name\u0027] \u003d \u0027\u0027"},{"line_number":160,"context_line":"        if floatingip_db.dns:"},{"line_number":161,"context_line":"            floatingip_res[\u0027dns_domain\u0027] \u003d floatingip_db.dns[\u0027dns_domain\u0027]"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_cf9b6465","line":158,"in_reply_to":"7a740942_63998bc3","updated":"2015-12-11 01:22:32.000000000","message":"Same as above","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        if not utils.is_extension_supported(plugin, dns.Dns.get_alias()):"},{"line_number":257,"context_line":"            return"},{"line_number":258,"context_line":"        dns_name \u003d port.get(\u0027dns_name\u0027)"},{"line_number":259,"context_line":"        if (not mech_context._network_context._network[\u0027dns_domain\u0027] or"},{"line_number":260,"context_line":"            dns_name is None):"},{"line_number":261,"context_line":"            return"},{"line_number":262,"context_line":"        if self._external_dns_not_needed(mech_context._network_context):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_a33f7385","line":259,"updated":"2015-12-09 10:08:28.000000000","message":"what if the dns_domain is \u0027\u0027?","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":256,"context_line":"        if not utils.is_extension_supported(plugin, dns.Dns.get_alias()):"},{"line_number":257,"context_line":"            return"},{"line_number":258,"context_line":"        dns_name \u003d port.get(\u0027dns_name\u0027)"},{"line_number":259,"context_line":"        if (not mech_context._network_context._network[\u0027dns_domain\u0027] or"},{"line_number":260,"context_line":"            dns_name is None):"},{"line_number":261,"context_line":"            return"},{"line_number":262,"context_line":"        if self._external_dns_not_needed(mech_context._network_context):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_ea364eb3","line":259,"in_reply_to":"7a740942_a33f7385","updated":"2015-12-11 01:22:32.000000000","message":"This is an update. In updates, API attributes don\u0027t get default values. If they are not specified by the user, they don\u0027t come in the request.\n\nSo.... In this case, we first do a port.get in the line above. If \u0027dns_name\u0027 is not present in the request (\u0027port\u0027), we\u0027ll get \u0027None\u0027 and that indicates we are not updating anything related to DNS, so we just return.\n\nIf, on the other hand, we get \u0027\u0027 for \u0027dns_name\u0027 from the request (\u0027port\u0027), that indicates the user wants to remove the port from the external DNS service. That is processed by lines 267 - 268 and 279 - 283. Note that if the port wasn\u0027t published previously in the external service, we will execute lines 267 and 284: a noop","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":398,"context_line":"                return True"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def _external_dns_not_needed(self, network_context):"},{"line_number":401,"context_line":"        if not self.dns_driver:"},{"line_number":402,"context_line":"            return True"},{"line_number":403,"context_line":"        if network_context._network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_43fd6faf","line":400,"updated":"2015-12-09 10:08:28.000000000","message":"i commented on this in a previous patch set. i think that the ml2 should override this.\nsay i am plugin foo and i support provider network type miaw then this will not work","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":397,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":398,"context_line":"                return True"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def _external_dns_not_needed(self, network_context):"},{"line_number":401,"context_line":"        if not self.dns_driver:"},{"line_number":402,"context_line":"            return True"},{"line_number":403,"context_line":"        if network_context._network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_e0a0ada7","line":400,"in_reply_to":"7a740942_43fd6faf","updated":"2015-12-11 01:22:32.000000000","message":"I didn\u0027t understand the full extent of your comment in the previous patchset. You made the comment on method _is_tunnel_tenant_network and I moved it to the plugin. But you are absolutely right in that the comment applies to this method as well, In fact, I think we should also move _is_vlan_tenant_network to the plugin. Hopefully, I got it right now ;-)","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def _process_dns_port_update(self, context, port, port_db, mech_context):"},{"line_number":253,"context_line":"        # expects to be called within a plugin\u0027s session"},{"line_number":254,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":255,"context_line":"        if not utils.is_extension_supported(plugin, dns.Dns.get_alias()):"},{"line_number":256,"context_line":"            return"},{"line_number":257,"context_line":"        dns_name \u003d port.get(\u0027dns_name\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_9d70f6a5","line":254,"updated":"2015-12-11 19:34:56.000000000","message":"The way you\u0027ve architected this, this method is accessed in the context of the ML2 plugin, so you don\u0027t need this. However, this shows the dreadful existing coupling that you\u0027re causing by tying ML2 with DNS.\n\nWe should strive to better split the two, via callbacks, extension mechanisms etc. In other words, you should try to make this work without making Ml2 inheriting from this mixin.","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"24a59f4ca3c610fc6975d67819b185dde0468bea","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    def _process_dns_port_update(self, context, port, port_db, mech_context):"},{"line_number":253,"context_line":"        # expects to be called within a plugin\u0027s session"},{"line_number":254,"context_line":"        plugin \u003d manager.NeutronManager.get_plugin()"},{"line_number":255,"context_line":"        if not utils.is_extension_supported(plugin, dns.Dns.get_alias()):"},{"line_number":256,"context_line":"            return"},{"line_number":257,"context_line":"        dns_name \u003d port.get(\u0027dns_name\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a7e1126_e194de43","line":254,"in_reply_to":"7a740942_9d70f6a5","updated":"2015-12-21 01:40:35.000000000","message":"I moved this to an implementation based on ML2 ExtensionManager","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        return dns_name, dns_domain"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def _external_dns_not_needed(self, network_context):"},{"line_number":389,"context_line":"        # This method must be overriden by the plugin"},{"line_number":390,"context_line":"        pass"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def _create_port_in_external_dns_service(self, context, port,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_02bca104","line":389,"updated":"2015-12-11 19:34:56.000000000","message":"If the method is meant to be overriden, then IMO it shouldn\u0027t be treated as private.","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"24a59f4ca3c610fc6975d67819b185dde0468bea","unresolved":false,"context_lines":[{"line_number":386,"context_line":"        return dns_name, dns_domain"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def _external_dns_not_needed(self, network_context):"},{"line_number":389,"context_line":"        # This method must be overriden by the plugin"},{"line_number":390,"context_line":"        pass"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def _create_port_in_external_dns_service(self, context, port,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a7e1126_418a921c","line":389,"in_reply_to":"7a740942_02bca104","updated":"2015-12-21 01:40:35.000000000","message":"Yes, you are right. Fixed","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"451bdc74a7e8ff7b1c7c55d645a5d6c94c7473dc","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from neutron import manager"},{"line_number":33,"context_line":"from neutron.plugins.common import constants as service_constants"},{"line_number":34,"context_line":"from neutron.plugins.common import utils as plugin_utils"},{"line_number":35,"context_line":"from neutron.plugins.ml2.common import exceptions as ml2_exc"},{"line_number":36,"context_line":"from neutron.plugins.ml2 import db"},{"line_number":37,"context_line":"from neutron.services.externaldns import driver"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_c633d1f4","line":35,"updated":"2015-12-21 17:57:32.000000000","message":"this should be generic code and should not really have an import to a plugin\n\nwhat happens when the ml2 breaks into it own repo?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"82e4b876e3364a0f68e90face282100eed6e2798","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from neutron import manager"},{"line_number":33,"context_line":"from neutron.plugins.common import constants as service_constants"},{"line_number":34,"context_line":"from neutron.plugins.common import utils as plugin_utils"},{"line_number":35,"context_line":"from neutron.plugins.ml2.common import exceptions as ml2_exc"},{"line_number":36,"context_line":"from neutron.plugins.ml2 import db"},{"line_number":37,"context_line":"from neutron.services.externaldns import driver"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_37af5d7e","line":35,"in_reply_to":"3a7e1126_c633d1f4","updated":"2015-12-21 19:30:24.000000000","message":"garyk,\n\nThis is a good point. There is a follow up to it. Below I defined (line 472) I defined class DNSDbCoreResourcesML2 (remembering your feedback from previous revisions) where I isolated the code specific to ML2. I think I should move that class to https://review.openstack.org/#/c/212213/36/neutron/plugins/ml2/extensions/dns_integration.py and in this way, all the ml2 related code will be in ml2. With that, this line and the one below can be removed from this module. What do you think?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class NetworkDNSDomain(model_base.BASEV2):"},{"line_number":43,"context_line":"    network_id \u003d sa.Column(sa.String(36),"},{"line_number":44,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":45,"context_line":"                           primary_key\u003dTrue, index\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_6cc2f7ea","line":42,"range":{"start_line":42,"start_character":6,"end_line":42,"end_character":22},"updated":"2015-12-22 01:04:58.000000000","message":"Should this be a new table?  Is that preferred over adding (a) column(s) to the network table?  I guess I have the same question about the other tables below too.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"02a60682d0216e0e6a33602217bf68b0f15da96d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class NetworkDNSDomain(model_base.BASEV2):"},{"line_number":43,"context_line":"    network_id \u003d sa.Column(sa.String(36),"},{"line_number":44,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":45,"context_line":"                           primary_key\u003dTrue, index\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_43d55c41","line":42,"range":{"start_line":42,"start_character":6,"end_line":42,"end_character":22},"in_reply_to":"1a7b0d38_5773df4d","updated":"2015-12-22 23:55:02.000000000","message":"Thanks for pointing out the feedback.  We should probably stay with this.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"82d1f29af480c61201f71aa4a2d54ea6ed6d1534","unresolved":false,"context_lines":[{"line_number":39,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class NetworkDNSDomain(model_base.BASEV2):"},{"line_number":43,"context_line":"    network_id \u003d sa.Column(sa.String(36),"},{"line_number":44,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":45,"context_line":"                           primary_key\u003dTrue, index\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_5773df4d","line":42,"range":{"start_line":42,"start_character":6,"end_line":42,"end_character":22},"in_reply_to":"3a7e1126_6cc2f7ea","updated":"2015-12-22 21:25:18.000000000","message":"My original approach was to add columns to existing table. However, back in PS30 I got feedback about it. Please see comment to line 119 in https://review.openstack.org/#/c/212213/30/neutron/db/l3_db.py \n\nSo looking around in the code base, I found that other extensions add new tables for new attributes. An example is the \u0027router:external\u0027 attribute for networks:  http://git.openstack.org/cgit/openstack/neutron/tree/neutron/db/external_net_db.py . This extension adds table \u0027ExternalNetwork\u0027 to support the \u0027router:external\u0027 attribute.\n\nI am fine adding columns to existing tables. If we have consensus on this, I\u0027ll implement it. The change is not a big deal","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                              primary_key\u003dTrue, index\u003dTrue)"},{"line_number":64,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":65,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":66,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":67,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    # Add a relationship to the FloatingIP model in order to instruct"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_8c572325","line":66,"range":{"start_line":66,"start_character":4,"end_line":66,"end_character":22},"updated":"2015-12-22 01:04:58.000000000","message":"What\u0027s the purpose of storing published and unpublished?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"02a60682d0216e0e6a33602217bf68b0f15da96d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                              primary_key\u003dTrue, index\u003dTrue)"},{"line_number":64,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":65,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":66,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":67,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    # Add a relationship to the FloatingIP model in order to instruct"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_83d8241f","line":66,"range":{"start_line":66,"start_character":4,"end_line":66,"end_character":22},"in_reply_to":"1a7b0d38_2a6caa9b","updated":"2015-12-22 23:55:02.000000000","message":"This makes sense.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"82d1f29af480c61201f71aa4a2d54ea6ed6d1534","unresolved":false,"context_lines":[{"line_number":63,"context_line":"                              primary_key\u003dTrue, index\u003dTrue)"},{"line_number":64,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":65,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":66,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":67,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    # Add a relationship to the FloatingIP model in order to instruct"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_2a6caa9b","line":66,"range":{"start_line":66,"start_character":4,"end_line":66,"end_character":22},"in_reply_to":"3a7e1126_8c572325","updated":"2015-12-22 21:25:18.000000000","message":"dns_name and dns_domain store the values that came in the body of the POST /floatingips. If the user didn\u0027t assign any values to them, the fip might still have a dns_name and a dns_domain that come from the associated port and its network. Let\u0027s say this was the case and now I want to delete the fip or disassociate it from the port. During the period between the fip creation / association and the deletion / disassociation, the user might have changed dns_name in the port or dns_domain in the network. I cannot use the changed values to delete from the external dns service the previously published records for the fip. I won\u0027t find them.\n\nThis is a consequence of the fact that we are using attributes associated with resources that can be updated independently from each other to create the records in the external dns service. Please also see my response to your comment to line 510 below","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":82,"context_line":"                        primary_key\u003dTrue, index\u003dTrue)"},{"line_number":83,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":84,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    # Add a relationship to the Port model in order to instruct"},{"line_number":87,"context_line":"    # SQLAlchemy to eagerly load this association"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_6d7f51e0","line":84,"range":{"start_line":84,"start_character":4,"end_line":84,"end_character":24},"updated":"2015-12-22 01:04:58.000000000","message":"I probably have already asked this before.  Do we have a plan for ports that get plugged directly in to a shared network with external access?  Do we need a way to set the dns_domain directly on a port?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"82d1f29af480c61201f71aa4a2d54ea6ed6d1534","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":82,"context_line":"                        primary_key\u003dTrue, index\u003dTrue)"},{"line_number":83,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":84,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    # Add a relationship to the Port model in order to instruct"},{"line_number":87,"context_line":"    # SQLAlchemy to eagerly load this association"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_99097634","line":84,"range":{"start_line":84,"start_character":4,"end_line":84,"end_character":24},"in_reply_to":"3a7e1126_6d7f51e0","updated":"2015-12-22 21:25:18.000000000","message":"It would be a good idea to be able to set dns_domain directly on ports. It would actually simplify things a lot, especially now that we have decided to do the REST call to designate in a call back. Please also see my response to your comment in line 510 below","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def dns_driver(self):"},{"line_number":100,"context_line":"        if not cfg.CONF.external_dns_driver:"},{"line_number":101,"context_line":"            return"},{"line_number":102,"context_line":"        if self._dns_driver:"},{"line_number":103,"context_line":"            return self._dns_driver"},{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":106,"context_line":"            LOG.debug(\"External DNS driver loaded: %s\","}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_270ba825","line":103,"range":{"start_line":102,"start_character":8,"end_line":103,"end_character":35},"updated":"2015-12-22 01:04:58.000000000","message":"nit:  Feels like this should be first.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def dns_driver(self):"},{"line_number":100,"context_line":"        if not cfg.CONF.external_dns_driver:"},{"line_number":101,"context_line":"            return"},{"line_number":102,"context_line":"        if self._dns_driver:"},{"line_number":103,"context_line":"            return self._dns_driver"},{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":106,"context_line":"            LOG.debug(\"External DNS driver loaded: %s\","}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_c847c549","line":103,"range":{"start_line":102,"start_character":8,"end_line":103,"end_character":35},"in_reply_to":"3a7e1126_270ba825","updated":"2015-12-28 23:35:10.000000000","message":"Done","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        # expects to be called within a plugin\u0027s session"},{"line_number":152,"context_line":"        plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":153,"context_line":"            service_constants.L3_ROUTER_NAT)"},{"line_number":154,"context_line":"        if not utils.is_extension_supported(plugin, dns.Dns.get_alias()):"},{"line_number":155,"context_line":"            return"},{"line_number":156,"context_line":"        dns_data_db \u003d context.session.query(FloatingIPDNS).filter_by("},{"line_number":157,"context_line":"            floatingip_id\u003dfloatingip_data[\u0027id\u0027]).one_or_none()"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_e7ada0e9","line":154,"range":{"start_line":154,"start_character":21,"end_line":154,"end_character":43},"updated":"2015-12-22 01:04:58.000000000","message":"Should this check be done in create too?  Maybe is_attr_set will always be False if the extension is not supported?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        # expects to be called within a plugin\u0027s session"},{"line_number":152,"context_line":"        plugin \u003d manager.NeutronManager.get_service_plugins().get("},{"line_number":153,"context_line":"            service_constants.L3_ROUTER_NAT)"},{"line_number":154,"context_line":"        if not utils.is_extension_supported(plugin, dns.Dns.get_alias()):"},{"line_number":155,"context_line":"            return"},{"line_number":156,"context_line":"        dns_data_db \u003d context.session.query(FloatingIPDNS).filter_by("},{"line_number":157,"context_line":"            floatingip_id\u003dfloatingip_data[\u0027id\u0027]).one_or_none()"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_2e0c23ec","line":154,"range":{"start_line":154,"start_character":21,"end_line":154,"end_character":43},"in_reply_to":"3a7e1126_e7ada0e9","updated":"2015-12-28 23:35:10.000000000","message":"In the case of create operations, attributes that the user didn\u0027t specify will still be included in the request by the API with their default value, \"\" in the case of dns_name. That is why, in the case of of create operations, knowing whether the dns_name attribute is set or not (with default value provided by the API or a user specified value) is sufficient to know whether the extension is supported.\n\nIn the case of updates, the situation is different. Requests only include the attributes explicitly specified by the user. As a consequence, presence of attributes in the request, or lack thereof, cannot be used to ascertain whether an extension is being supported. That is why this check is needed in the update and not in the create.\n\nOn top of this, the semantics of the PUT operation in the case of floating ips is different. A PUT is not an update. It is used to associate or disassociate a port to the floating ip. What we are really doing in this method is to process the potential impact in the external DNS service of associating or disassociating a port to the floating ip.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                context, floatingip_data, req_data))"},{"line_number":232,"context_line":"        if dns_name and dns_domain:"},{"line_number":233,"context_line":"            self._add_ips_to_external_dns_service(context, dns_domain,"},{"line_number":234,"context_line":"                dns_name, \u0027A\u0027, [floatingip_data[\u0027floating_ip_address\u0027]])"},{"line_number":235,"context_line":"        return dns_name, dns_domain"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _get_requested_state_for_external_dns_service_update(self, context,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_3f2c0c98","line":234,"range":{"start_line":234,"start_character":26,"end_line":234,"end_character":30},"updated":"2015-12-22 01:04:58.000000000","message":"Shouldn\u0027t the driver be able to figure out which kind of record to create from the address?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":231,"context_line":"                context, floatingip_data, req_data))"},{"line_number":232,"context_line":"        if dns_name and dns_domain:"},{"line_number":233,"context_line":"            self._add_ips_to_external_dns_service(context, dns_domain,"},{"line_number":234,"context_line":"                dns_name, \u0027A\u0027, [floatingip_data[\u0027floating_ip_address\u0027]])"},{"line_number":235,"context_line":"        return dns_name, dns_domain"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _get_requested_state_for_external_dns_service_update(self, context,"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_8e9f85b3","line":234,"range":{"start_line":234,"start_character":26,"end_line":234,"end_character":30},"in_reply_to":"3a7e1126_3f2c0c98","updated":"2015-12-28 23:35:10.000000000","message":"You are right. Fixed","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":492,"context_line":"            tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":493,"context_line":"            tun_min \u003d tun_min.strip()"},{"line_number":494,"context_line":"            tun_max \u003d tun_max.strip()"},{"line_number":495,"context_line":"            if (segmentation_id \u003e\u003d int(tun_min) and"},{"line_number":496,"context_line":"                segmentation_id \u003c\u003d int(tun_max)):"},{"line_number":497,"context_line":"                return True"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def _is_vlan_tenant_network(self, provider_net):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_2ddf093b","line":496,"range":{"start_line":495,"start_character":16,"end_line":496,"end_character":47},"updated":"2015-12-22 01:04:58.000000000","message":"nit:  You can write this like this for a little extra readability: \n\n  return int(tun_min) \u003c\u003d segmentation_id \u003c\u003d int(tun_max)","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":492,"context_line":"            tun_min, tun_max \u003d entry.split(\u0027:\u0027)"},{"line_number":493,"context_line":"            tun_min \u003d tun_min.strip()"},{"line_number":494,"context_line":"            tun_max \u003d tun_max.strip()"},{"line_number":495,"context_line":"            if (segmentation_id \u003e\u003d int(tun_min) and"},{"line_number":496,"context_line":"                segmentation_id \u003c\u003d int(tun_max)):"},{"line_number":497,"context_line":"                return True"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def _is_vlan_tenant_network(self, provider_net):"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_133c1e2e","line":496,"range":{"start_line":495,"start_character":16,"end_line":496,"end_character":47},"in_reply_to":"3a7e1126_2ddf093b","updated":"2015-12-28 23:35:10.000000000","message":"Good catch! Done","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":507,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":508,"context_line":"                return True"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"    def external_dns_not_needed(self, context, network):"},{"line_number":511,"context_line":"        if not self.dns_driver:"},{"line_number":512,"context_line":"            return True"},{"line_number":513,"context_line":"        if network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_6d18b1d3","line":510,"range":{"start_line":510,"start_character":8,"end_line":510,"end_character":31},"updated":"2015-12-22 01:04:58.000000000","message":"I don\u0027t really remember the purpose of this method.  A summary would be nice.  Let me try...\n\nRecords are not sent to ports on networks where the following is true\n- No DNS driver is loaded\n- The network is marked router:external\n- The only network segment is of network_type local\n- A vlan, gre, vxlan, or geneve network is using a segmentation id from the ml2 configured range for tenants.\n\nRecords are not sent to ports on networks where the following is true\n- There is more than one segment in the network.\n- The first segment is a flat.\n- A one segment vlan, gre, vxlan, or geneve network is using a segmentation id outside the ml2 configured range for tenants.\n\nI think I see what drove this.  Really, you\u0027re trying to determine if the IP address is going to be available from the external network, right?  And, because you don\u0027t have a direct way to answer that, you\u0027re relying on some heuristics to answer it.\n\nHow about calling the method something like \"network_is_publicly_available\" or something so that it is more obvious what you\u0027re after.\n\nBeyond that, I wonder if these heuristics are complete enough or if we\u0027ll run in to problems.\n\nLet me ask this.  Maybe you have a good answer.  Why can\u0027t we just try sending to external DNS for any network that has a dns domain configured?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"02a60682d0216e0e6a33602217bf68b0f15da96d","unresolved":false,"context_lines":[{"line_number":507,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":508,"context_line":"                return True"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"    def external_dns_not_needed(self, context, network):"},{"line_number":511,"context_line":"        if not self.dns_driver:"},{"line_number":512,"context_line":"            return True"},{"line_number":513,"context_line":"        if network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_2cc11de5","line":510,"range":{"start_line":510,"start_character":8,"end_line":510,"end_character":31},"in_reply_to":"1a7b0d38_dd1fe959","updated":"2015-12-22 23:55:02.000000000","message":"Miguel, thanks for your detailed explanation here.  Maybe we can keep it like this and follow up after this patch.\n\nI think I can sum up what we\u0027re trying to accomplish with these heuristics:\n\n\"IP addresses which can be reached from external we want to publish to DNS.\"  Is that about right?\n\nGiven this, I wonder if we should just have the operator configure DNS with the networks that have external connectivity.  Then, we know if we have either a port directly attached to it or a floating ip from it, we should publish that IP to DNS.\n\nWhen address scopes are finished, we can add another way:  Configure DNS with an address scope.  Any IP address from the address scope should be published to DNS.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"82d1f29af480c61201f71aa4a2d54ea6ed6d1534","unresolved":false,"context_lines":[{"line_number":507,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":508,"context_line":"                return True"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"    def external_dns_not_needed(self, context, network):"},{"line_number":511,"context_line":"        if not self.dns_driver:"},{"line_number":512,"context_line":"            return True"},{"line_number":513,"context_line":"        if network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_dd1fe959","line":510,"range":{"start_line":510,"start_character":8,"end_line":510,"end_character":31},"in_reply_to":"3a7e1126_6d18b1d3","updated":"2015-12-22 21:25:18.000000000","message":"For floating ips, we have 2 alternatives: either the user assigns dns_name and dns_domain to the fip at creation or the fip gets them from the port / network that it is associated with. If I just sent to external dns every port / network with dns_name /dns_domain, I might be sending data intended to be used in association with a fip address, not the port addresses. That is why I came up with this logic that boils down to:\n\n1) If user associated dns_name and dns_domain with port / network\n2) If the network is not a normal tenant networks as defined by the default tenant segmentation ranges or flat\n\nThen I conclude that the user intends to make ports in this network accessible from the outside directly, without a fip, because she / he is taking the effort to explicitly specify provider network and dns data.  Otherwise, dns_name and dns_domain in the port / network are meant to be used with a fip. \n\nHaving said this, and taking into consideration my responses to your comments to lines 66 and 84, I think we can simplify all this, especially now that we want to process the external dns calls as a call back. My proposal is:\n\n1) Ports have both dns_name and dns_domain attributes. If they have both, their ip addresses will be published to external dns. There won\u0027t be dns_domain attribute associated to networks.\n\n2) Floating ips have both dns_name and dns_domain attributes. If they have both, their ip address will be published to external dns. Floating ips won\u0027t have the option to get dns_name and dns_domain by association with a port.\n\nThe benefits of this simplification are several:\n\n1) We don\u0027t need to worry about the user changing dns related attributes in resources that can be updated independently of each other, as indicated in line 66 above. We only need to process the attributes that come in the current request. Otherwise, we need to remember history, which will complicate the implementation based on call backs because forces a read of the db.\n\n2) We don\u0027t need to discern whether a port\u0027s dns_name / dns_domain attributes are meant to be used for the port itself or for a fip, which is what motivates the logic in this method.\n\n3) The dns related code for ports becomes completely generic and therefore usable by any plugin. We don\u0027t need a subclass for ML2.\n\n4) From the point of view of floating ips, we don\u0027t sacrifice any functionality. We wanted the dns_name / dns_domain to come from the fip or the port / instance. But that can be accomplished by the user at the moment of floating ip creation, which needs to happen anyway. There is no additional price / effort on the part of the user.\n\n5) From the point of view of the ports, it will impose a small additional price on the user: a dns_domain needs to be specified at the port level. But I think the impact is minimal.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        if provider_net[\u0027network_type\u0027] in [\u0027gre\u0027, \u0027vxlan\u0027, \u0027geneve\u0027]:"},{"line_number":526,"context_line":"            return self._is_tunnel_tenant_network(provider_net)"},{"line_number":527,"context_line":"        raise ml2_exc.UnknownNetworkType("},{"line_number":528,"context_line":"            network_type\u003dprovider_net[\u0027network_type\u0027])"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_8dacfd8c","line":528,"updated":"2015-12-22 01:04:58.000000000","message":"Do we really want to raise an exception (which will most likely abort the operation for this?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        if provider_net[\u0027network_type\u0027] in [\u0027gre\u0027, \u0027vxlan\u0027, \u0027geneve\u0027]:"},{"line_number":526,"context_line":"            return self._is_tunnel_tenant_network(provider_net)"},{"line_number":527,"context_line":"        raise ml2_exc.UnknownNetworkType("},{"line_number":528,"context_line":"            network_type\u003dprovider_net[\u0027network_type\u0027])"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_f3f95281","line":528,"in_reply_to":"3a7e1126_8dacfd8c","updated":"2015-12-28 23:35:10.000000000","message":"Let\u0027s return True","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 IBM"},{"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":37,"id":"fa69d971_6ba9998f","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2016-01-12 16:49:49.000000000","message":"nano-nit:  2016.  :)","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 IBM"},{"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":37,"id":"da6ed579_11a214af","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"in_reply_to":"fa69d971_6ba9998f","updated":"2016-01-18 23:57:04.000000000","message":"It\u0027s really a good one.... It applies to all the new modules I am adding in this patchset","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":38,"context_line":"class NetworkDNSDomain(model_base.BASEV2):"},{"line_number":39,"context_line":"    network_id \u003d sa.Column(sa.String(36),"},{"line_number":40,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":41,"context_line":"                           primary_key\u003dTrue, index\u003dTrue)"},{"line_number":42,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # Add a relationship to the Network model in order to instruct"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_cbe205d5","line":41,"updated":"2016-01-12 16:49:49.000000000","message":"I think readability would be improved by putting one argument per line here and throughout.\n\nThat said, given that this is already the primary key, does it need to be an index also?","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"624fe19a55d826453ca2dbf14e89bde17f99d33c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"class NetworkDNSDomain(model_base.BASEV2):"},{"line_number":39,"context_line":"    network_id \u003d sa.Column(sa.String(36),"},{"line_number":40,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":41,"context_line":"                           primary_key\u003dTrue, index\u003dTrue)"},{"line_number":42,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # Add a relationship to the Network model in order to instruct"}],"source_content_type":"text/x-python","patch_set":37,"id":"9a68dd71_69e557da","line":41,"in_reply_to":"da6ed579_85547a21","updated":"2016-01-22 16:15:19.000000000","message":"Interesting.  I didn\u0027t know that.","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":38,"context_line":"class NetworkDNSDomain(model_base.BASEV2):"},{"line_number":39,"context_line":"    network_id \u003d sa.Column(sa.String(36),"},{"line_number":40,"context_line":"                           sa.ForeignKey(\u0027networks.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":41,"context_line":"                           primary_key\u003dTrue, index\u003dTrue)"},{"line_number":42,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # Add a relationship to the Network model in order to instruct"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_85547a21","line":41,"in_reply_to":"fa69d971_cbe205d5","updated":"2016-01-18 23:57:04.000000000","message":"Ok, changing to one argument per line.\n\nAs far as the index argument, I added it because postgres requires it. Unit tests were failing because it wasn\u0027t specified. Please see Henry Gessau comments here: https://review.openstack.org/#/c/212213/34/neutron/db/dns_db.py. As soon as I added this argument, the unit test failure went away","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    floatingip_id \u003d sa.Column(sa.String(36),"},{"line_number":57,"context_line":"                              sa.ForeignKey(\u0027floatingips.id\u0027,"},{"line_number":58,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":59,"context_line":"                              primary_key\u003dTrue, index\u003dTrue)"},{"line_number":60,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":61,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":62,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_2b572159","line":59,"updated":"2016-01-12 16:49:49.000000000","message":"Ditto (L41)","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    floatingip_id \u003d sa.Column(sa.String(36),"},{"line_number":57,"context_line":"                              sa.ForeignKey(\u0027floatingips.id\u0027,"},{"line_number":58,"context_line":"                                            ondelete\u003d\"CASCADE\"),"},{"line_number":59,"context_line":"                              primary_key\u003dTrue, index\u003dTrue)"},{"line_number":60,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":61,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":62,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_25190e89","line":59,"in_reply_to":"fa69d971_2b572159","updated":"2016-01-18 23:57:04.000000000","message":"Ditto (L41)","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    port_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":77,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":78,"context_line":"                        primary_key\u003dTrue, index\u003dTrue)"},{"line_number":79,"context_line":"    current_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":80,"context_line":"    current_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":81,"context_line":"    previous_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":37,"id":"fa69d971_2bde41dd","line":78,"updated":"2016-01-12 16:49:49.000000000","message":"ditto (L41)","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    port_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\u0027ports.id\u0027,"},{"line_number":77,"context_line":"                                                     ondelete\u003d\"CASCADE\"),"},{"line_number":78,"context_line":"                        primary_key\u003dTrue, index\u003dTrue)"},{"line_number":79,"context_line":"    current_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":80,"context_line":"    current_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":81,"context_line":"    previous_dns_name \u003d sa.Column(sa.String(255), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_e5121662","line":78,"in_reply_to":"fa69d971_2bde41dd","updated":"2016-01-18 23:57:04.000000000","message":"Ditto (L41)","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        published_dns_name, published_dns_domain \u003d ("},{"line_number":136,"context_line":"            self._create_floatingip_in_external_dns_service("},{"line_number":137,"context_line":"                context, floatingip_data, req_data))"},{"line_number":138,"context_line":"        if published_dns_name and published_dns_domain:"},{"line_number":139,"context_line":"            context.session.add(FloatingIPDNS("},{"line_number":140,"context_line":"                floatingip_id\u003dfloatingip_data[\u0027id\u0027],"},{"line_number":141,"context_line":"                dns_name\u003dreq_data[dns.DNSNAME],"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_f2a53eb5","line":138,"updated":"2016-01-12 16:49:49.000000000","message":"Curious:  Why would one be true and not the other?  I think I found the answer (L203)","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        published_dns_name, published_dns_domain \u003d ("},{"line_number":136,"context_line":"            self._create_floatingip_in_external_dns_service("},{"line_number":137,"context_line":"                context, floatingip_data, req_data))"},{"line_number":138,"context_line":"        if published_dns_name and published_dns_domain:"},{"line_number":139,"context_line":"            context.session.add(FloatingIPDNS("},{"line_number":140,"context_line":"                floatingip_id\u003dfloatingip_data[\u0027id\u0027],"},{"line_number":141,"context_line":"                dns_name\u003dreq_data[dns.DNSNAME],"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_abcb8d52","line":138,"in_reply_to":"da6ed579_f2a53eb5","updated":"2016-01-18 23:57:04.000000000","message":"If the floatingip doesn\u0027t have associated dns_name and dns_domain, then the other source is the internal port. But in this second case, the port\u0027s network might not have a dns_domain associated","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                                                            dns_data_db))"},{"line_number":160,"context_line":"        if dns_data_db:"},{"line_number":161,"context_line":"            if dns_data_db[\u0027dns_name\u0027]:"},{"line_number":162,"context_line":"                return"},{"line_number":163,"context_line":"            if published_dns_name and published_dns_domain:"},{"line_number":164,"context_line":"                dns_data_db[\u0027published_dns_name\u0027] \u003d published_dns_name"},{"line_number":165,"context_line":"                dns_data_db[\u0027published_dns_domain\u0027] \u003d published_dns_domain"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_3dee47ed","line":162,"range":{"start_line":162,"start_character":16,"end_line":162,"end_character":22},"updated":"2016-01-12 16:49:49.000000000","message":"Hold on a second, if dns_name is set here but the published_dns_* are not set, we don\u0027t want to execute the delete on L167?  I feel like I might be missing something.\n\nI don\u0027t think I fully understand why this is returning under this condition.","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                                                            dns_data_db))"},{"line_number":160,"context_line":"        if dns_data_db:"},{"line_number":161,"context_line":"            if dns_data_db[\u0027dns_name\u0027]:"},{"line_number":162,"context_line":"                return"},{"line_number":163,"context_line":"            if published_dns_name and published_dns_domain:"},{"line_number":164,"context_line":"                dns_data_db[\u0027published_dns_name\u0027] \u003d published_dns_name"},{"line_number":165,"context_line":"                dns_data_db[\u0027published_dns_domain\u0027] \u003d published_dns_domain"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_263834a0","line":162,"range":{"start_line":162,"start_character":16,"end_line":162,"end_character":22},"in_reply_to":"da6ed579_3dee47ed","updated":"2016-01-18 23:57:04.000000000","message":"The dns_name and dns_domain associated with the floatingip have precedence over the same attributes associated with the internal port and its network. dns_data_db[\u0027dns_name] stores the dns_name associated with the floating ip and it is not up-datable, as the put operation is used to associate and disassociate internal ports with the floating ip. Therefore, dns_data_db[\u0027dns_name] can only be set at floating ip creation and has the same value as dns_data_db[\u0027published_dns_name\u0027], because it was published in the external dns service during fip creation. In this case, the fact that a port is being associated or disassociated with the floating ip has no effect on the external dns service.\n\nCode in lines 163 to 175 only apply if:\n\n1) The floating ip doesn\u0027t have dns_name and dns_domain\n2) A new port is being associated with the floating ip\n3) This port has dns_name and its network has dns_domain","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        dns_domain \u003d None"},{"line_number":201,"context_line":"        if internal_port[\u0027dns_name\u0027]:"},{"line_number":202,"context_line":"            net_dns \u003d context.session.query(NetworkDNSDomain).filter_by("},{"line_number":203,"context_line":"                network_id\u003dinternal_port[\u0027network_id\u0027]).one_or_none()"},{"line_number":204,"context_line":"            if net_dns:"},{"line_number":205,"context_line":"                dns_domain \u003d net_dns[\u0027dns_domain\u0027]"},{"line_number":206,"context_line":"        return internal_port[\u0027dns_name\u0027], dns_domain"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_bda9d7e1","line":203,"range":{"start_line":203,"start_character":56,"end_line":203,"end_character":67},"updated":"2016-01-12 16:49:49.000000000","message":"Note:  This could return None and this method would return dns_name without a dns_domain.  This explains why so many places check that both contain a value.","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        dns_domain \u003d None"},{"line_number":201,"context_line":"        if internal_port[\u0027dns_name\u0027]:"},{"line_number":202,"context_line":"            net_dns \u003d context.session.query(NetworkDNSDomain).filter_by("},{"line_number":203,"context_line":"                network_id\u003dinternal_port[\u0027network_id\u0027]).one_or_none()"},{"line_number":204,"context_line":"            if net_dns:"},{"line_number":205,"context_line":"                dns_domain \u003d net_dns[\u0027dns_domain\u0027]"},{"line_number":206,"context_line":"        return internal_port[\u0027dns_name\u0027], dns_domain"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_86724048","line":203,"range":{"start_line":203,"start_character":56,"end_line":203,"end_character":67},"in_reply_to":"da6ed579_bda9d7e1","updated":"2016-01-18 23:57:04.000000000","message":"Yes, in the case the floating ip doesn\u0027t have dns_name and dns_domain, then we check if we find those attributes in the associated port and its network. But since they are set independently, the presence of one doesn\u0027t necessarily imply the presence of the other.","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            else:"},{"line_number":259,"context_line":"                return dns_name, dns_domain"},{"line_number":260,"context_line":"        if dns_name and dns_domain:"},{"line_number":261,"context_line":"            try:"},{"line_number":262,"context_line":"                self.dns_driver.create_record_set("},{"line_number":263,"context_line":"                    context, dns_domain, dns_name,"},{"line_number":264,"context_line":"                    [floatingip_data[\u0027floating_ip_address\u0027]])"},{"line_number":265,"context_line":"            except (dns.DNSDomainNotFound, dns.DuplicateRecordSet) as e:"},{"line_number":266,"context_line":"                raise n_exc.BadRequest(resource\u003d\u0027floatingip\u0027, msg\u003de.msg)"},{"line_number":267,"context_line":"        return dns_name, dns_domain"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def _add_ips_to_external_dns_service(self, context, dns_domain, dns_name,"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_1d34a3dc","line":266,"range":{"start_line":261,"start_character":12,"end_line":266,"end_character":72},"updated":"2016-01-12 16:49:49.000000000","message":"I think this is exactly what the next method does except that it passes \u0027floatingip\u0027 for resource instead of \u0027port\u0027.  It seems that can be easily parameterized.","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":258,"context_line":"            else:"},{"line_number":259,"context_line":"                return dns_name, dns_domain"},{"line_number":260,"context_line":"        if dns_name and dns_domain:"},{"line_number":261,"context_line":"            try:"},{"line_number":262,"context_line":"                self.dns_driver.create_record_set("},{"line_number":263,"context_line":"                    context, dns_domain, dns_name,"},{"line_number":264,"context_line":"                    [floatingip_data[\u0027floating_ip_address\u0027]])"},{"line_number":265,"context_line":"            except (dns.DNSDomainNotFound, dns.DuplicateRecordSet) as e:"},{"line_number":266,"context_line":"                raise n_exc.BadRequest(resource\u003d\u0027floatingip\u0027, msg\u003de.msg)"},{"line_number":267,"context_line":"        return dns_name, dns_domain"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"    def _add_ips_to_external_dns_service(self, context, dns_domain, dns_name,"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_bf2aaf8e","line":266,"range":{"start_line":261,"start_character":12,"end_line":266,"end_character":72},"in_reply_to":"da6ed579_1d34a3dc","updated":"2016-01-18 23:57:04.000000000","message":"Done","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"}],"neutron/db/l3_db.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"da20952f_dec35556","updated":"2015-09-08 22:43:51.000000000","message":"These changes aim to take care of publishing when floating ips are in use.  What about the use case where we boot a VM directly on to an external network?  I guess the network would be shared in that case and the dns_domain may not be valid for different tenants.  Can dns_domain be set on a port like it is on a floating ip?","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ba15a1d1_770af57a","in_reply_to":"da20952f_dec35556","updated":"2015-09-16 20:20:31.000000000","message":"Yes, this use case will also be implemented. Right now I am focusing on getting the functionality working for floating ips, to make sure we have a demo for Tokyo. Next step will be this use case.\n\nAs far as the dns_domain, right now it can only be set in networks, not ports. That is what we defined in the spec","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":115,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":116,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":117,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":118,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_5e850505","line":117,"updated":"2015-09-08 22:43:51.000000000","message":"It occurred to me that the floating ip has a backing port (to reserve the IP for the floating IP).  I wonder if there would be any benefit of using the dns_name set on the port instead of adding it here.\n\nI\u0027m not suggesting you do this.  I honestly want to get some opinions and consider it.  It might not be a good idea, especially since we\u0027d all like to get rid of that backing port one day anyway.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":115,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":116,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":117,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":118,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_db2aa7e7","line":117,"in_reply_to":"da20952f_5e850505","updated":"2015-09-16 20:20:31.000000000","message":"I think you refer to the port in the external network. neutron/db/l3_db.py has the following comment in create_floatingip regarding that port: \"This external port is never exposed to the tenant.\"\n\nI don\u0027t see any benefit of placing dns_name set on that port. On the contrary, we would be hiding this attribute from the tenant","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def __init__(self):"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":133,"context_line":"        except ImportError:"},{"line_number":134,"context_line":"            self._dns_driver \u003d None"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_7bb81be9","line":133,"updated":"2015-09-08 22:43:51.000000000","message":"This should probably be logged.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def __init__(self):"},{"line_number":131,"context_line":"        try:"},{"line_number":132,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":133,"context_line":"        except ImportError:"},{"line_number":134,"context_line":"            self._dns_driver \u003d None"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_103203f2","line":133,"in_reply_to":"da20952f_7bb81be9","updated":"2015-09-16 20:20:31.000000000","message":"Done","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":898,"context_line":"                context, internal_port[\u0027network_id\u0027])"},{"line_number":899,"context_line":"            data[\u0027dns_domain\u0027] \u003d internal_port_network[\u0027dns_domain\u0027]"},{"line_number":900,"context_line":"        else:"},{"line_number":901,"context_line":"            data[\u0027dns_domain\u0027] \u003d \u0027\u0027"},{"line_number":902,"context_line":"        return data"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"    def get_assoc_data(self, context, fip, floating_network_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_1eab0dd8","line":901,"updated":"2015-09-08 22:43:51.000000000","message":"Why empty string and not None?  I tend think of an empty string as a valid value when it is used.  Using None, or just leaving it unset, communicates that it shouldn\u0027t be interpreted as a valid dns domain to me.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":898,"context_line":"                context, internal_port[\u0027network_id\u0027])"},{"line_number":899,"context_line":"            data[\u0027dns_domain\u0027] \u003d internal_port_network[\u0027dns_domain\u0027]"},{"line_number":900,"context_line":"        else:"},{"line_number":901,"context_line":"            data[\u0027dns_domain\u0027] \u003d \u0027\u0027"},{"line_number":902,"context_line":"        return data"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"    def get_assoc_data(self, context, fip, floating_network_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_bc7e90e2","line":901,"in_reply_to":"da20952f_1eab0dd8","updated":"2015-09-16 20:20:31.000000000","message":"If the dns extension is enabled, the default values in the db for dns_name in port and dns_domain in network is empty string. So I am just treating it here uniformly","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":951,"context_line":""},{"line_number":952,"context_line":"    def _publish_floatingip_to_external_dns_service(self, context, fip,"},{"line_number":953,"context_line":"                                                    floatingip_db, port_id,"},{"line_number":954,"context_line":"                                                    internal_port_dns_data):"},{"line_number":955,"context_line":"        dns_name \u003d dns_domain \u003d None"},{"line_number":956,"context_line":"        if fip[\u0027dns_name\u0027] and fip[\u0027dns_domain\u0027]:"},{"line_number":957,"context_line":"            dns_name \u003d fip[\u0027dns_name\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_bb7553fb","line":954,"updated":"2015-09-08 22:43:51.000000000","message":"I like to be clear up front instead of having to go through the whole method only to discover there is nothing to do at L963.\n\n  if not self._dns_driver:\n      return","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":951,"context_line":""},{"line_number":952,"context_line":"    def _publish_floatingip_to_external_dns_service(self, context, fip,"},{"line_number":953,"context_line":"                                                    floatingip_db, port_id,"},{"line_number":954,"context_line":"                                                    internal_port_dns_data):"},{"line_number":955,"context_line":"        dns_name \u003d dns_domain \u003d None"},{"line_number":956,"context_line":"        if fip[\u0027dns_name\u0027] and fip[\u0027dns_domain\u0027]:"},{"line_number":957,"context_line":"            dns_name \u003d fip[\u0027dns_name\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_3c6b6020","line":954,"in_reply_to":"da20952f_bb7553fb","updated":"2015-09-16 20:20:31.000000000","message":"I agree with you. PS8 completely reworked this method and follows the approach indicated by you","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":956,"context_line":"        if fip[\u0027dns_name\u0027] and fip[\u0027dns_domain\u0027]:"},{"line_number":957,"context_line":"            dns_name \u003d fip[\u0027dns_name\u0027]"},{"line_number":958,"context_line":"            dns_domain \u003d fip[\u0027dns_domain\u0027]"},{"line_number":959,"context_line":"        elif (internal_port_dns_data[\u0027dns_name\u0027] and"},{"line_number":960,"context_line":"              internal_port_dns_data[\u0027dns_domain\u0027]):"},{"line_number":961,"context_line":"            dns_name \u003d internal_port_dns_data[\u0027dns_name\u0027]"},{"line_number":962,"context_line":"            dns_domain \u003d internal_port_dns_data[\u0027dns_domain\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_5b38b73d","line":959,"updated":"2015-09-08 22:43:51.000000000","message":"I think this can be None.  See L919.  You\u0027ll get an exception trying to access it as a dict.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":956,"context_line":"        if fip[\u0027dns_name\u0027] and fip[\u0027dns_domain\u0027]:"},{"line_number":957,"context_line":"            dns_name \u003d fip[\u0027dns_name\u0027]"},{"line_number":958,"context_line":"            dns_domain \u003d fip[\u0027dns_domain\u0027]"},{"line_number":959,"context_line":"        elif (internal_port_dns_data[\u0027dns_name\u0027] and"},{"line_number":960,"context_line":"              internal_port_dns_data[\u0027dns_domain\u0027]):"},{"line_number":961,"context_line":"            dns_name \u003d internal_port_dns_data[\u0027dns_name\u0027]"},{"line_number":962,"context_line":"            dns_domain \u003d internal_port_dns_data[\u0027dns_domain\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_7cd6b8c6","line":959,"in_reply_to":"da20952f_5b38b73d","updated":"2015-09-16 20:20:31.000000000","message":"This method only gets called if the dns api extension is enabled. In that case, internal_port_dns_data won\u0027t be None. In any case I completely reworked this method","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":959,"context_line":"        elif (internal_port_dns_data[\u0027dns_name\u0027] and"},{"line_number":960,"context_line":"              internal_port_dns_data[\u0027dns_domain\u0027]):"},{"line_number":961,"context_line":"            dns_name \u003d internal_port_dns_data[\u0027dns_name\u0027]"},{"line_number":962,"context_line":"            dns_domain \u003d internal_port_dns_data[\u0027dns_domain\u0027]"},{"line_number":963,"context_line":"        if dns_name and self._dns_driver:"},{"line_number":964,"context_line":"            self._dns_driver.create_record_set("},{"line_number":965,"context_line":"                context, dns_domain, dns_name, \u0027A\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_7b77bb08","line":962,"updated":"2015-09-08 22:43:51.000000000","message":"You could eliminate L955 and make the rest of the method a little simpler by adding this here:\n\n        else:\n            return\n\nIt may just be personal preference but I think this reads more naturally;\n\n        if not self._dns_driver:\n            return\n\n        if fip[\u0027dns_name\u0027] and fip[\u0027dns_domain\u0027]:\n            dns_name \u003d fip[\u0027dns_name\u0027]\n            dns_domain \u003d fip[\u0027dns_domain\u0027]\n        elif (internal_port_dns_data[\u0027dns_name\u0027] and\n              internal_port_dns_data[\u0027dns_domain\u0027]):\n            dns_name \u003d internal_port_dns_data[\u0027dns_name\u0027]\n            dns_domain \u003d internal_port_dns_data[\u0027dns_domain\u0027]\n        else:\n            return\n\n        self._dns_driver.create_record_set(\n            context, dns_domain, dns_name, \u0027A\u0027,\n                [floatingip_db[\u0027floating_ip_address\u0027]])\n\nI don\u0027t know, just playing around with to understand what the code is doing.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":959,"context_line":"        elif (internal_port_dns_data[\u0027dns_name\u0027] and"},{"line_number":960,"context_line":"              internal_port_dns_data[\u0027dns_domain\u0027]):"},{"line_number":961,"context_line":"            dns_name \u003d internal_port_dns_data[\u0027dns_name\u0027]"},{"line_number":962,"context_line":"            dns_domain \u003d internal_port_dns_data[\u0027dns_domain\u0027]"},{"line_number":963,"context_line":"        if dns_name and self._dns_driver:"},{"line_number":964,"context_line":"            self._dns_driver.create_record_set("},{"line_number":965,"context_line":"                context, dns_domain, dns_name, \u0027A\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_3c528068","line":962,"in_reply_to":"da20952f_7b77bb08","updated":"2015-09-16 20:20:31.000000000","message":"As indicated above, I completely reworked this method in PS8. It looks similar to what you propose here, although it also covers the case where you are updating the fip","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":962,"context_line":"            dns_domain \u003d internal_port_dns_data[\u0027dns_domain\u0027]"},{"line_number":963,"context_line":"        if dns_name and self._dns_driver:"},{"line_number":964,"context_line":"            self._dns_driver.create_record_set("},{"line_number":965,"context_line":"                context, dns_domain, dns_name, \u0027A\u0027,"},{"line_number":966,"context_line":"                [floatingip_db[\u0027floating_ip_address\u0027]])"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"    def _update_fip_assoc(self, context, fip, floatingip_db, external_port):"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_defef5ad","line":965,"updated":"2015-09-08 22:43:51.000000000","message":"I honestly forget what we were going to do with PTR records.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":962,"context_line":"            dns_domain \u003d internal_port_dns_data[\u0027dns_domain\u0027]"},{"line_number":963,"context_line":"        if dns_name and self._dns_driver:"},{"line_number":964,"context_line":"            self._dns_driver.create_record_set("},{"line_number":965,"context_line":"                context, dns_domain, dns_name, \u0027A\u0027,"},{"line_number":966,"context_line":"                [floatingip_db[\u0027floating_ip_address\u0027]])"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"    def _update_fip_assoc(self, context, fip, floatingip_db, external_port):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_b77badf4","line":965,"in_reply_to":"da20952f_defef5ad","updated":"2015-09-16 20:20:31.000000000","message":"I had forgotten the PTR records. PS9 adds code for them","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":14562,"name":"Zhi Chang","email":"changzhi2@lenovo.com","username":"changzhi"},"change_message_id":"a713d6a35b52425c1b560a068609f074c9a8a6c0","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        fip \u003d floatingip[\u0027floatingip\u0027]"},{"line_number":1036,"context_line":"        core_plugin_exts \u003d self._core_plugin.supported_extension_aliases"},{"line_number":1037,"context_line":"        if \u0027dns-integration\u0027 in core_plugin_exts:"},{"line_number":1038,"context_line":"            if fip[\u0027dns_domain\u0027] and not fip[\u0027dns_name\u0027]:"},{"line_number":1039,"context_line":"                msg \u003d _(\"dns_domain cannot be specified without a dns_name\")"},{"line_number":1040,"context_line":"                raise n_exc.BadRequest(resource\u003d\u0027floatingip\u0027, msg\u003dmsg)"},{"line_number":1041,"context_line":"            if fip[\u0027dns_name\u0027] and not fip[\u0027dns_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_ad2bc72f","line":1038,"updated":"2015-10-19 15:01:43.000000000","message":"I think this code should look like:\n\n    if fip.get(\u0027dns_domain\u0027) and not fip(\u0027dns_name\u0027):\n\n\nHere is error log:\nhttp://logs.openstack.org/13/212213/25/check/gate-neutron-dsvm-functional/aae9479/testr_results.html.gz","commit_id":"83ba1dc0b49b8b23ac2eeacdbaf8e7a05aefb8bd"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"34c683e44ace7b36fa0b17325a19d149ff48abb0","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        fip \u003d floatingip[\u0027floatingip\u0027]"},{"line_number":1036,"context_line":"        core_plugin_exts \u003d self._core_plugin.supported_extension_aliases"},{"line_number":1037,"context_line":"        if \u0027dns-integration\u0027 in core_plugin_exts:"},{"line_number":1038,"context_line":"            if fip[\u0027dns_domain\u0027] and not fip[\u0027dns_name\u0027]:"},{"line_number":1039,"context_line":"                msg \u003d _(\"dns_domain cannot be specified without a dns_name\")"},{"line_number":1040,"context_line":"                raise n_exc.BadRequest(resource\u003d\u0027floatingip\u0027, msg\u003dmsg)"},{"line_number":1041,"context_line":"            if fip[\u0027dns_name\u0027] and not fip[\u0027dns_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_d8afe629","line":1038,"in_reply_to":"3a29b11f_ad2bc72f","updated":"2015-10-26 10:59:16.000000000","message":"Thanks for the review! I think it is best to modify the test, given the way I implemented the rest API","commit_id":"83ba1dc0b49b8b23ac2eeacdbaf8e7a05aefb8bd"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d8a9a97bf9f1415cc2102a8c26a5f14c950f57a1","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    @property"},{"line_number":137,"context_line":"    def dns_driver(self):"},{"line_number":138,"context_line":"        if not cfg.CONF.external_dns_driver:"},{"line_number":139,"context_line":"            return None"},{"line_number":140,"context_line":"        if self._dns_driver:"},{"line_number":141,"context_line":"            return self._dns_driver"},{"line_number":142,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa80f949_fe5fb5e2","line":139,"updated":"2015-11-06 14:56:43.000000000","message":"same as below","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fd5ec23123b44311495870a899c639b644882c53","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    @property"},{"line_number":137,"context_line":"    def dns_driver(self):"},{"line_number":138,"context_line":"        if not cfg.CONF.external_dns_driver:"},{"line_number":139,"context_line":"            return None"},{"line_number":140,"context_line":"        if self._dns_driver:"},{"line_number":141,"context_line":"            return self._dns_driver"},{"line_number":142,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_9cfb067b","line":139,"in_reply_to":"fa80f949_fe5fb5e2","updated":"2015-11-19 00:19:13.000000000","message":"Done","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d8a9a97bf9f1415cc2102a8c26a5f14c950f57a1","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            return self._dns_driver"},{"line_number":142,"context_line":"        try:"},{"line_number":143,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":144,"context_line":"            LOG.debug(\"External DNS driver loaded: %s\" %"},{"line_number":145,"context_line":"                      cfg.CONF.external_dns_driver)"},{"line_number":146,"context_line":"            return self._dns_driver"},{"line_number":147,"context_line":"        except ImportError:"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa80f949_9ec30989","line":144,"updated":"2015-11-06 14:56:43.000000000","message":"please use a , instead of the %","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fd5ec23123b44311495870a899c639b644882c53","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            return self._dns_driver"},{"line_number":142,"context_line":"        try:"},{"line_number":143,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":144,"context_line":"            LOG.debug(\"External DNS driver loaded: %s\" %"},{"line_number":145,"context_line":"                      cfg.CONF.external_dns_driver)"},{"line_number":146,"context_line":"            return self._dns_driver"},{"line_number":147,"context_line":"        except ImportError:"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_5cfa7e76","line":144,"in_reply_to":"fa80f949_9ec30989","updated":"2015-11-19 00:19:13.000000000","message":"Done","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d8a9a97bf9f1415cc2102a8c26a5f14c950f57a1","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        except ImportError:"},{"line_number":148,"context_line":"            LOG.exception(_LE(\"ImportError exception occurred while loading \""},{"line_number":149,"context_line":"                              \"the external DNS service driver\"))"},{"line_number":150,"context_line":"            return None"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @property"},{"line_number":153,"context_line":"    def _core_plugin(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa80f949_9e4a2925","line":150,"updated":"2015-11-06 14:56:43.000000000","message":"by deafault a method returns None you do not need to specifically return None","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fd5ec23123b44311495870a899c639b644882c53","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        except ImportError:"},{"line_number":148,"context_line":"            LOG.exception(_LE(\"ImportError exception occurred while loading \""},{"line_number":149,"context_line":"                              \"the external DNS service driver\"))"},{"line_number":150,"context_line":"            return None"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    @property"},{"line_number":153,"context_line":"    def _core_plugin(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_7cf7428b","line":150,"in_reply_to":"fa80f949_9e4a2925","updated":"2015-11-19 00:19:13.000000000","message":"Done","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":117,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":118,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":119,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":120,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":121,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":122,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_e7b8642c","line":119,"updated":"2015-11-19 12:31:34.000000000","message":"why are we not adding in extension support for this?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":117,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":118,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":119,"context_line":"    dns_name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":120,"context_line":"    dns_domain \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":121,"context_line":"    published_dns_name \u003d sa.Column(sa.String(255), nullable\u003dTrue)"},{"line_number":122,"context_line":"    published_dns_domain \u003d sa.Column(sa.String(255), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_fe2b9892","line":119,"in_reply_to":"ba8a016a_e7b8642c","updated":"2015-11-29 23:05:55.000000000","message":"OK, moving this code to the extension. I am using the external networks extension as a guide on how to implement this. It is very similar to what I am trying to accomplish: add an attributes to floatingips. http://git.openstack.org/cgit/openstack/neutron/tree/neutron/db/external_net_db.py","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            return self._dns_driver"},{"line_number":142,"context_line":"        try:"},{"line_number":143,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":144,"context_line":"            LOG.debug(\"External DNS driver loaded: \","},{"line_number":145,"context_line":"                      cfg.CONF.external_dns_driver)"},{"line_number":146,"context_line":"            return self._dns_driver"},{"line_number":147,"context_line":"        except ImportError:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_c788c073","line":144,"updated":"2015-11-19 12:31:34.000000000","message":"missing %s","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            return self._dns_driver"},{"line_number":142,"context_line":"        try:"},{"line_number":143,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":144,"context_line":"            LOG.debug(\"External DNS driver loaded: \","},{"line_number":145,"context_line":"                      cfg.CONF.external_dns_driver)"},{"line_number":146,"context_line":"            return self._dns_driver"},{"line_number":147,"context_line":"        except ImportError:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_be1c3078","line":144,"in_reply_to":"ba8a016a_c788c073","updated":"2015-11-29 23:05:55.000000000","message":"Done","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":799,"context_line":"               \u0027port_id\u0027: floatingip[\u0027fixed_port_id\u0027],"},{"line_number":800,"context_line":"               \u0027fixed_ip_address\u0027: floatingip[\u0027fixed_ip_address\u0027],"},{"line_number":801,"context_line":"               \u0027status\u0027: floatingip[\u0027status\u0027]}"},{"line_number":802,"context_line":"        if \u0027dns_domain\u0027 in floatingip:"},{"line_number":803,"context_line":"            res[\u0027dns_domain\u0027] \u003d floatingip[\u0027dns_domain\u0027]"},{"line_number":804,"context_line":"        if \u0027dns_name\u0027 in floatingip:"},{"line_number":805,"context_line":"            res[\u0027dns_name\u0027] \u003d floatingip[\u0027dns_name\u0027]"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_279aecb9","line":802,"updated":"2015-11-19 12:31:34.000000000","message":"this should be part of the extension","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":799,"context_line":"               \u0027port_id\u0027: floatingip[\u0027fixed_port_id\u0027],"},{"line_number":800,"context_line":"               \u0027fixed_ip_address\u0027: floatingip[\u0027fixed_ip_address\u0027],"},{"line_number":801,"context_line":"               \u0027status\u0027: floatingip[\u0027status\u0027]}"},{"line_number":802,"context_line":"        if \u0027dns_domain\u0027 in floatingip:"},{"line_number":803,"context_line":"            res[\u0027dns_domain\u0027] \u003d floatingip[\u0027dns_domain\u0027]"},{"line_number":804,"context_line":"        if \u0027dns_name\u0027 in floatingip:"},{"line_number":805,"context_line":"            res[\u0027dns_name\u0027] \u003d floatingip[\u0027dns_name\u0027]"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_9e17ec53","line":802,"in_reply_to":"ba8a016a_279aecb9","updated":"2015-11-29 23:05:55.000000000","message":"OK, moving this code to the extension. I am using the external networks extension as a guide on how to implement this. It is very similar to what I am trying to accomplish: add an attributes to floatingips. http://git.openstack.org/cgit/openstack/neutron/tree/neutron/db/external_net_db.py","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":911,"context_line":"        return internal_port, internal_subnet_id, internal_ip_address"},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"    def _get_internal_port_dns_data(self, context, internal_port):"},{"line_number":914,"context_line":"        data \u003d dict(dns_name\u003dinternal_port[\u0027dns_name\u0027])"},{"line_number":915,"context_line":"        if internal_port[\u0027dns_name\u0027]:"},{"line_number":916,"context_line":"            internal_port_network \u003d self._core_plugin.get_network("},{"line_number":917,"context_line":"                context, internal_port[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_df2fb09f","line":914,"updated":"2015-11-25 10:50:39.000000000","message":"what if internal_port has no attribute \u0027dns_name\u0027 ?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":911,"context_line":"        return internal_port, internal_subnet_id, internal_ip_address"},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"    def _get_internal_port_dns_data(self, context, internal_port):"},{"line_number":914,"context_line":"        data \u003d dict(dns_name\u003dinternal_port[\u0027dns_name\u0027])"},{"line_number":915,"context_line":"        if internal_port[\u0027dns_name\u0027]:"},{"line_number":916,"context_line":"            internal_port_network \u003d self._core_plugin.get_network("},{"line_number":917,"context_line":"                context, internal_port[\u0027network_id\u0027])"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_30e482df","line":914,"in_reply_to":"9a8ffd7b_df2fb09f","updated":"2015-11-29 23:05:55.000000000","message":"I merged a previous patchset https://review.openstack.org/#/c/200952/ that lays the foundation for this one. This previous patchset started the implementation of the \"dns-integration\" extension that this patchset is completing. By the time this method is executed, we know the \"dns-integration\" extension is active. Per this extension, ports have a dns_name attribute with default value \"\"","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":925,"context_line":""},{"line_number":926,"context_line":"        When a floating IP is associated with an internal port,"},{"line_number":927,"context_line":"        we need to extract/determine some data associated with the"},{"line_number":928,"context_line":"        internal port, including the internal_ip_address, and router_id."},{"line_number":929,"context_line":"        The confirmation of the internal port whether owned by the tenant who"},{"line_number":930,"context_line":"        owns the floating IP will be confirmed by _get_router_for_floatingip."},{"line_number":931,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_7a7332b2","line":928,"updated":"2015-11-25 10:50:39.000000000","message":"no need to update for dns data here?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":925,"context_line":""},{"line_number":926,"context_line":"        When a floating IP is associated with an internal port,"},{"line_number":927,"context_line":"        we need to extract/determine some data associated with the"},{"line_number":928,"context_line":"        internal port, including the internal_ip_address, and router_id."},{"line_number":929,"context_line":"        The confirmation of the internal port whether owned by the tenant who"},{"line_number":930,"context_line":"        owns the floating IP will be confirmed by _get_router_for_floatingip."},{"line_number":931,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_d0ce562c","line":928,"in_reply_to":"9a8ffd7b_7a7332b2","updated":"2015-11-29 23:05:55.000000000","message":"No, the dns data is updated in the methods I added below. This method provides some of the date that eventually I use below, though. Specifically, it provides the internal_port.","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":1007,"context_line":"        if dns_name and dns_domain:"},{"line_number":1008,"context_line":"            try:"},{"line_number":1009,"context_line":"                self.dns_driver.create_record_set("},{"line_number":1010,"context_line":"                    context, dns_domain, dns_name, \u0027A\u0027,"},{"line_number":1011,"context_line":"                    [floatingip_db[\u0027floating_ip_address\u0027]])"},{"line_number":1012,"context_line":"                floatingip_db.update({\u0027published_dns_domain\u0027: dns_domain,"},{"line_number":1013,"context_line":"                                      \u0027published_dns_name\u0027: dns_name})"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_1ab1c68f","line":1010,"updated":"2015-11-25 10:50:39.000000000","message":"nit: will a constant for \u0027A\u0027 be better?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":1007,"context_line":"        if dns_name and dns_domain:"},{"line_number":1008,"context_line":"            try:"},{"line_number":1009,"context_line":"                self.dns_driver.create_record_set("},{"line_number":1010,"context_line":"                    context, dns_domain, dns_name, \u0027A\u0027,"},{"line_number":1011,"context_line":"                    [floatingip_db[\u0027floating_ip_address\u0027]])"},{"line_number":1012,"context_line":"                floatingip_db.update({\u0027published_dns_domain\u0027: dns_domain,"},{"line_number":1013,"context_line":"                                      \u0027published_dns_name\u0027: dns_name})"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_70e0ca96","line":1010,"in_reply_to":"9a8ffd7b_1ab1c68f","updated":"2015-11-29 23:05:55.000000000","message":"In the context of DNS, the nomenclature of \u0027A\u0027, \u0027AAAA\u0027 and PTR records is very well known. So, I chose to use it directly, instead of adding constants that might obscure the meaning","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        fip \u003d floatingip[\u0027floatingip\u0027]"},{"line_number":1036,"context_line":"        core_plugin_exts \u003d self._core_plugin.supported_extension_aliases"},{"line_number":1037,"context_line":"        if \u0027dns-integration\u0027 in core_plugin_exts:"},{"line_number":1038,"context_line":"            if fip[\u0027dns_domain\u0027] and not fip[\u0027dns_name\u0027]:"},{"line_number":1039,"context_line":"                msg \u003d _(\"dns_domain cannot be specified without a dns_name\")"},{"line_number":1040,"context_line":"                raise n_exc.BadRequest(resource\u003d\u0027floatingip\u0027, msg\u003dmsg)"},{"line_number":1041,"context_line":"            if fip[\u0027dns_name\u0027] and not fip[\u0027dns_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_757265e7","line":1038,"updated":"2015-11-25 10:50:39.000000000","message":"we should be able to create a floating IP with null dns_domain and dns_name, if so, fip[\u0027dsn_domain\u0027] and fip[\u0027dns_name\u0027] may raise KeyError.\n\nthe same to L1097-1098.","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        fip \u003d floatingip[\u0027floatingip\u0027]"},{"line_number":1036,"context_line":"        core_plugin_exts \u003d self._core_plugin.supported_extension_aliases"},{"line_number":1037,"context_line":"        if \u0027dns-integration\u0027 in core_plugin_exts:"},{"line_number":1038,"context_line":"            if fip[\u0027dns_domain\u0027] and not fip[\u0027dns_name\u0027]:"},{"line_number":1039,"context_line":"                msg \u003d _(\"dns_domain cannot be specified without a dns_name\")"},{"line_number":1040,"context_line":"                raise n_exc.BadRequest(resource\u003d\u0027floatingip\u0027, msg\u003dmsg)"},{"line_number":1041,"context_line":"            if fip[\u0027dns_name\u0027] and not fip[\u0027dns_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_afdf8c38","line":1038,"in_reply_to":"9a8ffd7b_757265e7","updated":"2015-11-29 23:05:55.000000000","message":"Yes, if you create a floating IP with null dns_name and null dns_domain, the api assigns default values of \"\". Since I am checking that the extension is active, KeyError execption won\u0027t happen. Please look at neutron/extensions/dns.py","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":899,"context_line":"            internal_subnet_id \u003d ipv4_fixed_ips[0][\u0027subnet_id\u0027]"},{"line_number":900,"context_line":"        return internal_port, internal_subnet_id, internal_ip_address"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"    def get_assoc_data(self, context, fip, floating_network_id):"},{"line_number":903,"context_line":"        \"\"\"Determine/extract data associated with the internal port."},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        When a floating IP is associated with an internal port,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_c39abf61","line":902,"range":{"start_line":902,"start_character":8,"end_line":902,"end_character":22},"updated":"2015-12-09 10:08:28.000000000","message":"is this a public method? if so you may be breaking external plugins that make use of this.\ni added a dumbass patch https://review.openstack.org/255175 to set this as external. so it looks ok.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":899,"context_line":"            internal_subnet_id \u003d ipv4_fixed_ips[0][\u0027subnet_id\u0027]"},{"line_number":900,"context_line":"        return internal_port, internal_subnet_id, internal_ip_address"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"    def get_assoc_data(self, context, fip, floating_network_id):"},{"line_number":903,"context_line":"        \"\"\"Determine/extract data associated with the internal port."},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        When a floating IP is associated with an internal port,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_a438723e","line":902,"in_reply_to":"7a740942_c39abf61","updated":"2015-12-11 01:22:32.000000000","message":"Thanks!","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":950,"context_line":"                              \u0027fixed_port_id\u0027: port_id,"},{"line_number":951,"context_line":"                              \u0027router_id\u0027: router_id,"},{"line_number":952,"context_line":"                              \u0027last_known_router_id\u0027: previous_router_id})"},{"line_number":953,"context_line":"        self.internal_port \u003d internal_port"},{"line_number":954,"context_line":"        return internal_port"},{"line_number":955,"context_line":""},{"line_number":956,"context_line":"    def _is_ipv4_network(self, context, net_id):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_a3e693ad","line":953,"updated":"2015-12-09 10:08:28.000000000","message":"??? what is this used for?","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":950,"context_line":"                              \u0027fixed_port_id\u0027: port_id,"},{"line_number":951,"context_line":"                              \u0027router_id\u0027: router_id,"},{"line_number":952,"context_line":"                              \u0027last_known_router_id\u0027: previous_router_id})"},{"line_number":953,"context_line":"        self.internal_port \u003d internal_port"},{"line_number":954,"context_line":"        return internal_port"},{"line_number":955,"context_line":""},{"line_number":956,"context_line":"    def _is_ipv4_network(self, context, net_id):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_1bfa00be","line":953,"in_reply_to":"7a740942_a3e693ad","updated":"2015-12-11 01:22:32.000000000","message":"Shouldn\u0027t be here. Removed","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":789,"context_line":"               \u0027status\u0027: floatingip[\u0027status\u0027]}"},{"line_number":790,"context_line":"        # NOTE(mlavalle): The following assumes this mixin is used in a"},{"line_number":791,"context_line":"        # class inheriting from CommonDbMixin, which is true for all existing"},{"line_number":792,"context_line":"        # plugins."},{"line_number":793,"context_line":"        if process_extensions:"},{"line_number":794,"context_line":"            self._apply_dict_extend_functions(l3.FLOATINGIPS, res, floatingip)"},{"line_number":795,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_229afd6e","line":792,"updated":"2015-12-11 19:34:56.000000000","message":"I HATE mixins.\n\nThere\u0027s gotta be a cleaner way than force this tie between this mixin the and the common db mixin. This might blow up in plugins that implement just this mixin and are purely an L3 service plugin. They may NOT inherit from CommonDbMixin","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":780,"context_line":"        return floatingip"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def _make_floatingip_dict(self, floatingip, fields\u003dNone,"},{"line_number":783,"context_line":"                              process_extensions\u003dTrue):"},{"line_number":784,"context_line":"        res \u003d {\u0027id\u0027: floatingip[\u0027id\u0027],"},{"line_number":785,"context_line":"               \u0027tenant_id\u0027: floatingip[\u0027tenant_id\u0027],"},{"line_number":786,"context_line":"               \u0027floating_ip_address\u0027: floatingip[\u0027floating_ip_address\u0027],"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_cc23eb54","line":783,"range":{"start_line":783,"start_character":30,"end_line":783,"end_character":53},"updated":"2015-12-22 01:04:58.000000000","message":"(no action) I\u0027m not a fan of this kind of parameter.  To me, it should be two different methods rather than one with a boolean argument to choose behaviors.  But, I see this pattern is everywhere.  So, it is probably best to leave it this way.  So, don\u0027t take any action here.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":780,"context_line":"        return floatingip"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def _make_floatingip_dict(self, floatingip, fields\u003dNone,"},{"line_number":783,"context_line":"                              process_extensions\u003dTrue):"},{"line_number":784,"context_line":"        res \u003d {\u0027id\u0027: floatingip[\u0027id\u0027],"},{"line_number":785,"context_line":"               \u0027tenant_id\u0027: floatingip[\u0027tenant_id\u0027],"},{"line_number":786,"context_line":"               \u0027floating_ip_address\u0027: floatingip[\u0027floating_ip_address\u0027],"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_c386dfda","line":783,"range":{"start_line":783,"start_character":30,"end_line":783,"end_character":53},"in_reply_to":"3a7e1126_cc23eb54","updated":"2015-12-28 23:35:10.000000000","message":"OK, thanks for the comment","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"            context.session.add(floatingip_db)"},{"line_number":1022,"context_line":"            floatingip_dict \u003d self._make_floatingip_dict("},{"line_number":1023,"context_line":"                floatingip_db, process_extensions\u003dFalse)"},{"line_number":1024,"context_line":"            self._process_dns_floatingip_create(context, floatingip_dict, fip)"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"        return floatingip_dict"},{"line_number":1027,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_7dad9f30","line":1024,"range":{"start_line":1024,"start_character":17,"end_line":1024,"end_character":47},"updated":"2016-01-12 16:49:49.000000000","message":"Aren\u0027t these still making external calls in DB transactions?  Do we need a callback mechanism for this too?  Or, can we simply unindent this to remove it from the transaction?  (Might be too simple)","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"            context.session.add(floatingip_db)"},{"line_number":1022,"context_line":"            floatingip_dict \u003d self._make_floatingip_dict("},{"line_number":1023,"context_line":"                floatingip_db, process_extensions\u003dFalse)"},{"line_number":1024,"context_line":"            self._process_dns_floatingip_create(context, floatingip_dict, fip)"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"        return floatingip_dict"},{"line_number":1027,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_220d44e8","line":1024,"range":{"start_line":1024,"start_character":17,"end_line":1024,"end_character":47},"in_reply_to":"da6ed579_7dad9f30","updated":"2016-01-18 23:57:04.000000000","message":"Yes, per our IRC conversation, I am going to \"unbundle\" the REST call from this method and move it to a new \"post commit\" method that will be executed outside the with block","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"                                   self._core_plugin.get_port("},{"line_number":1042,"context_line":"                                       context.elevated(), fip_port_id))"},{"line_number":1043,"context_line":"            floatingip_dict \u003d self._make_floatingip_dict(floatingip_db)"},{"line_number":1044,"context_line":"            self._process_dns_floatingip_update(context, floatingip_dict)"},{"line_number":1045,"context_line":"        return old_floatingip, floatingip_dict"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"    def _floatingips_to_router_ids(self, floatingips):"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_33496f8c","line":1044,"range":{"start_line":1044,"start_character":17,"end_line":1044,"end_character":47},"updated":"2016-01-12 16:49:49.000000000","message":"ditto","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"                                   self._core_plugin.get_port("},{"line_number":1042,"context_line":"                                       context.elevated(), fip_port_id))"},{"line_number":1043,"context_line":"            floatingip_dict \u003d self._make_floatingip_dict(floatingip_db)"},{"line_number":1044,"context_line":"            self._process_dns_floatingip_update(context, floatingip_dict)"},{"line_number":1045,"context_line":"        return old_floatingip, floatingip_dict"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"    def _floatingips_to_router_ids(self, floatingips):"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_a218541f","line":1044,"range":{"start_line":1044,"start_character":17,"end_line":1044,"end_character":47},"in_reply_to":"da6ed579_33496f8c","updated":"2016-01-18 23:57:04.000000000","message":"Yes, per our IRC conversation, I am going to \"unbundle\" the REST call from this method and move it to a new \"post commit\" method that will be executed outside the with block","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"}],"neutron/extensions/dns.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":25,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":26,"context_line":"DNS_LABEL_REGEX \u003d \"[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"},{"line_number":27,"context_line":"FQDN_MAX_LEN \u003d 255"},{"line_number":28,"context_line":"INTERNAL_DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def _validate_port_dns_name(data, max_len\u003dFQDN_MAX_LEN):"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_3e55b1f9","line":28,"updated":"2015-09-08 22:43:51.000000000","message":"I\u0027m not sure it is necessary to rename this.  It doesn\u0027t add much but adds a bit more noise to the patch set.\n\nI just noticed this constant exists in two places.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":25,"context_line":"DNS_LABEL_MAX_LEN \u003d 63"},{"line_number":26,"context_line":"DNS_LABEL_REGEX \u003d \"[a-z0-9-]{1,%d}$\" % DNS_LABEL_MAX_LEN"},{"line_number":27,"context_line":"FQDN_MAX_LEN \u003d 255"},{"line_number":28,"context_line":"INTERNAL_DNS_DOMAIN_DEFAULT \u003d \u0027openstacklocal.\u0027"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def _validate_port_dns_name(data, max_len\u003dFQDN_MAX_LEN):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_ba7634a2","line":28,"in_reply_to":"da20952f_3e55b1f9","updated":"2015-09-16 20:20:31.000000000","message":"Removed this change. The reason it is in 2 places is because I was getting a circular import exeception. Maybe add this constant to neutron/common/constants?","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":93,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":94,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":95,"context_line":"        if len(trimmed) \u003e max_len:"},{"line_number":96,"context_line":"            raise TypeError("},{"line_number":97,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":98,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_bb2d53aa","line":95,"updated":"2015-09-08 22:43:51.000000000","message":"This isn\u0027t strictly related to the rest of the patch.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":93,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":94,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":95,"context_line":"        if len(trimmed) \u003e max_len:"},{"line_number":96,"context_line":"            raise TypeError("},{"line_number":97,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":98,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_da06881c","line":95,"in_reply_to":"da20952f_bb2d53aa","updated":"2015-09-16 20:20:31.000000000","message":"Removed","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @classmethod"},{"line_number":232,"context_line":"    def get_description(cls):"},{"line_number":233,"context_line":"        return \"Provides integration with internal and external DNS.\""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @classmethod"},{"line_number":236,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_3e1e1160","line":233,"updated":"2015-09-08 22:43:51.000000000","message":"I wonder if the distinction between internal and external DNS will be understood in this context.  Maybe just leave out \"internal and external\"?","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    @classmethod"},{"line_number":232,"context_line":"    def get_description(cls):"},{"line_number":233,"context_line":"        return \"Provides integration with internal and external DNS.\""},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @classmethod"},{"line_number":236,"context_line":"    def get_updated(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_1a196079","line":233,"in_reply_to":"da20952f_3e1e1160","updated":"2015-09-16 20:20:31.000000000","message":"Done","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"afb3cb5f2662d6eca50f3b845d0e7881760cfd78","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    message \u003d _(\"Name %(dns_name)s already exists in the external DNS service\")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def _validate_port_dns_name(data, max_len\u003dFQDN_MAX_LEN):"},{"line_number":40,"context_line":"    msg \u003d _validate_dns_format(data, max_len)"},{"line_number":41,"context_line":"    if msg:"},{"line_number":42,"context_line":"        return msg"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_451461f4","line":39,"updated":"2015-11-09 11:46:09.000000000","message":"HI, After I read internal-dns-resolution and external-dns-resolution bp,  If my understanding is right: \nThe port_dns_name should be same with instance name by default, then instance name should be carefully choose for dns_name when spawning instance?\nThe fqdn for instance should be port_dns_name+network DNSDomain or port_dns_name + cfg.CONF.dns_domain if no dns_name and dns_domain for floaitingip, we need to check the length of fdqn, but not here, right? the _validate_dns_name_with_internal_dns_domain function just check port_dns_name + cfg.CONF.dns_domain, this should be okay for internal internal-dns-resolution bp, but not for external-dns-resolution bp?","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    msg \u003d attr._validate_string(data)"},{"line_number":58,"context_line":"    if msg:"},{"line_number":59,"context_line":"        return msg"},{"line_number":60,"context_line":"    if not data:"},{"line_number":61,"context_line":"        return"},{"line_number":62,"context_line":"    if data.endswith(\u0027.\u0027):"},{"line_number":63,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is a Fully Qualified Domain Name. \""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_d081df90","line":60,"updated":"2015-11-25 10:50:39.000000000","message":"why not put L60-61 before L57. and will this duplicated to L107-108 ?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    msg \u003d attr._validate_string(data)"},{"line_number":58,"context_line":"    if msg:"},{"line_number":59,"context_line":"        return msg"},{"line_number":60,"context_line":"    if not data:"},{"line_number":61,"context_line":"        return"},{"line_number":62,"context_line":"    if data.endswith(\u0027.\u0027):"},{"line_number":63,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is a Fully Qualified Domain Name. \""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_6a88b2c5","line":60,"in_reply_to":"9a8ffd7b_d081df90","updated":"2015-11-29 23:05:55.000000000","message":"This attribute is supposed to be a string. That is what I validate first in line 57. Now, \"\" is a perfectly valid value for this attribute, but one that doesn\u0027t require any further validation. That is why I return here","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    if msg:"},{"line_number":68,"context_line":"        return msg"},{"line_number":69,"context_line":"    length \u003d len(data)"},{"line_number":70,"context_line":"    if length \u003e max_len - 3:"},{"line_number":71,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 is \u0027%(length)s\u0027 characters long. When \""},{"line_number":72,"context_line":"                \"concatenated to a domain name, it will exceed the maximum \""},{"line_number":73,"context_line":"                \"length of a Fully Qualified Domain Name of \""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_6b8846e8","line":70,"updated":"2015-11-25 10:50:39.000000000","message":"so, data length shouldn\u0027t be longer than max_len -3 ? If so, why not pass (max_lan -3) to _validate_string, or why not define a final version to max_len at beginning?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    if msg:"},{"line_number":68,"context_line":"        return msg"},{"line_number":69,"context_line":"    length \u003d len(data)"},{"line_number":70,"context_line":"    if length \u003e max_len - 3:"},{"line_number":71,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 is \u0027%(length)s\u0027 characters long. When \""},{"line_number":72,"context_line":"                \"concatenated to a domain name, it will exceed the maximum \""},{"line_number":73,"context_line":"                \"length of a Fully Qualified Domain Name of \""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_aa145a4c","line":70,"in_reply_to":"9a8ffd7b_6b8846e8","updated":"2015-11-29 23:05:55.000000000","message":"Yes, I can have _validate_string fail the request with a very generic message: \"\u0027%(data)s\u0027 exceeds maximum length of %(max_len)s\". To improve the user experience, I chose to provide a more specific error message here","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    msg \u003d attr._validate_string(data)"},{"line_number":82,"context_line":"    if msg:"},{"line_number":83,"context_line":"        return msg"},{"line_number":84,"context_line":"    if not data:"},{"line_number":85,"context_line":"        return"},{"line_number":86,"context_line":"    if not data.endswith(\u0027.\u0027):"},{"line_number":87,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a Fully Qualified Domain Name\") % data"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_cb9372f9","line":84,"updated":"2015-11-25 10:50:39.000000000","message":"ditto","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    msg \u003d attr._validate_string(data)"},{"line_number":82,"context_line":"    if msg:"},{"line_number":83,"context_line":"        return msg"},{"line_number":84,"context_line":"    if not data:"},{"line_number":85,"context_line":"        return"},{"line_number":86,"context_line":"    if not data.endswith(\u0027.\u0027):"},{"line_number":87,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is not a Fully Qualified Domain Name\") % data"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_c529918b","line":84,"in_reply_to":"9a8ffd7b_cb9372f9","updated":"2015-11-29 23:05:55.000000000","message":"ditto","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    if msg:"},{"line_number":91,"context_line":"        return msg"},{"line_number":92,"context_line":"    length \u003d len(data)"},{"line_number":93,"context_line":"    if length \u003e max_len - 2:"},{"line_number":94,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 is \u0027%(length)s\u0027 characters long. When \""},{"line_number":95,"context_line":"                \"concatenated to lower level labels, it will exceed the \""},{"line_number":96,"context_line":"                \"maximum length of a Fully Qualified Domain Name of \""}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_9ec60c15","line":93,"updated":"2015-11-22 23:59:24.000000000","message":"itto","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    if msg:"},{"line_number":91,"context_line":"        return msg"},{"line_number":92,"context_line":"    length \u003d len(data)"},{"line_number":93,"context_line":"    if length \u003e max_len - 2:"},{"line_number":94,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 is \u0027%(length)s\u0027 characters long. When \""},{"line_number":95,"context_line":"                \"concatenated to lower level labels, it will exceed the \""},{"line_number":96,"context_line":"                \"maximum length of a Fully Qualified Domain Name of \""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_453e01c2","line":93,"in_reply_to":"ba8a016a_9ec60c15","updated":"2015-11-29 23:05:55.000000000","message":"ditto","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":13667,"name":"ZongKai LI","email":"onionpiece@163.com","username":"lzklibj"},"change_message_id":"3316025935150bfd72297003dcae504793daae49","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":111,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":112,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":113,"context_line":"        if len(trimmed) \u003e 255:"},{"line_number":114,"context_line":"            raise TypeError("},{"line_number":115,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":116,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_ab306e57","line":113,"updated":"2015-11-25 10:50:39.000000000","message":"Per L28, can you also fix this to FQDN_MAX_LEN ?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":111,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":112,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":113,"context_line":"        if len(trimmed) \u003e 255:"},{"line_number":114,"context_line":"            raise TypeError("},{"line_number":115,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":116,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_25d65df1","line":113,"in_reply_to":"9a8ffd7b_ab306e57","updated":"2015-11-29 23:05:55.000000000","message":"Good catch.","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            raise TypeError("},{"line_number":115,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":116,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"},{"line_number":117,"context_line":"                                \"max_len\": max_len})"},{"line_number":118,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":119,"context_line":"        for name in names:"},{"line_number":120,"context_line":"            if not name:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_c7d9a058","line":117,"updated":"2015-11-19 12:31:34.000000000","message":"not sure why we need the max len here - the check above tests 255","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            raise TypeError("},{"line_number":115,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":116,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"},{"line_number":117,"context_line":"                                \"max_len\": max_len})"},{"line_number":118,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":119,"context_line":"        for name in names:"},{"line_number":120,"context_line":"            if not name:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_e50a9589","line":117,"in_reply_to":"ba8a016a_c7d9a058","updated":"2015-11-29 23:05:55.000000000","message":"Changed to  FQDN_MAX_LEN","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.api import extensions"},{"line_number":22,"context_line":"from neutron.api.v2 import attributes as attr"},{"line_number":23,"context_line":"from neutron.common import exceptions as n_exc"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_5f05ca77","line":20,"updated":"2015-12-07 09:28:00.000000000","message":"please import the neutron._i18n for the _ stypes","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import six"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from oslo_config import cfg"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.api import extensions"},{"line_number":22,"context_line":"from neutron.api.v2 import attributes as attr"},{"line_number":23,"context_line":"from neutron.common import exceptions as n_exc"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_83193024","line":20,"in_reply_to":"7a740942_5f05ca77","updated":"2015-12-09 01:29:31.000000000","message":"Done","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        return"},{"line_number":63,"context_line":"    if data.endswith(\u0027.\u0027):"},{"line_number":64,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is a Fully Qualified Domain Name. \""},{"line_number":65,"context_line":"                \"It should be a Partially Qualified Domain Name\") % data"},{"line_number":66,"context_line":"        return msg"},{"line_number":67,"context_line":"    msg \u003d _validate_dns_format(data, max_len)"},{"line_number":68,"context_line":"    if msg:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_5a1fa6b6","line":65,"updated":"2015-12-09 01:58:58.000000000","message":"Suggestion:\n\nChange to a relative domain name.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        return"},{"line_number":63,"context_line":"    if data.endswith(\u0027.\u0027):"},{"line_number":64,"context_line":"        msg \u003d _(\"\u0027%s\u0027 is a Fully Qualified Domain Name. \""},{"line_number":65,"context_line":"                \"It should be a Partially Qualified Domain Name\") % data"},{"line_number":66,"context_line":"        return msg"},{"line_number":67,"context_line":"    msg \u003d _validate_dns_format(data, max_len)"},{"line_number":68,"context_line":"    if msg:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_3fcfaf80","line":65,"in_reply_to":"7a740942_5a1fa6b6","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return msg"},{"line_number":70,"context_line":"    length \u003d len(data)"},{"line_number":71,"context_line":"    if length \u003e max_len - 3:"},{"line_number":72,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 is \u0027%(length)s\u0027 characters long. When \""},{"line_number":73,"context_line":"                \"concatenated to a domain name, it will exceed the maximum \""},{"line_number":74,"context_line":"                \"length of a Fully Qualified Domain Name of \""},{"line_number":75,"context_line":"                \"\u0027%(max_len)s\u0027\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_fad212d0","line":72,"updated":"2015-12-09 01:58:58.000000000","message":"Suggestion:\n\n$data contains $length characters. Adding a domain name will cause it to exceed...","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return msg"},{"line_number":70,"context_line":"    length \u003d len(data)"},{"line_number":71,"context_line":"    if length \u003e max_len - 3:"},{"line_number":72,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 is \u0027%(length)s\u0027 characters long. When \""},{"line_number":73,"context_line":"                \"concatenated to a domain name, it will exceed the maximum \""},{"line_number":74,"context_line":"                \"length of a Fully Qualified Domain Name of \""},{"line_number":75,"context_line":"                \"\u0027%(max_len)s\u0027\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_5ff4fb85","line":72,"in_reply_to":"7a740942_fad212d0","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        return msg"},{"line_number":93,"context_line":"    length \u003d len(data)"},{"line_number":94,"context_line":"    if length \u003e max_len - 2:"},{"line_number":95,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 is \u0027%(length)s\u0027 characters long. When \""},{"line_number":96,"context_line":"                \"concatenated to lower level labels, it will exceed the \""},{"line_number":97,"context_line":"                \"maximum length of a Fully Qualified Domain Name of \""},{"line_number":98,"context_line":"                \"\u0027%(max_len)s\u0027\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_fae9b27f","line":95,"updated":"2015-12-09 01:58:58.000000000","message":"Suggestion:\n\n$data contains $length characters. Adding lower-level labels will cause it to exceed...\n\nDoes \"lower-level\" mean sub-domains? If so, this error should use that wording.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        return msg"},{"line_number":93,"context_line":"    length \u003d len(data)"},{"line_number":94,"context_line":"    if length \u003e max_len - 2:"},{"line_number":95,"context_line":"        msg \u003d _(\"\u0027%(data)s\u0027 is \u0027%(length)s\u0027 characters long. When \""},{"line_number":96,"context_line":"                \"concatenated to lower level labels, it will exceed the \""},{"line_number":97,"context_line":"                \"maximum length of a Fully Qualified Domain Name of \""},{"line_number":98,"context_line":"                \"\u0027%(max_len)s\u0027\") % {\"data\": data,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_7f9f7703","line":95,"in_reply_to":"7a740942_fae9b27f","updated":"2015-12-11 01:22:32.000000000","message":"Labels is technically correct. But sub-domain is more meaningful. Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":114,"context_line":"        if len(trimmed) \u003e FQDN_MAX_LEN:"},{"line_number":115,"context_line":"            raise TypeError("},{"line_number":116,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":117,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"},{"line_number":118,"context_line":"                                \"max_len\": FQDN_MAX_LEN})"},{"line_number":119,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_7af6225e","line":116,"updated":"2015-12-09 01:58:58.000000000","message":"Should we assume people know FQDN (or how to find it) and shorten all messages to use it?","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":114,"context_line":"        if len(trimmed) \u003e FQDN_MAX_LEN:"},{"line_number":115,"context_line":"            raise TypeError("},{"line_number":116,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":117,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"},{"line_number":118,"context_line":"                                \"max_len\": FQDN_MAX_LEN})"},{"line_number":119,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_1f2bd395","line":116,"in_reply_to":"7a740942_7af6225e","updated":"2015-12-11 01:22:32.000000000","message":"FQDN is well known. And if you don\u0027t know what it is, just google it and you are taken to a wikipedia article. Shortening the other messages","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class InvalidPTRZoneConfiguration(n_exc.Conflict):"},{"line_number":45,"context_line":"    message \u003d _(\"Value of %(parameter)s has to be multiple of %(number)s, \""},{"line_number":46,"context_line":"                \"with maximum value of %(maximum) and minimum value of \""},{"line_number":47,"context_line":"                \"%(minimum)\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_e295d532","line":46,"updated":"2015-12-11 19:34:56.000000000","message":"missing qualifier","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"24a59f4ca3c610fc6975d67819b185dde0468bea","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"class InvalidPTRZoneConfiguration(n_exc.Conflict):"},{"line_number":45,"context_line":"    message \u003d _(\"Value of %(parameter)s has to be multiple of %(number)s, \""},{"line_number":46,"context_line":"                \"with maximum value of %(maximum) and minimum value of \""},{"line_number":47,"context_line":"                \"%(minimum)\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a7e1126_41913246","line":46,"in_reply_to":"7a740942_e295d532","updated":"2015-12-21 01:40:35.000000000","message":"Done","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"class InvalidPTRZoneConfiguration(n_exc.Conflict):"},{"line_number":45,"context_line":"    message \u003d _(\"Value of %(parameter)s has to be multiple of %(number)s, \""},{"line_number":46,"context_line":"                \"with maximum value of %(maximum) and minimum value of \""},{"line_number":47,"context_line":"                \"%(minimum)\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def _validate_port_dns_name(data, max_len\u003dFQDN_MAX_LEN):"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_627b2529","line":47,"updated":"2015-12-11 19:34:56.000000000","message":"missing qualifier","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"24a59f4ca3c610fc6975d67819b185dde0468bea","unresolved":false,"context_lines":[{"line_number":44,"context_line":"class InvalidPTRZoneConfiguration(n_exc.Conflict):"},{"line_number":45,"context_line":"    message \u003d _(\"Value of %(parameter)s has to be multiple of %(number)s, \""},{"line_number":46,"context_line":"                \"with maximum value of %(maximum) and minimum value of \""},{"line_number":47,"context_line":"                \"%(minimum)\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def _validate_port_dns_name(data, max_len\u003dFQDN_MAX_LEN):"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a7e1126_6196ae40","line":47,"in_reply_to":"7a740942_627b2529","updated":"2015-12-21 01:40:35.000000000","message":"Done","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        DNSASSIGNMENT: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":217,"context_line":"    },"},{"line_number":218,"context_line":"    \u0027floatingips\u0027: {"},{"line_number":219,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":220,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":221,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_02c26134","line":218,"updated":"2015-12-11 19:34:56.000000000","message":"I am assuming we\u0027re allowing only because the dns extension was half backed.","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    message \u003d _(\"Domain %(dns_domain)s not found in the external DNS service\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class DuplicateRecordSet(n_exc.Conflict):"},{"line_number":37,"context_line":"    message \u003d _(\"Name %(dns_name)s already exists in the external DNS service\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_27b88874","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":24},"updated":"2015-12-22 01:04:58.000000000","message":"I thought we weren\u0027t going to check for duplicates.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    message \u003d _(\"Domain %(dns_domain)s not found in the external DNS service\")"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class DuplicateRecordSet(n_exc.Conflict):"},{"line_number":37,"context_line":"    message \u003d _(\"Name %(dns_name)s already exists in the external DNS service\")"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_2e33c3ac","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":24},"in_reply_to":"3a7e1126_27b88874","updated":"2015-12-28 23:35:10.000000000","message":"Designate returns duplicate if you attempt to create a duplicate entry","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":113,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":114,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":115,"context_line":"        if len(trimmed) \u003e FQDN_MAX_LEN:"},{"line_number":116,"context_line":"            raise TypeError("},{"line_number":117,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":118,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"},{"line_number":119,"context_line":"                                \"max_len\": FQDN_MAX_LEN})"},{"line_number":120,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":121,"context_line":"        for name in names:"},{"line_number":122,"context_line":"            if not name:"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_07430c6d","line":119,"range":{"start_line":115,"start_character":8,"end_line":119,"end_character":57},"updated":"2015-12-22 01:04:58.000000000","message":"This change seems just a bit off topic for this patch.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        # Trailing periods are allowed to indicate that a name is fully"},{"line_number":113,"context_line":"        # qualified per RFC 1034 (page 7)."},{"line_number":114,"context_line":"        trimmed \u003d data if not data.endswith(\u0027.\u0027) else data[:-1]"},{"line_number":115,"context_line":"        if len(trimmed) \u003e FQDN_MAX_LEN:"},{"line_number":116,"context_line":"            raise TypeError("},{"line_number":117,"context_line":"                _(\"\u0027%(trimmed)s\u0027 exceeds the \u0027%(max_len)s\u0027 character FQDN \""},{"line_number":118,"context_line":"                    \"limit\") % {\"trimmed\": trimmed,"},{"line_number":119,"context_line":"                                \"max_len\": FQDN_MAX_LEN})"},{"line_number":120,"context_line":"        names \u003d trimmed.split(\u0027.\u0027)"},{"line_number":121,"context_line":"        for name in names:"},{"line_number":122,"context_line":"            if not name:"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_2ec18354","line":119,"range":{"start_line":115,"start_character":8,"end_line":119,"end_character":57},"in_reply_to":"3a7e1126_07430c6d","updated":"2015-12-28 23:35:10.000000000","message":"Removed","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        return msg"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"def _validate_dns_name_with_internal_dns_domain(request_dns_name):"},{"line_number":142,"context_line":"    # If a PQDN was passed, make sure the FQDN that will be generated is of"},{"line_number":143,"context_line":"    # legal size"},{"line_number":144,"context_line":"    dns_domain \u003d _get_dns_domain()"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_e75cc04c","line":141,"range":{"start_line":141,"start_character":4,"end_line":141,"end_character":47},"updated":"2015-12-22 01:04:58.000000000","message":"ditto","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        return msg"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"def _validate_dns_name_with_internal_dns_domain(request_dns_name):"},{"line_number":142,"context_line":"    # If a PQDN was passed, make sure the FQDN that will be generated is of"},{"line_number":143,"context_line":"    # legal size"},{"line_number":144,"context_line":"    dns_domain \u003d _get_dns_domain()"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_4ec64f69","line":141,"range":{"start_line":141,"start_character":4,"end_line":141,"end_character":47},"in_reply_to":"3a7e1126_e75cc04c","updated":"2015-12-28 23:35:10.000000000","message":"Removed","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"attr.validators[\u0027type:port_dns_name\u0027] \u003d (_validate_port_dns_name)"},{"line_number":201,"context_line":"attr.validators[\u0027type:fip_dns_name\u0027] \u003d (_validate_fip_dns_name)"},{"line_number":202,"context_line":"attr.validators[\u0027type:dns_domain\u0027] \u003d (_validate_dns_domain)"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_8757fc24","line":200,"range":{"start_line":200,"start_character":22,"end_line":200,"end_character":35},"updated":"2015-12-22 01:04:58.000000000","message":"ditto.  Maybe some of this internal stuff could be changed in a patch preceding this one in order to make this patch a bit more focused.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"attr.validators[\u0027type:port_dns_name\u0027] \u003d (_validate_port_dns_name)"},{"line_number":201,"context_line":"attr.validators[\u0027type:fip_dns_name\u0027] \u003d (_validate_fip_dns_name)"},{"line_number":202,"context_line":"attr.validators[\u0027type:dns_domain\u0027] \u003d (_validate_dns_domain)"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_2ea8a38c","line":200,"range":{"start_line":200,"start_character":22,"end_line":200,"end_character":35},"in_reply_to":"3a7e1126_8757fc24","updated":"2015-12-28 23:35:10.000000000","message":"removed","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":211,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":212,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"},{"line_number":213,"context_line":"                  \u0027validate\u0027: {\u0027type:port_dns_name\u0027: FQDN_MAX_LEN},"},{"line_number":214,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":215,"context_line":"        DNSASSIGNMENT: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"                        \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_5202300b","line":213,"range":{"start_line":213,"start_character":37,"end_line":213,"end_character":50},"updated":"2015-12-22 01:04:58.000000000","message":"ditto (internal stuff)","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":211,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":212,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"},{"line_number":213,"context_line":"                  \u0027validate\u0027: {\u0027type:port_dns_name\u0027: FQDN_MAX_LEN},"},{"line_number":214,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":215,"context_line":"        DNSASSIGNMENT: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"                        \u0027is_visible\u0027: True},"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_8e975747","line":213,"range":{"start_line":213,"start_character":37,"end_line":213,"end_character":50},"in_reply_to":"3a7e1126_5202300b","updated":"2015-12-28 23:35:10.000000000","message":"removed","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        DNSASSIGNMENT: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":217,"context_line":"    },"},{"line_number":218,"context_line":"    \u0027floatingips\u0027: {"},{"line_number":219,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":220,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":221,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_a700f802","line":218,"range":{"start_line":218,"start_character":5,"end_line":218,"end_character":16},"updated":"2015-12-22 01:04:58.000000000","message":"should this be the constant from l3.py?","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        DNSASSIGNMENT: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":216,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":217,"context_line":"    },"},{"line_number":218,"context_line":"    \u0027floatingips\u0027: {"},{"line_number":219,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":220,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":221,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_8e7e7717","line":218,"range":{"start_line":218,"start_character":5,"end_line":218,"end_character":16},"in_reply_to":"3a7e1126_a700f802","updated":"2015-12-28 23:35:10.000000000","message":"Done","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":227,"context_line":"                    \u0027validate\u0027: {\u0027type:dns_domain\u0027: FQDN_MAX_LEN},"},{"line_number":228,"context_line":"                    \u0027is_visible\u0027: True},"},{"line_number":229,"context_line":"    },"},{"line_number":230,"context_line":"    \u0027networks\u0027: {"},{"line_number":231,"context_line":"        DNSDOMAIN: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":232,"context_line":"                    \u0027default\u0027: \u0027\u0027,"},{"line_number":233,"context_line":"                    \u0027convert_to\u0027: convert_to_lowercase,"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_8ecc376b","line":230,"updated":"2015-12-28 23:35:10.000000000","message":"Did the same as in line 218, using a constant for networks","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":216,"context_line":"    },"},{"line_number":217,"context_line":"    l3.FLOATINGIPS: {"},{"line_number":218,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":219,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":220,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"},{"line_number":221,"context_line":"                  \u0027validate\u0027: {\u0027type:fip_dns_name\u0027: FQDN_MAX_LEN},"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_bd48f788","line":218,"range":{"start_line":218,"start_character":51,"end_line":218,"end_character":56},"updated":"2016-01-12 16:49:49.000000000","message":"Can\u0027t update the dns_name of an existing floating ip?  Is that the long term plan?","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                        \u0027is_visible\u0027: True},"},{"line_number":216,"context_line":"    },"},{"line_number":217,"context_line":"    l3.FLOATINGIPS: {"},{"line_number":218,"context_line":"        DNSNAME: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":219,"context_line":"                  \u0027default\u0027: \u0027\u0027,"},{"line_number":220,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"},{"line_number":221,"context_line":"                  \u0027validate\u0027: {\u0027type:fip_dns_name\u0027: FQDN_MAX_LEN},"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_88068f1b","line":218,"range":{"start_line":218,"start_character":51,"end_line":218,"end_character":56},"in_reply_to":"da6ed579_bd48f788","updated":"2016-01-18 23:57:04.000000000","message":"Per our irc conversation, there is no \"floatingip-update\" operation in the API. The HTTP PUT operation is used in the case of floating ips for port association / disassociation. Changing the semantics of this is beyond the scope of this patchset.\n\nOn the other hand, I don\u0027t think it is such a big deal. The dns_name and dns_domain associated to a floating ip should be stable. If you need to change them constantly, it is better to assign them to the port / network associated with the floating ip or create a new one\n\nFinally, if after releasing the functionality we have users and admins claiming that they need to update the floating ip dns_name and dns_domain, then we will have a strong argument with the community to change the API","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"},{"line_number":221,"context_line":"                  \u0027validate\u0027: {\u0027type:fip_dns_name\u0027: FQDN_MAX_LEN},"},{"line_number":222,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":223,"context_line":"        DNSDOMAIN: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":224,"context_line":"                    \u0027default\u0027: \u0027\u0027,"},{"line_number":225,"context_line":"                    \u0027convert_to\u0027: convert_to_lowercase,"},{"line_number":226,"context_line":"                    \u0027validate\u0027: {\u0027type:dns_domain\u0027: FQDN_MAX_LEN},"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_3d55e71c","line":223,"range":{"start_line":223,"start_character":53,"end_line":223,"end_character":58},"updated":"2016-01-12 16:49:49.000000000","message":"... or dns_domain?  Am I missing something?","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                  \u0027convert_to\u0027: convert_to_lowercase,"},{"line_number":221,"context_line":"                  \u0027validate\u0027: {\u0027type:fip_dns_name\u0027: FQDN_MAX_LEN},"},{"line_number":222,"context_line":"                  \u0027is_visible\u0027: True},"},{"line_number":223,"context_line":"        DNSDOMAIN: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":224,"context_line":"                    \u0027default\u0027: \u0027\u0027,"},{"line_number":225,"context_line":"                    \u0027convert_to\u0027: convert_to_lowercase,"},{"line_number":226,"context_line":"                    \u0027validate\u0027: {\u0027type:dns_domain\u0027: FQDN_MAX_LEN},"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_08137f5c","line":223,"range":{"start_line":223,"start_character":53,"end_line":223,"end_character":58},"in_reply_to":"da6ed579_3d55e71c","updated":"2016-01-18 23:57:04.000000000","message":"Please see response above L218","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"}],"neutron/extensions/l3.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2cbcd68909c76eaab2cd38d0992f72f299d07680","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"ROUTERS \u003d \u0027routers\u0027"},{"line_number":81,"context_line":"EXTERNAL_GW_INFO \u003d \u0027external_gateway_info\u0027"},{"line_number":82,"context_line":"FLOATINGIPS \u003d \u0027floatingips\u0027"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":85,"context_line":"    ROUTERS: {"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_37c99dac","line":82,"range":{"start_line":82,"start_character":0,"end_line":82,"end_character":11},"updated":"2015-12-21 19:40:01.000000000","message":"I\u0027d avoid touching this file in the context of this patch.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"ROUTERS \u003d \u0027routers\u0027"},{"line_number":81,"context_line":"EXTERNAL_GW_INFO \u003d \u0027external_gateway_info\u0027"},{"line_number":82,"context_line":"FLOATINGIPS \u003d \u0027floatingips\u0027"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":85,"context_line":"    ROUTERS: {"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_6c7af789","line":82,"range":{"start_line":82,"start_character":0,"end_line":82,"end_character":11},"in_reply_to":"3a7e1126_37c99dac","updated":"2015-12-22 01:04:58.000000000","message":"I see what you\u0027re after here.  You could probably break this out in to a separate patch that could merge on its own fairly quickly.  It would be good to use a constant for this value.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"ROUTERS \u003d \u0027routers\u0027"},{"line_number":81,"context_line":"EXTERNAL_GW_INFO \u003d \u0027external_gateway_info\u0027"},{"line_number":82,"context_line":"FLOATINGIPS \u003d \u0027floatingips\u0027"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":85,"context_line":"    ROUTERS: {"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_8369b727","line":82,"range":{"start_line":82,"start_character":0,"end_line":82,"end_character":11},"in_reply_to":"3a7e1126_37c99dac","updated":"2015-12-28 23:35:10.000000000","message":"Moved this changes to their own patchset: https://review.openstack.org/#/c/261060/","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"ROUTERS \u003d \u0027routers\u0027"},{"line_number":81,"context_line":"EXTERNAL_GW_INFO \u003d \u0027external_gateway_info\u0027"},{"line_number":82,"context_line":"FLOATINGIPS \u003d \u0027floatingips\u0027"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {"},{"line_number":85,"context_line":"    ROUTERS: {"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_4373cf15","line":82,"range":{"start_line":82,"start_character":0,"end_line":82,"end_character":11},"in_reply_to":"3a7e1126_6c7af789","updated":"2015-12-28 23:35:10.000000000","message":"Moved this changes to their own patchset: https://review.openstack.org/#/c/261060/","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"}],"neutron/plugins/ml2/common/exceptions.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class UnknownNetworkType(exceptions.NeutronException):"},{"line_number":32,"context_line":"    \"\"\"Network with unknow type.\"\"\""},{"line_number":33,"context_line":"    message \u003d _(\"Unknow network type %(network_type)s.\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_07c32858","line":32,"updated":"2015-11-19 12:31:34.000000000","message":"unknow  \u003d\u003e unknown","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class UnknownNetworkType(exceptions.NeutronException):"},{"line_number":32,"context_line":"    \"\"\"Network with unknow type.\"\"\""},{"line_number":33,"context_line":"    message \u003d _(\"Unknow network type %(network_type)s.\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_65f7858b","line":32,"in_reply_to":"ba8a016a_07c32858","updated":"2015-11-29 23:05:55.000000000","message":"Done","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class UnknownNetworkType(exceptions.NeutronException):"},{"line_number":32,"context_line":"    \"\"\"Network with unknow type.\"\"\""},{"line_number":33,"context_line":"    message \u003d _(\"Unknow network type %(network_type)s.\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_079a486e","line":33,"updated":"2015-11-19 12:31:34.000000000","message":"Unknow \u003d\u003e Unknown","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class UnknownNetworkType(exceptions.NeutronException):"},{"line_number":32,"context_line":"    \"\"\"Network with unknow type.\"\"\""},{"line_number":33,"context_line":"    message \u003d _(\"Unknow network type %(network_type)s.\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_05f2399a","line":33,"in_reply_to":"ba8a016a_079a486e","updated":"2015-11-29 23:05:55.000000000","message":"Done","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"}],"neutron/plugins/ml2/driver_api.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2cbcd68909c76eaab2cd38d0992f72f299d07680","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"        \"\"\""},{"line_number":1024,"context_line":"        pass"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"    def process_delete_port(self, plugin_context, result):"},{"line_number":1027,"context_line":"        \"\"\"Process extended attributes for delete port."},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"        :param plugin_context: plugin request context"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_773ac59a","line":1026,"updated":"2015-12-21 19:40:01.000000000","message":"it\u0027s probably best to extract this API addition and base your patch on it.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"        \"\"\""},{"line_number":1024,"context_line":"        pass"},{"line_number":1025,"context_line":""},{"line_number":1026,"context_line":"    def process_delete_port(self, plugin_context, result):"},{"line_number":1027,"context_line":"        \"\"\"Process extended attributes for delete port."},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"        :param plugin_context: plugin request context"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_838537ae","line":1026,"in_reply_to":"3a7e1126_773ac59a","updated":"2015-12-28 23:35:10.000000000","message":"Not needed anymore","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2cbcd68909c76eaab2cd38d0992f72f299d07680","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        \"\"\"Process extended attributes for delete port."},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"        :param plugin_context: plugin request context"},{"line_number":1030,"context_line":"        :param result: port dictionary with data of port to be deleted"},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"        Called inside transaction context on plugin_context.session to"},{"line_number":1033,"context_line":"        execute any processing needed upon port deletion related to the"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_d799397a","line":1030,"range":{"start_line":1030,"start_character":15,"end_line":1030,"end_character":21},"updated":"2015-12-21 19:40:01.000000000","message":"this should probably be still called \u0027data\u0027","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        \"\"\"Process extended attributes for delete port."},{"line_number":1028,"context_line":""},{"line_number":1029,"context_line":"        :param plugin_context: plugin request context"},{"line_number":1030,"context_line":"        :param result: port dictionary with data of port to be deleted"},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"        Called inside transaction context on plugin_context.session to"},{"line_number":1033,"context_line":"        execute any processing needed upon port deletion related to the"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_239483e0","line":1030,"range":{"start_line":1030,"start_character":15,"end_line":1030,"end_character":21},"in_reply_to":"3a7e1126_d799397a","updated":"2015-12-28 23:35:10.000000000","message":"Not needed anymore","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"}],"neutron/plugins/ml2/extensions/dns_integration.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2cbcd68909c76eaab2cd38d0992f72f299d07680","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        return self._supported_extension_alias"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def process_create_network(self, plugin_context, request_data, db_data):"},{"line_number":37,"context_line":"        self.dns_db._process_dns_domain_network_create(plugin_context, db_data,"},{"line_number":38,"context_line":"                                                       request_data)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def process_update_network(self, plugin_context, request_data, db_data):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_37575dcb","line":37,"updated":"2015-12-21 19:40:01.000000000","message":"if these methods are meant to be called like this, why are you choosing to make them private? They are part of a contract you seem to rely on.\n\nBut why the passthrough at all? Seems unnecessary. I suppose this is decoupling the ML2 extension from the DNS logic, but if that\u0027s the case, the reliance on private methods seems even more problematic.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        return self._supported_extension_alias"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def process_create_network(self, plugin_context, request_data, db_data):"},{"line_number":37,"context_line":"        self.dns_db._process_dns_domain_network_create(plugin_context, db_data,"},{"line_number":38,"context_line":"                                                       request_data)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def process_update_network(self, plugin_context, request_data, db_data):"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_6eed4bb6","line":37,"in_reply_to":"3a7e1126_37575dcb","updated":"2015-12-28 23:35:10.000000000","message":"I reimplemented this using callbacks. I moved the code in dns_db to this module, so this class is not just a passthrough anymore","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    _supported_extension_alias \u003d \u0027dns-integration\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def initialize(self):"},{"line_number":39,"context_line":"        LOG.info(_LI(\"DNSExtensionDriver initialization complete\"))"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @property"},{"line_number":42,"context_line":"    def extension_alias(self):"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_b85b252e","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":67},"updated":"2016-01-12 16:49:49.000000000","message":"Isn\u0027t this a bit premature?  Wouldn\u0027t a sub-class call super first which would log this before it had a chance to do anything?","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    _supported_extension_alias \u003d \u0027dns-integration\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def initialize(self):"},{"line_number":39,"context_line":"        LOG.info(_LI(\"DNSExtensionDriver initialization complete\"))"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @property"},{"line_number":42,"context_line":"    def extension_alias(self):"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_e8e94be7","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":67},"in_reply_to":"da6ed579_b85b252e","updated":"2016-01-18 23:57:04.000000000","message":"Yes, you are right. Moving this to the subclass","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def process_create_network(self, plugin_context, request_data, db_data):"},{"line_number":46,"context_line":"        dns_domain \u003d request_data.get(dns.DNSDOMAIN)"},{"line_number":47,"context_line":"        dns_domain_set \u003d attributes.is_attr_set(dns_domain)"},{"line_number":48,"context_line":"        if not dns_domain_set:"},{"line_number":49,"context_line":"            return"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_fecbc51c","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":22},"updated":"2016-01-12 16:49:49.000000000","message":"nit:  it is nice when boolean begin with is_ (is_dns_domain_set)\n\nBut, thinking about it again, this extra local variable doesn\u0027t add much.  Wouldn\u0027t the following do just as well?\n\n  if not attributes.is_attr_set(dns_domain):\n      return\n\nKind of like L58","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def process_create_network(self, plugin_context, request_data, db_data):"},{"line_number":46,"context_line":"        dns_domain \u003d request_data.get(dns.DNSDOMAIN)"},{"line_number":47,"context_line":"        dns_domain_set \u003d attributes.is_attr_set(dns_domain)"},{"line_number":48,"context_line":"        if not dns_domain_set:"},{"line_number":49,"context_line":"            return"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_c8bfa7a8","line":47,"range":{"start_line":47,"start_character":8,"end_line":47,"end_character":22},"in_reply_to":"da6ed579_fecbc51c","updated":"2016-01-18 23:57:04.000000000","message":"Done","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":182,"context_line":"                return True"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def external_dns_not_needed(self, context, network):"},{"line_number":185,"context_line":"        if not DNS_DRIVER:"},{"line_number":186,"context_line":"            return True"},{"line_number":187,"context_line":"        if network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_96ecc8c8","line":184,"range":{"start_line":184,"start_character":8,"end_line":184,"end_character":31},"updated":"2016-01-12 16:49:49.000000000","message":"While I think this is okay for now, I don\u0027t want the discussion here [1] to get lost.  I think this can be improved iteratively.\n\n [1] https://review.openstack.org/#/c/212213/36/neutron/db/dns_db.py","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:"},{"line_number":182,"context_line":"                return True"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def external_dns_not_needed(self, context, network):"},{"line_number":185,"context_line":"        if not DNS_DRIVER:"},{"line_number":186,"context_line":"            return True"},{"line_number":187,"context_line":"        if network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_c8ed67b8","line":184,"range":{"start_line":184,"start_character":8,"end_line":184,"end_character":31},"in_reply_to":"da6ed579_96ecc8c8","updated":"2016-01-18 23:57:04.000000000","message":"Duly noted :-)","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            dns_data_db[\u0027current_dns_name\u0027])"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"def subscribe():"},{"line_number":312,"context_line":"    registry.subscribe("},{"line_number":313,"context_line":"        _create_port_in_external_dns_service, resources.PORT,"},{"line_number":314,"context_line":"        events.AFTER_CREATE)"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_3290b195","line":311,"updated":"2016-01-12 16:49:49.000000000","message":"I do like the callbacks a lot better.","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":308,"context_line":"            dns_data_db[\u0027current_dns_name\u0027])"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"def subscribe():"},{"line_number":312,"context_line":"    registry.subscribe("},{"line_number":313,"context_line":"        _create_port_in_external_dns_service, resources.PORT,"},{"line_number":314,"context_line":"        events.AFTER_CREATE)"}],"source_content_type":"text/x-python","patch_set":37,"id":"da6ed579_4838973d","line":311,"in_reply_to":"da6ed579_3290b195","updated":"2016-01-18 23:57:04.000000000","message":"Me too","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"}],"neutron/plugins/ml2/managers.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2cbcd68909c76eaab2cd38d0992f72f299d07680","unresolved":false,"context_lines":[{"line_number":826,"context_line":"                             \"%(method)s\"),"},{"line_number":827,"context_line":"                             {\u0027name\u0027: driver.name, \u0027method\u0027: method_name})"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"    def _call_on_ext_drivers_delete(self, method_name, plugin_context, result):"},{"line_number":830,"context_line":"        \"\"\"Helper method for calling a delete across all extension drivers.\"\"\""},{"line_number":831,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":832,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_9795f133","line":829,"range":{"start_line":829,"start_character":36,"end_line":829,"end_character":40},"updated":"2015-12-21 19:40:01.000000000","message":"this should be extracted in its own patch.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":826,"context_line":"                             \"%(method)s\"),"},{"line_number":827,"context_line":"                             {\u0027name\u0027: driver.name, \u0027method\u0027: method_name})"},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"    def _call_on_ext_drivers_delete(self, method_name, plugin_context, result):"},{"line_number":830,"context_line":"        \"\"\"Helper method for calling a delete across all extension drivers.\"\"\""},{"line_number":831,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":832,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_8373f7e6","line":829,"range":{"start_line":829,"start_character":36,"end_line":829,"end_character":40},"in_reply_to":"3a7e1126_9795f133","updated":"2015-12-28 23:35:10.000000000","message":"Removed. Not needed anymore. I am using a callback to process the effect on the external dns service of a port delete","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2cbcd68909c76eaab2cd38d0992f72f299d07680","unresolved":false,"context_lines":[{"line_number":869,"context_line":""},{"line_number":870,"context_line":"    def process_delete_port(self, plugin_context, result):"},{"line_number":871,"context_line":"        \"\"\"Notify all extension drivers during port delete.\"\"\""},{"line_number":872,"context_line":"        self._call_on_ext_drivers_delete(\"process_delete_port\", plugin_context,"},{"line_number":873,"context_line":"                                         result)"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    def _call_on_dict_driver(self, method_name, session, base_model, result):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_3798bd69","line":872,"updated":"2015-12-21 19:40:01.000000000","message":"and this one.\n\nThis is to allow for a review that\u0027s not tainted by the DNS specifics.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":869,"context_line":""},{"line_number":870,"context_line":"    def process_delete_port(self, plugin_context, result):"},{"line_number":871,"context_line":"        \"\"\"Notify all extension drivers during port delete.\"\"\""},{"line_number":872,"context_line":"        self._call_on_ext_drivers_delete(\"process_delete_port\", plugin_context,"},{"line_number":873,"context_line":"                                         result)"},{"line_number":874,"context_line":""},{"line_number":875,"context_line":"    def _call_on_dict_driver(self, method_name, session, base_model, result):"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_23824395","line":872,"in_reply_to":"3a7e1126_3798bd69","updated":"2015-12-28 23:35:10.000000000","message":"Removed. Not needed anymore. I am using a callback to process the effect on the external dns service of a port delete","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            return self._dns_driver"},{"line_number":145,"context_line":"        try:"},{"line_number":146,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":147,"context_line":"            LOG.debug(\"External DNS driver loaded: %s\" %"},{"line_number":148,"context_line":"                      cfg.CONF.external_dns_driver)"},{"line_number":149,"context_line":"            return self._dns_driver"},{"line_number":150,"context_line":"        except ImportError:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_0771e843","line":147,"updated":"2015-11-19 12:31:34.000000000","message":"please use a comma instead of %","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            return self._dns_driver"},{"line_number":145,"context_line":"        try:"},{"line_number":146,"context_line":"            self._dns_driver \u003d driver.ExternalDNSService.get_instance()"},{"line_number":147,"context_line":"            LOG.debug(\"External DNS driver loaded: %s\" %"},{"line_number":148,"context_line":"                      cfg.CONF.external_dns_driver)"},{"line_number":149,"context_line":"            return self._dns_driver"},{"line_number":150,"context_line":"        except ImportError:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_af67f023","line":147,"in_reply_to":"ba8a016a_0771e843","updated":"2015-11-29 23:05:55.000000000","message":"Done","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"            return False"},{"line_number":1034,"context_line":"        segmentation_id \u003d int(provider_net[\u0027segmentation_id\u0027])"},{"line_number":1035,"context_line":"        for vlan_range in vlan_ranges:"},{"line_number":1036,"context_line":"            if (segmentation_id \u003e\u003d vlan_range[0] and"},{"line_number":1037,"context_line":"                segmentation_id \u003c\u003d vlan_range[1]):"},{"line_number":1038,"context_line":"                return True"},{"line_number":1039,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_5ed0a4c9","line":1036,"updated":"2015-11-22 23:59:24.000000000","message":"you can use:\n\n if vlan_range[0] \u003c\u003d segmentation_id \u003c\u003d vlan_range[1]:","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"            return False"},{"line_number":1034,"context_line":"        segmentation_id \u003d int(provider_net[\u0027segmentation_id\u0027])"},{"line_number":1035,"context_line":"        for vlan_range in vlan_ranges:"},{"line_number":1036,"context_line":"            if (segmentation_id \u003e\u003d vlan_range[0] and"},{"line_number":1037,"context_line":"                segmentation_id \u003c\u003d vlan_range[1]):"},{"line_number":1038,"context_line":"                return True"},{"line_number":1039,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_727744a0","line":1036,"in_reply_to":"ba8a016a_5ed0a4c9","updated":"2015-11-29 23:05:55.000000000","message":"duh!.... Nice catch! Thanks :-)","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"fb947ef2272ccb3e2f8e340d469d1ce663b32564","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        for vlan_range in vlan_ranges:"},{"line_number":1036,"context_line":"            if (segmentation_id \u003e\u003d vlan_range[0] and"},{"line_number":1037,"context_line":"                segmentation_id \u003c\u003d vlan_range[1]):"},{"line_number":1038,"context_line":"                return True"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def _is_tunnel_tenant_network(self, provider_net):"},{"line_number":1041,"context_line":"        if provider_net[\u0027network_type\u0027] \u003d\u003d \u0027geneve\u0027:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_87b2b8e3","line":1038,"updated":"2015-11-19 12:31:34.000000000","message":"do we want to return False at the end or will None suffice?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        for vlan_range in vlan_ranges:"},{"line_number":1036,"context_line":"            if (segmentation_id \u003e\u003d vlan_range[0] and"},{"line_number":1037,"context_line":"                segmentation_id \u003c\u003d vlan_range[1]):"},{"line_number":1038,"context_line":"                return True"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def _is_tunnel_tenant_network(self, provider_net):"},{"line_number":1041,"context_line":"        if provider_net[\u0027network_type\u0027] \u003d\u003d \u0027geneve\u0027:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_b2b84c2b","line":1038,"in_reply_to":"ba8a016a_87b2b8e3","updated":"2015-11-29 23:05:55.000000000","message":"None will suffice :-)","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":1058,"context_line":"                segmentation_id \u003c\u003d int(tun_max)):"},{"line_number":1059,"context_line":"                return True"},{"line_number":1060,"context_line":""},{"line_number":1061,"context_line":"    def _external_dns_not_needed(self, port, bound_context):"},{"line_number":1062,"context_line":"        if not self.dns_driver:"},{"line_number":1063,"context_line":"            return True"},{"line_number":1064,"context_line":"        if bound_context._network_context._network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_9eedac90","line":1061,"updated":"2015-11-22 23:59:24.000000000","message":"I don\u0027t understand why you need this","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":1058,"context_line":"                segmentation_id \u003c\u003d int(tun_max)):"},{"line_number":1059,"context_line":"                return True"},{"line_number":1060,"context_line":""},{"line_number":1061,"context_line":"    def _external_dns_not_needed(self, port, bound_context):"},{"line_number":1062,"context_line":"        if not self.dns_driver:"},{"line_number":1063,"context_line":"            return True"},{"line_number":1064,"context_line":"        if bound_context._network_context._network[\u0027router:external\u0027]:"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_32b3fc0b","line":1061,"in_reply_to":"ba8a016a_9eedac90","updated":"2015-11-29 23:05:55.000000000","message":"The convention I am taking is that if:\n\n1) The provider network is outside the tenant segmentation ranges\n2) Have dns_domain assigned\n3) The port being created has dns_name assigned\n\nthen the user wants this to be accessible from the outside and therefore it is necessary to create a record in the external dns service. This method checks these conditions","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":1160,"context_line":"                              \"failed, deleting port \u0027%s\u0027\"), result[\u0027id\u0027])"},{"line_number":1161,"context_line":"                self.delete_port(context, result[\u0027id\u0027])"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"        if \u0027dns-integration\u0027 in self.supported_extension_aliases:"},{"line_number":1164,"context_line":"            try:"},{"line_number":1165,"context_line":"                self._create_port_in_external_dns_service(context, port,"},{"line_number":1166,"context_line":"                                                          bound_context)"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_5ee744ac","line":1163,"updated":"2015-11-22 23:59:24.000000000","message":"Use a constant instead of \u0027dns-integration\u0027 and utils.is_extension_supported","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":1160,"context_line":"                              \"failed, deleting port \u0027%s\u0027\"), result[\u0027id\u0027])"},{"line_number":1161,"context_line":"                self.delete_port(context, result[\u0027id\u0027])"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"        if \u0027dns-integration\u0027 in self.supported_extension_aliases:"},{"line_number":1164,"context_line":"            try:"},{"line_number":1165,"context_line":"                self._create_port_in_external_dns_service(context, port,"},{"line_number":1166,"context_line":"                                                          bound_context)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_7d1875d3","line":1163,"in_reply_to":"ba8a016a_5ee744ac","updated":"2015-11-29 23:05:55.000000000","message":"Done","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":1279,"context_line":"            mech_context,"},{"line_number":1280,"context_line":"            allow_notify\u003dTrue,"},{"line_number":1281,"context_line":"            need_notify\u003dneed_port_update_notify)"},{"line_number":1282,"context_line":""},{"line_number":1283,"context_line":"        return bound_context.current"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"    def _process_dvr_port_binding(self, mech_context, context, attrs):"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_9ff3329e","line":1282,"updated":"2015-12-07 09:28:00.000000000","message":"you can drop this change","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":1279,"context_line":"            mech_context,"},{"line_number":1280,"context_line":"            allow_notify\u003dTrue,"},{"line_number":1281,"context_line":"            need_notify\u003dneed_port_update_notify)"},{"line_number":1282,"context_line":""},{"line_number":1283,"context_line":"        return bound_context.current"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"    def _process_dvr_port_binding(self, mech_context, context, attrs):"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_23b2bce5","line":1282,"in_reply_to":"7a740942_9ff3329e","updated":"2015-12-09 01:29:31.000000000","message":"Yeah, sorry for that. It shouldn\u0027t be there","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":616,"context_line":"                               \u0027resource_ids\u0027: \u0027, \u0027.join(resource_ids)})"},{"line_number":617,"context_line":"                self._delete_objects(context, resource, objects)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    def _is_tunnel_tenant_network(self, provider_net):"},{"line_number":620,"context_line":"        if provider_net[\u0027network_type\u0027] \u003d\u003d \u0027geneve\u0027:"},{"line_number":621,"context_line":"            tunnel_ranges \u003d cfg.CONF.ml2_type_geneve.vni_ranges"},{"line_number":622,"context_line":"        elif provider_net[\u0027network_type\u0027] \u003d\u003d \u0027vxlan\u0027:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_e3333b12","line":619,"updated":"2015-12-09 10:08:28.000000000","message":"where is this used?","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":616,"context_line":"                               \u0027resource_ids\u0027: \u0027, \u0027.join(resource_ids)})"},{"line_number":617,"context_line":"                self._delete_objects(context, resource, objects)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    def _is_tunnel_tenant_network(self, provider_net):"},{"line_number":620,"context_line":"        if provider_net[\u0027network_type\u0027] \u003d\u003d \u0027geneve\u0027:"},{"line_number":621,"context_line":"            tunnel_ranges \u003d cfg.CONF.ml2_type_geneve.vni_ranges"},{"line_number":622,"context_line":"        elif provider_net[\u0027network_type\u0027] \u003d\u003d \u0027vxlan\u0027:"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a740942_71124b0b","line":619,"in_reply_to":"7a740942_e3333b12","updated":"2015-12-11 01:22:32.000000000","message":"This is used by _external_dns_not_needed. I moved it here in the previous revision. I am also moving _external_dns_not_needed and _is_vlan_tenant_network to the plugin. I\u0027ll keep the 3 together","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,"},{"line_number":91,"context_line":"                dns_db.DNS_db_mixin,"},{"line_number":92,"context_line":"                dvr_mac_db.DVRDbMixin,"},{"line_number":93,"context_line":"                external_net_db.External_net_db_mixin,"},{"line_number":94,"context_line":"                sg_db_rpc.SecurityGroupServerRpcMixin,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_c29699ef","line":91,"updated":"2015-12-11 19:34:56.000000000","message":"It should be possible to avoid this mixin monkey business and avoid sprinkling the code with the _process_ methods but relying on the extension manager process_* methods\n\nSee lines 630, 1222, etc.","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"24a59f4ca3c610fc6975d67819b185dde0468bea","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,"},{"line_number":91,"context_line":"                dns_db.DNS_db_mixin,"},{"line_number":92,"context_line":"                dvr_mac_db.DVRDbMixin,"},{"line_number":93,"context_line":"                external_net_db.External_net_db_mixin,"},{"line_number":94,"context_line":"                sg_db_rpc.SecurityGroupServerRpcMixin,"}],"source_content_type":"text/x-python","patch_set":35,"id":"5a710552_e17b207a","line":91,"in_reply_to":"7a740942_c29699ef","updated":"2015-12-21 01:40:35.000000000","message":"Yes, I followed your advice and implemented this using ml2 ExtensionManager","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":1436,"context_line":"                router_ids \u003d l3plugin.disassociate_floatingips("},{"line_number":1437,"context_line":"                    context, id, do_notify\u003dFalse)"},{"line_number":1438,"context_line":""},{"line_number":1439,"context_line":"            if bound_mech_contexts:"},{"line_number":1440,"context_line":"                network_context \u003d bound_mech_contexts[0]._network_context"},{"line_number":1441,"context_line":"            else:"},{"line_number":1442,"context_line":"                network_context \u003d driver_context.NetworkContext(self, context,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_7d798a81","line":1439,"updated":"2015-12-11 19:34:56.000000000","message":"Please refrain from tying dns concept into ML2","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"24a59f4ca3c610fc6975d67819b185dde0468bea","unresolved":false,"context_lines":[{"line_number":1436,"context_line":"                router_ids \u003d l3plugin.disassociate_floatingips("},{"line_number":1437,"context_line":"                    context, id, do_notify\u003dFalse)"},{"line_number":1438,"context_line":""},{"line_number":1439,"context_line":"            if bound_mech_contexts:"},{"line_number":1440,"context_line":"                network_context \u003d bound_mech_contexts[0]._network_context"},{"line_number":1441,"context_line":"            else:"},{"line_number":1442,"context_line":"                network_context \u003d driver_context.NetworkContext(self, context,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3a7e1126_219c265c","line":1439,"in_reply_to":"7a740942_7d798a81","updated":"2015-12-21 01:40:35.000000000","message":"Not happening anymore","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2cbcd68909c76eaab2cd38d0992f72f299d07680","unresolved":false,"context_lines":[{"line_number":1374,"context_line":"                router_ids \u003d l3plugin.disassociate_floatingips("},{"line_number":1375,"context_line":"                    context, id, do_notify\u003dFalse)"},{"line_number":1376,"context_line":""},{"line_number":1377,"context_line":"            self.extension_manager.process_delete_port(context, port_db)"},{"line_number":1378,"context_line":"            LOG.debug(\"Calling delete_port for %(port_id)s owned by %(owner)s\","},{"line_number":1379,"context_line":"                      {\"port_id\": id, \"owner\": device_owner})"},{"line_number":1380,"context_line":"            super(Ml2Plugin, self).delete_port(context, id)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_f761d505","line":1377,"updated":"2015-12-21 19:40:01.000000000","message":"I am starting to question the rationale for this hook. For what I can tell, all you need this for is to signal the \u0027designate\u0027 driver to process the removal of the record, and this is making a REST call within a transaction. This is problematic, and we should talk some more, because I don\u0027t believe this is a viable integration solution.\n\nSorry it took me a while to notice, but I am only recently starting to look at this patch with more attention.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":1374,"context_line":"                router_ids \u003d l3plugin.disassociate_floatingips("},{"line_number":1375,"context_line":"                    context, id, do_notify\u003dFalse)"},{"line_number":1376,"context_line":""},{"line_number":1377,"context_line":"            self.extension_manager.process_delete_port(context, port_db)"},{"line_number":1378,"context_line":"            LOG.debug(\"Calling delete_port for %(port_id)s owned by %(owner)s\","},{"line_number":1379,"context_line":"                      {\"port_id\": id, \"owner\": device_owner})"},{"line_number":1380,"context_line":"            super(Ml2Plugin, self).delete_port(context, id)"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_835a174f","line":1377,"in_reply_to":"3a7e1126_f761d505","updated":"2015-12-28 23:35:10.000000000","message":"Removed. Not needed anymore. I am using a callback to process the effect on the external dns service of a port delete","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"}],"neutron/services/externaldns/driver.py":[{"author":{"_account_id":13768,"name":"Pavel Bondar","email":"pbondar@infoblox.com","username":"pavel_bondar"},"change_message_id":"76a6f0f409c4bb469652a9a9332077aa032e449b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        mgr \u003d manager.NeutronManager"},{"line_number":43,"context_line":"        LOG.debug(\"Loading external dns driver: %s\", external_dns_driver_name)"},{"line_number":44,"context_line":"        # TODO(mlavalle) how do I define the name space"},{"line_number":45,"context_line":"        # neutron.external_dns_drivers?"},{"line_number":46,"context_line":"        driver_class \u003d mgr.load_class_for_provider("},{"line_number":47,"context_line":"            \u0027neutron.external_dns_drivers\u0027, external_dns_driver_name)"},{"line_number":48,"context_line":"        return driver_class()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_07fa0343","line":45,"updated":"2015-08-13 16:02:11.000000000","message":"[1] is the answer, you need to define it in setup.cfg.\nThe entire review [1] is about adding ipam driver loader, so might be useful to take a look.\n\n[1] https://review.openstack.org/#/c/147479/59/setup.cfg","commit_id":"4797f8bca7a491735d23b3989ad0cc0c2eeefece"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8308a52a146daf9cfcef19ab94c4719dfd8f17a3","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        mgr \u003d manager.NeutronManager"},{"line_number":43,"context_line":"        LOG.debug(\"Loading external dns driver: %s\", external_dns_driver_name)"},{"line_number":44,"context_line":"        # TODO(mlavalle) how do I define the name space"},{"line_number":45,"context_line":"        # neutron.external_dns_drivers?"},{"line_number":46,"context_line":"        driver_class \u003d mgr.load_class_for_provider("},{"line_number":47,"context_line":"            \u0027neutron.external_dns_drivers\u0027, external_dns_driver_name)"},{"line_number":48,"context_line":"        return driver_class()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_bc59cb5d","line":45,"in_reply_to":"1a4dcd0f_07fa0343","updated":"2015-08-14 00:28:27.000000000","message":"This is very useful. Thanks!","commit_id":"4797f8bca7a491735d23b3989ad0cc0c2eeefece"},{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"a0f4bf167a506ccec3e31a2027d9b9d001baf201","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @classmethod"},{"line_number":38,"context_line":"    def get_instance(cls, subnet_pool, context):"},{"line_number":39,"context_line":"        \"\"\"Returns an instance of the configured IPAM driver"},{"line_number":40,"context_line":"        \"\"\""},{"line_number":41,"context_line":"        external_dns_driver_name \u003d cfg.CONF.external_dns_driver"},{"line_number":42,"context_line":"        mgr \u003d manager.NeutronManager"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_73c82da9","line":39,"updated":"2015-08-14 16:21:20.000000000","message":"s/IPAM/DNS/","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"eb895856c0f31160e3d5402074c6871ce32f63ea","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @classmethod"},{"line_number":38,"context_line":"    def get_instance(cls, subnet_pool, context):"},{"line_number":39,"context_line":"        \"\"\"Returns an instance of the configured IPAM driver"},{"line_number":40,"context_line":"        \"\"\""},{"line_number":41,"context_line":"        external_dns_driver_name \u003d cfg.CONF.external_dns_driver"},{"line_number":42,"context_line":"        mgr \u003d manager.NeutronManager"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_21e0c228","line":39,"in_reply_to":"1a4dcd0f_73c82da9","updated":"2015-08-19 22:42:18.000000000","message":"Done","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"a0f4bf167a506ccec3e31a2027d9b9d001baf201","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return driver_class()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @abc.abstractmethod"},{"line_number":49,"context_line":"    def get_zones(self, tenant_id):"},{"line_number":50,"context_line":"        \"\"\"Gets the DNS zones a tenant has access to in the external DNS"},{"line_number":51,"context_line":"        service"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_73a90d90","line":49,"updated":"2015-08-14 16:21:20.000000000","message":"Why do we need this?","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"eb895856c0f31160e3d5402074c6871ce32f63ea","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return driver_class()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @abc.abstractmethod"},{"line_number":49,"context_line":"    def get_zones(self, tenant_id):"},{"line_number":50,"context_line":"        \"\"\"Gets the DNS zones a tenant has access to in the external DNS"},{"line_number":51,"context_line":"        service"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_a1913249","line":49,"in_reply_to":"1a4dcd0f_73a90d90","updated":"2015-08-19 22:42:18.000000000","message":"When assigning a dns_domain to a floating ip or a netrwok, i want to verify if the tenant has a corresponding zone in the external service. That is why I think we need to get the tenant\u0027s zones","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"1dceb340e9c45890b94c0feed36a776ae2622562","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return driver_class()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @abc.abstractmethod"},{"line_number":49,"context_line":"    def get_zones(self, tenant_id):"},{"line_number":50,"context_line":"        \"\"\"Gets the DNS zones a tenant has access to in the external DNS"},{"line_number":51,"context_line":"        service"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_b6c9baae","line":49,"in_reply_to":"fa1b9901_a1913249","updated":"2015-08-24 17:19:31.000000000","message":"Sorry, I was out all last week and am just seeing this. I still think this is unnecessary. Either you\u0027ll make the check yourself and raise an error, or you\u0027ll try it with the external system and let it return the error. Seems like extra work for no real reason.","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f37c9a8c15869390d57ab5c9003eb971bb9bd4b3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return driver_class()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @abc.abstractmethod"},{"line_number":49,"context_line":"    def get_zones(self, tenant_id):"},{"line_number":50,"context_line":"        \"\"\"Gets the DNS zones a tenant has access to in the external DNS"},{"line_number":51,"context_line":"        service"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_f88ee42c","line":49,"in_reply_to":"fa1b9901_b6c9baae","updated":"2015-08-31 02:10:05.000000000","message":"OK, following your advice here","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"a0f4bf167a506ccec3e31a2027d9b9d001baf201","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        :param tenant_id: id of tenant the record set will be created for"},{"line_number":65,"context_line":"        :type tenant_id: String"},{"line_number":66,"context_line":"        :param zone_id: id of the zone where the record set will be created"},{"line_number":67,"context_line":"        :type zone_id: String (uuid)"},{"line_number":68,"context_line":"        :param name: the name associated with the record set"},{"line_number":69,"context_line":"        :type name: String"},{"line_number":70,"context_line":"        :param record_type: the type for this record set, A or AAAA"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_33e62517","line":67,"updated":"2015-08-14 16:21:20.000000000","message":"Rather than a UUID, this should be a driver-specific ID. For Designate integration it will be a UUID but could be something else for other drivers.","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"eb895856c0f31160e3d5402074c6871ce32f63ea","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        :param tenant_id: id of tenant the record set will be created for"},{"line_number":65,"context_line":"        :type tenant_id: String"},{"line_number":66,"context_line":"        :param zone_id: id of the zone where the record set will be created"},{"line_number":67,"context_line":"        :type zone_id: String (uuid)"},{"line_number":68,"context_line":"        :param name: the name associated with the record set"},{"line_number":69,"context_line":"        :type name: String"},{"line_number":70,"context_line":"        :param record_type: the type for this record set, A or AAAA"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_a7bdc2b8","line":67,"in_reply_to":"1a4dcd0f_33e62517","updated":"2015-08-19 22:42:18.000000000","message":"Ok. I assumed this will still be a String","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"a0f4bf167a506ccec3e31a2027d9b9d001baf201","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        :type ttl: String"},{"line_number":76,"context_line":"        :param description: record set description"},{"line_number":77,"context_line":"        :type description: String"},{"line_number":78,"context_line":"        :returns: uuid of newly created record set"},{"line_number":79,"context_line":"        :type: String (uuid)"},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_9329393a","line":78,"updated":"2015-08-14 16:21:20.000000000","message":"Ditto.","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"eb895856c0f31160e3d5402074c6871ce32f63ea","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        :type ttl: String"},{"line_number":76,"context_line":"        :param description: record set description"},{"line_number":77,"context_line":"        :type description: String"},{"line_number":78,"context_line":"        :returns: uuid of newly created record set"},{"line_number":79,"context_line":"        :type: String (uuid)"},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_47ae2682","line":78,"in_reply_to":"1a4dcd0f_9329393a","updated":"2015-08-19 22:42:18.000000000","message":"Ok. I assumed this will still be a String","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"a0f4bf167a506ccec3e31a2027d9b9d001baf201","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        :param zone_id: id of the zone where the record set will be deleted"},{"line_number":89,"context_line":"        :type zone_id: String (uuid)"},{"line_number":90,"context_line":"        :param record_set_id: the id of the record set to be deleted"},{"line_number":91,"context_line":"        :type record_set_id: String (uuid)"},{"line_number":92,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_f3c67d67","line":91,"updated":"2015-08-14 16:21:20.000000000","message":"So, zone_id and record_set_id are going to be stored somewhere in Neutron?\n\nWould it be better to use tenant_id/dns_label/dns_domain directly, and let the driver figure out how that maps into the external system?","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"eb895856c0f31160e3d5402074c6871ce32f63ea","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        :param zone_id: id of the zone where the record set will be deleted"},{"line_number":89,"context_line":"        :type zone_id: String (uuid)"},{"line_number":90,"context_line":"        :param record_set_id: the id of the record set to be deleted"},{"line_number":91,"context_line":"        :type record_set_id: String (uuid)"},{"line_number":92,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa1b9901_72ea0aae","line":91,"in_reply_to":"1a4dcd0f_f3c67d67","updated":"2015-08-19 22:42:18.000000000","message":"Yeah! Good idea.I also changed zone_id argument to dns_domain in the create_record_set call","commit_id":"d1cdca987f8a704434c337db6c2441a1a9f7523b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":28,"context_line":"class ExternalDNSService(object):"},{"line_number":29,"context_line":"    \"\"\"Interface definition for an external dns service driver."},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_fec2d985","line":29,"updated":"2015-09-08 22:43:51.000000000","message":"nit: I don\u0027t think these should wrap if they\u0027re one line docstrings.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":28,"context_line":"class ExternalDNSService(object):"},{"line_number":29,"context_line":"    \"\"\"Interface definition for an external dns service driver."},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_bad5d41c","line":29,"in_reply_to":"da20952f_fec2d985","updated":"2015-09-16 20:20:31.000000000","message":"Done","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def __init__(self):"},{"line_number":33,"context_line":"        \"\"\"Initialize external dns service driver"},{"line_number":34,"context_line":"        \"\"\""},{"line_number":35,"context_line":"        pass"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @classmethod"},{"line_number":38,"context_line":"    def get_instance(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_9ed39d5f","line":35,"updated":"2015-09-08 22:43:51.000000000","message":"Nano-nit:  don\u0027t need pass.","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    def __init__(self):"},{"line_number":33,"context_line":"        \"\"\"Initialize external dns service driver"},{"line_number":34,"context_line":"        \"\"\""},{"line_number":35,"context_line":"        pass"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    @classmethod"},{"line_number":38,"context_line":"    def get_instance(cls):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_7adbbc4f","line":35,"in_reply_to":"da20952f_9ed39d5f","updated":"2015-09-16 20:20:31.000000000","message":"Done","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":10518,"name":"Jesse","email":"jesse@easystack.cn","username":"jesse"},"change_message_id":"afb3cb5f2662d6eca50f3b845d0e7881760cfd78","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    @abc.abstractmethod"},{"line_number":45,"context_line":"    def create_record_set(self, context, dns_domain, dns_name, record_type,"},{"line_number":46,"context_line":"                          records):"},{"line_number":47,"context_line":"        \"\"\"Creates a record set in the specified zone for the specified tenat"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        :param context: neutron api request context"},{"line_number":50,"context_line":"        :type context: neutron.context.Context"}],"source_content_type":"text/x-python","patch_set":28,"id":"da85f559_459ea157","line":47,"updated":"2015-11-09 11:46:09.000000000","message":"tenant?","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fd5ec23123b44311495870a899c639b644882c53","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    @abc.abstractmethod"},{"line_number":45,"context_line":"    def create_record_set(self, context, dns_domain, dns_name, record_type,"},{"line_number":46,"context_line":"                          records):"},{"line_number":47,"context_line":"        \"\"\"Creates a record set in the specified zone for the specified tenat"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        :param context: neutron api request context"},{"line_number":50,"context_line":"        :type context: neutron.context.Context"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba8a016a_7c53c26b","line":47,"in_reply_to":"da85f559_459ea157","updated":"2015-11-19 00:19:13.000000000","message":"Good catch! Left that form a previous version of the method","commit_id":"ccab6082ffc4a6717cf519dab817a7b0097ade57"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        :type records: List of Strings"},{"line_number":59,"context_line":"        :raises: neutron.extensions.dns.DNSDomainNotFound"},{"line_number":60,"context_line":"                 neutron.extensions.dns.DuplicateRecordSet"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @abc.abstractmethod"},{"line_number":64,"context_line":"    def delete_record_set(self, context, dns_domain, dns_name, records):"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_1f366252","line":61,"updated":"2015-12-07 09:28:00.000000000","message":"maybe just have pass here","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        :type records: List of Strings"},{"line_number":59,"context_line":"        :raises: neutron.extensions.dns.DNSDomainNotFound"},{"line_number":60,"context_line":"                 neutron.extensions.dns.DuplicateRecordSet"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @abc.abstractmethod"},{"line_number":64,"context_line":"    def delete_record_set(self, context, dns_domain, dns_name, records):"}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_ee1edb0a","line":61,"in_reply_to":"7a740942_1f366252","updated":"2015-12-09 01:29:31.000000000","message":"Good idea, Done","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        :type dns_name: String"},{"line_number":75,"context_line":"        :param records: the records in the set to be deleted"},{"line_number":76,"context_line":"        :type records: List of Strings"},{"line_number":77,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_3f39de41","line":77,"updated":"2015-12-07 09:28:00.000000000","message":"ditto","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        :type dns_name: String"},{"line_number":75,"context_line":"        :param records: the records in the set to be deleted"},{"line_number":76,"context_line":"        :type records: List of Strings"},{"line_number":77,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_8e195724","line":77,"in_reply_to":"7a740942_3f39de41","updated":"2015-12-09 01:29:31.000000000","message":"Done","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"1027c02e13693f6c761a86c0e7a161bc9f702bac","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises: neutron.extensions.dns.DNSDomainNotFound"},{"line_number":60,"context_line":"                 neutron.extensions.dns.DuplicateRecordSet"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        pass"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @abc.abstractmethod"},{"line_number":65,"context_line":"    def delete_record_set(self, context, dns_domain, dns_name, records):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a7e1126_cd28c59c","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":12},"updated":"2015-12-22 01:04:58.000000000","message":"nit:  No need for pass here.","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5cf6d92d11e176a5afda9d78b49b9b6d0e329227","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        :raises: neutron.extensions.dns.DNSDomainNotFound"},{"line_number":60,"context_line":"                 neutron.extensions.dns.DuplicateRecordSet"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        pass"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @abc.abstractmethod"},{"line_number":65,"context_line":"    def delete_record_set(self, context, dns_domain, dns_name, records):"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a7b0d38_23300301","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":12},"in_reply_to":"3a7e1126_cd28c59c","updated":"2015-12-28 23:35:10.000000000","message":"I got feedback to the contrary here: https://review.openstack.org/#/c/212213/33/neutron/services/externaldns/driver.py.\n\nSince I agree with you, I\u0027ll remove them here and L79","commit_id":"3cdb6c8c61a32ffa3199be28e371acfca0707c71"}],"neutron/services/externaldns/drivers/designate/driver.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b0a1d1c3b8bef51e2281063d89681239e9632113","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    if not _SESSION:"},{"line_number":43,"context_line":"        _SESSION \u003d session.Session()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    auth \u003d token_endpoint.Token(CONF.designate.url, context.auth_token)"},{"line_number":46,"context_line":"    return client.Client(session\u003dsession, auth\u003dauth)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da20952f_fe709975","line":45,"updated":"2015-09-08 22:43:51.000000000","message":"Ah, so does authentication with designate just work with the API user\u0027s token?","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"349f5a7652f0085313f4c62adf2f8d2887792efb","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    if not _SESSION:"},{"line_number":43,"context_line":"        _SESSION \u003d session.Session()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    auth \u003d token_endpoint.Token(CONF.designate.url, context.auth_token)"},{"line_number":46,"context_line":"    return client.Client(session\u003dsession, auth\u003dauth)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba15a1d1_3acd4466","line":45,"in_reply_to":"da20952f_fe709975","updated":"2015-09-16 20:20:31.000000000","message":"You can authenticate with username and password as well. However, I am adding records to designate on behalf of the user that sent the request to Neutron. So I only need his / her token for this. This might change after your questions about PTR records (thanks!). I added code for PTR records in PS9. So now I am adding records to the in-addr.arpa domain. For that, I might need admin privileges, so I might need to authenticate as admin. If this is needed, it will come in PS10","commit_id":"8fcf831a7cbca289b518132482cc5fb25d4b89cb"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                      \u0027context\u0027)),"},{"line_number":56,"context_line":"    cfg.BoolOpt(\u0027allow_reverse_dns_lookup\u0027, default\u003dTrue,"},{"line_number":57,"context_line":"                help\u003d_(\u0027Allow the creation of PTR records\u0027)),"},{"line_number":58,"context_line":"    cfg.IntOpt(\u0027ipv4_ptr_zone_prefix_size\u0027, default\u003d24,"},{"line_number":59,"context_line":"        help\u003d_(\u0027Number of bits in an ipv4 PTR zone that will be considered \u0027"},{"line_number":60,"context_line":"               \u0027network prefix. It has to align to byte boundary. Minimum \u0027"},{"line_number":61,"context_line":"               \u0027value is 8. Maximum value is 24\u0027)),"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_9e94cce8","line":58,"updated":"2015-11-22 23:59:24.000000000","message":"Only 3 values seem valid: 8, 16 and 24","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                      \u0027context\u0027)),"},{"line_number":56,"context_line":"    cfg.BoolOpt(\u0027allow_reverse_dns_lookup\u0027, default\u003dTrue,"},{"line_number":57,"context_line":"                help\u003d_(\u0027Allow the creation of PTR records\u0027)),"},{"line_number":58,"context_line":"    cfg.IntOpt(\u0027ipv4_ptr_zone_prefix_size\u0027, default\u003d24,"},{"line_number":59,"context_line":"        help\u003d_(\u0027Number of bits in an ipv4 PTR zone that will be considered \u0027"},{"line_number":60,"context_line":"               \u0027network prefix. It has to align to byte boundary. Minimum \u0027"},{"line_number":61,"context_line":"               \u0027value is 8. Maximum value is 24\u0027)),"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_9dfbd946","line":58,"in_reply_to":"ba8a016a_9e94cce8","updated":"2015-11-29 23:05:55.000000000","message":"Correct. From a name like \u00271.0.0.10.in-addr.arpa.\u0027, I can only cut whole bytes to come up with the zone name, for examples \u00270.0.10.in-addr.arpa.\u0027 or \u00270.10.in-addr.arpa.\u0027. I clarified the range of values in the help string","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        help\u003d_(\u0027Number of bits in an ipv4 PTR zone that will be considered \u0027"},{"line_number":60,"context_line":"               \u0027network prefix. It has to align to byte boundary. Minimum \u0027"},{"line_number":61,"context_line":"               \u0027value is 8. Maximum value is 24\u0027)),"},{"line_number":62,"context_line":"    cfg.IntOpt(\u0027ipv6_ptr_zone_prefix_size\u0027, default\u003d120,"},{"line_number":63,"context_line":"        help\u003d_(\u0027Number of bits in an ipv4 PTR zone that will be considered \u0027"},{"line_number":64,"context_line":"               \u0027network prefix. It has to align to nyble boundary. Minimum \u0027"},{"line_number":65,"context_line":"               \u0027value is 4. Maximum value is 124\u0027)),"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_fe8f18ca","line":62,"updated":"2015-11-22 23:59:24.000000000","message":"You should have the type of restriction for ipv6: perhaps 4, 8, 12, ... 124?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        help\u003d_(\u0027Number of bits in an ipv4 PTR zone that will be considered \u0027"},{"line_number":60,"context_line":"               \u0027network prefix. It has to align to byte boundary. Minimum \u0027"},{"line_number":61,"context_line":"               \u0027value is 8. Maximum value is 24\u0027)),"},{"line_number":62,"context_line":"    cfg.IntOpt(\u0027ipv6_ptr_zone_prefix_size\u0027, default\u003d120,"},{"line_number":63,"context_line":"        help\u003d_(\u0027Number of bits in an ipv4 PTR zone that will be considered \u0027"},{"line_number":64,"context_line":"               \u0027network prefix. It has to align to nyble boundary. Minimum \u0027"},{"line_number":65,"context_line":"               \u0027value is 4. Maximum value is 124\u0027)),"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_5d3491fa","line":62,"in_reply_to":"ba8a016a_fe8f18ca","updated":"2015-11-29 23:05:55.000000000","message":"I clarified the range of values in the help string","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":60,"context_line":"               \u0027network prefix. It has to align to byte boundary. Minimum \u0027"},{"line_number":61,"context_line":"               \u0027value is 8. Maximum value is 24\u0027)),"},{"line_number":62,"context_line":"    cfg.IntOpt(\u0027ipv6_ptr_zone_prefix_size\u0027, default\u003d120,"},{"line_number":63,"context_line":"        help\u003d_(\u0027Number of bits in an ipv4 PTR zone that will be considered \u0027"},{"line_number":64,"context_line":"               \u0027network prefix. It has to align to nyble boundary. Minimum \u0027"},{"line_number":65,"context_line":"               \u0027value is 4. Maximum value is 124\u0027)),"},{"line_number":66,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_3e8600ba","line":63,"updated":"2015-11-22 23:59:24.000000000","message":"ipv6","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"               \u0027network prefix. It has to align to byte boundary. Minimum \u0027"},{"line_number":61,"context_line":"               \u0027value is 8. Maximum value is 24\u0027)),"},{"line_number":62,"context_line":"    cfg.IntOpt(\u0027ipv6_ptr_zone_prefix_size\u0027, default\u003d120,"},{"line_number":63,"context_line":"        help\u003d_(\u0027Number of bits in an ipv4 PTR zone that will be considered \u0027"},{"line_number":64,"context_line":"               \u0027network prefix. It has to align to nyble boundary. Minimum \u0027"},{"line_number":65,"context_line":"               \u0027value is 4. Maximum value is 124\u0027)),"},{"line_number":66,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_1d3a89e7","line":63,"in_reply_to":"ba8a016a_3e8600ba","updated":"2015-11-29 23:05:55.000000000","message":"Done","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # Set up the PTR records"},{"line_number":129,"context_line":"        recordset_name \u003d \u0027%s.%s\u0027 % (dns_name, dns_domain)"},{"line_number":130,"context_line":"        ptr_zone_email \u003d \u0027admin@%s\u0027 % dns_domain[:-1]"},{"line_number":131,"context_line":"        for record in records:"},{"line_number":132,"context_line":"            in_addr_name \u003d netaddr.IPAddress(record).reverse_dns"},{"line_number":133,"context_line":"            in_addr_zone_name \u003d self._get_in_addr_zone_name(in_addr_name)"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_7eba4870","line":130,"updated":"2015-11-22 23:59:24.000000000","message":"huhum, should be configurable?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # Set up the PTR records"},{"line_number":129,"context_line":"        recordset_name \u003d \u0027%s.%s\u0027 % (dns_name, dns_domain)"},{"line_number":130,"context_line":"        ptr_zone_email \u003d \u0027admin@%s\u0027 % dns_domain[:-1]"},{"line_number":131,"context_line":"        for record in records:"},{"line_number":132,"context_line":"            in_addr_name \u003d netaddr.IPAddress(record).reverse_dns"},{"line_number":133,"context_line":"            in_addr_zone_name \u003d self._get_in_addr_zone_name(in_addr_name)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_d84e4f3a","line":130,"in_reply_to":"ba8a016a_7eba4870","updated":"2015-11-29 23:05:55.000000000","message":"Good idea! Done","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8edb8f957a637df58fd3a17124a66d5c2ad0a4ce","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            in_addr_zone_name \u003d self._get_in_addr_zone_name(in_addr_name)"},{"line_number":134,"context_line":"            in_addr_zone_description \u003d ("},{"line_number":135,"context_line":"                \u0027An %s zone for reverse lookups set up by Neutron.\u0027 %"},{"line_number":136,"context_line":"                \u0027.\u0027.join(in_addr_name.split(\u0027.\u0027)[-3:]))"},{"line_number":137,"context_line":"            try:"},{"line_number":138,"context_line":"                # Since we don\u0027t delete in-addr zones, assume it already"},{"line_number":139,"context_line":"                # exists. If it doesn\u0027t, create it"}],"source_content_type":"text/x-python","patch_set":30,"id":"ba8a016a_3eada031","line":136,"updated":"2015-11-22 23:59:24.000000000","message":"seems not working for ipv6?","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8ccbbf5f3fbe4a69c86a8168d32f8db42479dae1","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            in_addr_zone_name \u003d self._get_in_addr_zone_name(in_addr_name)"},{"line_number":134,"context_line":"            in_addr_zone_description \u003d ("},{"line_number":135,"context_line":"                \u0027An %s zone for reverse lookups set up by Neutron.\u0027 %"},{"line_number":136,"context_line":"                \u0027.\u0027.join(in_addr_name.split(\u0027.\u0027)[-3:]))"},{"line_number":137,"context_line":"            try:"},{"line_number":138,"context_line":"                # Since we don\u0027t delete in-addr zones, assume it already"},{"line_number":139,"context_line":"                # exists. If it doesn\u0027t, create it"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a8ffd7b_989207f5","line":136,"in_reply_to":"ba8a016a_3eada031","updated":"2015-11-29 23:05:55.000000000","message":"Testing in my Python interpreter, seems to be working fine:\n\n\u003e\u003e\u003e in_addr_name \u003d netaddr.IPAddress(\u0027fd1a:511f:5dd3:0:f816:3eff:fe11:2797\u0027).reverse_dns\n\u003e\u003e\u003e in_addr_name\n\u00277.9.7.2.1.1.e.f.f.f.e.3.6.1.8.f.0.0.0.0.3.d.d.5.f.1.1.5.a.1.d.f.ip6.arpa.\u0027\n\u003e\u003e\u003e in_addr_zone_description \u003d  \u0027An %s zone for reverse lookups set up by Neutron.\u0027 % \u0027.\u0027.join(in_addr_name.split(\u0027.\u0027)[-3:])\n\u003e\u003e\u003e in_addr_zone_description\n\u0027An ip6.arpa. zone for reverse lookups set up by Neutron.\u0027\n \nIt also works for ipv4:\n\n\u003e\u003e\u003e in_addr_name \u003d netaddr.IPAddress(\u002710.0.1.10\u0027).reverse_dns\n\n\u003e\u003e\u003e in_addr_zone_description \u003d  \u0027An %s zone for reverse lookups set up by Neutron.\u0027 % \u0027.\u0027.join(in_addr_name.split(\u0027.\u0027)[-3:])\n\n\u003e\u003e\u003e in_addr_zone_description\n\n\u0027An in-addr.arpa. zone for reverse lookups set up by Neutron.\u0027","commit_id":"18ce4495802bc5f4b664e9dc87ebd4650384871d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d902f0c86dff2c6b5bcecb09c9e127e201e78662","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from keystoneclient import session"},{"line_number":23,"context_line":"from oslo_config import cfg"},{"line_number":24,"context_line":"from oslo_log import log"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from neutron.extensions import dns"},{"line_number":27,"context_line":"from neutron.services.externaldns import driver"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_bf45ceb3","line":25,"updated":"2015-12-07 09:28:00.000000000","message":"same comment again with the _ imports","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"f3437022e9f0781367799e5d7634e804f45c5c99","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from keystoneclient import session"},{"line_number":23,"context_line":"from oslo_config import cfg"},{"line_number":24,"context_line":"from oslo_log import log"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from neutron.extensions import dns"},{"line_number":27,"context_line":"from neutron.services.externaldns import driver"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"7a740942_4e928f4d","line":25,"in_reply_to":"7a740942_bf45ceb3","updated":"2015-12-09 01:29:31.000000000","message":"Done","commit_id":"41d563095ce0e049d72c8733634ba9b97e7565e7"}],"neutron/services/l3_router/l3_router_plugin.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9693945b18a945e59bd3d99b1eff0eba8f9d8c6a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                     l3_gwmode_db.L3_NAT_db_mixin,"},{"line_number":43,"context_line":"                     l3_dvrscheduler_db.L3_DVRsch_db_mixin,"},{"line_number":44,"context_line":"                     l3_hascheduler_db.L3_HA_scheduler_db_mixin,"},{"line_number":45,"context_line":"                     dns_db.DNS_db_mixin):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    \"\"\"Implementation of the Neutron L3 Router Service Plugin."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7a740942_3dc6a29a","line":45,"updated":"2015-12-11 19:34:56.000000000","message":"The mixin in two places? This is a bit insane","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"24a59f4ca3c610fc6975d67819b185dde0468bea","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                     l3_gwmode_db.L3_NAT_db_mixin,"},{"line_number":43,"context_line":"                     l3_dvrscheduler_db.L3_DVRsch_db_mixin,"},{"line_number":44,"context_line":"                     l3_hascheduler_db.L3_HA_scheduler_db_mixin,"},{"line_number":45,"context_line":"                     dns_db.DNS_db_mixin):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    \"\"\"Implementation of the Neutron L3 Router Service Plugin."},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"3a7e1126_c1a522a2","line":45,"in_reply_to":"7a740942_3dc6a29a","updated":"2015-12-21 01:40:35.000000000","message":"The mixin is now only used here. And I mininmized the impact on the L3 code","commit_id":"79f885dfb1a0bd3e78550105e0d8685887043140"}],"releasenotes/notes/add-integration-with-external-dns-f56ec8a4993b1fc4.yaml":[{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Integration with an external DNS service is now supported."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IP\u0027s and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a740942_fa83f200","line":3,"updated":"2015-12-09 01:58:58.000000000","message":"Support integration with external DNS service.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Integration with an external DNS service is now supported."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IP\u0027s and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a740942_b1bd13d9","line":3,"in_reply_to":"7a740942_fa83f200","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Integration with an external DNS service is now supported."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IP\u0027s and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."},{"line_number":7,"context_line":"    - Floating IP\u0027s can have dns_name and dns_domain attributes associated"},{"line_number":8,"context_line":"      with them"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a740942_7a706240","line":5,"updated":"2015-12-09 01:58:58.000000000","message":"Same issue with Floating IPs.","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Integration with an external DNS service is now supported."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IP\u0027s and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."},{"line_number":7,"context_line":"    - Floating IP\u0027s can have dns_name and dns_domain attributes associated"},{"line_number":8,"context_line":"      with them"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a740942_31ca836f","line":5,"in_reply_to":"7a740942_7a706240","updated":"2015-12-11 01:22:32.000000000","message":"Done","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"7dec79e09f3c703fb2c4befe2f0b6b2b2c23f372","unresolved":false,"context_lines":[{"line_number":8,"context_line":"      with them"},{"line_number":9,"context_line":"    - Ports can have a dns_name attribute associated with them. The network"},{"line_number":10,"context_line":"      where a port is created can have a dns_domain associated with it"},{"line_number":11,"context_line":"    - The reference driver integrates Neutron with OpenStack Designate"},{"line_number":12,"context_line":"    - Drivers for other DNSaaS can be implemented"},{"line_number":13,"context_line":"    - Driver is configured in the default section of neutron.conf using"},{"line_number":14,"context_line":"      parameter external_dns_driver"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a740942_dae5d6db","line":11,"updated":"2015-12-09 01:58:58.000000000","message":"The central documentation uses lower-case for service code-names... not sure if that applies here. Should neutron change to OpenStack Networking?","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":8,"context_line":"      with them"},{"line_number":9,"context_line":"    - Ports can have a dns_name attribute associated with them. The network"},{"line_number":10,"context_line":"      where a port is created can have a dns_domain associated with it"},{"line_number":11,"context_line":"    - The reference driver integrates Neutron with OpenStack Designate"},{"line_number":12,"context_line":"    - Drivers for other DNSaaS can be implemented"},{"line_number":13,"context_line":"    - Driver is configured in the default section of neutron.conf using"},{"line_number":14,"context_line":"      parameter external_dns_driver"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a740942_918fb722","line":11,"in_reply_to":"7a740942_dae5d6db","updated":"2015-12-11 01:22:32.000000000","message":"Put everything in lower-case","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3980c91e037da32619579cfc8100c82648bc2c4b","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    - The reference driver integrates Neutron with OpenStack Designate"},{"line_number":12,"context_line":"    - Drivers for other DNSaaS can be implemented"},{"line_number":13,"context_line":"    - Driver is configured in the default section of neutron.conf using"},{"line_number":14,"context_line":"      parameter external_dns_driver"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a740942_232e23a5","line":14,"updated":"2015-12-09 10:08:28.000000000","message":"please add in a note about the new configuration variable","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8c0c70646464297453c6e05629568b533598a643","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    - The reference driver integrates Neutron with OpenStack Designate"},{"line_number":12,"context_line":"    - Drivers for other DNSaaS can be implemented"},{"line_number":13,"context_line":"    - Driver is configured in the default section of neutron.conf using"},{"line_number":14,"context_line":"      parameter external_dns_driver"}],"source_content_type":"text/x-yaml","patch_set":34,"id":"7a740942_11a427a4","line":14,"in_reply_to":"7a740942_232e23a5","updated":"2015-12-11 01:22:32.000000000","message":"Above line mentions the configuration variable. I put it between \u0027\u0027 this time around","commit_id":"9074430982edf955460cf0523273a16fca0b31be"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support integration with external DNS service."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IPs and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."}],"source_content_type":"text/x-yaml","patch_set":37,"id":"da6ed579_f3aaf618","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":49},"updated":"2016-01-12 16:49:49.000000000","message":"Do we have a plan to work on some documentation in the networking guide?","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support integration with external DNS service."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IPs and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."}],"source_content_type":"text/x-yaml","patch_set":37,"id":"da6ed579_91b12492","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":49},"in_reply_to":"da6ed579_bc4d2b74","updated":"2016-01-18 23:57:04.000000000","message":"Yes, I will coordinate with Sam-I-Am","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"dc8e3ba84ed81683618ec2f60a5f1cc5bb8fcc3f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support integration with external DNS service."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IPs and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."}],"source_content_type":"text/x-yaml","patch_set":37,"id":"da6ed579_bc4d2b74","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":49},"in_reply_to":"da6ed579_f3aaf618","updated":"2016-01-12 17:15:41.000000000","message":"Talk to me.","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"b2843d9873c1c268f16409e7870679c63aaefcbb","unresolved":false,"context_lines":[{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support integration with external DNS service."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IPs and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."},{"line_number":7,"context_line":"    - Floating IPs can have dns_name and dns_domain attributes associated"},{"line_number":8,"context_line":"      with them"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"da6ed579_93113aaf","line":5,"updated":"2016-01-12 16:49:49.000000000","message":"Maybe put this one after the next two?","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8a5913fd4ea21d978d985cb2a5e8e294f2042a27","unresolved":false,"context_lines":[{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support integration with external DNS service."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"    - Floating IPs and ports will be published in an external DNS service"},{"line_number":6,"context_line":"      if they have dns_name and dns_domain attributes associated with them."},{"line_number":7,"context_line":"    - Floating IPs can have dns_name and dns_domain attributes associated"},{"line_number":8,"context_line":"      with them"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"da6ed579_b18548ae","line":5,"in_reply_to":"da6ed579_93113aaf","updated":"2016-01-18 23:57:04.000000000","message":"Yes, great point. It becomes clearer","commit_id":"2ae3e084d4ba8f1138ff9b343ad21faa013926e8"}],"requirements.txt":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"de2cb818e615334334fe262b3f3ae63d24c6651a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"ovs\u003e\u003d2.4.0;python_version\u003d\u003d\u00272.7\u0027 # Apache-2.0"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"python-novaclient!\u003d2.33.0,\u003e\u003d2.29.0 # Apache-2.0"},{"line_number":46,"context_line":"python-designateclient\u003e\u003d1.5.0"}],"source_content_type":"text/plain","patch_set":38,"id":"9a68dd71_191c5c76","line":46,"range":{"start_line":46,"start_character":7,"end_line":46,"end_character":22},"updated":"2016-01-21 19:49:16.000000000","message":"this must match:\n\npython-designateclient\u003e\u003d1.5.0  # Apache-2.0","commit_id":"e93cc8ce6ad3aadaccb702c5a413dc508d39fdc2"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"ecd41689721694a825148f9dd16d716c7e762991","unresolved":false,"context_lines":[{"line_number":43,"context_line":"ovs\u003e\u003d2.4.0;python_version\u003d\u003d\u00272.7\u0027 # Apache-2.0"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"python-novaclient!\u003d2.33.0,\u003e\u003d2.29.0 # Apache-2.0"},{"line_number":46,"context_line":"python-designateclient\u003e\u003d1.5.0"}],"source_content_type":"text/plain","patch_set":38,"id":"9a68dd71_0d15ec3e","line":46,"range":{"start_line":46,"start_character":7,"end_line":46,"end_character":22},"in_reply_to":"9a68dd71_191c5c76","updated":"2016-01-22 01:25:40.000000000","message":"Done","commit_id":"e93cc8ce6ad3aadaccb702c5a413dc508d39fdc2"}],"setup.cfg":[{"author":{"_account_id":12912,"name":"John Belamaric","email":"jbelamaric@infoblox.com","username":"johnbelamaric"},"change_message_id":"4eec8394b0c8908d00ecadd0bec0f5d8017f136a","unresolved":false,"context_lines":[{"line_number":165,"context_line":"neutron.agent.linux.pd_drivers \u003d"},{"line_number":166,"context_line":"    dibbler \u003d neutron.agent.linux.dibbler:PDDibbler"},{"line_number":167,"context_line":"neutron.external_dns_drivers \u003d"},{"line_number":168,"context_line":"    reference \u003d neutron.services.externaldns.drivers.designate.driver:Designate"},{"line_number":169,"context_line":"# These are for backwards compat with Icehouse notification_driver configuration values"},{"line_number":170,"context_line":"oslo.messaging.notify.drivers \u003d"},{"line_number":171,"context_line":"    neutron.openstack.common.notifier.log_notifier \u003d oslo_messaging.notify._impl_log:LogDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":24,"id":"5a2ca52d_8e7f8faa","line":168,"updated":"2015-10-15 16:01:48.000000000","message":"Shouldn\u0027t you call this \"designate\" instead of \"reference\"? It is the reference driver, but calling it designate is more descriptive.","commit_id":"885998eaf482263e6ad479e2fb89ee22636300c7"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"063d1adba61b04253230d856fdbeddeb89e29f9b","unresolved":false,"context_lines":[{"line_number":165,"context_line":"neutron.agent.linux.pd_drivers \u003d"},{"line_number":166,"context_line":"    dibbler \u003d neutron.agent.linux.dibbler:PDDibbler"},{"line_number":167,"context_line":"neutron.external_dns_drivers \u003d"},{"line_number":168,"context_line":"    reference \u003d neutron.services.externaldns.drivers.designate.driver:Designate"},{"line_number":169,"context_line":"# These are for backwards compat with Icehouse notification_driver configuration values"},{"line_number":170,"context_line":"oslo.messaging.notify.drivers \u003d"},{"line_number":171,"context_line":"    neutron.openstack.common.notifier.log_notifier \u003d oslo_messaging.notify._impl_log:LogDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":24,"id":"3a29b11f_ccdae578","line":168,"in_reply_to":"5a2ca52d_8e7f8faa","updated":"2015-10-18 22:10:26.000000000","message":"Done","commit_id":"885998eaf482263e6ad479e2fb89ee22636300c7"}]}
