)]}'
{".zuul.yaml":[{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"737a6b1489a0dbc5d54d2eca1f3f400739f2239f","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    required-projects:"},{"line_number":124,"context_line":"      - openstack/devstack-gate"},{"line_number":125,"context_line":"      - openstack/neutron"},{"line_number":126,"context_line":"      - openstack/neutron-lib"},{"line_number":127,"context_line":"      - openstack/tempest"},{"line_number":128,"context_line":"    vars:"},{"line_number":129,"context_line":"      tempest_concurrency: 4"},{"line_number":130,"context_line":"      devstack_localrc:"},{"line_number":131,"context_line":"        Q_DVR_MODE: dvr_snat"},{"line_number":132,"context_line":"        # Temp for testing"},{"line_number":133,"context_line":"        LIBS_FROM_GIT: neutron-lib"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"- job:"},{"line_number":136,"context_line":"    name: neutron-tempest-linuxbridge"}],"source_content_type":"text/x-yaml","patch_set":9,"id":"9fb8cfa7_8663dfb1","line":133,"range":{"start_line":126,"start_character":0,"end_line":133,"end_character":34},"updated":"2019-06-17 13:33:40.000000000","message":"With this, the unreleased neutron-lib from master is being used just for being able to show some testing for this patch before the neutron-lib release is being made. This is of course to be reverted before this patch can be merged.","commit_id":"64fd56845f7ac816f9654e9d9b702255dde983d6"}],"/COMMIT_MSG":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"252ec261e183b83c3d9252177b25f9aa9171f7e9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"makes this decision based on various properties of the network that"},{"line_number":13,"context_line":"the subnet is contained in [1]."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO: Fix deleting DNS records on port deletion."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"TODO: Create tests and a release note, update docs."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7faddb67_82ed6025","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":48},"updated":"2019-09-03 15:50:42.000000000","message":"Sorry, can you explain this? I don\u0027t get it","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0c5525a1aaa12c5aa7e0529d68af81215e13a993","unresolved":false,"context_lines":[{"line_number":12,"context_line":"makes this decision based on various properties of the network that"},{"line_number":13,"context_line":"the subnet is contained in [1]."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO: Fix deleting DNS records on port deletion."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"TODO: Create tests and a release note, update docs."},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7faddb67_c7503c61","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":48},"in_reply_to":"7faddb67_82ed6025","updated":"2019-09-04 08:16:56.000000000","message":"I haven\u0027t debugged this completely yet. Might be a duplicate of https://bugs.launchpad.net/neutron/+bug/1812168 .","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e5e6e6feb9a9ea8bc86b4b092543d0dd3220c006","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO: Fix deleting DNS records on port deletion."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"TODO: Create tests and a release note, update docs."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"[0] https://launchpad.net/bugs/1784879"},{"line_number":20,"context_line":"[1] https://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7faddb67_41b77586","line":17,"updated":"2019-09-02 20:21:11.000000000","message":"so is this patch still WIP or those todos should be done in follow up patches?","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0c5525a1aaa12c5aa7e0529d68af81215e13a993","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO: Fix deleting DNS records on port deletion."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"TODO: Create tests and a release note, update docs."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"[0] https://launchpad.net/bugs/1784879"},{"line_number":20,"context_line":"[1] https://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7faddb67_c7d59cb8","line":17,"in_reply_to":"7faddb67_22890c6e","updated":"2019-09-04 08:16:56.000000000","message":"Will add a reno for the next revision, I\u0027ve also get some simple unit tests ready. Would it still make sense to try to target this for Train or would you wait for the U release anyway?","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"d18359915f522ede3df851f80cfe47de804a495b","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO: Fix deleting DNS records on port deletion."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"TODO: Create tests and a release note, update docs."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"[0] https://launchpad.net/bugs/1784879"},{"line_number":20,"context_line":"[1] https://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7faddb67_a4443749","line":17,"in_reply_to":"7faddb67_41b77586","updated":"2019-09-02 20:58:00.000000000","message":"That depends on what reviewers say, I\u0027m open to both options.","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"252ec261e183b83c3d9252177b25f9aa9171f7e9","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"TODO: Fix deleting DNS records on port deletion."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"TODO: Create tests and a release note, update docs."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"[0] https://launchpad.net/bugs/1784879"},{"line_number":20,"context_line":"[1] https://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"7faddb67_22890c6e","line":17,"in_reply_to":"7faddb67_a4443749","updated":"2019-09-03 15:50:42.000000000","message":"I think the docs could be part of the technical debt for this bug.\n\nThe release note should be added here in this patch","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"}],"doc/source/admin/config-dns-int-ext-serv.rst":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d344133d504c546ea8fa1fccbf89b3d239ff1d0e","unresolved":false,"context_lines":[{"line_number":527,"context_line":""},{"line_number":528,"context_line":"When the ``subnet_dns_publish_fixed_ips`` extension is enabled, it is possible"},{"line_number":529,"context_line":"to make a selection per subnet whether DNS records should be published for"},{"line_number":530,"context_line":"fixed IPs that are assigned to ports from that subnet. This happens via the"},{"line_number":531,"context_line":"``dns_publish_fixed_ips`` attribute that this extension adds to subnets."},{"line_number":532,"context_line":"It is a boolean flag with a default value of ``False`` but it can be set"},{"line_number":533,"context_line":"to ``True`` when creating or updating subnets. When the flag is ``True``,"}],"source_content_type":"text/x-rst","patch_set":40,"id":"3fa7e38b_f5389b3b","line":530,"range":{"start_line":530,"start_character":28,"end_line":530,"end_character":36},"updated":"2019-12-09 10:05:43.000000000","message":"shouldn\u0027t be \"to the ports\"","commit_id":"107f52a7c9aa1d4e4dd44cd87cfc0a3a8aa7251f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d344133d504c546ea8fa1fccbf89b3d239ff1d0e","unresolved":false,"context_lines":[{"line_number":528,"context_line":"When the ``subnet_dns_publish_fixed_ips`` extension is enabled, it is possible"},{"line_number":529,"context_line":"to make a selection per subnet whether DNS records should be published for"},{"line_number":530,"context_line":"fixed IPs that are assigned to ports from that subnet. This happens via the"},{"line_number":531,"context_line":"``dns_publish_fixed_ips`` attribute that this extension adds to subnets."},{"line_number":532,"context_line":"It is a boolean flag with a default value of ``False`` but it can be set"},{"line_number":533,"context_line":"to ``True`` when creating or updating subnets. When the flag is ``True``,"},{"line_number":534,"context_line":"all fixed IPs from this subnet are published in the external DNS service,"}],"source_content_type":"text/x-rst","patch_set":40,"id":"3fa7e38b_954127aa","line":531,"range":{"start_line":531,"start_character":61,"end_line":531,"end_character":71},"updated":"2019-12-09 10:05:43.000000000","message":"to the subnets?","commit_id":"107f52a7c9aa1d4e4dd44cd87cfc0a3a8aa7251f"}],"neutron/db/db_base_plugin_common.py":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":138,"context_line":"               \u0027enable_dhcp\u0027: subnet[\u0027enable_dhcp\u0027],"},{"line_number":139,"context_line":"               \u0027ipv6_ra_mode\u0027: subnet[\u0027ipv6_ra_mode\u0027],"},{"line_number":140,"context_line":"               \u0027ipv6_address_mode\u0027: subnet[\u0027ipv6_address_mode\u0027],"},{"line_number":141,"context_line":"               \u0027dns_publish_fixed_ip\u0027: subnet[\u0027dns_publish_fixed_ip\u0027],"},{"line_number":142,"context_line":"               }"},{"line_number":143,"context_line":"        res[\u0027gateway_ip\u0027] \u003d str("},{"line_number":144,"context_line":"                subnet[\u0027gateway_ip\u0027]) if subnet[\u0027gateway_ip\u0027] else None"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_0a442646","line":141,"updated":"2019-10-13 00:21:00.000000000","message":"We don\u0027t need this. See all my other comments","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":138,"context_line":"               \u0027enable_dhcp\u0027: subnet[\u0027enable_dhcp\u0027],"},{"line_number":139,"context_line":"               \u0027ipv6_ra_mode\u0027: subnet[\u0027ipv6_ra_mode\u0027],"},{"line_number":140,"context_line":"               \u0027ipv6_address_mode\u0027: subnet[\u0027ipv6_address_mode\u0027],"},{"line_number":141,"context_line":"               \u0027dns_publish_fixed_ip\u0027: subnet[\u0027dns_publish_fixed_ip\u0027],"},{"line_number":142,"context_line":"               }"},{"line_number":143,"context_line":"        res[\u0027gateway_ip\u0027] \u003d str("},{"line_number":144,"context_line":"                subnet[\u0027gateway_ip\u0027]) if subnet[\u0027gateway_ip\u0027] else None"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_359a8513","line":141,"in_reply_to":"3fa7e38b_0a442646","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                \u0027subnetpool_id\u0027: subnetpool_id,"},{"line_number":334,"context_line":"                \u0027enable_dhcp\u0027: subnet[\u0027enable_dhcp\u0027],"},{"line_number":335,"context_line":"                \u0027gateway_ip\u0027: detail.gateway_ip,"},{"line_number":336,"context_line":"                \u0027dns_publish_fixed_ip\u0027: subnet.get(\u0027dns_publish_fixed_ip\u0027),"},{"line_number":337,"context_line":"                \u0027description\u0027: subnet.get(\u0027description\u0027)}"},{"line_number":338,"context_line":"        if subnet[\u0027ip_version\u0027] \u003d\u003d 6 and subnet[\u0027enable_dhcp\u0027]:"},{"line_number":339,"context_line":"            if validators.is_attr_set(subnet[\u0027ipv6_ra_mode\u0027]):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_aa7632a3","line":336,"updated":"2019-10-13 00:21:00.000000000","message":"Not sure we need this","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":333,"context_line":"                \u0027subnetpool_id\u0027: subnetpool_id,"},{"line_number":334,"context_line":"                \u0027enable_dhcp\u0027: subnet[\u0027enable_dhcp\u0027],"},{"line_number":335,"context_line":"                \u0027gateway_ip\u0027: detail.gateway_ip,"},{"line_number":336,"context_line":"                \u0027dns_publish_fixed_ip\u0027: subnet.get(\u0027dns_publish_fixed_ip\u0027),"},{"line_number":337,"context_line":"                \u0027description\u0027: subnet.get(\u0027description\u0027)}"},{"line_number":338,"context_line":"        if subnet[\u0027ip_version\u0027] \u003d\u003d 6 and subnet[\u0027enable_dhcp\u0027]:"},{"line_number":339,"context_line":"            if validators.is_attr_set(subnet[\u0027ipv6_ra_mode\u0027]):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_d59c510f","line":336,"in_reply_to":"3fa7e38b_aa7632a3","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"}],"neutron/db/migration/alembic_migrations/versions/train/expand/263d454a9655_add_dns_publish_fixed_ip_to_subnets.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"586721acd017febc5b3f561e28131b470c14c52d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                  sa.Column(\u0027dns_publish_fixed_ip\u0027,"},{"line_number":35,"context_line":"                            sa.Boolean(),"},{"line_number":36,"context_line":"                            nullable\u003dTrue,"},{"line_number":37,"context_line":"                            default\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_c129c69b","line":37,"range":{"start_line":37,"start_character":28,"end_line":37,"end_character":35},"updated":"2019-06-17 09:43:29.000000000","message":"in migration should be server_default","commit_id":"cc777bb740a542c8962843904b6e1e2c2e942f69"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"608c766f4f35111cc770b7c01cc9b3e6e4b3feaf","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                  sa.Column(\u0027dns_publish_fixed_ip\u0027,"},{"line_number":35,"context_line":"                            sa.Boolean(),"},{"line_number":36,"context_line":"                            nullable\u003dTrue,"},{"line_number":37,"context_line":"                            default\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_dc6769ea","line":37,"range":{"start_line":37,"start_character":28,"end_line":37,"end_character":35},"in_reply_to":"9fb8cfa7_c129c69b","updated":"2019-06-17 09:51:27.000000000","message":"Thanks, fixed.","commit_id":"cc777bb740a542c8962843904b6e1e2c2e942f69"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"290eb1e72909b98c29099a29f26c36c371ee39b9","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    op.add_column(\u0027subnets\u0027,"},{"line_number":34,"context_line":"                  sa.Column(\u0027dns_publish_fixed_ip\u0027,"},{"line_number":35,"context_line":"                            sa.Boolean(),"},{"line_number":36,"context_line":"                            nullable\u003dTrue,"},{"line_number":37,"context_line":"                            server_default\u003dsa.sql.false()))"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_e0e104fe","line":36,"updated":"2019-06-21 17:03:36.000000000","message":"Do we need to allow this parameter to be nullable? I\u0027m saying this because of [1]: here we are forcing this parameter to \"False\" in case the parameter is not given.\n\n[1] https://review.opendev.org/#/c/662409/10/neutron/plugins/ml2/extensions/subnet_dns_publish_fixed_ip.py@34","commit_id":"9326e53ffb0fc43003e57fb7f6909ea1904e7ccc"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"5faa9c3c84f6828e52fc849093adcb9b8bdd0387","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    op.add_column(\u0027subnets\u0027,"},{"line_number":34,"context_line":"                  sa.Column(\u0027dns_publish_fixed_ip\u0027,"},{"line_number":35,"context_line":"                            sa.Boolean(),"},{"line_number":36,"context_line":"                            nullable\u003dTrue,"},{"line_number":37,"context_line":"                            server_default\u003dsa.sql.false()))"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_f480e548","line":36,"in_reply_to":"9fb8cfa7_e0e104fe","updated":"2019-06-21 18:25:32.000000000","message":"Probably you are right in that this is not needed, will drop it. According to the docs, it would only be used in a create_table statement, not in add_column().","commit_id":"9326e53ffb0fc43003e57fb7f6909ea1904e7ccc"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":29,"context_line":"down_revision \u003d \u0027c613d0b82681\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.add_column(\u0027subnets\u0027,"},{"line_number":34,"context_line":"                  sa.Column(\u0027dns_publish_fixed_ip\u0027,"},{"line_number":35,"context_line":"                            sa.Boolean(),"},{"line_number":36,"context_line":"                            server_default\u003dsa.sql.false()))"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_a71aeb79","line":36,"range":{"start_line":32,"start_character":0,"end_line":36,"end_character":59},"updated":"2019-10-13 00:21:00.000000000","message":"Please see my comment to https://review.opendev.org/#/c/662409/20/neutron/db/models_v2.py@202 and adjust accordingly","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":29,"context_line":"down_revision \u003d \u0027c613d0b82681\u0027"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.add_column(\u0027subnets\u0027,"},{"line_number":34,"context_line":"                  sa.Column(\u0027dns_publish_fixed_ip\u0027,"},{"line_number":35,"context_line":"                            sa.Boolean(),"},{"line_number":36,"context_line":"                            server_default\u003dsa.sql.false()))"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_d5e771ab","line":36,"range":{"start_line":32,"start_character":0,"end_line":36,"end_character":59},"in_reply_to":"3fa7e38b_a71aeb79","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"}],"neutron/db/migration/alembic_migrations/versions/ussuri/expand/263d454a9655_add_dns_publish_fixed_ip_to_subnets.py":[{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"8355b9e646cc5c26718f41d762ca905ec9b678dc","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Revision ID: 263d454a9655"},{"line_number":22,"context_line":"Revises: 86274d77933e"},{"line_number":23,"context_line":"Create Date: 2019-05-24 10:00:00.000000"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\"\"\""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_b3ddb06e","line":23,"updated":"2019-12-03 10:00:18.000000000","message":"Question to reviewers as I need to rebase this once more after some other new migration was merged:\n\nWould I still leave this at the original date or should I reset this to the current date?","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"65d2ca697c58f2a452bfa38f71ecb8c49bcd6028","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Revision ID: 263d454a9655"},{"line_number":22,"context_line":"Revises: 86274d77933e"},{"line_number":23,"context_line":"Create Date: 2019-05-24 10:00:00.000000"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\"\"\""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_7e5e1c7a","line":23,"in_reply_to":"3fa7e38b_939af46c","updated":"2019-12-03 15:31:03.000000000","message":"O.k., I\u0027ll leave it like it is, then. Here\u0027s hoping that this is going to be the final rebase of this baby ...","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"200f82ff7495128cc550bf8495832eb62a56f950","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Revision ID: 263d454a9655"},{"line_number":22,"context_line":"Revises: 86274d77933e"},{"line_number":23,"context_line":"Create Date: 2019-05-24 10:00:00.000000"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\"\"\""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_939af46c","line":23,"in_reply_to":"3fa7e38b_b3ddb06e","updated":"2019-12-03 10:12:26.000000000","message":"IMO it can stay like it\u0027s now but it\u0027s up to You :)","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"bc064ef2450f6bab517d8573cadb2b3c72e45bd3","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027subnetdnspublishfixedips\u0027,"},{"line_number":34,"context_line":"                    sa.Column(\u0027subnet_id\u0027,"},{"line_number":35,"context_line":"                              sa.String(length\u003d36),"},{"line_number":36,"context_line":"                              nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_0f3334f9","line":33,"range":{"start_line":33,"start_character":21,"end_line":33,"end_character":45},"updated":"2019-12-03 15:45:06.000000000","message":"How about the table name \"subnet_dns_publish_fixed_ips\"?","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e3dbf4842ff328d78acd2fb31a832a1cb6a37351","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027subnetdnspublishfixedips\u0027,"},{"line_number":34,"context_line":"                    sa.Column(\u0027subnet_id\u0027,"},{"line_number":35,"context_line":"                              sa.String(length\u003d36),"},{"line_number":36,"context_line":"                              nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_afe0e098","line":33,"range":{"start_line":33,"start_character":21,"end_line":33,"end_character":45},"in_reply_to":"3fa7e38b_0f3334f9","updated":"2019-12-04 18:23:44.000000000","message":"Done","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e3dbf4842ff328d78acd2fb31a832a1cb6a37351","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027subnetdnspublishfixedips\u0027,"},{"line_number":34,"context_line":"                    sa.Column(\u0027subnet_id\u0027,"},{"line_number":35,"context_line":"                              sa.String(length\u003d36),"},{"line_number":36,"context_line":"                              nullable\u003dFalse,"},{"line_number":37,"context_line":"                              index\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027dns_publish_fixed_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_cfdbdce7","line":35,"updated":"2019-12-04 18:23:44.000000000","message":"should this one use the neutron-lib constant, too?","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0be9bdf1390be52185b56435b11e9ae2e45c92c6","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027subnetdnspublishfixedips\u0027,"},{"line_number":34,"context_line":"                    sa.Column(\u0027subnet_id\u0027,"},{"line_number":35,"context_line":"                              sa.String(length\u003d36),"},{"line_number":36,"context_line":"                              nullable\u003dFalse,"},{"line_number":37,"context_line":"                              index\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027dns_publish_fixed_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_7e390ed6","line":35,"in_reply_to":"3fa7e38b_a27f79dd","updated":"2019-12-05 20:06:55.000000000","message":"Thanks for confirming, done.","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fb9ca5d9b163b899d81569bea663b59d5c4507b7","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027subnetdnspublishfixedips\u0027,"},{"line_number":34,"context_line":"                    sa.Column(\u0027subnet_id\u0027,"},{"line_number":35,"context_line":"                              sa.String(length\u003d36),"},{"line_number":36,"context_line":"                              nullable\u003dFalse,"},{"line_number":37,"context_line":"                              index\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027dns_publish_fixed_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_a27f79dd","line":35,"in_reply_to":"3fa7e38b_cfdbdce7","updated":"2019-12-05 01:05:52.000000000","message":"Yes, it should.\n\nfrom neutron_lib.db import constants as db_const\nand\ndb_const.UUID_FIELD_SIZE","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fb9ca5d9b163b899d81569bea663b59d5c4507b7","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027subnet_dns_publish_fixed_ips\u0027,"},{"line_number":34,"context_line":"                    sa.Column(\u0027subnet_id\u0027,"},{"line_number":35,"context_line":"                              sa.String(length\u003d36),"},{"line_number":36,"context_line":"                              nullable\u003dFalse,"},{"line_number":37,"context_line":"                              index\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027dns_publish_fixed_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_6252e16a","line":35,"range":{"start_line":35,"start_character":47,"end_line":35,"end_character":49},"updated":"2019-12-05 01:05:52.000000000","message":"Plz see my comment in patch set 34.","commit_id":"9bc4e814bb5ec8edeb0234a9ae94da58c1e47dac"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0be9bdf1390be52185b56435b11e9ae2e45c92c6","unresolved":false,"context_lines":[{"line_number":32,"context_line":"def upgrade():"},{"line_number":33,"context_line":"    op.create_table(\u0027subnet_dns_publish_fixed_ips\u0027,"},{"line_number":34,"context_line":"                    sa.Column(\u0027subnet_id\u0027,"},{"line_number":35,"context_line":"                              sa.String(length\u003d36),"},{"line_number":36,"context_line":"                              nullable\u003dFalse,"},{"line_number":37,"context_line":"                              index\u003dTrue),"},{"line_number":38,"context_line":"                    sa.Column(\u0027dns_publish_fixed_ip\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_9e364ae7","line":35,"range":{"start_line":35,"start_character":47,"end_line":35,"end_character":49},"in_reply_to":"3fa7e38b_6252e16a","updated":"2019-12-05 20:06:55.000000000","message":"Done","commit_id":"9bc4e814bb5ec8edeb0234a9ae94da58c1e47dac"}],"neutron/db/models/dns.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"8b515a47982d6bd66fdce29ddc3b4fddd4078dd8","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    # Add a relationship to the Subnet model in order to instruct"},{"line_number":115,"context_line":"    # SQLAlchemy to eagerly load this association"},{"line_number":116,"context_line":"    subnet \u003d orm.relationship(models_v2.Subnet,"},{"line_number":117,"context_line":"                              load_on_pending\u003dTrue,"},{"line_number":118,"context_line":"                              backref\u003dorm.backref(\"dns_publish_fixed_ip\","},{"line_number":119,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"}],"source_content_type":"text/x-python","patch_set":42,"id":"3fa7e38b_696348ac","line":116,"updated":"2019-12-11 21:08:51.000000000","message":"I wonder if this is the issue you are encountering when your test code gets the \"NotImplementedError: in_() not yet supported for relationships.  For a simple many-to-one, use in_() against the set of foreign key values.\" error.  As the error suggests, you need to use in_ against the foreign keys instead.  But since the \u0027_in()\u0027 is buried in the depths of neutron_lib model_query.py [1] I am not sure how to avoid this unless it is to reverse the relationship.\n\n[1] https://opendev.org/openstack/neutron-lib/src/branch/master/neutron_lib/db/model_query.py#L199","commit_id":"abd66bc402b294fe3ad4c5e514c3ea1d69108674"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"661a13492334936759d4ab986a3c6567de30d6bd","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    # Add a relationship to the Subnet model in order to instruct"},{"line_number":115,"context_line":"    # SQLAlchemy to eagerly load this association"},{"line_number":116,"context_line":"    subnet \u003d orm.relationship(models_v2.Subnet,"},{"line_number":117,"context_line":"                              load_on_pending\u003dTrue,"},{"line_number":118,"context_line":"                              backref\u003dorm.backref(\"dns_publish_fixed_ip\","},{"line_number":119,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"}],"source_content_type":"text/x-python","patch_set":42,"id":"3fa7e38b_7e6e4aff","line":116,"in_reply_to":"3fa7e38b_004382b1","updated":"2019-12-17 20:36:29.000000000","message":"Sure, I am all right with that, since it\u0027s not a special case.  If you wouldn\u0027t mind putting the details in an LP bug I can get some attention from our resident SQLAlchemy expert on it. Thanks!","commit_id":"abd66bc402b294fe3ad4c5e514c3ea1d69108674"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"a72be329f637689ea03304968c7e263cba5d01f1","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    # Add a relationship to the Subnet model in order to instruct"},{"line_number":115,"context_line":"    # SQLAlchemy to eagerly load this association"},{"line_number":116,"context_line":"    subnet \u003d orm.relationship(models_v2.Subnet,"},{"line_number":117,"context_line":"                              load_on_pending\u003dTrue,"},{"line_number":118,"context_line":"                              backref\u003dorm.backref(\"dns_publish_fixed_ip\","},{"line_number":119,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"}],"source_content_type":"text/x-python","patch_set":42,"id":"3fa7e38b_004382b1","line":116,"in_reply_to":"3fa7e38b_696348ac","updated":"2019-12-12 07:49:56.000000000","message":"I copied this code from the NetworkDNSDomain class above, as suggested by mlavalle in an earlier review. It seems that that code already has the same bug, see https://bugs.launchpad.net/neutron/+bug/1818318 .\n\nSo when there is a fix for that bug, it should fix the issue at hand here, too. Maybe we can accept this as a known issue and get the feature merged anyway?","commit_id":"abd66bc402b294fe3ad4c5e514c3ea1d69108674"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"ed8f7b49ea749bf04fa24030b6e7493ee06c6166","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    # Add a relationship to the Subnet model in order to instruct"},{"line_number":115,"context_line":"    # SQLAlchemy to eagerly load this association"},{"line_number":116,"context_line":"    subnet \u003d orm.relationship(models_v2.Subnet,"},{"line_number":117,"context_line":"                              load_on_pending\u003dTrue,"},{"line_number":118,"context_line":"                              backref\u003dorm.backref(\"dns_publish_fixed_ip\","},{"line_number":119,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"}],"source_content_type":"text/x-python","patch_set":42,"id":"3fa7e38b_23dd1641","line":116,"in_reply_to":"3fa7e38b_7e6e4aff","updated":"2019-12-18 05:42:40.000000000","message":"Yes, will do that after the upcoming holidays.","commit_id":"abd66bc402b294fe3ad4c5e514c3ea1d69108674"}],"neutron/db/models/subnet_dns_publish_fixed_ip.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e03d5d6c49059bbbd4bbf90075f831edaf8da80d","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class SubnetDNSPublishFixedIP(model_base.BASEV2):"},{"line_number":23,"context_line":"    subnet_id \u003d sa.Column(sa.String(36),"},{"line_number":24,"context_line":"                          sa.ForeignKey(\u0027subnets.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":25,"context_line":"                          primary_key\u003dTrue,"},{"line_number":26,"context_line":"                          index\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_18370301","line":23,"range":{"start_line":23,"start_character":36,"end_line":23,"end_character":38},"updated":"2019-12-03 09:46:54.000000000","message":"there is constant for this in https://github.com/openstack/neutron-lib/blob/master/neutron_lib/db/constants.py#L20","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"65d2ca697c58f2a452bfa38f71ecb8c49bcd6028","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class SubnetDNSPublishFixedIP(model_base.BASEV2):"},{"line_number":23,"context_line":"    subnet_id \u003d sa.Column(sa.String(36),"},{"line_number":24,"context_line":"                          sa.ForeignKey(\u0027subnets.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":25,"context_line":"                          primary_key\u003dTrue,"},{"line_number":26,"context_line":"                          index\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_1e64c84c","line":23,"range":{"start_line":23,"start_character":36,"end_line":23,"end_character":38},"in_reply_to":"3fa7e38b_18370301","updated":"2019-12-03 15:31:03.000000000","message":"Done","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"bc064ef2450f6bab517d8573cadb2b3c72e45bd3","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.db import models_v2"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class SubnetDNSPublishFixedIP(model_base.BASEV2):"},{"line_number":24,"context_line":"    subnet_id \u003d sa.Column(sa.String(constants.UUID_FIELD_SIZE),"},{"line_number":25,"context_line":"                          sa.ForeignKey(\u0027subnets.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":26,"context_line":"                          primary_key\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_cf88bc6c","line":23,"updated":"2019-12-03 15:45:06.000000000","message":"Add table name:\n__tablename__ \u003d \"subnet_dns_publish_fixed_ips\"","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e3dbf4842ff328d78acd2fb31a832a1cb6a37351","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.db import models_v2"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class SubnetDNSPublishFixedIP(model_base.BASEV2):"},{"line_number":24,"context_line":"    subnet_id \u003d sa.Column(sa.String(constants.UUID_FIELD_SIZE),"},{"line_number":25,"context_line":"                          sa.ForeignKey(\u0027subnets.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":26,"context_line":"                          primary_key\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_ef51f864","line":23,"in_reply_to":"3fa7e38b_cf88bc6c","updated":"2019-12-04 18:23:44.000000000","message":"Done","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"9e5ecb7bdcf58b8c15f73cde75a5844094c8d6e8","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.db import models_v2"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class SubnetDNSPublishFixedIP(model_base.BASEV2):"},{"line_number":24,"context_line":"    __tablename__ \u003d \"subnet_dns_publish_fixed_ips\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    subnet_id \u003d sa.Column(sa.String(constants.UUID_FIELD_SIZE),"},{"line_number":27,"context_line":"                          sa.ForeignKey(\u0027subnets.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":28,"context_line":"                          primary_key\u003dTrue,"},{"line_number":29,"context_line":"                          index\u003dTrue)"},{"line_number":30,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean(),"},{"line_number":31,"context_line":"                                     nullable\u003dFalse,"},{"line_number":32,"context_line":"                                     server_default\u003dsql.false())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    # Add a relationship to the Subnet model in order to instruct"},{"line_number":35,"context_line":"    # SQLAlchemy to eagerly load this association"},{"line_number":36,"context_line":"    subnet \u003d orm.relationship(models_v2.Subnet,"},{"line_number":37,"context_line":"                              load_on_pending\u003dTrue,"},{"line_number":38,"context_line":"                              backref\u003dorm.backref(\"dns_publish_fixed_ip\","},{"line_number":39,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"},{"line_number":40,"context_line":"                                                  uselist\u003dFalse,"},{"line_number":41,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":42,"context_line":"    revises_on_change \u003d (\u0027subnet\u0027, )"}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_29f05491","line":42,"range":{"start_line":23,"start_character":0,"end_line":42,"end_character":36},"updated":"2019-12-04 21:43:30.000000000","message":"I wonder why not put this table definition in neutron/db/models/dns_py. IMO it would be easier to  future reader of the code to have all the dns integration tables under one module. This is a minot thing, so feel free to ignore","commit_id":"9bc4e814bb5ec8edeb0234a9ae94da58c1e47dac"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0be9bdf1390be52185b56435b11e9ae2e45c92c6","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.db import models_v2"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class SubnetDNSPublishFixedIP(model_base.BASEV2):"},{"line_number":24,"context_line":"    __tablename__ \u003d \"subnet_dns_publish_fixed_ips\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    subnet_id \u003d sa.Column(sa.String(constants.UUID_FIELD_SIZE),"},{"line_number":27,"context_line":"                          sa.ForeignKey(\u0027subnets.id\u0027, ondelete\u003d\"CASCADE\"),"},{"line_number":28,"context_line":"                          primary_key\u003dTrue,"},{"line_number":29,"context_line":"                          index\u003dTrue)"},{"line_number":30,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean(),"},{"line_number":31,"context_line":"                                     nullable\u003dFalse,"},{"line_number":32,"context_line":"                                     server_default\u003dsql.false())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    # Add a relationship to the Subnet model in order to instruct"},{"line_number":35,"context_line":"    # SQLAlchemy to eagerly load this association"},{"line_number":36,"context_line":"    subnet \u003d orm.relationship(models_v2.Subnet,"},{"line_number":37,"context_line":"                              load_on_pending\u003dTrue,"},{"line_number":38,"context_line":"                              backref\u003dorm.backref(\"dns_publish_fixed_ip\","},{"line_number":39,"context_line":"                                                  lazy\u003d\u0027joined\u0027,"},{"line_number":40,"context_line":"                                                  uselist\u003dFalse,"},{"line_number":41,"context_line":"                                                  cascade\u003d\u0027delete\u0027))"},{"line_number":42,"context_line":"    revises_on_change \u003d (\u0027subnet\u0027, )"}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_bb0d5841","line":42,"range":{"start_line":23,"start_character":0,"end_line":42,"end_character":36},"in_reply_to":"3fa7e38b_29f05491","updated":"2019-12-05 20:06:55.000000000","message":"Initially I thought that this would make it better findable as being subnet-related, but looking at it now, I think you are right. Done.","commit_id":"9bc4e814bb5ec8edeb0234a9ae94da58c1e47dac"}],"neutron/db/models_v2.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"290eb1e72909b98c29099a29f26c36c371ee39b9","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                                          constants.DHCPV6_STATELESS,"},{"line_number":199,"context_line":"                                          name\u003d\u0027ipv6_address_modes\u0027),"},{"line_number":200,"context_line":"                                  nullable\u003dTrue)"},{"line_number":201,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean())"},{"line_number":202,"context_line":"    # subnets don\u0027t have their own rbac_entries, they just inherit from"},{"line_number":203,"context_line":"    # the network rbac entries"},{"line_number":204,"context_line":"    rbac_entries \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_e0458416","line":201,"updated":"2019-06-21 17:03:36.000000000","message":"This parameter is nullable: https://review.opendev.org/#/c/662409/10/neutron/db/migration/alembic_migrations/versions/train/expand/263d454a9655_add_dns_publish_fixed_ip_to_subnets.py@36","commit_id":"9326e53ffb0fc43003e57fb7f6909ea1904e7ccc"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"5faa9c3c84f6828e52fc849093adcb9b8bdd0387","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                                          constants.DHCPV6_STATELESS,"},{"line_number":199,"context_line":"                                          name\u003d\u0027ipv6_address_modes\u0027),"},{"line_number":200,"context_line":"                                  nullable\u003dTrue)"},{"line_number":201,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean())"},{"line_number":202,"context_line":"    # subnets don\u0027t have their own rbac_entries, they just inherit from"},{"line_number":203,"context_line":"    # the network rbac entries"},{"line_number":204,"context_line":"    rbac_entries \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_34319da3","line":201,"in_reply_to":"9fb8cfa7_e0458416","updated":"2019-06-21 18:25:32.000000000","message":"I copied this from the enable_dhcp example above. That parameter is also created as nullable in [1], but not mentioned above.\n\n[1] https://opendev.org/openstack/neutron/src/branch/master/neutron/db/migration/alembic_migrations/core_init_ops.py#L66","commit_id":"9326e53ffb0fc43003e57fb7f6909ea1904e7ccc"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e5e6e6feb9a9ea8bc86b4b092543d0dd3220c006","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                          name\u003d\u0027ipv6_address_modes\u0027),"},{"line_number":201,"context_line":"                                  nullable\u003dTrue)"},{"line_number":202,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean(),"},{"line_number":203,"context_line":"                                     server_default\u003dsa.sql.false())"},{"line_number":204,"context_line":"    # subnets don\u0027t have their own rbac_entries, they just inherit from"},{"line_number":205,"context_line":"    # the network rbac entries"},{"line_number":206,"context_line":"    rbac_entries \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_814fad90","line":203,"range":{"start_line":203,"start_character":37,"end_line":203,"end_character":51},"updated":"2019-09-02 20:21:11.000000000","message":"IIUC https://github.com/openstack/neutron/blob/a388701ddfe628e9a5bd16a78422164799b11ef8/doc/source/contributor/internals/db_layer.rst it is not needed here to use server_default value. It will be already set as default value on db\u0027s side by migration script","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"252ec261e183b83c3d9252177b25f9aa9171f7e9","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                          name\u003d\u0027ipv6_address_modes\u0027),"},{"line_number":201,"context_line":"                                  nullable\u003dTrue)"},{"line_number":202,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean(),"},{"line_number":203,"context_line":"                                     server_default\u003dsa.sql.false())"},{"line_number":204,"context_line":"    # subnets don\u0027t have their own rbac_entries, they just inherit from"},{"line_number":205,"context_line":"    # the network rbac entries"},{"line_number":206,"context_line":"    rbac_entries \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_623ce4be","line":203,"range":{"start_line":203,"start_character":37,"end_line":203,"end_character":51},"in_reply_to":"7faddb67_04374be5","updated":"2019-09-03 15:50:42.000000000","message":"Because dns_publish_fixed_ip is not nullable, we need here \"default\u003dFalse\"","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"d18359915f522ede3df851f80cfe47de804a495b","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                          name\u003d\u0027ipv6_address_modes\u0027),"},{"line_number":201,"context_line":"                                  nullable\u003dTrue)"},{"line_number":202,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean(),"},{"line_number":203,"context_line":"                                     server_default\u003dsa.sql.false())"},{"line_number":204,"context_line":"    # subnets don\u0027t have their own rbac_entries, they just inherit from"},{"line_number":205,"context_line":"    # the network rbac entries"},{"line_number":206,"context_line":"    rbac_entries \u003d orm.relationship("}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_04374be5","line":203,"range":{"start_line":203,"start_character":37,"end_line":203,"end_character":51},"in_reply_to":"7faddb67_814fad90","updated":"2019-09-02 20:58:00.000000000","message":"Well the errors in the functional tests on the previous PS tell a different story. I added the server_default to the migration script based on reviews in earlier revisions.","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                                          constants.DHCPV6_STATELESS,"},{"line_number":200,"context_line":"                                          name\u003d\u0027ipv6_address_modes\u0027),"},{"line_number":201,"context_line":"                                  nullable\u003dTrue)"},{"line_number":202,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean(),"},{"line_number":203,"context_line":"                                     server_default\u003dsa.sql.false())"},{"line_number":204,"context_line":"    # subnets don\u0027t have their own rbac_entries, they just inherit from"},{"line_number":205,"context_line":"    # the network rbac entries"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_07289f94","line":202,"updated":"2019-10-13 00:21:00.000000000","message":"Subnets are one of the 3 fundamental abstractions (along with networks and ports) of Neutron. Everything else is considered an extension and for the purposes of DB models, we try to keep their added attributes out of this models_v2.py. The perfect example in this case is the dns_domain attribute for networks: https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/db/models/dns.py#L22-L38. Please implement this new attribute in a similar way. This will also keep us consistent with the way the external DNS integration extensions have been implemented over time. As you see in the rest of my comments, this consistency is the major theme of my review","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                                          constants.DHCPV6_STATELESS,"},{"line_number":200,"context_line":"                                          name\u003d\u0027ipv6_address_modes\u0027),"},{"line_number":201,"context_line":"                                  nullable\u003dTrue)"},{"line_number":202,"context_line":"    dns_publish_fixed_ip \u003d sa.Column(sa.Boolean(),"},{"line_number":203,"context_line":"                                     server_default\u003dsa.sql.false())"},{"line_number":204,"context_line":"    # subnets don\u0027t have their own rbac_entries, they just inherit from"},{"line_number":205,"context_line":"    # the network rbac entries"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_f5838dc9","line":202,"in_reply_to":"3fa7e38b_07289f94","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"}],"neutron/db/subnet_dns_publish_fixed_ip_mixin.py":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron_lib.db import resource_extend"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@resource_extend.has_resource_extenders"},{"line_number":21,"context_line":"class SubnetDNSPublishFixedIPMixin(object):"},{"line_number":22,"context_line":"    \"\"\"Mixin class to extend subnet with dns_publish_fixed_ip attribute\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @staticmethod"},{"line_number":25,"context_line":"    @resource_extend.extends([subnet_def.COLLECTION_NAME])"},{"line_number":26,"context_line":"    def _extend_subnet_dns_publish_fixed_ip(subnet_res, subnet_db):"},{"line_number":27,"context_line":"        subnet_res[\u0027dns_publish_fixed_ip\u0027] \u003d subnet_db.dns_publish_fixed_ip"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_87156f4b","line":27,"range":{"start_line":20,"start_character":0,"end_line":27,"end_character":75},"updated":"2019-10-13 00:21:00.000000000","message":"The entire reason of this mixin is to extend the subnet response dictionary. Please note that the external DNS integration extensions are implemented as ML2 extensions drivers (https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/plugins/ml2/extensions/dns_integration.py#L38), which are handled by the ML2 extensions manager. This manager will attempt to call an extend_subnet_dict method in each loaded ml2 extension driver https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/plugins/ml2/managers.py#L1166. So extending the subnet dictionary should be implemented with a extend_subnet_dict method. The perfect example to follow for this is the way the dns_domain for ports is handled: https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/plugins/ml2/extensions/dns_integration.py#L395-L403","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from neutron_lib.db import resource_extend"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"@resource_extend.has_resource_extenders"},{"line_number":21,"context_line":"class SubnetDNSPublishFixedIPMixin(object):"},{"line_number":22,"context_line":"    \"\"\"Mixin class to extend subnet with dns_publish_fixed_ip attribute\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @staticmethod"},{"line_number":25,"context_line":"    @resource_extend.extends([subnet_def.COLLECTION_NAME])"},{"line_number":26,"context_line":"    def _extend_subnet_dns_publish_fixed_ip(subnet_res, subnet_db):"},{"line_number":27,"context_line":"        subnet_res[\u0027dns_publish_fixed_ip\u0027] \u003d subnet_db.dns_publish_fixed_ip"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_d580d1c1","line":27,"range":{"start_line":20,"start_character":0,"end_line":27,"end_character":75},"in_reply_to":"3fa7e38b_87156f4b","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"}],"neutron/extensions/subnet_dns_publish_fixed_ip.py":[{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"368f3b2ccf762ec8d80885b63e6fe3c0131449d5","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from neutron_lib.api.definitions import subnet_dns_publish_fixed_ip as apidef"},{"line_number":14,"context_line":"from neutron_lib.api import extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_f35dbb48","line":13,"updated":"2019-06-17 13:14:21.000000000","message":"We need to wait for neutron-lib to be released with the extension before it can be used.","commit_id":"64fd56845f7ac816f9654e9d9b702255dde983d6"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":19,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def _disable_extension_by_dep(aliases):"},{"line_number":23,"context_line":"    if dns.ALIAS not in aliases:"},{"line_number":24,"context_line":"        aliases.remove(apidef.ALIAS)"},{"line_number":25,"context_line":"        LOG.info(\u0027Disabled %s extension.\u0027, apidef.ALIAS)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class Subnet_dns_publish_fixed_ip(extensions.APIExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_470bf728","line":25,"range":{"start_line":22,"start_character":0,"end_line":25,"end_character":56},"updated":"2019-10-13 00:21:00.000000000","message":"Since I am recommending that we keep consistent with the approach that we used historically to implement the external DNS integration extensions as ML2 extension drivers, we are not going to need this. Please remove","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":19,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def _disable_extension_by_dep(aliases):"},{"line_number":23,"context_line":"    if dns.ALIAS not in aliases:"},{"line_number":24,"context_line":"        aliases.remove(apidef.ALIAS)"},{"line_number":25,"context_line":"        LOG.info(\u0027Disabled %s extension.\u0027, apidef.ALIAS)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class Subnet_dns_publish_fixed_ip(extensions.APIExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_958a59bc","line":25,"range":{"start_line":22,"start_character":0,"end_line":25,"end_character":56},"in_reply_to":"3fa7e38b_470bf728","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b07a426e8e7a01e89d4df482ad224ecd0bc4f21c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from neutron_lib.api.definitions import subnet_dns_publish_fixed_ip as apidef"},{"line_number":14,"context_line":"from neutron_lib.api import extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class Subnet_dns_publish_fixed_ip(extensions.APIExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_e20d7c8f","line":18,"range":{"start_line":16,"start_character":0,"end_line":18,"end_character":33},"updated":"2019-12-04 15:26:54.000000000","message":"unused.","commit_id":"eeeab39df788e84789f3d748f144d95a21761e6b"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e3dbf4842ff328d78acd2fb31a832a1cb6a37351","unresolved":false,"context_lines":[{"line_number":13,"context_line":"from neutron_lib.api.definitions import subnet_dns_publish_fixed_ip as apidef"},{"line_number":14,"context_line":"from neutron_lib.api import extensions"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class Subnet_dns_publish_fixed_ip(extensions.APIExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_3c47334f","line":18,"range":{"start_line":16,"start_character":0,"end_line":18,"end_character":33},"in_reply_to":"3fa7e38b_e20d7c8f","updated":"2019-12-04 18:23:44.000000000","message":"Done","commit_id":"eeeab39df788e84789f3d748f144d95a21761e6b"}],"neutron/objects/subnet.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"290eb1e72909b98c29099a29f26c36c371ee39b9","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        \u0027service_types\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":217,"context_line":"        \u0027dns_publish_fixed_ip\u0027: obj_fields.BooleanField(nullable\u003dTrue),"},{"line_number":218,"context_line":"    }"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"},{"line_number":221,"context_line":"                        \u0027service_types\u0027, \u0027shared\u0027]"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_2012bc0a","line":219,"updated":"2019-06-21 17:03:36.000000000","message":"Please, implement obj_make_compatible: https://github.com/openstack/neutron/blob/master/doc/source/contributor/internals/objects_usage.rst#defining-your-own-object","commit_id":"9326e53ffb0fc43003e57fb7f6909ea1904e7ccc"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"5faa9c3c84f6828e52fc849093adcb9b8bdd0387","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        \u0027service_types\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":217,"context_line":"        \u0027dns_publish_fixed_ip\u0027: obj_fields.BooleanField(nullable\u003dTrue),"},{"line_number":218,"context_line":"    }"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"},{"line_number":221,"context_line":"                        \u0027service_types\u0027, \u0027shared\u0027]"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_148a591a","line":219,"in_reply_to":"9fb8cfa7_2012bc0a","updated":"2019-06-21 18:25:32.000000000","message":"Oh, I didn\u0027t know that document, thanks for the pointer, will do.","commit_id":"9326e53ffb0fc43003e57fb7f6909ea1904e7ccc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"252ec261e183b83c3d9252177b25f9aa9171f7e9","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            # subnets. Happens on routed networks when host isn\u0027t known."},{"line_number":415,"context_line":"            raise ipam_exceptions.DeferIpam()"},{"line_number":416,"context_line":"        return False"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":419,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":420,"context_line":"        if _target_version \u003c (1, 1):  # version 1.1 adds \"dns_publish_fixed_ip\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_22b02c40","line":417,"updated":"2019-09-03 15:50:42.000000000","message":"You should also add a UT for this","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0c5525a1aaa12c5aa7e0529d68af81215e13a993","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            # subnets. Happens on routed networks when host isn\u0027t known."},{"line_number":415,"context_line":"            raise ipam_exceptions.DeferIpam()"},{"line_number":416,"context_line":"        return False"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":419,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":420,"context_line":"        if _target_version \u003c (1, 1):  # version 1.1 adds \"dns_publish_fixed_ip\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_4f68f01f","line":417,"in_reply_to":"7faddb67_22b02c40","updated":"2019-09-04 08:16:56.000000000","message":"Do you mean for the function below? Do you have an example for that?","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"48f9a4ab8c577900163bdc4e3489658bf48dca1c","unresolved":false,"context_lines":[{"line_number":414,"context_line":"            # subnets. Happens on routed networks when host isn\u0027t known."},{"line_number":415,"context_line":"            raise ipam_exceptions.DeferIpam()"},{"line_number":416,"context_line":"        return False"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":419,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":420,"context_line":"        if _target_version \u003c (1, 1):  # version 1.1 adds \"dns_publish_fixed_ip\""}],"source_content_type":"text/x-python","patch_set":18,"id":"5faad753_99757d9b","line":417,"in_reply_to":"7faddb67_4f68f01f","updated":"2019-09-06 15:11:12.000000000","message":"test_object_version_degradation_1_1_to_1_0_no_shared","commit_id":"8b20a63f25a9e6042306fc955e6c45f84aeb31af"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        \u0027ipv6_ra_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":220,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":221,"context_line":"        \u0027service_types\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":222,"context_line":"        \u0027dns_publish_fixed_ip\u0027: obj_fields.BooleanField(nullable\u003dTrue),"},{"line_number":223,"context_line":"    }"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_2a13225e","line":222,"updated":"2019-10-13 00:21:00.000000000","message":"Given my comment to https://review.opendev.org/#/c/662409/20/neutron/db/models_v2.py@202, you are also going to need something similar to https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/objects/network.py#L361-L382","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        \u0027ipv6_ra_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":220,"context_line":"        \u0027ipv6_address_mode\u0027: common_types.IPV6ModeEnumField(nullable\u003dTrue),"},{"line_number":221,"context_line":"        \u0027service_types\u0027: obj_fields.ListOfStringsField(nullable\u003dTrue),"},{"line_number":222,"context_line":"        \u0027dns_publish_fixed_ip\u0027: obj_fields.BooleanField(nullable\u003dTrue),"},{"line_number":223,"context_line":"    }"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    synthetic_fields \u003d [\u0027allocation_pools\u0027, \u0027dns_nameservers\u0027, \u0027host_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_152d09fd","line":222,"in_reply_to":"3fa7e38b_2a13225e","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"bc064ef2450f6bab517d8573cadb2b3c72e45bd3","unresolved":false,"context_lines":[{"line_number":191,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":192,"context_line":"class Subnet(base.NeutronDbObject):"},{"line_number":193,"context_line":"    # Version 1.0: Initial version"},{"line_number":194,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    db_model \u003d models_v2.Subnet"},{"line_number":197,"context_line":"    new_facade \u003d True"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_0f8fb476","line":194,"range":{"start_line":194,"start_character":4,"end_line":194,"end_character":19},"updated":"2019-12-03 15:45:06.000000000","message":"VERSION++","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e3dbf4842ff328d78acd2fb31a832a1cb6a37351","unresolved":false,"context_lines":[{"line_number":191,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":192,"context_line":"class Subnet(base.NeutronDbObject):"},{"line_number":193,"context_line":"    # Version 1.0: Initial version"},{"line_number":194,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    db_model \u003d models_v2.Subnet"},{"line_number":197,"context_line":"    new_facade \u003d True"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_cfa2fc3f","line":194,"range":{"start_line":194,"start_character":4,"end_line":194,"end_character":19},"in_reply_to":"3fa7e38b_0f8fb476","updated":"2019-12-04 18:23:44.000000000","message":"Hmm, are you sure? I had that earlier and reverted it, following mlavalle\u0027s comments, see PS20.\n\n@Miguel please comment.","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fb9ca5d9b163b899d81569bea663b59d5c4507b7","unresolved":false,"context_lines":[{"line_number":191,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":192,"context_line":"class Subnet(base.NeutronDbObject):"},{"line_number":193,"context_line":"    # Version 1.0: Initial version"},{"line_number":194,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    db_model \u003d models_v2.Subnet"},{"line_number":197,"context_line":"    new_facade \u003d True"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_426ec52c","line":194,"range":{"start_line":194,"start_character":4,"end_line":194,"end_character":19},"in_reply_to":"3fa7e38b_cfa2fc3f","updated":"2019-12-05 01:05:52.000000000","message":"I did not see objections about version++ on patch set 20. ： ）","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"bc064ef2450f6bab517d8573cadb2b3c72e45bd3","unresolved":false,"context_lines":[{"line_number":254,"context_line":"                    self.obj_context,"},{"line_number":255,"context_line":"                    subnet_id\u003dself.id)"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        dns_publish_fixed_ip \u003d False"},{"line_number":258,"context_line":"        if dns_publish_fixed_ips:"},{"line_number":259,"context_line":"            dns_publish_fixed_ip \u003d dns_publish_fixed_ips.get("},{"line_number":260,"context_line":"                    \u0027dns_publish_fixed_ip\u0027)"},{"line_number":261,"context_line":"        setattr(self, \u0027dns_publish_fixed_ip\u0027, dns_publish_fixed_ip)"},{"line_number":262,"context_line":"        self.obj_reset_changes([\u0027dns_publish_fixed_ip\u0027])"},{"line_number":263,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_0f0a541d","line":260,"range":{"start_line":257,"start_character":8,"end_line":260,"end_character":43},"updated":"2019-12-03 15:45:06.000000000","message":"dns_publish_fixed_ip \u003d dns_publish_fixed_ips.get(\n    \u0027dns_publish_fixed_ip\u0027) if dns_publish_fixed_ips else False\n\nAnd I\u0027m lost in dns_publish_fixed_ips and dns_publish_fixed_ip.","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e3dbf4842ff328d78acd2fb31a832a1cb6a37351","unresolved":false,"context_lines":[{"line_number":254,"context_line":"                    self.obj_context,"},{"line_number":255,"context_line":"                    subnet_id\u003dself.id)"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        dns_publish_fixed_ip \u003d False"},{"line_number":258,"context_line":"        if dns_publish_fixed_ips:"},{"line_number":259,"context_line":"            dns_publish_fixed_ip \u003d dns_publish_fixed_ips.get("},{"line_number":260,"context_line":"                    \u0027dns_publish_fixed_ip\u0027)"},{"line_number":261,"context_line":"        setattr(self, \u0027dns_publish_fixed_ip\u0027, dns_publish_fixed_ip)"},{"line_number":262,"context_line":"        self.obj_reset_changes([\u0027dns_publish_fixed_ip\u0027])"},{"line_number":263,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_4a6fdac3","line":260,"range":{"start_line":257,"start_character":8,"end_line":260,"end_character":43},"in_reply_to":"3fa7e38b_0f0a541d","updated":"2019-12-04 18:23:44.000000000","message":"O.k., I renamed the first variable, please let me know if you have a proposal for a better name.","commit_id":"5c88ef9f218cd17bcad2067c6c4c63713d2a5b60"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b07a426e8e7a01e89d4df482ad224ecd0bc4f21c","unresolved":false,"context_lines":[{"line_number":191,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":192,"context_line":"class Subnet(base.NeutronDbObject):"},{"line_number":193,"context_line":"    # Version 1.0: Initial version"},{"line_number":194,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    db_model \u003d models_v2.Subnet"},{"line_number":197,"context_line":"    new_facade \u003d True"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_2214f49e","line":194,"range":{"start_line":194,"start_character":4,"end_line":194,"end_character":19},"updated":"2019-12-04 15:26:54.000000000","message":"VERSION \u003d \u00271.1\u0027 since new attribute was added to the Subnet.","commit_id":"eeeab39df788e84789f3d748f144d95a21761e6b"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e3dbf4842ff328d78acd2fb31a832a1cb6a37351","unresolved":false,"context_lines":[{"line_number":191,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":192,"context_line":"class Subnet(base.NeutronDbObject):"},{"line_number":193,"context_line":"    # Version 1.0: Initial version"},{"line_number":194,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    db_model \u003d models_v2.Subnet"},{"line_number":197,"context_line":"    new_facade \u003d True"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_7cc28b88","line":194,"range":{"start_line":194,"start_character":4,"end_line":194,"end_character":19},"in_reply_to":"3fa7e38b_2214f49e","updated":"2019-12-04 18:23:44.000000000","message":"O.k., I added this back in as it was in PS20, together with the corresponding obj_make_compatible function.","commit_id":"eeeab39df788e84789f3d748f144d95a21761e6b"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fb9ca5d9b163b899d81569bea663b59d5c4507b7","unresolved":false,"context_lines":[{"line_number":192,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":193,"context_line":"class Subnet(base.NeutronDbObject):"},{"line_number":194,"context_line":"    # Version 1.0: Initial version"},{"line_number":195,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":196,"context_line":"    # Version 1.1: Add dns_publish_fixed_ip field"},{"line_number":197,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_824d9dc6","line":195,"range":{"start_line":195,"start_character":4,"end_line":195,"end_character":19},"updated":"2019-12-05 01:05:52.000000000","message":"You forgot to remove this. : )","commit_id":"9bc4e814bb5ec8edeb0234a9ae94da58c1e47dac"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0be9bdf1390be52185b56435b11e9ae2e45c92c6","unresolved":false,"context_lines":[{"line_number":192,"context_line":"@base.NeutronObjectRegistry.register"},{"line_number":193,"context_line":"class Subnet(base.NeutronDbObject):"},{"line_number":194,"context_line":"    # Version 1.0: Initial version"},{"line_number":195,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":196,"context_line":"    # Version 1.1: Add dns_publish_fixed_ip field"},{"line_number":197,"context_line":"    VERSION \u003d \u00271.1\u0027"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_5e41b235","line":195,"range":{"start_line":195,"start_character":4,"end_line":195,"end_character":19},"in_reply_to":"3fa7e38b_824d9dc6","updated":"2019-12-05 20:06:55.000000000","message":"Done","commit_id":"9bc4e814bb5ec8edeb0234a9ae94da58c1e47dac"}],"neutron/plugins/ml2/extensions/dns_integration.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"290eb1e72909b98c29099a29f26c36c371ee39b9","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        plugin \u003d directory.get_plugin()"},{"line_number":335,"context_line":"        network \u003d plugin.get_network(context, network_id)"},{"line_number":336,"context_line":"        subnets \u003d plugin.get_subnets_by_network(context, network_id)"},{"line_number":337,"context_line":"        return network, subnets"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"class DNSExtensionDriverML2(DNSExtensionDriver):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_40a1f0a8","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":31},"updated":"2019-06-21 17:03:36.000000000","message":"Hmmmm I\u0027m going to be pedantic on this one: \"_get_network\" should return only one parameter, the requested network.","commit_id":"9326e53ffb0fc43003e57fb7f6909ea1904e7ccc"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"5faa9c3c84f6828e52fc849093adcb9b8bdd0387","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        plugin \u003d directory.get_plugin()"},{"line_number":335,"context_line":"        network \u003d plugin.get_network(context, network_id)"},{"line_number":336,"context_line":"        subnets \u003d plugin.get_subnets_by_network(context, network_id)"},{"line_number":337,"context_line":"        return network, subnets"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"class DNSExtensionDriverML2(DNSExtensionDriver):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_d4ffe164","line":337,"range":{"start_line":337,"start_character":8,"end_line":337,"end_character":31},"in_reply_to":"9fb8cfa7_40a1f0a8","updated":"2019-06-21 18:25:32.000000000","message":"Hmm, I think I see your point, but \"_get_network_and_subnets\" seems a bit clumsy and cause more issues with long lines. How about \"_get_details\"?","commit_id":"9326e53ffb0fc43003e57fb7f6909ea1904e7ccc"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a833523f72fca2bde71b86e358c7cb3ad449f90d","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        if not dns_driver:"},{"line_number":375,"context_line":"            return True"},{"line_number":376,"context_line":"        for subnet in subnets:"},{"line_number":377,"context_line":"            if subnet.get(\u0027dns_publish_fixed_ip\u0027, False):"},{"line_number":378,"context_line":"                return False"},{"line_number":379,"context_line":"        if network[\u0027router:external\u0027]:"},{"line_number":380,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":20,"id":"5faad753_78028d3f","line":377,"range":{"start_line":377,"start_character":50,"end_line":377,"end_character":55},"updated":"2019-09-12 10:56:06.000000000","message":"nit: this is not needed, it will be \"None\" by default so will work in same way.","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        if not dns_driver:"},{"line_number":375,"context_line":"            return True"},{"line_number":376,"context_line":"        for subnet in subnets:"},{"line_number":377,"context_line":"            if subnet.get(\u0027dns_publish_fixed_ip\u0027, False):"},{"line_number":378,"context_line":"                return False"},{"line_number":379,"context_line":"        if network[\u0027router:external\u0027]:"},{"line_number":380,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_b5ae752b","line":377,"range":{"start_line":377,"start_character":50,"end_line":377,"end_character":55},"in_reply_to":"5faad753_78028d3f","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"e03d5d6c49059bbbd4bbf90075f831edaf8da80d","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    filter_fixed_ips \u003d False"},{"line_number":441,"context_line":"    for ip in fixed_ips:"},{"line_number":442,"context_line":"        subnet \u003d subnet_obj.Subnet.get_object("},{"line_number":443,"context_line":"            context, id\u003dip[\u0027subnet_id\u0027])"},{"line_number":444,"context_line":"        if subnet.get(\u0027dns_publish_fixed_ip\u0027):"},{"line_number":445,"context_line":"            filter_fixed_ips \u003d True"},{"line_number":446,"context_line":"            subnet_filtered.append(str(ip[\u0027ip_address\u0027]))"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_78195785","line":443,"updated":"2019-12-03 09:46:54.000000000","message":"it will potentially do many queries to db. Maybe better would be to first prepare list of subnet ids from all fixed_ips and than call only once get_objects() method?","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"65d2ca697c58f2a452bfa38f71ecb8c49bcd6028","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    filter_fixed_ips \u003d False"},{"line_number":441,"context_line":"    for ip in fixed_ips:"},{"line_number":442,"context_line":"        subnet \u003d subnet_obj.Subnet.get_object("},{"line_number":443,"context_line":"            context, id\u003dip[\u0027subnet_id\u0027])"},{"line_number":444,"context_line":"        if subnet.get(\u0027dns_publish_fixed_ip\u0027):"},{"line_number":445,"context_line":"            filter_fixed_ips \u003d True"},{"line_number":446,"context_line":"            subnet_filtered.append(str(ip[\u0027ip_address\u0027]))"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_fe51ac64","line":443,"in_reply_to":"3fa7e38b_33aa2084","updated":"2019-12-03 15:31:03.000000000","message":"Done","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"8355b9e646cc5c26718f41d762ca905ec9b678dc","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    filter_fixed_ips \u003d False"},{"line_number":441,"context_line":"    for ip in fixed_ips:"},{"line_number":442,"context_line":"        subnet \u003d subnet_obj.Subnet.get_object("},{"line_number":443,"context_line":"            context, id\u003dip[\u0027subnet_id\u0027])"},{"line_number":444,"context_line":"        if subnet.get(\u0027dns_publish_fixed_ip\u0027):"},{"line_number":445,"context_line":"            filter_fixed_ips \u003d True"},{"line_number":446,"context_line":"            subnet_filtered.append(str(ip[\u0027ip_address\u0027]))"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_938d147e","line":443,"in_reply_to":"3fa7e38b_78195785","updated":"2019-12-03 10:00:18.000000000","message":"Is it common to have lots of fixed_ips on a port? I would usually only expect 1 x IPv4 and 1 x IPv6. But if you think that this is a performance issue, I can look into rewriting this loop.","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"200f82ff7495128cc550bf8495832eb62a56f950","unresolved":false,"context_lines":[{"line_number":440,"context_line":"    filter_fixed_ips \u003d False"},{"line_number":441,"context_line":"    for ip in fixed_ips:"},{"line_number":442,"context_line":"        subnet \u003d subnet_obj.Subnet.get_object("},{"line_number":443,"context_line":"            context, id\u003dip[\u0027subnet_id\u0027])"},{"line_number":444,"context_line":"        if subnet.get(\u0027dns_publish_fixed_ip\u0027):"},{"line_number":445,"context_line":"            filter_fixed_ips \u003d True"},{"line_number":446,"context_line":"            subnet_filtered.append(str(ip[\u0027ip_address\u0027]))"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_33aa2084","line":443,"in_reply_to":"3fa7e38b_938d147e","updated":"2019-12-03 10:12:26.000000000","message":"It isn\u0027t maybe very common use case but it\u0027s possible.\nMaybe You can just add note that this is place where we potentially may look for improvement in the future if we will have perf issue with this.\nLets not improve without real profiling maybe :)","commit_id":"7c5a4ac236b462791314f041becb6bb85dfdcbd9"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"9e5ecb7bdcf58b8c15f73cde75a5844094c8d6e8","unresolved":false,"context_lines":[{"line_number":435,"context_line":"            driver\u003dcfg.CONF.external_dns_driver)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"def _filter_by_subnet(context, fixed_ips):"},{"line_number":439,"context_line":"    subnet_filtered \u003d []"},{"line_number":440,"context_line":"    filter_fixed_ips \u003d False"},{"line_number":441,"context_line":"    for ip in fixed_ips:"}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_e92d5cae","line":438,"updated":"2019-12-04 21:43:30.000000000","message":"Yeah, this is where the behavior subtly changes. We no longer send all the port\u0027s IPs to the external DNS service, if the \u0027dns_publish_fixed_ip\u0027 is defined for any of the subnets. I think that for clarity to users this needs to be documented","commit_id":"9bc4e814bb5ec8edeb0234a9ae94da58c1e47dac"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"0be9bdf1390be52185b56435b11e9ae2e45c92c6","unresolved":false,"context_lines":[{"line_number":435,"context_line":"            driver\u003dcfg.CONF.external_dns_driver)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"def _filter_by_subnet(context, fixed_ips):"},{"line_number":439,"context_line":"    subnet_filtered \u003d []"},{"line_number":440,"context_line":"    filter_fixed_ips \u003d False"},{"line_number":441,"context_line":"    for ip in fixed_ips:"}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_de55a2fa","line":438,"in_reply_to":"3fa7e38b_e92d5cae","updated":"2019-12-05 20:06:55.000000000","message":"I agree, I just postponed that part until everything else got stabilized, but it seems we have finally reached that point in time now, yay!\n\nI did publish a first draft now, still need to add some more examples and fill in the documentation for the dns_domain_ports extension.","commit_id":"9bc4e814bb5ec8edeb0234a9ae94da58c1e47dac"}],"neutron/plugins/ml2/extensions/subnet_dns_publish_fixed_ip.py":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":17,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SubnetDNSPublishFixedIPExtensionDriver(api.ExtensionDriver):"},{"line_number":21,"context_line":"    _supported_extension_alias \u003d subnet_dns_publish_fixed_ip.ALIAS"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def initialize(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_2a3c82c6","line":20,"range":{"start_line":20,"start_character":45,"end_line":20,"end_character":64},"updated":"2019-10-13 00:21:00.000000000","message":"Given that you wrote this https://review.opendev.org/#/c/662409/20/neutron/extensions/subnet_dns_publish_fixed_ip.py@23, this ML2 extension depends on https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/plugins/ml2/extensions/dns_integration.py#L38. Why not inherit from it? Having said that, why not inherit from https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/plugins/ml2/extensions/dns_integration.py#L385? Do you see any use case where SubnetDNSPublishFixedIPExtensionDriver and DNSDomainPortsExtensionDriver is not? The way I see it is that the former is a superset of the former","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class SubnetDNSPublishFixedIPExtensionDriver(api.ExtensionDriver):"},{"line_number":21,"context_line":"    _supported_extension_alias \u003d subnet_dns_publish_fixed_ip.ALIAS"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def initialize(self):"},{"line_number":24,"context_line":"        LOG.info(\"SubnetDNSPublishFixedIPExtensionDriver initialization \""}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_4a39bed4","line":21,"range":{"start_line":21,"start_character":33,"end_line":21,"end_character":66},"updated":"2019-10-13 00:21:00.000000000","message":"You are going to need to adjust this https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/plugins/ml2/extensions/dns_integration.py#L386. The specific adjustment depends on your answer to my comment to L20","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"3fa7e38b_6a1efa5f","line":35,"updated":"2019-10-13 00:21:00.000000000","message":"Please see my comment to https://review.opendev.org/#/c/662409/20/neutron/db/subnet_dns_publish_fixed_ip_mixin.py@26. You need to implement a method named extend_subnet_dict method instead","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b07a426e8e7a01e89d4df482ad224ecd0bc4f21c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class SubnetDNSPublishFixedIPExtensionDriver("},{"line_number":26,"context_line":"        dns_int.DNSDomainPortsExtensionDriver):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    _supported_extension_aliases \u003d [dns_apidef.ALIAS,"},{"line_number":29,"context_line":"                                    ports_apidef.ALIAS,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_5ca9d679","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":45},"updated":"2019-12-04 15:26:54.000000000","message":"Why not directly inherit from DNSExtensionDriverML2?\nThe ExtensionManager will call each extend function in the setting order.","commit_id":"eeeab39df788e84789f3d748f144d95a21761e6b"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e3dbf4842ff328d78acd2fb31a832a1cb6a37351","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class SubnetDNSPublishFixedIPExtensionDriver("},{"line_number":26,"context_line":"        dns_int.DNSDomainPortsExtensionDriver):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    _supported_extension_aliases \u003d [dns_apidef.ALIAS,"},{"line_number":29,"context_line":"                                    ports_apidef.ALIAS,"}],"source_content_type":"text/x-python","patch_set":37,"id":"3fa7e38b_7cab6bd6","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":45},"in_reply_to":"3fa7e38b_5ca9d679","updated":"2019-12-04 18:23:44.000000000","message":"Because this extension needs to include the dns_domain_ports extension. Enabling multiple dns extensions leads to errors, see the issues in some of the earlier patchsets.","commit_id":"eeeab39df788e84789f3d748f144d95a21761e6b"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                extradhcpopt_db.ExtraDhcpOptMixin,"},{"line_number":160,"context_line":"                address_scope_db.AddressScopeDbMixin,"},{"line_number":161,"context_line":"                subnet_service_type_mixin.SubnetServiceTypeMixin,"},{"line_number":162,"context_line":"                sn_mixin.SubnetDNSPublishFixedIPMixin):"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    \"\"\"Implement the Neutron L2 abstractions using modules."},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_0a2f4688","line":162,"range":{"start_line":162,"start_character":16,"end_line":162,"end_character":53},"updated":"2019-10-13 00:21:00.000000000","message":"As I\u0027ve mentioned in my other comments, the external DNS integration extensions have been implemented ad ML2 plugin extension drivers. One of the big reasons that this type of drivers were created was to avoid ML2Plugin mixins, like the one you are adding here. To properly load an ML2 plugin extension driver you need the following:\n\n1) Declare an entry point for your new driver, similar to what was done here: https://review.opendev.org/#/c/457101/13/setup.cfg@109\n\n2) Once you have that in place, the deployer will have to configure the extension similar to what we describe in point 2 here: https://docs.openstack.org/neutron/latest/admin/config-dns-int.html#the-networking-service-internal-dns-resolution","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                extradhcpopt_db.ExtraDhcpOptMixin,"},{"line_number":160,"context_line":"                address_scope_db.AddressScopeDbMixin,"},{"line_number":161,"context_line":"                subnet_service_type_mixin.SubnetServiceTypeMixin,"},{"line_number":162,"context_line":"                sn_mixin.SubnetDNSPublishFixedIPMixin):"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    \"\"\"Implement the Neutron L2 abstractions using modules."},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_9526d9cd","line":162,"range":{"start_line":162,"start_character":16,"end_line":162,"end_character":53},"in_reply_to":"3fa7e38b_0a2f4688","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                                    agent_resources_synced.ALIAS,"},{"line_number":210,"context_line":"                                    subnet_onboard_def.ALIAS,"},{"line_number":211,"context_line":"                                    subnetpool_prefix_ops_def.ALIAS,"},{"line_number":212,"context_line":"                                    subnet_dns_publish_fixed_ip_def.ALIAS]"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    # List of agent types for which all binding_failed ports should try to be"},{"line_number":215,"context_line":"    # rebound when agent revive"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_8a581631","line":212,"range":{"start_line":212,"start_character":36,"end_line":212,"end_character":73},"updated":"2019-10-13 00:21:00.000000000","message":"If we implement your new extension properly as a ML2 extension driver, this is not needed. The ML2 extensions manager adds you extension to this list if it is configured: https://github.com/openstack/neutron/blob/92c8065fb722eb80ced7d6829bdbddf82909d431/neutron/plugins/ml2/managers.py#L1096-L1106. That is why you wrote https://review.opendev.org/#/c/662409/20/neutron/plugins/ml2/extensions/subnet_dns_publish_fixed_ip.py@28, which is called from here: https://github.com/openstack/neutron-lib/blob/710d129ca94df443d3b21c546c15e5b4ece23761/neutron_lib/plugins/ml2/api.py#L1110-L1117, which in turn is called from L222 below","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                                    agent_resources_synced.ALIAS,"},{"line_number":210,"context_line":"                                    subnet_onboard_def.ALIAS,"},{"line_number":211,"context_line":"                                    subnetpool_prefix_ops_def.ALIAS,"},{"line_number":212,"context_line":"                                    subnet_dns_publish_fixed_ip_def.ALIAS]"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    # List of agent types for which all binding_failed ports should try to be"},{"line_number":215,"context_line":"    # rebound when agent revive"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_552ce1aa","line":212,"range":{"start_line":212,"start_character":36,"end_line":212,"end_character":73},"in_reply_to":"3fa7e38b_8a581631","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"5bb2289fab5a0fc0c0d8d06ba0963000655ac372","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            sg_rpc.disable_security_group_extension_by_config(aliases)"},{"line_number":224,"context_line":"            vlantransparent._disable_extension_by_config(aliases)"},{"line_number":225,"context_line":"            filter_validation._disable_extension_by_config(aliases)"},{"line_number":226,"context_line":"            subnet_dns_publish_fixed_ip._disable_extension_by_dep(aliases)"},{"line_number":227,"context_line":"            self._aliases \u003d aliases"},{"line_number":228,"context_line":"        return self._aliases"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_ea466a50","line":226,"updated":"2019-10-13 00:21:00.000000000","message":"See my comment to L212. We don\u0027t need this","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"42b047324c0a8316a24abf0da06e0c22a512cb50","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            sg_rpc.disable_security_group_extension_by_config(aliases)"},{"line_number":224,"context_line":"            vlantransparent._disable_extension_by_config(aliases)"},{"line_number":225,"context_line":"            filter_validation._disable_extension_by_config(aliases)"},{"line_number":226,"context_line":"            subnet_dns_publish_fixed_ip._disable_extension_by_dep(aliases)"},{"line_number":227,"context_line":"            self._aliases \u003d aliases"},{"line_number":228,"context_line":"        return self._aliases"},{"line_number":229,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa7e38b_75279dc8","line":226,"in_reply_to":"3fa7e38b_ea466a50","updated":"2019-10-15 20:44:59.000000000","message":"Done","commit_id":"43256c290cd83ba6461411cb419ee5a41379c012"}],"releasenotes/notes/subnet-dns-publish-fixed-ip-extension-6a5bb42a048a6671.yaml":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d344133d504c546ea8fa1fccbf89b3d239ff1d0e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``subnet-dns-publish-fixed-ip`` extension adds a new attribute to"},{"line_number":5,"context_line":"    subnets. When set to ``true`` it will allow publishing DNS records for"},{"line_number":6,"context_line":"    fixed IPs from that subnet independent of the restrictions described"},{"line_number":7,"context_line":"    in the `DNS integration with an external service"},{"line_number":8,"context_line":"    \u003chttps://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html#configuration-of-the-externally-accessible-network-for-use-case-3\u003e`_"}],"source_content_type":"text/x-yaml","patch_set":40,"id":"3fa7e38b_956fe727","line":5,"range":{"start_line":4,"start_character":71,"end_line":5,"end_character":11},"updated":"2019-12-09 10:05:43.000000000","message":"to the subnets?","commit_id":"107f52a7c9aa1d4e4dd44cd87cfc0a3a8aa7251f"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"f404a003cbf1cf79a1f773a5e6c97d7ad0c1e423","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``subnet-dns-publish-fixed-ip`` extension adds a new attribute to"},{"line_number":5,"context_line":"    subnets. When set to ``true`` it will allow publishing DNS records for"},{"line_number":6,"context_line":"    fixed IPs from that subnet independent of the restrictions described"},{"line_number":7,"context_line":"    in the `DNS integration with an external service"},{"line_number":8,"context_line":"    \u003chttps://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html#configuration-of-the-externally-accessible-network-for-use-case-3\u003e`_"}],"source_content_type":"text/x-yaml","patch_set":40,"id":"3fa7e38b_aee974e4","line":5,"range":{"start_line":4,"start_character":71,"end_line":5,"end_character":11},"in_reply_to":"3fa7e38b_956fe727","updated":"2019-12-10 11:53:56.000000000","message":"Hmm, to me, \"to subnets\" is the generic form, like \"to any subnet\" or \"to all subnets\", while \"to the subnets\" would only make sense when talking about a specific set of subnets.\n\nBut I\u0027m no native speaker, so I may be wrong.","commit_id":"107f52a7c9aa1d4e4dd44cd87cfc0a3a8aa7251f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"444f99e5a71b3e9bb78c12c73b07d0ea0d5b69c3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``subnet-dns-publish-fixed-ip`` extension adds a new attribute to"},{"line_number":5,"context_line":"    subnets. When set to ``true`` it will allow publishing DNS records for"},{"line_number":6,"context_line":"    fixed IPs from that subnet independent of the restrictions described"},{"line_number":7,"context_line":"    in the `DNS integration with an external service"},{"line_number":8,"context_line":"    \u003chttps://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html#configuration-of-the-externally-accessible-network-for-use-case-3\u003e`_"}],"source_content_type":"text/x-yaml","patch_set":40,"id":"3fa7e38b_f1e412aa","line":5,"range":{"start_line":4,"start_character":71,"end_line":5,"end_character":11},"in_reply_to":"3fa7e38b_aee974e4","updated":"2019-12-10 19:15:06.000000000","message":"The form \"to the subnets\" definitely means specific subnets, a subset of all subnets.  The form \"to subnets\" is somewhat ambiguous, and could mean either \"to all instantiated subnets\" or \"to the class/object that defines what a subnet is\".  For maximum clarity I would avoid ambiguity and say \"to the definition of the subnet resource\".","commit_id":"107f52a7c9aa1d4e4dd44cd87cfc0a3a8aa7251f"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"e50930b26be36acfe410062222d5dbe5a0555a00","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The ``subnet-dns-publish-fixed-ip`` extension adds a new attribute to"},{"line_number":5,"context_line":"    subnets. When set to ``true`` it will allow publishing DNS records for"},{"line_number":6,"context_line":"    fixed IPs from that subnet independent of the restrictions described"},{"line_number":7,"context_line":"    in the `DNS integration with an external service"},{"line_number":8,"context_line":"    \u003chttps://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html#configuration-of-the-externally-accessible-network-for-use-case-3\u003e`_"}],"source_content_type":"text/x-yaml","patch_set":40,"id":"3fa7e38b_143992a1","line":5,"range":{"start_line":4,"start_character":71,"end_line":5,"end_character":11},"in_reply_to":"3fa7e38b_f1e412aa","updated":"2019-12-11 11:42:15.000000000","message":"This is a good idea, amended both locations accordingly.","commit_id":"107f52a7c9aa1d4e4dd44cd87cfc0a3a8aa7251f"}]}
