)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ed7b6b2a3c73bed9da73b98e87693b757249597e","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Helen Chen \u003cichen@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-09-04 11:11:56 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"bug/2115776: Neutron should delete both A/AAAA records in dualstack setup"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Resolves-Bug: #2115776"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"2de0d953_f12d125c","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":13},"updated":"2025-09-04 15:33:18.000000000","message":"This is not needed :)","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"d264c3f822edb3b148cf925d0e020531065424fb","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"bug/2115776: Neutron should delete both A/AAAA records in dualstack setup"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Resolves-Bug: #2115776"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Modified DNS record filter to retrieve either A or AAAA records based on"},{"line_number":12,"context_line":"the address family, allowing Neutron to delete both A and AAAA records"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"f6637c9a_47d12b55","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":12},"updated":"2025-09-04 18:07:03.000000000","message":"Should be Closes-Bug","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ed7b6b2a3c73bed9da73b98e87693b757249597e","unresolved":true,"context_lines":[{"line_number":12,"context_line":"the address family, allowing Neutron to delete both A and AAAA records"},{"line_number":13,"context_line":"in a dualstack setup."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\tmodified:   neutron/services/externaldns/drivers/designate/driver.py"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I42f1d504a063f1d8542c861b3b7caffe56c47bf1"},{"line_number":18,"context_line":"Signed-off-by: Helen Chen \u003cichen@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"6f366e64_443ae15e","line":15,"updated":"2025-09-04 15:33:18.000000000","message":"I don\u0027t think we use this for patches going to master, only on the backports to let reviewers know what has been changed compared to the original master patch.","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"605af35b413e4961158bf78ca9ed89323312bed4","unresolved":true,"context_lines":[{"line_number":13,"context_line":"in a dualstack setup."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\tmodified:   neutron/services/externaldns/drivers/designate/driver.py"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I42f1d504a063f1d8542c861b3b7caffe56c47bf1"},{"line_number":18,"context_line":"Signed-off-by: Helen Chen \u003cichen@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"82114338_05ba6357","line":16,"updated":"2025-09-05 17:53:22.000000000","message":"Here\u0027s a good summary of commit message guidelines produced be Gemini:\n\nThe Core Structure\n1. Subject Line\nThe first line is a concise summary of the change.\n\nIt must be 50 characters or less.\n\nIt should be written in the imperative mood (e.g., \"Fix bug\" not \"Fixes bug\" or \"Fixed bug\").\n\n2. Message Body\nAfter the subject line, there must be a blank line, followed by a more detailed explanation.\n\nIt must be wrapped at 72 characters per line.\n\nIt should explain the problem that was fixed and the approach of the solution. It answers the \"what\" and \"why\" of the change, not just the \"how.\"\n\n3. Footer Lines\nAfter another blank line, special footer lines are used for machine-readable metadata.\n\nCloses-Bug: #\u003cbug-id\u003e: Links the commit to a specific bug report in their tracker (like Launchpad or StoryBoard). Use Related-Bug for partial fixes.\n\nChange-Id:: A unique hash automatically generated by the git-review tool. This is required for the Gerrit code review system to track patch sets.\n\nDocImpact:: A brief message explaining if the change affects documentation.\n\nAPIImpact:: A message explaining if the change affects a public API.","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"79ee0f6f9fbd9d217594cf657da89045ba4854c0","unresolved":true,"context_lines":[{"line_number":13,"context_line":"in a dualstack setup."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\tmodified:   neutron/services/externaldns/drivers/designate/driver.py"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I42f1d504a063f1d8542c861b3b7caffe56c47bf1"},{"line_number":18,"context_line":"Signed-off-by: Helen Chen \u003cichen@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"73431aba_37634c2f","line":16,"in_reply_to":"82114338_05ba6357","updated":"2025-09-05 19:23:18.000000000","message":"The other thing that I recommend is changing the overall description of what is done is this patch. What we are doing is:\n\nEnable the deletion of Designate recordssets for the same dns_name and dns_domain that were created in two separate port and floating ip operations","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"2f3daaaa66dadfc8c84633cb11b5b67c787cfa29","unresolved":true,"context_lines":[{"line_number":16,"context_line":"within the dns_domain is associated with multiple Designate"},{"line_number":17,"context_line":"recordsets while the deletion operation occurs multiple times."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Conequently, the change handles each deletion operation of the"},{"line_number":20,"context_line":"dns_name in the dns_domain based on the IP addresses specified"},{"line_number":21,"context_line":"in the input argument."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"0e85bf2b_6af66785","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":11},"updated":"2025-09-09 21:33:34.000000000","message":"Nit: Consequently","commit_id":"9b91a2c05fb94ac9a2e3f22462745f50ebceb174"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a500621c495f6598d0ada5c7939ddb3e71c45c62","unresolved":true,"context_lines":[{"line_number":25,"context_line":"between recordset and input argument records compared the size of two"},{"line_number":26,"context_line":"sets rather than the values of the data."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Closes-Bug: #2115776"},{"line_number":29,"context_line":"Change-Id: I42f1d504a063f1d8542c861b3b7caffe56c47bf1"},{"line_number":30,"context_line":"Signed-off-by: Helen Chen \u003cichen@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"c7a7e5a5_dae952a6","line":28,"updated":"2025-09-11 19:07:28.000000000","message":"I *think* if you put this here it will also run the tests that aren\u0027t getting run now, worth checking:\n\nDepends-on: https://review.opendev.org/c/openstack/neutron-tempest-plugin/+/960659","commit_id":"a50e4dee190b8c1b122a280377319f606af6642d"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ed7b6b2a3c73bed9da73b98e87693b757249597e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"94cc4a31_67abf093","updated":"2025-09-04 15:33:18.000000000","message":"I don\u0027t know much about designate - just tried to point out some Python related things. I think the optimal solution would be if we could specify multiple types for the DNS records in the query, so we could get both A and AAA records with a single query.","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"3f7fcba6a847bbe793f146a770abb5b5c485b65a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3b3e88dd_cf669eeb","updated":"2025-09-05 17:58:19.000000000","message":"by the way, the recommended new exception must be added here: https://github.com/openstack/neutron-lib/blob/master/neutron_lib/exceptions/dns.py","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"7e49851804456e344d2c5e8d2d7f267e5cbfcb80","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"50e99ab5_67c23ea3","updated":"2025-09-10 22:53:39.000000000","message":"recheck failure in neutron-ovn-tempest-ipv6-only-ovs-release not related to change","commit_id":"a50e4dee190b8c1b122a280377319f606af6642d"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"6ee6057e86199af51a4b0ced51b183904a5d3bfc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"cc46629b_85b42d53","updated":"2025-09-11 13:19:49.000000000","message":"recheck neutron-tempest-plugin-designate-scenario","commit_id":"a50e4dee190b8c1b122a280377319f606af6642d"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"2383bbbd96652bebd134885c8978c2b4c4e511d6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"831dafac_78140b88","updated":"2025-09-11 20:54:19.000000000","message":"You are depending on the wrong patch. Change your depends on to:\n\nDepends-on: https://review.opendev.org/c/openstack/neutron-tempest-plugin/+/960659","commit_id":"c52905c3f6a6e6bd5afd61a370d0122959ce3bb3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"1bcc3c098e1148efdfd53da0c3e019919413d528","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"b0f8454e_3461fb78","updated":"2025-09-11 19:31:43.000000000","message":"recheck neutron-tempest-plugin-designate-scenario using the proposed fix to tempest","commit_id":"c52905c3f6a6e6bd5afd61a370d0122959ce3bb3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"bbb8a5fc31af9aef22ea96113e7b961912997fda","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"966300aa_fe548585","updated":"2025-09-18 13:55:47.000000000","message":"Recheck neutron-ova-grenade-multinode is not related","commit_id":"9320cd392f88a68a365bca154b3079b7317103c6"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"7f1bc584daa5de887d9bc6bc9ca972834d26c58e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"a0304d9f_6a9d3dfb","updated":"2025-09-19 13:25:06.000000000","message":"Recheck neutron-ovs-tempest-dvr-ha-multinode-full is not related","commit_id":"9320cd392f88a68a365bca154b3079b7317103c6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8b6695f9fb86d5741adb8135b71e87557601b1ff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"b0419109_19fef202","updated":"2025-09-18 07:41:47.000000000","message":"recheck\ntempest-integrated-networking failure (test_resize_volume_backed_server_confirm) is not related","commit_id":"9320cd392f88a68a365bca154b3079b7317103c6"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"21d91ea848b7a05b3b06d57c25f2c52415ca7ed7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8028e70c_05074f07","updated":"2025-09-19 02:42:36.000000000","message":"recheck neutron-ovs-tempest-multinode-full","commit_id":"9320cd392f88a68a365bca154b3079b7317103c6"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"ccc745d06bec5fb9abf017d7d81820be6ec8034a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"c454646c_ff6698c0","updated":"2025-09-18 17:39:47.000000000","message":"recheck since failed tests all passed previously","commit_id":"9320cd392f88a68a365bca154b3079b7317103c6"}],"neutron/services/externaldns/drivers/designate/driver.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ed7b6b2a3c73bed9da73b98e87693b757249597e","unresolved":true,"context_lines":[{"line_number":163,"context_line":"        recordsets \u003d []"},{"line_number":164,"context_line":"        criterion \u003d {}"},{"line_number":165,"context_line":"        v4, v6 \u003d self._classify_records(records)"},{"line_number":166,"context_line":"        criterion[\u0027name\u0027] \u003d name"},{"line_number":167,"context_line":"        if v4:"},{"line_number":168,"context_line":"            criterion[\u0027type\u0027] \u003d \"A\""},{"line_number":169,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"30f37421_e3298272","line":166,"updated":"2025-09-04 15:33:18.000000000","message":"You can initialize this key directly on L164\n```\ncriterion \u003d {\u0027name\u0027: name}\n```","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ed7b6b2a3c73bed9da73b98e87693b757249597e","unresolved":true,"context_lines":[{"line_number":167,"context_line":"        if v4:"},{"line_number":168,"context_line":"            criterion[\u0027type\u0027] \u003d \"A\""},{"line_number":169,"context_line":"            try:"},{"line_number":170,"context_line":"                recordsets +\u003d designate_client.recordsets.list("},{"line_number":171,"context_line":"                    dns_domain, criterion \u003d criterion)"},{"line_number":172,"context_line":"            except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":173,"context_line":"                raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"}],"source_content_type":"text/x-python","patch_set":1,"id":"54699b3f_e47fd596","line":170,"range":{"start_line":170,"start_character":27,"end_line":170,"end_character":29},"updated":"2025-09-04 15:33:18.000000000","message":"You don\u0027t need to extend the list as it\u0027s empty and it\u0027s not in any loop. You can just assign the list instead.","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ed7b6b2a3c73bed9da73b98e87693b757249597e","unresolved":true,"context_lines":[{"line_number":168,"context_line":"            criterion[\u0027type\u0027] \u003d \"A\""},{"line_number":169,"context_line":"            try:"},{"line_number":170,"context_line":"                recordsets +\u003d designate_client.recordsets.list("},{"line_number":171,"context_line":"                    dns_domain, criterion \u003d criterion)"},{"line_number":172,"context_line":"            except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":173,"context_line":"                raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":174,"context_line":"        if v6:"}],"source_content_type":"text/x-python","patch_set":1,"id":"19831209_94ff8950","line":171,"range":{"start_line":171,"start_character":32,"end_line":171,"end_character":53},"updated":"2025-09-04 15:33:18.000000000","message":"This should fail pep8, the parameters are passed without whitespaces around `criterion\u003dcriterion`","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"d264c3f822edb3b148cf925d0e020531065424fb","unresolved":true,"context_lines":[{"line_number":171,"context_line":"                    dns_domain, criterion \u003d criterion)"},{"line_number":172,"context_line":"            except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":173,"context_line":"                raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":174,"context_line":"        if v6:"},{"line_number":175,"context_line":"            criterion[\u0027type\u0027] \u003d \"AAAA\""},{"line_number":176,"context_line":"            try:"},{"line_number":177,"context_line":"                recordsets +\u003d designate_client.recordsets.list("},{"line_number":178,"context_line":"                    dns_domain, criterion \u003d criterion)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6e5f1cba_2e6469a4","line":175,"range":{"start_line":174,"start_character":8,"end_line":175,"end_character":38},"updated":"2025-09-04 18:07:03.000000000","message":"You can probably do this like L64-74 does above:\n\ntry:\n    if v4:\n        ...\n    if v6:\n        ...\nexcept...\n\nThat way we don\u0027t duplicate as much code.","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"605af35b413e4961158bf78ca9ed89323312bed4","unresolved":true,"context_lines":[{"line_number":180,"context_line":"                raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":181,"context_line":"        ids \u003d [rec[\u0027id\u0027] for rec in recordsets]"},{"line_number":182,"context_line":"        ips \u003d [str(ip) for rec in recordsets for ip in rec[\u0027records\u0027]]"},{"line_number":183,"context_line":"        if set(ips) !\u003d set(records):"},{"line_number":184,"context_line":"            raise dns_exc.DuplicateRecordSet(dns_name\u003dname)"},{"line_number":185,"context_line":"        return ids"}],"source_content_type":"text/x-python","patch_set":1,"id":"7208b815_ad701eae","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":59},"updated":"2025-09-05 17:53:22.000000000","message":"The submitter of https://bugs.launchpad.net/neutron/+bug/2115776 indicates that his \"whole scenario is basically Use case 1 and 3a from https://docs.openstack.org/neutron/latest/admin/config-dns-int-ext-serv.html\". When these two lines were written as part of https://review.opendev.org/c/openstack/neutron/+/212213/39/neutron/services/externaldns/drivers/designate/driver.py#204 (almost 10 years ago!), we were years away from envisioning use case 3a. At that point in time it wasn\u0027t plausible to assume that one of the Designate recordsets associated to a Neutron port was created during a port creation or update (use case 3a), while another recordset was separately created when associating a floating IP to the same port (use case 1). The assumption then was that all the recordsets were created by a port creation/update or a floating IP creation/update, but never a combination of both. Therefore, the check in this line made sense.\n\nNow, with the availability of use case 3a and as demonstrated by the bug report, it is perfectly reasonable to associate recordsets to a port that were created separately. The same applies to the deletion of those recordsets: they are going to be deleted separately. The traceback provided be the bug submitter (https://paste.openstack.org/show/bPOZX1GHmL6CFu8KVYHk/) clearly shows that the problem manifests itself when trying to delete the recordset during a port update or deletion operation:\n\nneutron/plugins/ml2/extensions/dns_integration.py, line 502\n\nWhen these two lines are executed, we find a mismatch because we also find the recordset associated to the floating IP, which this request doesn\u0027t know about.\n\nThe correct and simpler fix is just to relax this check:\n\nif set(ips) \u003e set(records):\n\nIt is also advisable to create a proper exception to raise, to convey the correct semantics:\n\nraise dns_exc.MismatchedRecordSet(dns_name\u003dname)\n\nWhen fixing this, we are likely to break a few unit tests. Let\u0027s fix the code here first and see then what we break.","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"af6f5ec0dafc3ae77245755ef7b2b3ee276dce17","unresolved":true,"context_lines":[{"line_number":180,"context_line":"                raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":181,"context_line":"        ids \u003d [rec[\u0027id\u0027] for rec in recordsets]"},{"line_number":182,"context_line":"        ips \u003d [str(ip) for rec in recordsets for ip in rec[\u0027records\u0027]]"},{"line_number":183,"context_line":"        if set(ips) !\u003d set(records):"},{"line_number":184,"context_line":"            raise dns_exc.DuplicateRecordSet(dns_name\u003dname)"},{"line_number":185,"context_line":"        return ids"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f73827a_e5db47e5","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":59},"in_reply_to":"0a8768a0_b356f833","updated":"2025-09-05 19:17:52.000000000","message":"I think replacing lines 181 - 184 with https://paste.openstack.org/show/b7wjcmvkplpheL4G6rww/ might work:","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"03edcbf7e74addf7ed4cd60aa60309c496169d24","unresolved":true,"context_lines":[{"line_number":180,"context_line":"                raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":181,"context_line":"        ids \u003d [rec[\u0027id\u0027] for rec in recordsets]"},{"line_number":182,"context_line":"        ips \u003d [str(ip) for rec in recordsets for ip in rec[\u0027records\u0027]]"},{"line_number":183,"context_line":"        if set(ips) !\u003d set(records):"},{"line_number":184,"context_line":"            raise dns_exc.DuplicateRecordSet(dns_name\u003dname)"},{"line_number":185,"context_line":"        return ids"}],"source_content_type":"text/x-python","patch_set":1,"id":"cb9e4ca3_88a3fb82","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":59},"in_reply_to":"4f73827a_e5db47e5","updated":"2025-09-05 19:26:20.000000000","message":"This the correct change: https://paste.openstack.org/show/buIVky04k77IQHIBGOUL/","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"ce63cea9aeb320c403bfad1e528ed893705bce76","unresolved":true,"context_lines":[{"line_number":180,"context_line":"                raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":181,"context_line":"        ids \u003d [rec[\u0027id\u0027] for rec in recordsets]"},{"line_number":182,"context_line":"        ips \u003d [str(ip) for rec in recordsets for ip in rec[\u0027records\u0027]]"},{"line_number":183,"context_line":"        if set(ips) !\u003d set(records):"},{"line_number":184,"context_line":"            raise dns_exc.DuplicateRecordSet(dns_name\u003dname)"},{"line_number":185,"context_line":"        return ids"}],"source_content_type":"text/x-python","patch_set":1,"id":"0a8768a0_b356f833","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":59},"in_reply_to":"7208b815_ad701eae","updated":"2025-09-05 18:26:17.000000000","message":"No, the fix is more complicated than I suggested above. We should return only the ids of the recordsets in \"recordsets\" whose ip addresses are in \"records\". Also we need to check if set(ips) is a superset of records, as indicated in the recommendation above. This means we also need to update lines 181-182","commit_id":"bb84ee2d38277b519ff209cb321308e10baffb87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"e114ded7eb6954a696ccf8ada7a656c81673e105","unresolved":true,"context_lines":[{"line_number":165,"context_line":"                dns_domain, criterion\u003d{\"name\": \"%s\" % name})"},{"line_number":166,"context_line":"        except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":167,"context_line":"            raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":168,"context_line":"        return [rec[\u0027id\u0027] for rec in recordsets"},{"line_number":169,"context_line":"                for ip in rec[\u0027records\u0027]"},{"line_number":170,"context_line":"                if ip in records]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3730a521_67c2a525","line":168,"updated":"2025-09-09 20:30:26.000000000","message":"I haddn\u0027t look in detail at this change. I don\u0027t think it will work. Here\u0027s a little mock test that I ran in the Python interpreter: https://paste.openstack.org/show/bJzuFuByXVWmpPorQogX/","commit_id":"9b91a2c05fb94ac9a2e3f22462745f50ebceb174"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"579a5b539f26933c329612e9f296c8808490999c","unresolved":true,"context_lines":[{"line_number":165,"context_line":"                dns_domain, criterion\u003d{\"name\": \"%s\" % name})"},{"line_number":166,"context_line":"        except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":167,"context_line":"            raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":168,"context_line":"        return [rec[\u0027id\u0027] for rec in recordsets"},{"line_number":169,"context_line":"                for ip in rec[\u0027records\u0027]"},{"line_number":170,"context_line":"                if ip in records]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fc9f135_054fb69c","line":168,"in_reply_to":"34ff6e12_1484ffc7","updated":"2025-09-09 21:36:34.000000000","message":"This is the good one: \n\n{rec[\u0027id\u0027] for rec in recordsets for ip in str(rec[\u0027records\u0027]) if ip in records}","commit_id":"9b91a2c05fb94ac9a2e3f22462745f50ebceb174"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"1f48f4b0fb82fe5d88c2a1811d9a7111eb21461b","unresolved":true,"context_lines":[{"line_number":165,"context_line":"                dns_domain, criterion\u003d{\"name\": \"%s\" % name})"},{"line_number":166,"context_line":"        except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":167,"context_line":"            raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":168,"context_line":"        return [rec[\u0027id\u0027] for rec in recordsets"},{"line_number":169,"context_line":"                for ip in rec[\u0027records\u0027]"},{"line_number":170,"context_line":"                if ip in records]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa5092f8_be6aae8a","line":168,"in_reply_to":"3730a521_67c2a525","updated":"2025-09-09 20:35:34.000000000","message":"this is what I meant to share https://paste.openstack.org/show/b606MRnZWINy8HLLIcp3/","commit_id":"9b91a2c05fb94ac9a2e3f22462745f50ebceb174"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"52ba5ad9789052c625c620f29369abf4cf5f640a","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                dns_domain, criterion\u003d{\"name\": \"%s\" % name})"},{"line_number":166,"context_line":"        except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":167,"context_line":"            raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":168,"context_line":"        return [rec[\u0027id\u0027] for rec in recordsets"},{"line_number":169,"context_line":"                for ip in rec[\u0027records\u0027]"},{"line_number":170,"context_line":"                if ip in records]"}],"source_content_type":"text/x-python","patch_set":2,"id":"8981dbe4_a598d1ea","line":168,"in_reply_to":"3fc9f135_054fb69c","updated":"2025-09-17 01:25:44.000000000","message":"Done","commit_id":"9b91a2c05fb94ac9a2e3f22462745f50ebceb174"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"a53680b019aad2a09997d1c3bd968eec11e8c66d","unresolved":true,"context_lines":[{"line_number":165,"context_line":"                dns_domain, criterion\u003d{\"name\": \"%s\" % name})"},{"line_number":166,"context_line":"        except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":167,"context_line":"            raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":168,"context_line":"        return [rec[\u0027id\u0027] for rec in recordsets"},{"line_number":169,"context_line":"                for ip in rec[\u0027records\u0027]"},{"line_number":170,"context_line":"                if ip in records]"}],"source_content_type":"text/x-python","patch_set":2,"id":"34ff6e12_1484ffc7","line":168,"in_reply_to":"fa5092f8_be6aae8a","updated":"2025-09-09 21:32:23.000000000","message":"the set can be created directly in the comprenhension with:\n\n{rec[\u0027id\u0027] for rec in recordsets for ip in str(rec[\u0027records\u0027]) if ip in records] # converting to string rec[\u0027records\u0027}","commit_id":"9b91a2c05fb94ac9a2e3f22462745f50ebceb174"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"6ee6057e86199af51a4b0ced51b183904a5d3bfc","unresolved":true,"context_lines":[{"line_number":166,"context_line":"        except (d_exc.NotFound, d_exc.Forbidden):"},{"line_number":167,"context_line":"            raise dns_exc.DNSDomainNotFound(dns_domain\u003ddns_domain)"},{"line_number":168,"context_line":"        return [rec[\u0027id\u0027] for rec in recordsets"},{"line_number":169,"context_line":"                for ip in rec[\u0027records\u0027]"},{"line_number":170,"context_line":"                if ip in records]"}],"source_content_type":"text/x-python","patch_set":3,"id":"c1b9a9c7_fc27d5f2","line":169,"updated":"2025-09-11 13:19:49.000000000","message":"recheck neutron-tempest-plugin-designate-scenario","commit_id":"a50e4dee190b8c1b122a280377319f606af6642d"}]}
