)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d5d3b1a773e4e8e6bbc5d73ad72b379cfb247b7e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b3cd5ffa_46e8ce49","updated":"2022-08-01 13:47:57.000000000","message":"I\u0027m so happy to see this progressing!","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2b67c0f20efa4f4ce1b8b382d26a19bdba5cbe30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"29db16c0_0f7cf62e","updated":"2022-08-03 10:15:09.000000000","message":"I like this, Nice and simple! But unfortunately -1 because this needs to control the external dnsmasq service to perform HUP signals when files in dhcp-hostsdir and dhcp-optsdir is truncated/updated.","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"8de1fbb61e0101feb8a25106877b9d9e92200bcb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8679098c_52ce8210","updated":"2022-08-05 11:13:11.000000000","message":"Looks good to me, just need unit tests and releasenote afict.","commit_id":"b69176e203abd4f6ce4292bfcdddde3caa0bbd69"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"8b2ddda25998be1295e52862cc30639b8514e7d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"07d3e96f_81ef97b7","updated":"2022-08-25 21:46:47.000000000","message":"Seems like it\u0027s moving in a good direction. Eager to see the next update.","commit_id":"899e85beea413065d75972c6283c2537d3ac09d1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"42e76e8b32201e85ba3751523c503e8ad2045ade","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"74a394f3_5e68e528","updated":"2022-09-02 18:21:47.000000000","message":"My only issue is the debug logging. Copyright notices should also be cleaned up as suggested.","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"055be835e0b267d522a490ab136132e00dbc5084","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"24554e30_fd4997f3","updated":"2022-09-01 16:45:01.000000000","message":"No technical issues I can see; but I do think we need to clear up the copyright notice situation to be compliant with policy.","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"24b861efef9dca267e8905fc6f23707dbcaa59f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"ebd56b8b_fcac855e","in_reply_to":"24554e30_fd4997f3","updated":"2022-09-05 02:00:19.000000000","message":"Done","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"}],"ironic/common/pxe_utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d5d3b1a773e4e8e6bbc5d73ad72b379cfb247b7e","unresolved":true,"context_lines":[{"line_number":518,"context_line":"        ipxe_script_url \u003d \u0027/\u0027.join([CONF.deploy.http_url, script_name])"},{"line_number":519,"context_line":"        # if the request comes from dumb firmware send them the iPXE"},{"line_number":520,"context_line":"        # boot image."},{"line_number":521,"context_line":"        if dhcp_provider_name in (\u0027neutron\u0027, \u0027dnsmasq\u0027):"},{"line_number":522,"context_line":"            # Neutron use dnsmasq as default DHCP agent. Neutron carries the"},{"line_number":523,"context_line":"            # configuration to relate to the tags below. The ipxe6 tag was"},{"line_number":524,"context_line":"            # added in the Stein cycle which identifies the iPXE User-Class"}],"source_content_type":"text/x-python","patch_set":2,"id":"00fe66ef_0adc09a1","line":521,"updated":"2022-08-01 13:47:57.000000000","message":"I wonder how we can avoid hardcoding driver names here...","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"423ea08f481c6c1e9bcae5e55ec3b10321bb68cc","unresolved":false,"context_lines":[{"line_number":518,"context_line":"        ipxe_script_url \u003d \u0027/\u0027.join([CONF.deploy.http_url, script_name])"},{"line_number":519,"context_line":"        # if the request comes from dumb firmware send them the iPXE"},{"line_number":520,"context_line":"        # boot image."},{"line_number":521,"context_line":"        if dhcp_provider_name in (\u0027neutron\u0027, \u0027dnsmasq\u0027):"},{"line_number":522,"context_line":"            # Neutron use dnsmasq as default DHCP agent. Neutron carries the"},{"line_number":523,"context_line":"            # configuration to relate to the tags below. The ipxe6 tag was"},{"line_number":524,"context_line":"            # added in the Stein cycle which identifies the iPXE User-Class"}],"source_content_type":"text/x-python","patch_set":2,"id":"4abacbea_334a67fa","line":521,"in_reply_to":"00fe66ef_0adc09a1","updated":"2022-08-02 02:32:01.000000000","message":"I\u0027ll add a supports_ipxe_tag method on each provider.","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"}],"ironic/conf/dhcp.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d5d3b1a773e4e8e6bbc5d73ad72b379cfb247b7e","unresolved":true,"context_lines":[{"line_number":23,"context_line":"               help\u003d_(\u0027DHCP provider to use. \"neutron\" uses Neutron, \u0027"},{"line_number":24,"context_line":"                      \u0027\"dnsmasq\" uses the Dnsmasq provider, and \u0027"},{"line_number":25,"context_line":"                      \u0027\"none\" uses a no-op provider.\u0027)),"},{"line_number":26,"context_line":"    cfg.StrOpt(\u0027dnsmasq_dhcp_optsdir\u0027,"},{"line_number":27,"context_line":"               default\u003d\u0027/etc/dnsmasq.d/optsdir.d\u0027,"},{"line_number":28,"context_line":"               help\u003d_(\u0027Directory where the \"dnsmasq\" provider will write \u0027"},{"line_number":29,"context_line":"                      \u0027option configuration files for an external \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"76650c57_bcf25c8f","line":26,"updated":"2022-08-01 13:47:57.000000000","message":"Since we have a [neutron] group, I wonder if we should introduce a [dnsmasq] group.","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"fc92e271cc2884460b39536cf21888507343d384","unresolved":false,"context_lines":[{"line_number":23,"context_line":"               help\u003d_(\u0027DHCP provider to use. \"neutron\" uses Neutron, \u0027"},{"line_number":24,"context_line":"                      \u0027\"dnsmasq\" uses the Dnsmasq provider, and \u0027"},{"line_number":25,"context_line":"                      \u0027\"none\" uses a no-op provider.\u0027)),"},{"line_number":26,"context_line":"    cfg.StrOpt(\u0027dnsmasq_dhcp_optsdir\u0027,"},{"line_number":27,"context_line":"               default\u003d\u0027/etc/dnsmasq.d/optsdir.d\u0027,"},{"line_number":28,"context_line":"               help\u003d_(\u0027Directory where the \"dnsmasq\" provider will write \u0027"},{"line_number":29,"context_line":"                      \u0027option configuration files for an external \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"cacb3ac6_402d91ba","line":26,"in_reply_to":"76650c57_bcf25c8f","updated":"2022-08-02 02:32:32.000000000","message":"Done","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"}],"ironic/conf/dnsmasq.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"8b2ddda25998be1295e52862cc30639b8514e7d5","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Intel Corporation"},{"line_number":2,"context_line":"# Copyright 2014 Rackspace, Inc."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"1c3b7572_df4a58ea","line":2,"updated":"2022-08-25 21:46:47.000000000","message":"These copyright headers are intensely confusing for new code. I\u0027m assuming this is heavily based off the code in Neutron?","commit_id":"899e85beea413065d75972c6283c2537d3ac09d1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"42ea9be295ba3bfeda11062d09530da351b69074","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Intel Corporation"},{"line_number":2,"context_line":"# Copyright 2014 Rackspace, Inc."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"7d35b0dd_8a9fadc0","line":2,"in_reply_to":"1c3b7572_df4a58ea","updated":"2022-08-26 03:23:45.000000000","message":"Ugh, this should be 2022 Red Hat","commit_id":"899e85beea413065d75972c6283c2537d3ac09d1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"8b2ddda25998be1295e52862cc30639b8514e7d5","unresolved":true,"context_lines":[{"line_number":32,"context_line":"                      \u0027dhcp-hostsdir dnsmasq configuration directive\u0027)),"},{"line_number":33,"context_line":"    cfg.StrOpt(\u0027leases_file\u0027,"},{"line_number":34,"context_line":"               default\u003d\u0027/var/lib/dnsmasq/dnsmasq.leases\u0027,"},{"line_number":35,"context_line":"               help\u003d_(\u0027Dnsmasq leases file for the \"dnsmasq\" driver to \u0027"},{"line_number":36,"context_line":"                      \u0027discover IP addresses of managed nodes.\u0027)),"},{"line_number":37,"context_line":"]"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1ffe962a_fd0d0ac9","line":35,"updated":"2022-08-25 21:46:47.000000000","message":"nit: maybe indicate what setting in dnsmasq indicates or sets this location as well?\n\nI know this isn\u0027t the path dnsmasq leases live on all distros :)","commit_id":"899e85beea413065d75972c6283c2537d3ac09d1"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"42ea9be295ba3bfeda11062d09530da351b69074","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                      \u0027dhcp-hostsdir dnsmasq configuration directive\u0027)),"},{"line_number":33,"context_line":"    cfg.StrOpt(\u0027leases_file\u0027,"},{"line_number":34,"context_line":"               default\u003d\u0027/var/lib/dnsmasq/dnsmasq.leases\u0027,"},{"line_number":35,"context_line":"               help\u003d_(\u0027Dnsmasq leases file for the \"dnsmasq\" driver to \u0027"},{"line_number":36,"context_line":"                      \u0027discover IP addresses of managed nodes.\u0027)),"},{"line_number":37,"context_line":"]"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"405bc0fc_3a568d95","line":35,"in_reply_to":"1ffe962a_fd0d0ac9","updated":"2022-08-26 03:23:45.000000000","message":"Note to self, the dnsmasq option is dhcp-leasefile. Maybe this should be renamed to dhcp_leasefile","commit_id":"899e85beea413065d75972c6283c2537d3ac09d1"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"055be835e0b267d522a490ab136132e00dbc5084","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright 2022 Red Hat, Inc."},{"line_number":3,"context_line":"# All Rights Reserved"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"3aceb1f5_9b616e2e","line":3,"updated":"2022-09-01 16:45:01.000000000","message":"https://wiki.openstack.org/wiki/LegalIssuesFAQ#Copyright_Headers\n\n\u003e Q: Should \"All rights reserved\" follow a copyright notice?\n\n\u003e A: It is not necessary to follow a copyright notice with the words \"All rights reserved\". While it is harmless, some people regard \"All rights reserved\" as being inappropriate in conjunction with an open source license grant. Therefore it is recommended that developers not include \"All rights reserved\" in copyright headers. \n\nThis should be removed, per legal issues faq.","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"42e76e8b32201e85ba3751523c503e8ad2045ade","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright 2022 Red Hat, Inc."},{"line_number":3,"context_line":"# All Rights Reserved"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"7878bd51_e843657a","line":3,"in_reply_to":"3aceb1f5_9b616e2e","updated":"2022-09-02 18:21:47.000000000","message":"++","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"24b861efef9dca267e8905fc6f23707dbcaa59f7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright 2022 Red Hat, Inc."},{"line_number":3,"context_line":"# All Rights Reserved"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"36c6de57_2a25faa6","line":3,"in_reply_to":"7878bd51_e843657a","updated":"2022-09-05 02:00:19.000000000","message":"Done","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"}],"ironic/dhcp/base.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2bea64c8a17ce2b134452ce0f50b397b5adecd81","unresolved":true,"context_lines":[{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        pass"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def supports_ipxe_tag(self):"},{"line_number":107,"context_line":"        \"\"\"Whether the provider will correctly apply the \u0027ipxe\u0027 tag."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        When iPXE makes a DHCP request, does this provider support adding"}],"source_content_type":"text/x-python","patch_set":4,"id":"812daa2f_554d2448","line":106,"updated":"2022-08-03 16:59:33.000000000","message":"I like... this is good thinking ahead!","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"42ea9be295ba3bfeda11062d09530da351b69074","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        pass"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def supports_ipxe_tag(self):"},{"line_number":107,"context_line":"        \"\"\"Whether the provider will correctly apply the \u0027ipxe\u0027 tag."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        When iPXE makes a DHCP request, does this provider support adding"}],"source_content_type":"text/x-python","patch_set":4,"id":"78ffcac1_852d8d64","line":106,"in_reply_to":"812daa2f_554d2448","updated":"2022-08-26 03:23:45.000000000","message":"Done","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"}],"ironic/dhcp/dnsmasq.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d5d3b1a773e4e8e6bbc5d73ad72b379cfb247b7e","unresolved":true,"context_lines":[{"line_number":47,"context_line":"                           \u0027ip_version\u0027: 4}]"},{"line_number":48,"context_line":"        :param vifs: Ignored argument"},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        macs \u003d set(port.address for port in task.ports)"},{"line_number":51,"context_line":"        host_file \u003d self._host_file_path(task)"},{"line_number":52,"context_line":"        opt_file \u003d self._opt_file_path(task)"},{"line_number":53,"context_line":"        uuid \u003d task.node.uuid"}],"source_content_type":"text/x-python","patch_set":2,"id":"b5a0a660_626f1d6d","line":50,"updated":"2022-08-01 13:47:57.000000000","message":"I wonder if we should consider pxe_enabled on ports. Or will the enabled ports be passed through vifs?","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"423ea08f481c6c1e9bcae5e55ec3b10321bb68cc","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                           \u0027ip_version\u0027: 4}]"},{"line_number":48,"context_line":"        :param vifs: Ignored argument"},{"line_number":49,"context_line":"        \"\"\""},{"line_number":50,"context_line":"        macs \u003d set(port.address for port in task.ports)"},{"line_number":51,"context_line":"        host_file \u003d self._host_file_path(task)"},{"line_number":52,"context_line":"        opt_file \u003d self._opt_file_path(task)"},{"line_number":53,"context_line":"        uuid \u003d task.node.uuid"}],"source_content_type":"text/x-python","patch_set":2,"id":"e291bdb9_89244af0","line":50,"in_reply_to":"b5a0a660_626f1d6d","updated":"2022-08-02 02:32:01.000000000","message":"I\u0027ll add a pxe_enabled check","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d5d3b1a773e4e8e6bbc5d73ad72b379cfb247b7e","unresolved":true,"context_lines":[{"line_number":61,"context_line":"                    \u0027opt_name\u0027: option.get(\u0027opt_name\u0027),"},{"line_number":62,"context_line":"                    \u0027opt_value\u0027: option.get(\u0027opt_value\u0027),"},{"line_number":63,"context_line":"                }"},{"line_number":64,"context_line":"                entry \u003d \u0027tag:%(tag)s,%(opt_name)s,%(opt_value)s\\n\u0027 % opt"},{"line_number":65,"context_line":"                LOG.debug(entry)"},{"line_number":66,"context_line":"                f.write(entry)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df0ee52d_2d34f463","line":64,"updated":"2022-08-01 13:47:57.000000000","message":"nit: use f-strings as cool kids do :)","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"423ea08f481c6c1e9bcae5e55ec3b10321bb68cc","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                    \u0027opt_name\u0027: option.get(\u0027opt_name\u0027),"},{"line_number":62,"context_line":"                    \u0027opt_value\u0027: option.get(\u0027opt_value\u0027),"},{"line_number":63,"context_line":"                }"},{"line_number":64,"context_line":"                entry \u003d \u0027tag:%(tag)s,%(opt_name)s,%(opt_value)s\\n\u0027 % opt"},{"line_number":65,"context_line":"                LOG.debug(entry)"},{"line_number":66,"context_line":"                f.write(entry)"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"4a9b4109_1204a458","line":64,"in_reply_to":"df0ee52d_2d34f463","updated":"2022-08-02 02:32:01.000000000","message":"But I\u0027m oooold ;(\n\n(Done)","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d5d3b1a773e4e8e6bbc5d73ad72b379cfb247b7e","unresolved":true,"context_lines":[{"line_number":62,"context_line":"                    \u0027opt_value\u0027: option.get(\u0027opt_value\u0027),"},{"line_number":63,"context_line":"                }"},{"line_number":64,"context_line":"                entry \u003d \u0027tag:%(tag)s,%(opt_name)s,%(opt_value)s\\n\u0027 % opt"},{"line_number":65,"context_line":"                LOG.debug(entry)"},{"line_number":66,"context_line":"                f.write(entry)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        LOG.debug(\u0027Writing to %s:\u0027, host_file)"}],"source_content_type":"text/x-python","patch_set":2,"id":"de3d251a_7b42892e","line":65,"updated":"2022-08-01 13:47:57.000000000","message":"I\u0027d actually keep some logging like this in the final version of the patch","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"423ea08f481c6c1e9bcae5e55ec3b10321bb68cc","unresolved":false,"context_lines":[{"line_number":62,"context_line":"                    \u0027opt_value\u0027: option.get(\u0027opt_value\u0027),"},{"line_number":63,"context_line":"                }"},{"line_number":64,"context_line":"                entry \u003d \u0027tag:%(tag)s,%(opt_name)s,%(opt_value)s\\n\u0027 % opt"},{"line_number":65,"context_line":"                LOG.debug(entry)"},{"line_number":66,"context_line":"                f.write(entry)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        LOG.debug(\u0027Writing to %s:\u0027, host_file)"}],"source_content_type":"text/x-python","patch_set":2,"id":"2eb68117_6b0be074","line":65,"in_reply_to":"de3d251a_7b42892e","updated":"2022-08-02 02:32:01.000000000","message":"Done","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d5d3b1a773e4e8e6bbc5d73ad72b379cfb247b7e","unresolved":true,"context_lines":[{"line_number":122,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":123,"context_line":"                f.truncate(0)"},{"line_number":124,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":125,"context_line":"        # files, a periodic task could delete old empty files"}],"source_content_type":"text/x-python","patch_set":2,"id":"6f51552b_b40fb46f","line":125,"updated":"2022-08-01 13:47:57.000000000","message":"Cannot we remove them as the 3rd step? Or will it race with dnsmasq\u0027s re-reading the directory?\n\nIt\u0027s probably fine if we remove any empty files in __init__","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"423ea08f481c6c1e9bcae5e55ec3b10321bb68cc","unresolved":true,"context_lines":[{"line_number":122,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":123,"context_line":"                f.truncate(0)"},{"line_number":124,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":125,"context_line":"        # files, a periodic task could delete old empty files"}],"source_content_type":"text/x-python","patch_set":2,"id":"97a15fee_a48876de","line":125,"in_reply_to":"6f51552b_b40fb46f","updated":"2022-08-02 02:32:01.000000000","message":"From what I can tell from the docs, deleting files is ignored by dnsmasq, so the only race danger is another ironic operation re-populating the file between the file-size check and the delete file operation.\n\nBut this wouldn\u0027t happen on service start-up, so lets do it in __init__. Later.","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"8de1fbb61e0101feb8a25106877b9d9e92200bcb","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":123,"context_line":"                f.truncate(0)"},{"line_number":124,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":125,"context_line":"        # files, a periodic task could delete old empty files"}],"source_content_type":"text/x-python","patch_set":2,"id":"433d697c_da4274f4","line":125,"in_reply_to":"97a15fee_a48876de","updated":"2022-08-05 11:13:11.000000000","message":"Marking this as resolved, the current patchset deletes the opts files.","commit_id":"ffa7b18711b15d607d870ab6fd316fc402eaee37"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2b67c0f20efa4f4ce1b8b382d26a19bdba5cbe30","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        LOG.debug(\u0027Truncating %s:\u0027, opt_file)"},{"line_number":125,"context_line":"        if os.path.exists(opt_file):"},{"line_number":126,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":127,"context_line":"                f.truncate(0)"},{"line_number":128,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":129,"context_line":"        # files, a periodic task could delete old empty files"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"4261dd06_c58cf0b2","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":29},"updated":"2022-08-03 10:15:09.000000000","message":"dnsmasq will not remove the in-memory configuration when a file is truncated, or if one or more entries is removed from a file. It has no knowledge of what was previously in the specific file, and thus does not know what configuration entry to remove. We need to HUP dnsmasq for this to take effect.\n\nThe snippet in dnsmasq manual that describes this:\n  --dhcp-hostsdir\u003d\u003cpath\u003e\n      \u003csnip\u003e\n      If a file is deleted or changed after it has been read by dnsmasq, \n      then the host record it contained will remain until dnsmasq receives a \n      SIGHUP, or is restarted; ie host records are only added dynamically.\n      \u003csnip\u003e\n\nInstead of truncating the `host_file` in L122 it might be an option to set the \u0027,ignore\u0027 flag for the nodes mac addresses. Then some periodic task to remove \u0027,ignore\u0027 entries and do a HUP to ensure dnsmasq re-reads configuration from files. But I think any changing beyond adding opts for a node will require service HUP.","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2bea64c8a17ce2b134452ce0f50b397b5adecd81","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        LOG.debug(\u0027Truncating %s:\u0027, opt_file)"},{"line_number":125,"context_line":"        if os.path.exists(opt_file):"},{"line_number":126,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":127,"context_line":"                f.truncate(0)"},{"line_number":128,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":129,"context_line":"        # files, a periodic task could delete old empty files"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"834f093b_e0d7065a","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":29},"in_reply_to":"4261dd06_c58cf0b2","updated":"2022-08-03 16:59:33.000000000","message":"As much as periodics make me sad at times, I do think it is likely a good path to take for managing the files and contents, and would help ensure a drive towards eventual consistency.","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"aed1b9ca5ade6429ad5bb95fbc12515fb86b4fa5","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        LOG.debug(\u0027Truncating %s:\u0027, opt_file)"},{"line_number":125,"context_line":"        if os.path.exists(opt_file):"},{"line_number":126,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":127,"context_line":"                f.truncate(0)"},{"line_number":128,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":129,"context_line":"        # files, a periodic task could delete old empty files"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"cb3bd3bb_a7c9fa00","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":29},"in_reply_to":"7f21cfea_96df24b9","updated":"2022-08-04 21:25:33.000000000","message":"\u003e Wonder if generating a new uuid for the tag every time DHCP options are updated would be an alternative? i.e instead of the node-uuid which would be re-used each time a node is booted.\n\nYep, I think its time to store some state in the driver_internal_info of the node, just a unique UUID, so to summarize:\n\n- the tag is a unique uuid stored in driver_internal_info, unset during clean_dhcp_opts\n- the hosts filename has the mac address, applies the uuid tag, replaced with the ignore tag on clean_dhcp_opts\n- the options filename is the *node* uuid, matching on the tag from the driver_internal_info uuid, deleted on clean_dhcp_opts\n\nThis results in no dnsmasq rules applying from previous actions, no requirement for SIGHUP, and the only accumulating files are hosts entries with mac address filenames that don\u0027t need any periodic delete.","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"7b96980b5c898d3dc87345ea039d069b15f62b9d","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        LOG.debug(\u0027Truncating %s:\u0027, opt_file)"},{"line_number":125,"context_line":"        if os.path.exists(opt_file):"},{"line_number":126,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":127,"context_line":"                f.truncate(0)"},{"line_number":128,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":129,"context_line":"        # files, a periodic task could delete old empty files"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"e91e16fd_c1cb24be","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":29},"in_reply_to":"834f093b_e0d7065a","updated":"2022-08-03 23:24:29.000000000","message":"The only thing the host record does is tag the mac with the node uuid. I don\u0027t think we ever want to ignore the mac because it might show up with a different node uuid. We probably don\u0027t need to care about the tagging lingering after cleanup and we could even delete the host file completely. (as long as a new tag gets applied when the same mac shows up with a different node uuid).\n\nWhat we do need to think about is the behaviour of dhcp-optsdir rules disappearing and being overwritten. I might need to observe actual behaviour because the docs are too vague to make any kind of assertion.\n\nAlso I\u0027d really like to avoid needing SIGHUP ever, because it would be very difficult to do that from outside the container in the kubernetes case. The only way I can think of is to write a dnsmasq process manager wrapper which spawns dnsmasq, does its own inotify watching, and sends SIGHUP when necessary. Then the systemd unit or pod launches the wrapper, not dnsmasq. (I should probably look at how neutron does it)\n\nEdit:\nWe could go with Harald\u0027s host \u0027,ignore\u0027 approach as long as update_dhcp_opts parses every existing file to delete files with a matching mac and the ignore tag before writing the new file. That seems do-able.","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"8de1fbb61e0101feb8a25106877b9d9e92200bcb","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        LOG.debug(\u0027Truncating %s:\u0027, opt_file)"},{"line_number":125,"context_line":"        if os.path.exists(opt_file):"},{"line_number":126,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":127,"context_line":"                f.truncate(0)"},{"line_number":128,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":129,"context_line":"        # files, a periodic task could delete old empty files"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"e5ceabb7_db4c40c0","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":29},"in_reply_to":"cb3bd3bb_a7c9fa00","updated":"2022-08-05 11:13:11.000000000","message":"\u003e \u003e Wonder if generating a new uuid for the tag every time DHCP options are updated would be an alternative? i.e instead of the node-uuid which would be re-used each time a node is booted.\n\u003e \n\u003e Yep, I think its time to store some state in the driver_internal_info of the node, just a unique UUID, so to summarize:\n\u003e \n\u003e - the tag is a unique uuid stored in driver_internal_info, unset during clean_dhcp_opts\n\u003e - the hosts filename has the mac address, applies the uuid tag, replaced with the ignore tag on clean_dhcp_opts\n\u003e - the options filename is the *node* uuid, matching on the tag from the driver_internal_info uuid, deleted on clean_dhcp_opts\n\u003e \n\u003e This results in no dnsmasq rules applying from previous actions, no requirement for SIGHUP, and the only accumulating files are hosts entries with mac address filenames that don\u0027t need any periodic delete.\n\nYes, Good idea using driver_internal_info!\nI belive this implementation as detailed above will work.\n\nWe may want to document that busy environments should restart/SIGHUP the external dnsmasq periodically to avoid potential performance degradation in dnsmasq if the options in memory grow to a huge number. I can\u0027t imagine more often than daily or even weekly would be required, with such intervals asking the user to set up a cron job or similar seems reasonable.","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"42ea9be295ba3bfeda11062d09530da351b69074","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        LOG.debug(\u0027Truncating %s:\u0027, opt_file)"},{"line_number":125,"context_line":"        if os.path.exists(opt_file):"},{"line_number":126,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":127,"context_line":"                f.truncate(0)"},{"line_number":128,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":129,"context_line":"        # files, a periodic task could delete old empty files"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"59bcce2d_c8ad2b88","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":29},"in_reply_to":"d6286371_7e6e1d40","updated":"2022-08-26 03:23:45.000000000","message":"I\u0027d be open to more API based DHCP providers other than the neutron one, but I can\u0027t imagine metal3 or bifrost switching so the motivation would need to come from whoever has the use case.\n\nAny HUP support is tricky due to the variety of ways the dnsmasq daemon is managed. We have systemd (bifrost), a container in a kubernetes pod (metal3) and a standalone container (metal3, dev-mode). This is why I\u0027ve been motivated to stay away from requiring sending HUP at all.\n\nThe dnsmasq logging gives some reasonable transparency on what is happening:\nhttps://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_e30/851682/6/check/bifrost-integration-redfish-uefi-fedora-latest/e30e80e/logs/dnsmasq.log","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"8b2ddda25998be1295e52862cc30639b8514e7d5","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        LOG.debug(\u0027Truncating %s:\u0027, opt_file)"},{"line_number":125,"context_line":"        if os.path.exists(opt_file):"},{"line_number":126,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":127,"context_line":"                f.truncate(0)"},{"line_number":128,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":129,"context_line":"        # files, a periodic task could delete old empty files"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"d6286371_7e6e1d40","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":29},"in_reply_to":"e5ceabb7_db4c40c0","updated":"2022-08-25 21:46:47.000000000","message":"Gonna be honest, all this complexity makes me want to see what a real-api-accessible DHCP integration would look like (e.g. isc-dhcp-server or kea)... or even a small wrapper that could run alongside dnsmasq to hold some of this complexity (and perform HUPs is needed).\n\nI don\u0027t love the solution as proposed as it\u0027ll make troubleshooting failed DHCP significantly harder than it already is, but I don\u0027t have a better suggestion that can maintain the requirement that we support situations where Ironic would be unable to HUP dnsmasq that also doesn\u0027t require a lot more work.\n\nTo summarize, imo this is OK to support dnsmasq; but also should be seen as evidence that dnsmasq may not be the best fit for our use case.","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"a87a750f3a0f45f665b08562308122cbdfc3faeb","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        LOG.debug(\u0027Truncating %s:\u0027, opt_file)"},{"line_number":125,"context_line":"        if os.path.exists(opt_file):"},{"line_number":126,"context_line":"            with open(opt_file, \u0027a\u0027) as f:"},{"line_number":127,"context_line":"                f.truncate(0)"},{"line_number":128,"context_line":"        # TODO(sbaker) This will result in an accumulation of zero length"},{"line_number":129,"context_line":"        # files, a periodic task could delete old empty files"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7f21cfea_96df24b9","line":127,"range":{"start_line":127,"start_character":16,"end_line":127,"end_character":29},"in_reply_to":"e91e16fd_c1cb24be","updated":"2022-08-04 16:47:43.000000000","message":"\u003e What we do need to think about is the behaviour of dhcp-optsdir rules disappearing and being overwritten. I might need to observe actual behaviour because the docs are too vague to make any kind of assertion.\n\u003e \n\n+1 on observing actual behavior.\n\nI believe options are essentially always add only when files in dhcp-optsdir is changed so in dnsmasq memory they are never overwritten. Multiple options for a tag is added like this:\ndhcp-option\u003dtag:uuid-aaa,option:OPT_A,VALUE_a\ndhcp-option\u003dtag:uuid-aaa,option:OPT_B,VALUE_b\ndhcp-option\u003dtag:uuid-aaa,option:OPT_C,VALUE_c\n\nIf we later do:\ndhcp-option\u003dtag:\u003cuuid-aaa\u003e,option:OPT_A,VALUE_a_new\ndhcp-option\u003dtag:\u003cuuid-aaa\u003e,option:OPT_C,Value_c_new\n\nI don\u0027t think dnsmasq overwrites the previous OPT_A and OPT_C, I think the new value is simply appended to a linked list in dnsmasq memory and I\u0027m not sure the actual value returned to a DHCP client is even deterministic in this case.\n\n\nWonder if generating a new uuid for the tag every time DHCP options are updated would be an alternative? i.e instead of the node-uuid which would be re-used each time a node is booted.","commit_id":"2ef0ae203d39190bfc1c5a0ea8f3443d89523e3b"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"b75621e2f51b036d7e00623962ccd5597662a501","unresolved":true,"context_lines":[{"line_number":75,"context_line":"                LOG.debug(entry)"},{"line_number":76,"context_line":"                f.write(entry)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _delete_ignored_macs(self, macs):"},{"line_number":79,"context_line":"        # Search exiting hosts files for ignored macs which should now be"},{"line_number":80,"context_line":"        # tagged with a node uuid"},{"line_number":81,"context_line":"        ignore_rules \u003d set([\u0027{mac},ignore\\n\u0027.format(mac\u003dmac) for mac in macs])"}],"source_content_type":"text/x-python","patch_set":5,"id":"3bf7a352_f7fed743","line":78,"range":{"start_line":78,"start_character":8,"end_line":78,"end_character":28},"updated":"2022-08-04 17:06:54.000000000","message":"a tought ... would it be more efficient to use a hosts file per-mac address instead of a file per-node which may hold dnsmasq host entry for multiple macs?","commit_id":"5b72e5251c642eb5cdc22ebc746b019f5e20b2a9"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"aed1b9ca5ade6429ad5bb95fbc12515fb86b4fa5","unresolved":true,"context_lines":[{"line_number":75,"context_line":"                LOG.debug(entry)"},{"line_number":76,"context_line":"                f.write(entry)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _delete_ignored_macs(self, macs):"},{"line_number":79,"context_line":"        # Search exiting hosts files for ignored macs which should now be"},{"line_number":80,"context_line":"        # tagged with a node uuid"},{"line_number":81,"context_line":"        ignore_rules \u003d set([\u0027{mac},ignore\\n\u0027.format(mac\u003dmac) for mac in macs])"}],"source_content_type":"text/x-python","patch_set":5,"id":"b23d0c1c_22ddee53","line":78,"range":{"start_line":78,"start_character":8,"end_line":78,"end_character":28},"in_reply_to":"3bf7a352_f7fed743","updated":"2022-08-04 21:25:33.000000000","message":"That would save having to scan every file, yeah","commit_id":"5b72e5251c642eb5cdc22ebc746b019f5e20b2a9"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"8de1fbb61e0101feb8a25106877b9d9e92200bcb","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                LOG.debug(entry)"},{"line_number":76,"context_line":"                f.write(entry)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _delete_ignored_macs(self, macs):"},{"line_number":79,"context_line":"        # Search exiting hosts files for ignored macs which should now be"},{"line_number":80,"context_line":"        # tagged with a node uuid"},{"line_number":81,"context_line":"        ignore_rules \u003d set([\u0027{mac},ignore\\n\u0027.format(mac\u003dmac) for mac in macs])"}],"source_content_type":"text/x-python","patch_set":5,"id":"b99e1c51_2080377b","line":78,"range":{"start_line":78,"start_character":8,"end_line":78,"end_character":28},"in_reply_to":"b23d0c1c_22ddee53","updated":"2022-08-05 11:13:11.000000000","message":"Marking this resolved, current patch set has a file per-mac.","commit_id":"5b72e5251c642eb5cdc22ebc746b019f5e20b2a9"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"8de1fbb61e0101feb8a25106877b9d9e92200bcb","unresolved":true,"context_lines":[{"line_number":76,"context_line":"            with open(host_file, \u0027w\u0027) as f:"},{"line_number":77,"context_line":"                # Tag each address with the unique uuid scoped to"},{"line_number":78,"context_line":"                # this node and DHCP transaction"},{"line_number":79,"context_line":"                entry \u003d \u0027{mac},set:{tag}\\n\u0027.format("},{"line_number":80,"context_line":"                    mac\u003dmac, tag\u003dtag)"},{"line_number":81,"context_line":"                LOG.debug(entry)"},{"line_number":82,"context_line":"                f.write(entry)"}],"source_content_type":"text/x-python","patch_set":6,"id":"0d450075_b84fa938","line":79,"range":{"start_line":79,"start_character":31,"end_line":79,"end_character":42},"updated":"2022-08-05 11:13:11.000000000","message":"An idea, probably good as follow up patch to catch other peoples opinion.\n\nAssuming the dnsmasq service is potentially shared, used for non-ironic case as well. Would it make sense to set an additional tag to indicate this is an ironic node, i.e \u0027set:ironic\u0027? (Something configurable would probably be better)\n\nThis would allow the user to set options in dnsmasq.conf with tag:!ironic, (not) to ensure generic options never apply to ironic nodes?","commit_id":"b69176e203abd4f6ce4292bfcdddde3caa0bbd69"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"8b2ddda25998be1295e52862cc30639b8514e7d5","unresolved":true,"context_lines":[{"line_number":76,"context_line":"            with open(host_file, \u0027w\u0027) as f:"},{"line_number":77,"context_line":"                # Tag each address with the unique uuid scoped to"},{"line_number":78,"context_line":"                # this node and DHCP transaction"},{"line_number":79,"context_line":"                entry \u003d \u0027{mac},set:{tag}\\n\u0027.format("},{"line_number":80,"context_line":"                    mac\u003dmac, tag\u003dtag)"},{"line_number":81,"context_line":"                LOG.debug(entry)"},{"line_number":82,"context_line":"                f.write(entry)"}],"source_content_type":"text/x-python","patch_set":6,"id":"438726ef_6f5b0be7","line":79,"range":{"start_line":79,"start_character":31,"end_line":79,"end_character":42},"in_reply_to":"0d450075_b84fa938","updated":"2022-08-25 21:46:47.000000000","message":"If we do this, lets do it now rather than in a follow-up, so untagged entries never get created. I do think it\u0027s a good idea to namespace them, barring other complications.","commit_id":"b69176e203abd4f6ce4292bfcdddde3caa0bbd69"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"42ea9be295ba3bfeda11062d09530da351b69074","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            with open(host_file, \u0027w\u0027) as f:"},{"line_number":77,"context_line":"                # Tag each address with the unique uuid scoped to"},{"line_number":78,"context_line":"                # this node and DHCP transaction"},{"line_number":79,"context_line":"                entry \u003d \u0027{mac},set:{tag}\\n\u0027.format("},{"line_number":80,"context_line":"                    mac\u003dmac, tag\u003dtag)"},{"line_number":81,"context_line":"                LOG.debug(entry)"},{"line_number":82,"context_line":"                f.write(entry)"}],"source_content_type":"text/x-python","patch_set":6,"id":"d8fbbb92_60b718d1","line":79,"range":{"start_line":79,"start_character":31,"end_line":79,"end_character":42},"in_reply_to":"438726ef_6f5b0be7","updated":"2022-08-26 03:23:45.000000000","message":"Done","commit_id":"b69176e203abd4f6ce4292bfcdddde3caa0bbd69"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"42e76e8b32201e85ba3751523c503e8ad2045ade","unresolved":true,"context_lines":[{"line_number":132,"context_line":"        macs \u003d set(self._pxe_enabled_macs(task.ports))"},{"line_number":133,"context_line":"        for mac in macs:"},{"line_number":134,"context_line":"            host_file \u003d self._host_file_path(mac)"},{"line_number":135,"context_line":"            LOG.debug(\u0027Setting to ignore %s:\u0027, host_file)"},{"line_number":136,"context_line":"            with open(host_file, \u0027w\u0027) as f:"},{"line_number":137,"context_line":"                entry \u003d \u0027{mac},ignore\\n\u0027.format(mac\u003dmac)"},{"line_number":138,"context_line":"                LOG.debug(entry)"}],"source_content_type":"text/x-python","patch_set":9,"id":"2110c821_9ed86755","line":135,"range":{"start_line":135,"start_character":12,"end_line":135,"end_character":57},"updated":"2022-09-02 18:21:47.000000000","message":"Same as comment below, we really need to be mindful if we *should* be logging normal operations.","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"24b861efef9dca267e8905fc6f23707dbcaa59f7","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        macs \u003d set(self._pxe_enabled_macs(task.ports))"},{"line_number":133,"context_line":"        for mac in macs:"},{"line_number":134,"context_line":"            host_file \u003d self._host_file_path(mac)"},{"line_number":135,"context_line":"            LOG.debug(\u0027Setting to ignore %s:\u0027, host_file)"},{"line_number":136,"context_line":"            with open(host_file, \u0027w\u0027) as f:"},{"line_number":137,"context_line":"                entry \u003d \u0027{mac},ignore\\n\u0027.format(mac\u003dmac)"},{"line_number":138,"context_line":"                LOG.debug(entry)"}],"source_content_type":"text/x-python","patch_set":9,"id":"33a7a0dd_5548c2c2","line":135,"range":{"start_line":135,"start_character":12,"end_line":135,"end_character":57},"in_reply_to":"2110c821_9ed86755","updated":"2022-09-05 02:00:19.000000000","message":"Done, but I\u0027ll leave in the update_dhcp_opts logging since Dmitry asked for verbose debug logging in an earlier review of this change.","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"42e76e8b32201e85ba3751523c503e8ad2045ade","unresolved":true,"context_lines":[{"line_number":135,"context_line":"            LOG.debug(\u0027Setting to ignore %s:\u0027, host_file)"},{"line_number":136,"context_line":"            with open(host_file, \u0027w\u0027) as f:"},{"line_number":137,"context_line":"                entry \u003d \u0027{mac},ignore\\n\u0027.format(mac\u003dmac)"},{"line_number":138,"context_line":"                LOG.debug(entry)"},{"line_number":139,"context_line":"                f.write(entry)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # Deleting the file containing dhcp-option won\u0027t remove the rules from"}],"source_content_type":"text/x-python","patch_set":9,"id":"cf9af50a_6879539c","line":138,"range":{"start_line":138,"start_character":16,"end_line":138,"end_character":32},"updated":"2022-09-02 18:21:47.000000000","message":"We need to be careful about just logging items to even debug, as some operators just run their entire system in debug all of the tiem.","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"24b861efef9dca267e8905fc6f23707dbcaa59f7","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            LOG.debug(\u0027Setting to ignore %s:\u0027, host_file)"},{"line_number":136,"context_line":"            with open(host_file, \u0027w\u0027) as f:"},{"line_number":137,"context_line":"                entry \u003d \u0027{mac},ignore\\n\u0027.format(mac\u003dmac)"},{"line_number":138,"context_line":"                LOG.debug(entry)"},{"line_number":139,"context_line":"                f.write(entry)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # Deleting the file containing dhcp-option won\u0027t remove the rules from"}],"source_content_type":"text/x-python","patch_set":9,"id":"3b80584c_392154af","line":138,"range":{"start_line":138,"start_character":16,"end_line":138,"end_character":32},"in_reply_to":"cf9af50a_6879539c","updated":"2022-09-05 02:00:19.000000000","message":"Done","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"42e76e8b32201e85ba3751523c503e8ad2045ade","unresolved":true,"context_lines":[{"line_number":143,"context_line":"        # these rules will not apply."},{"line_number":144,"context_line":"        opt_file \u003d self._opt_file_path(node)"},{"line_number":145,"context_line":"        if os.path.exists(opt_file):"},{"line_number":146,"context_line":"            LOG.debug(\u0027Removing %s\u0027, opt_file)"},{"line_number":147,"context_line":"            os.remove(opt_file)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def supports_ipxe_tag(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"606c30cc_d0a50344","line":146,"updated":"2022-09-02 18:21:47.000000000","message":"Same as comment above.","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"24b861efef9dca267e8905fc6f23707dbcaa59f7","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        # these rules will not apply."},{"line_number":144,"context_line":"        opt_file \u003d self._opt_file_path(node)"},{"line_number":145,"context_line":"        if os.path.exists(opt_file):"},{"line_number":146,"context_line":"            LOG.debug(\u0027Removing %s\u0027, opt_file)"},{"line_number":147,"context_line":"            os.remove(opt_file)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def supports_ipxe_tag(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"2178339b_adfdbf7e","line":146,"in_reply_to":"606c30cc_d0a50344","updated":"2022-09-05 02:00:19.000000000","message":"Done","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"}],"ironic/tests/unit/dhcp/test_dnsmasq.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"055be835e0b267d522a490ab136132e00dbc5084","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright 2022 Red Hat, Inc."},{"line_number":3,"context_line":"# All Rights Reserved"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"cfb366f6_a907184b","line":3,"updated":"2022-09-01 16:45:01.000000000","message":"nit: I know this wasn\u0027t added in this patch, but if you could remove that, per the other comment, it\u0027d be awesome.","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"24b861efef9dca267e8905fc6f23707dbcaa59f7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright 2022 Red Hat, Inc."},{"line_number":3,"context_line":"# All Rights Reserved"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"d3492bdd_d5757671","line":3,"in_reply_to":"cfb366f6_a907184b","updated":"2022-09-05 02:00:19.000000000","message":"Done","commit_id":"e40d4b72554c82075a5957541a0da3cdcf18fed9"}]}
