)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0647326b84396cbcaaff9daadc69a9242a51a2dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"bc0dfc1b_2f96aee5","updated":"2025-04-21 14:54:40.000000000","message":"And... state \"available\"; target provision state is \"active\"\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils [None req-c94b779e-2492-4874-824c-a345560c2fd2 None None] Unexpected error while preparing the configdrive for node d63a8891-b76f-4279-9862-2041b7663c2d: pycdlib.pycdlibexception.PyCdlibInvalidInput: Could not find path\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils Traceback (most recent call last):\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils   File \"/opt/stack/ironic/ironic/conductor/deployments.py\", line 209, in do_node_deploy\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils     configdrive \u003d _check_and_fix_configdrive(task, configdrive)\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils   File \"/opt/stack/ironic/ironic/conductor/deployments.py\", line 579, in _check_and_fix_configdrive\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils     configdrive \u003d utils.check_and_patch_configdrive_network_data(\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils   File \"/opt/stack/ironic/ironic/conductor/utils.py\", line 1246, in check_and_patch_configdrive_network_data\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils     with iso.open_file_from_iso(\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils          ^^^^^^^^^^^^^^^^^^^^^^^\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils   File \"/opt/stack/data/venv/lib/python3.12/site-packages/pycdlib/pycdlib.py\", line 6068, in open_file_from_iso\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils     rec \u003d self._find_iso_record(utils.normpath(kwargs[\u0027iso_path\u0027]))\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils   File \"/opt/stack/data/venv/lib/python3.12/site-packages/pycdlib/pycdlib.py\", line 736, in _find_iso_record\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils     return _find_dr_record_by_name(self.pvd, iso_path, \u0027utf-8\u0027)\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils   File \"/opt/stack/data/venv/lib/python3.12/site-packages/pycdlib/pycdlib.py\", line 544, in _find_dr_record_by_name\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils     raise pycdlibexception.PyCdlibInvalidInput(\u0027Could not find path\u0027)\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils pycdlib.pycdlibexception.PyCdlibInvalidInput: Could not find path\nApr 18 17:48:14.111143 np0040492003 ironic-conductor[89846]: ERROR ironic.conductor.utils \nApr 18 17:48:14.134835 np0040492003 ironic-conductor[89846]: DEBUG ironic.common.states [None req-c94b779e-2492-4874-824c-a345560c2fd2 None None] Exiting old state \u0027deploying\u0027 in response to event \u0027fail\u0027 {{(pid\u003d89846) on_exit /opt/stack/ironic/ironic/common/states.py:361}}\nApr 18 17:48:14.134969 np0040492003 ironic-conductor[89846]: DEBUG ironic.common.states [None req-c94b779e-2492-4874-824c-a345560c2fd2 None None] Entering new state \u0027deploy failed\u0027 in response to event \u0027fail\u0027 {{(pid\u003d89846) on_enter /opt/stack/ironic/ironic/common/states.py:367}}","commit_id":"a1fff01248a38b8da5157c3465a5d83999fd886e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"c06472d1c1db3ac297919fb9205a7c4b5fdca688","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"16af63ff_59956340","updated":"2025-04-21 14:53:43.000000000","message":"Apr 18 17:48:22.424491 np0040492003 nova-compute[92296]: DEBUG nova.network.neutron [req-7195e2fe-5fd0-4269-bc21-fa9c038ef9e3 req-a89d01a8-b44b-48c0-9fa0-be6dbc770728 service nova] [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1] Refreshing network info cache for port 8c73db96-1993-4124-8e9a-3cd3a9b23434 {{(pid\u003d92296) _get_instance_nw_info /opt/stack/nova/nova/network/neutron.py:2064}}\nApr 18 17:48:22.630858 np0040492003 nova-compute[92296]: DEBUG oslo_concurrency.lockutils [None req-f8c79011-7890-4d3f-a355-b07d4b625031 tempest-BaremetalBasicOps-1670136038 tempest-BaremetalBasicOps-1670136038-project-member] Lock \"compute_resources\" \"released\" by \"nova.compute.resource_tracker.ResourceTracker.abort_instance_claim\" :: held 1.542s {{(pid\u003d92296) inner /opt/stack/data/venv/lib/python3.12/site-packages/oslo_concurrency/lockutils.py:424}}\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [None req-f8c79011-7890-4d3f-a355-b07d4b625031 tempest-BaremetalBasicOps-1670136038 tempest-BaremetalBasicOps-1670136038-project-member] [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1] Failed to build and run instance: nova.exception.InstanceDeployFailure: Failed to provision instance 3f6e7e33-05ba-4afb-96a7-53b010dbcea1: Failed to prepare the configdrive. Exception: Could not find path\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1] Traceback (most recent call last):\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/nova/nova/compute/manager.py\", line 2648, in _build_and_run_instance\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     self.driver.spawn(context, instance, image_meta,\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/nova/nova/virt/ironic/driver.py\", line 1274, in spawn\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     with excutils.save_and_reraise_exception():\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_utils/excutils.py\", line 227, in __exit__\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     self.force_reraise()\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_utils/excutils.py\", line 200, in force_reraise\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     raise self.value\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/nova/nova/virt/ironic/driver.py\", line 1270, in spawn\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     timer.start(interval\u003dCONF.ironic.api_retry_interval).wait()\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/data/venv/lib/python3.12/site-packages/eventlet/event.py\", line 124, in wait\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     result \u003d hub.switch()\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]              ^^^^^^^^^^^^\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/data/venv/lib/python3.12/site-packages/eventlet/hubs/hub.py\", line 310, in switch\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     return self.greenlet.switch()\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]            ^^^^^^^^^^^^^^^^^^^^^^\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_service/backend/eventlet/loopingcall.py\", line 151, in _run_loop\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     result \u003d func(*self.args, **self.kw)\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]              ^^^^^^^^^^^^^^^^^^^^^^^^^^^\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]   File \"/opt/stack/nova/nova/virt/ironic/driver.py\", line 543, in _wait_for_active\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]     raise exception.InstanceDeployFailure(msg)\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1] nova.exception.InstanceDeployFailure: Failed to provision instance 3f6e7e33-05ba-4afb-96a7-53b010dbcea1: Failed to prepare the configdrive. Exception: Could not find path\nApr 18 17:48:22.631616 np0040492003 nova-compute[92296]: ERROR nova.compute.manager [instance: 3f6e7e33-05ba-4afb-96a7-53b010dbcea1]","commit_id":"a1fff01248a38b8da5157c3465a5d83999fd886e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ded343bc44163e28cc9693dcd5b61433c04b38d2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"11a8e0aa_6282408e","updated":"2025-05-08 13:31:48.000000000","message":"Oh, add a reno!","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3881d0686c992219eeba34c0a52e47158e415be0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"43324898_91b22ea7","updated":"2025-05-12 15:05:28.000000000","message":"I\u0027m going to investigate the job failures before letting this merge.","commit_id":"0984be7341c6dfa11e9d7c289e729a8f76894973"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"467b8a10a5ab458524adf775dcf5183d22453e73","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"118472b8_3053a720","updated":"2025-05-12 17:22:39.000000000","message":"Node 4e41df61-84b1-5856-bfb6-6b5f2cd3dd11 reached failure state \\\"deploy failed\\\"; the last error is Failed to prepare the configdrive. Exception: Invalid base64-encoded string: number of data characters (69) cannot be 1 more than a multiple of 4\"\n\n\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils [None req-06a67c38-6b51-429f-9af8-8eab15084275 bifrost_user - - - - -] Unexpected error while preparing the configdrive for node 4e41df61-84b1-5856-bfb6-6b5f2cd3dd11: binascii.Error: Invalid base64-encoded string: number of data characters (69) cannot be 1 more than a multiple of 4\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils Traceback (most recent call last):\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils   File \"/opt/stack/bifrost/lib64/python3.9/site-packages/ironic/conductor/deployments.py\", line 209, in do_node_deploy\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils     configdrive \u003d _check_and_fix_configdrive(task, configdrive)\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils   File \"/opt/stack/bifrost/lib64/python3.9/site-packages/ironic/conductor/deployments.py\", line 611, in _check_and_fix_configdrive\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils     configdrive \u003d utils.check_and_patch_configdrive(\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils   File \"/opt/stack/bifrost/lib64/python3.9/site-packages/ironic/conductor/utils.py\", line 1273, in check_and_patch_configdrive\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils     fileobj.write(gzip.decompress(base64.b64decode(configdrive)))\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils   File \"/usr/lib64/python3.9/base64.py\", line 87, in b64decode\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils     return binascii.a2b_base64(s)\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils binascii.Error: Invalid base64-encoded string: number of data characters (69) cannot be 1 more than a multiple of 4\nMay 09 21:33:40 np0040709044 ironic[27826]: 2025-05-09 21:33:40.795 27826 ERROR ironic.conductor.utils","commit_id":"0984be7341c6dfa11e9d7c289e729a8f76894973"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a46d585e9998d1f12207d6c69542fbc4e1af4915","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"58f61923_e869899a","updated":"2025-05-12 16:44:29.000000000","message":"recheck unrelated failures","commit_id":"0984be7341c6dfa11e9d7c289e729a8f76894973"},{"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":"9d47b3e19de723470014b68c77a8691ce0f61f40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"8e473b7c_8c5c5937","updated":"2025-05-29 17:13:11.000000000","message":"My concern about configdrive vs config_drive would be a nit if it wasn\u0027t operator facing. Otherwise LGTM.","commit_id":"d47306fc19f489bf4f973fd1afb5308a73f57e46"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"326075a503935ee94f69096513a7b68b8d9cd104","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":28,"id":"dbea0f61_93a88ef7","updated":"2025-06-05 16:48:06.000000000","message":"We discussed this one that the code makes it behave a lot closer to what the nova ironic hypervisor driver does for this which is great. Overall there\u0027s still some funky behavior with this data and cloud-init that needs to be resolved but we\u0027ll tackle that in the future with a clearer problem statement.","commit_id":"e6283e3524a84e8c143df9fc24a6e11d5a606d2a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51f2d0ade17235078cd721321ec7c8c3c15c71d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"09f13f41_31d025c3","updated":"2025-05-30 20:50:20.000000000","message":"recheck weird swift failure?!","commit_id":"e6283e3524a84e8c143df9fc24a6e11d5a606d2a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"779e3d34cb1ff6eb465c872470dc21e636478e41","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":28,"id":"78ed84a3_f9581d2d","in_reply_to":"dbea0f61_93a88ef7","updated":"2025-06-05 16:58:40.000000000","message":"FWIW, I have it on my todo list in short order to see if there is a clean-ish way to reduce port ids to something shorter. Unfortunately, depending on what code interpretting the data is, it could treat the ID values like actual names which is bonkers, but hey, it is what it is.","commit_id":"e6283e3524a84e8c143df9fc24a6e11d5a606d2a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"1bb33b9e_e0cd4958","updated":"2025-06-06 15:11:54.000000000","message":"I\u0027ve left a bunch of comments. Most of them are really just stylistic nits but there are a few questions and observations that I\u0027d like you check/acknowledge before +2","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"12ccf69151ad2597ebb6c45a9558b9ec283690f6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"2cde55f1_6f5b8ec1","updated":"2025-06-06 15:39:03.000000000","message":"Per IRC discussion, instances of list(dict.keys()) can stay because not everyone may remember that list(dict) is the same thing (which is not obvious).\n\nPlease follow-up with the rest.","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"97877affba896d836c8a4db5ec789d5406479ee0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"de67710c_6f5fd6db","updated":"2025-06-06 21:51:24.000000000","message":"recheck metal3-integration post failure now","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"d026ce5cddcdd9cff4d20dd4cbc9ed2d341edbfc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"2aed1361_1f49d17d","updated":"2025-06-06 19:21:02.000000000","message":"recheck metal3-integration timed out","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"}],"ironic/common/neutron.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":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":true,"context_lines":[{"line_number":585,"context_line":"    LOG.debug(\u0027Received port %(port)s data: %(info)s\u0027,"},{"line_number":586,"context_line":"              {\u0027port\u0027: vif_id, \u0027info\u0027: port_config})"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    port_id \u003d port_config[\u0027name\u0027] or port_id"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    network_id \u003d port_config.network_id"},{"line_number":591,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"874475bf_8a1c2cb1","line":588,"range":{"start_line":588,"start_character":14,"end_line":588,"end_character":36},"updated":"2025-05-08 13:31:37.000000000","message":"We should likely consider changing this, name is not unique, but in this context it is also informational so *shrug*","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e0753db44e9139b1fdaa38bb5bb147c3a074eaad","unresolved":false,"context_lines":[{"line_number":585,"context_line":"    LOG.debug(\u0027Received port %(port)s data: %(info)s\u0027,"},{"line_number":586,"context_line":"              {\u0027port\u0027: vif_id, \u0027info\u0027: port_config})"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    port_id \u003d port_config[\u0027name\u0027] or port_id"},{"line_number":589,"context_line":""},{"line_number":590,"context_line":"    network_id \u003d port_config.network_id"},{"line_number":591,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"679de08b_a465f7a6","line":588,"range":{"start_line":588,"start_character":14,"end_line":588,"end_character":36},"in_reply_to":"874475bf_8a1c2cb1","updated":"2025-05-20 13:41:32.000000000","message":"Done","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":660,"context_line":"    if bond_links:"},{"line_number":661,"context_line":"        links \u003d []"},{"line_number":662,"context_line":"        for link in bond_links:"},{"line_number":663,"context_line":"            links.append(link[\u0027id\u0027])"},{"line_number":664,"context_line":"        # Add the list of links to the bond port"},{"line_number":665,"context_line":"        network_data[\u0027links\u0027][0][\u0027bond_links\u0027] \u003d links"},{"line_number":666,"context_line":"        # Add the rest of the links to the metadata."}],"source_content_type":"text/x-python","patch_set":29,"id":"bff4bfa8_0460da2d","line":663,"updated":"2025-06-06 15:11:54.000000000","message":"nitty-nit:\n\nlinks \u003d [link[\u0027id\u0027] for link in bond_links]","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":660,"context_line":"    if bond_links:"},{"line_number":661,"context_line":"        links \u003d []"},{"line_number":662,"context_line":"        for link in bond_links:"},{"line_number":663,"context_line":"            links.append(link[\u0027id\u0027])"},{"line_number":664,"context_line":"        # Add the list of links to the bond port"},{"line_number":665,"context_line":"        network_data[\u0027links\u0027][0][\u0027bond_links\u0027] \u003d links"},{"line_number":666,"context_line":"        # Add the rest of the links to the metadata."}],"source_content_type":"text/x-python","patch_set":29,"id":"86ea3db9_ba790f1f","line":663,"in_reply_to":"bff4bfa8_0460da2d","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"}],"ironic/conductor/configdrive_utils.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# coding\u003dutf-8"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":29,"id":"0a7de031_af1193b4","line":1,"updated":"2025-06-06 15:11:54.000000000","message":"nit: I think we decided to stop doing these long ago (I even forgot why)","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# coding\u003dutf-8"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":29,"id":"0c172adc_5cfeb199","line":1,"in_reply_to":"0a7de031_af1193b4","updated":"2025-06-10 18:19:08.000000000","message":"I don\u0027t even remember adding it....\n\nSo I sort of remember the why and it was a pre-py3 \"oh noes, we might get unicode characters in the code base\" worries. I think it doesn\u0027t matter much anymore, but yeah.","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":47,"context_line":"        # likely just declare missing MTU as a qualifier to rebuild, but"},{"line_number":48,"context_line":"        # that is likely to then trigger far more often. Maybe that means"},{"line_number":49,"context_line":"        # it is an even better idea..."},{"line_number":50,"context_line":"        return ((len(network_data.get(\u0027links\u0027, [])) \u003d\u003d 0)"},{"line_number":51,"context_line":"                and (len(network_data.get(\u0027networks\u0027, [])) \u003d\u003d 0)"},{"line_number":52,"context_line":"                and (len(network_data.get(\u0027services\u0027, [])) \u003d\u003d 0))"},{"line_number":53,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":29,"id":"8b087d29_900a6304","line":50,"updated":"2025-06-06 15:11:54.000000000","message":"nit: ETOOMANYBRACKETS (also could use \"not\" for simplicity)","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":51,"context_line":"                and (len(network_data.get(\u0027networks\u0027, [])) \u003d\u003d 0)"},{"line_number":52,"context_line":"                and (len(network_data.get(\u0027services\u0027, [])) \u003d\u003d 0))"},{"line_number":53,"context_line":"    except AttributeError:"},{"line_number":54,"context_line":"        # Got called with None or something else lacking the attribute."},{"line_number":55,"context_line":"        # NOTE(TheJulia): If we ever want to inject metadata if missing"},{"line_number":56,"context_line":"        # here is where we would add it."},{"line_number":57,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":29,"id":"ac93e213_d72804f6","line":54,"updated":"2025-06-06 15:11:54.000000000","message":"I wonder if it\u0027s a good reason to log something about network_data not being dict-like (and what it actually is)","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":true,"context_lines":[{"line_number":51,"context_line":"                and (len(network_data.get(\u0027networks\u0027, [])) \u003d\u003d 0)"},{"line_number":52,"context_line":"                and (len(network_data.get(\u0027services\u0027, [])) \u003d\u003d 0))"},{"line_number":53,"context_line":"    except AttributeError:"},{"line_number":54,"context_line":"        # Got called with None or something else lacking the attribute."},{"line_number":55,"context_line":"        # NOTE(TheJulia): If we ever want to inject metadata if missing"},{"line_number":56,"context_line":"        # here is where we would add it."},{"line_number":57,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":29,"id":"3eccd70c_af17ec97","line":54,"in_reply_to":"ac93e213_d72804f6","updated":"2025-06-10 18:19:08.000000000","message":"eh, we\u0027d have to pass in something extra so there is something to actually log. Besides, AttibuteError guarding is more for tests with None getting passed around to make it defensive. Data submitted is also generally enforced at the api so I doubt we\u0027d have much here, ever.","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":66,"context_line":"    correct, which is intended to allow the overall deployment process to"},{"line_number":67,"context_line":"    proceed with the correct data."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    :param task: A Taskmanager object."},{"line_number":70,"context_line":"    :param configdrive: The in-memory configuration drive file which was"},{"line_number":71,"context_line":"                        submitted by the requester."},{"line_number":72,"context_line":"    :returns: The submitted configuration drive or a regenerated and patched"}],"source_content_type":"text/x-python","patch_set":29,"id":"092856cf_5047c414","line":69,"updated":"2025-06-06 15:11:54.000000000","message":"nit: TaskManager","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    correct, which is intended to allow the overall deployment process to"},{"line_number":67,"context_line":"    proceed with the correct data."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    :param task: A Taskmanager object."},{"line_number":70,"context_line":"    :param configdrive: The in-memory configuration drive file which was"},{"line_number":71,"context_line":"                        submitted by the requester."},{"line_number":72,"context_line":"    :returns: The submitted configuration drive or a regenerated and patched"}],"source_content_type":"text/x-python","patch_set":29,"id":"c8f84e65_bd8b3724","line":69,"in_reply_to":"092856cf_5047c414","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":102,"context_line":"                    # NOTE(TheJulia): We\u0027ve gotten some sort of invalid data"},{"line_number":103,"context_line":"                    # which is a possible case. So... just live with it and"},{"line_number":104,"context_line":"                    # move on."},{"line_number":105,"context_line":"                    LOG.debug(\u0027Encountered error while trying to parse \u0027"},{"line_number":106,"context_line":"                              \u0027configuration drive network_data.json file \u0027"},{"line_number":107,"context_line":"                              \u0027content which was submitted to Ironic. \u0027"},{"line_number":108,"context_line":"                              \u0027Error: %s\u0027, e)"}],"source_content_type":"text/x-python","patch_set":29,"id":"ccf57ae4_f5f920c0","line":105,"updated":"2025-06-06 15:11:54.000000000","message":"Please log the node UUID","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                    # NOTE(TheJulia): We\u0027ve gotten some sort of invalid data"},{"line_number":103,"context_line":"                    # which is a possible case. So... just live with it and"},{"line_number":104,"context_line":"                    # move on."},{"line_number":105,"context_line":"                    LOG.debug(\u0027Encountered error while trying to parse \u0027"},{"line_number":106,"context_line":"                              \u0027configuration drive network_data.json file \u0027"},{"line_number":107,"context_line":"                              \u0027content which was submitted to Ironic. \u0027"},{"line_number":108,"context_line":"                              \u0027Error: %s\u0027, e)"}],"source_content_type":"text/x-python","patch_set":29,"id":"61a0b3fd_7e921b42","line":105,"in_reply_to":"9b417eb5_0118bd15","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"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":"b825434a24d0c31381ba4a227276e3347a3b6dea","unresolved":true,"context_lines":[{"line_number":102,"context_line":"                    # NOTE(TheJulia): We\u0027ve gotten some sort of invalid data"},{"line_number":103,"context_line":"                    # which is a possible case. So... just live with it and"},{"line_number":104,"context_line":"                    # move on."},{"line_number":105,"context_line":"                    LOG.debug(\u0027Encountered error while trying to parse \u0027"},{"line_number":106,"context_line":"                              \u0027configuration drive network_data.json file \u0027"},{"line_number":107,"context_line":"                              \u0027content which was submitted to Ironic. \u0027"},{"line_number":108,"context_line":"                              \u0027Error: %s\u0027, e)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9b417eb5_0118bd15","line":105,"in_reply_to":"ccf57ae4_f5f920c0","updated":"2025-06-06 15:18:41.000000000","message":"Good idea -- maybe instance_uuid, too, since this may often need to trace back up a layer","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":106,"context_line":"                              \u0027configuration drive network_data.json file \u0027"},{"line_number":107,"context_line":"                              \u0027content which was submitted to Ironic. \u0027"},{"line_number":108,"context_line":"                              \u0027Error: %s\u0027, e)"},{"line_number":109,"context_line":"                    pass"},{"line_number":110,"context_line":"            LOG.warning(\u0027The provided metadata for the deployment of \u0027"},{"line_number":111,"context_line":"                        \u0027node %s appears invalid, and will be \u0027"},{"line_number":112,"context_line":"                        \u0027regenerated based upon the available \u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"806485fa_e73d535a","line":109,"updated":"2025-06-06 15:11:54.000000000","message":"nit: pass not needed","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":114,"context_line":"            network_data \u003d json.dumps(generate_config_metadata(task))"},{"line_number":115,"context_line":"            # Grab the filename to use. This is not with a context manager"},{"line_number":116,"context_line":"            # because we are going to do the write-out of the new file"},{"line_number":117,"context_line":"            # using mkisofs."},{"line_number":118,"context_line":"            new_iso_file \u003d tempfile.mkstemp(dir\u003dCONF.tempdir)[1]"},{"line_number":119,"context_line":"            # NOTE(TheJulia): This is where we would make a decision to"},{"line_number":120,"context_line":"            # inject any additional override files to the image as the"}],"source_content_type":"text/x-python","patch_set":29,"id":"2d16dbe8_850ca259","line":117,"updated":"2025-06-06 15:11:54.000000000","message":"Hmm, I\u0027m not sure why you couldn\u0027t use a NamedTemporaryFile still","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":true,"context_lines":[{"line_number":114,"context_line":"            network_data \u003d json.dumps(generate_config_metadata(task))"},{"line_number":115,"context_line":"            # Grab the filename to use. This is not with a context manager"},{"line_number":116,"context_line":"            # because we are going to do the write-out of the new file"},{"line_number":117,"context_line":"            # using mkisofs."},{"line_number":118,"context_line":"            new_iso_file \u003d tempfile.mkstemp(dir\u003dCONF.tempdir)[1]"},{"line_number":119,"context_line":"            # NOTE(TheJulia): This is where we would make a decision to"},{"line_number":120,"context_line":"            # inject any additional override files to the image as the"}],"source_content_type":"text/x-python","patch_set":29,"id":"168c7c4f_079ef299","line":117,"in_reply_to":"2d16dbe8_850ca259","updated":"2025-06-10 18:19:08.000000000","message":"Because you get a handler to it? I need a file to know about, but let the iso generation write to.","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":129,"context_line":"        # Catch any general OSError (permission issue) or"},{"line_number":130,"context_line":"        # ProcessExecutionError from regenerate_iso."},{"line_number":131,"context_line":"        LOG.error(\u0027Failed to regenerate the configuration drive ISO, \u0027"},{"line_number":132,"context_line":"                  \u0027proceeding with submitted metadata: %s\u0027, e)"},{"line_number":133,"context_line":"        return configdrive"},{"line_number":134,"context_line":"    except exception.ConfigDriveRegenerationFailure:"},{"line_number":135,"context_line":"        # If this is being raised, the generation failed. That should have"}],"source_content_type":"text/x-python","patch_set":29,"id":"859dd6bf_321e0c5e","line":132,"updated":"2025-06-06 15:11:54.000000000","message":"Please log the node UUID","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        # Catch any general OSError (permission issue) or"},{"line_number":130,"context_line":"        # ProcessExecutionError from regenerate_iso."},{"line_number":131,"context_line":"        LOG.error(\u0027Failed to regenerate the configuration drive ISO, \u0027"},{"line_number":132,"context_line":"                  \u0027proceeding with submitted metadata: %s\u0027, e)"},{"line_number":133,"context_line":"        return configdrive"},{"line_number":134,"context_line":"    except exception.ConfigDriveRegenerationFailure:"},{"line_number":135,"context_line":"        # If this is being raised, the generation failed. That should have"}],"source_content_type":"text/x-python","patch_set":29,"id":"1cc36129_4672a3f7","line":132,"in_reply_to":"859dd6bf_321e0c5e","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":171,"context_line":"        # NOTE(TheJulia): The base extraction logic was sourced from kickstart"},{"line_number":172,"context_line":"        # utils, as an actually kind of simple base approach to do the needful"},{"line_number":173,"context_line":"        # extraction."},{"line_number":174,"context_line":"        LOG.debug(\u0027Extracting configuration drive to %s\u0027, tempfolder)"},{"line_number":175,"context_line":"        # The default configuration drive format we expect is generally"},{"line_number":176,"context_line":"        # of a rock ridge format, and to avoid classic dos ISO9660 level"},{"line_number":177,"context_line":"        # constraints, we will get the path using a rock ridge base path"}],"source_content_type":"text/x-python","patch_set":29,"id":"18787601_30ded728","line":174,"updated":"2025-06-06 15:11:54.000000000","message":"nit: I\u0027m not sure it\u0027s a useful message, but if you think it is, please add node UUID here and below","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        # NOTE(TheJulia): The base extraction logic was sourced from kickstart"},{"line_number":172,"context_line":"        # utils, as an actually kind of simple base approach to do the needful"},{"line_number":173,"context_line":"        # extraction."},{"line_number":174,"context_line":"        LOG.debug(\u0027Extracting configuration drive to %s\u0027, tempfolder)"},{"line_number":175,"context_line":"        # The default configuration drive format we expect is generally"},{"line_number":176,"context_line":"        # of a rock ridge format, and to avoid classic dos ISO9660 level"},{"line_number":177,"context_line":"        # constraints, we will get the path using a rock ridge base path"}],"source_content_type":"text/x-python","patch_set":29,"id":"a33b8412_2cbcb2b4","line":174,"in_reply_to":"18787601_30ded728","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":196,"context_line":"                source.get_file_from_iso("},{"line_number":197,"context_line":"                    joliet_path\u003diso_file_path, local_path\u003dposix_file_path)"},{"line_number":198,"context_line":"        # Okay, we have the files in a folder, lets patch!"},{"line_number":199,"context_line":"        for file in override_files.keys():"},{"line_number":200,"context_line":"            LOG.debug(\u0027Patching override configuration drive file %s\u0027, file)"},{"line_number":201,"context_line":"            content \u003d override_files[file]"},{"line_number":202,"context_line":"            dest_path \u003d os.path.join(tempfolder, str(file).lstrip(\u0027/\u0027))"}],"source_content_type":"text/x-python","patch_set":29,"id":"a080da10_4927a620","line":199,"updated":"2025-06-06 15:11:54.000000000","message":"nit: unnecessary keys()","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                source.get_file_from_iso("},{"line_number":197,"context_line":"                    joliet_path\u003diso_file_path, local_path\u003dposix_file_path)"},{"line_number":198,"context_line":"        # Okay, we have the files in a folder, lets patch!"},{"line_number":199,"context_line":"        for file in override_files.keys():"},{"line_number":200,"context_line":"            LOG.debug(\u0027Patching override configuration drive file %s\u0027, file)"},{"line_number":201,"context_line":"            content \u003d override_files[file]"},{"line_number":202,"context_line":"            dest_path \u003d os.path.join(tempfolder, str(file).lstrip(\u0027/\u0027))"}],"source_content_type":"text/x-python","patch_set":29,"id":"9b71eff7_883e3347","line":199,"in_reply_to":"a080da10_4927a620","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # The pattern here is keyed off a list of VIF Ids. We\u0027ll need"},{"line_number":266,"context_line":"        # this to finish hydrating necessary data."},{"line_number":267,"context_line":"        vif_id_keys \u003d list(vif_id_to_objects[\u0027ports\u0027].keys())"},{"line_number":268,"context_line":"        vif_id_keys.extend(list(vif_id_to_objects[\u0027portgroups\u0027].keys()))"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        # This is the starting point for metadata generation. We have three"}],"source_content_type":"text/x-python","patch_set":29,"id":"6c07c02a_689f8317","line":267,"updated":"2025-06-06 15:11:54.000000000","message":"nit: unnecessary keys()","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"        # The pattern here is keyed off a list of VIF Ids. We\u0027ll need"},{"line_number":266,"context_line":"        # this to finish hydrating necessary data."},{"line_number":267,"context_line":"        vif_id_keys \u003d list(vif_id_to_objects[\u0027ports\u0027].keys())"},{"line_number":268,"context_line":"        vif_id_keys.extend(list(vif_id_to_objects[\u0027portgroups\u0027].keys()))"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        # This is the starting point for metadata generation. We have three"}],"source_content_type":"text/x-python","patch_set":29,"id":"f2b30de9_619bb222","line":267,"in_reply_to":"6c07c02a_689f8317","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":265,"context_line":"        # The pattern here is keyed off a list of VIF Ids. We\u0027ll need"},{"line_number":266,"context_line":"        # this to finish hydrating necessary data."},{"line_number":267,"context_line":"        vif_id_keys \u003d list(vif_id_to_objects[\u0027ports\u0027].keys())"},{"line_number":268,"context_line":"        vif_id_keys.extend(list(vif_id_to_objects[\u0027portgroups\u0027].keys()))"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        # This is the starting point for metadata generation. We have three"},{"line_number":271,"context_line":"        # buckets which contain lists of dicts. In this specific case, we"}],"source_content_type":"text/x-python","patch_set":29,"id":"0f6a504d_e722ca0d","line":268,"updated":"2025-06-06 15:11:54.000000000","message":"... and list() (IIRC you can use an iterator here)","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":357,"context_line":"    # was left appropriately broad to set that stage."},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    # Logging first, because we know we\u0027re only being called if there"},{"line_number":360,"context_line":"    # is a problem. We can proceed from there."},{"line_number":361,"context_line":"    LOG.error(\u0027An error has been detected in the supplied network \u0027"},{"line_number":362,"context_line":"              \u0027configuration metadata for the deployment of \u0027"},{"line_number":363,"context_line":"              \u0027node %s.\u0027, task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":29,"id":"d2aa772b_81feed3d","line":360,"updated":"2025-06-06 15:11:54.000000000","message":"This duplicates the warning on line 110","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":357,"context_line":"    # was left appropriately broad to set that stage."},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    # Logging first, because we know we\u0027re only being called if there"},{"line_number":360,"context_line":"    # is a problem. We can proceed from there."},{"line_number":361,"context_line":"    LOG.error(\u0027An error has been detected in the supplied network \u0027"},{"line_number":362,"context_line":"              \u0027configuration metadata for the deployment of \u0027"},{"line_number":363,"context_line":"              \u0027node %s.\u0027, task.node.uuid)"}],"source_content_type":"text/x-python","patch_set":29,"id":"7fa36a50_8caf80bd","line":360,"in_reply_to":"d2aa772b_81feed3d","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":362,"context_line":"              \u0027configuration metadata for the deployment of \u0027"},{"line_number":363,"context_line":"              \u0027node %s.\u0027, task.node.uuid)"},{"line_number":364,"context_line":"    metadata \u003d generate_instance_network_data(task)"},{"line_number":365,"context_line":"    if metadata is None:"},{"line_number":366,"context_line":"        # We were unable to generate metadata because the underlying"},{"line_number":367,"context_line":"        # interface configuration, i.e. no neutron support."},{"line_number":368,"context_line":"        LOG.error(\u0027Failed to generate new network metadata for \u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"d31a7347_ca70c3f8","line":365,"updated":"2025-06-06 15:11:54.000000000","message":"I don\u0027t see a code path there that returns None, are you sure?","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":362,"context_line":"              \u0027configuration metadata for the deployment of \u0027"},{"line_number":363,"context_line":"              \u0027node %s.\u0027, task.node.uuid)"},{"line_number":364,"context_line":"    metadata \u003d generate_instance_network_data(task)"},{"line_number":365,"context_line":"    if metadata is None:"},{"line_number":366,"context_line":"        # We were unable to generate metadata because the underlying"},{"line_number":367,"context_line":"        # interface configuration, i.e. no neutron support."},{"line_number":368,"context_line":"        LOG.error(\u0027Failed to generate new network metadata for \u0027"}],"source_content_type":"text/x-python","patch_set":29,"id":"f6748ed9_aa19fcd0","line":365,"in_reply_to":"d31a7347_ca70c3f8","updated":"2025-06-10 18:19:08.000000000","message":"Nope, at this point, doesn\u0027t look like it can.  I guess that is left over from an earlier version.","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":411,"context_line":"    # use this same method to also just supply network metadata injection if"},{"line_number":412,"context_line":"    # no configuration drive is supplied."},{"line_number":413,"context_line":"    try:"},{"line_number":414,"context_line":"        if configdrive is None or configdrive \u003d\u003d {}:"},{"line_number":415,"context_line":"            LOG.debug(\u0027Failed to locate configuration drive contents for \u0027"},{"line_number":416,"context_line":"                      \u0027node %s.\u0027, task.node.uuid)"},{"line_number":417,"context_line":"            # Nothing to see here, move along. Possible opportunity to"}],"source_content_type":"text/x-python","patch_set":29,"id":"fb4487e4_621b354c","line":414,"updated":"2025-06-06 15:11:54.000000000","message":"nit: I don\u0027t think this branch is reachable because of a check in the calling function","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":true,"context_lines":[{"line_number":411,"context_line":"    # use this same method to also just supply network metadata injection if"},{"line_number":412,"context_line":"    # no configuration drive is supplied."},{"line_number":413,"context_line":"    try:"},{"line_number":414,"context_line":"        if configdrive is None or configdrive \u003d\u003d {}:"},{"line_number":415,"context_line":"            LOG.debug(\u0027Failed to locate configuration drive contents for \u0027"},{"line_number":416,"context_line":"                      \u0027node %s.\u0027, task.node.uuid)"},{"line_number":417,"context_line":"            # Nothing to see here, move along. Possible opportunity to"}],"source_content_type":"text/x-python","patch_set":29,"id":"767bb8f1_1126e56b","line":414,"in_reply_to":"fb4487e4_621b354c","updated":"2025-06-10 18:19:08.000000000","message":"yup, fair enough.","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"}],"ironic/conductor/deployments.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":"a22e7e54820b389f3fe96f69631344b3ea8888cf","unresolved":false,"context_lines":[{"line_number":587,"context_line":"        LOG.warning(\u0027Ironic was unable to regenerate the configdrive for node \u0027"},{"line_number":588,"context_line":"                    \u0027%s.\u0027, task.node.uuid)"},{"line_number":589,"context_line":"        # This is not a fatal failure, just circle things back."},{"line_number":590,"context_line":"        return configdrive"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"def _start_console_in_deploy(task):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a9f73b2_5f4cbe2d","line":590,"range":{"start_line":590,"start_character":0,"end_line":590,"end_character":26},"updated":"2025-04-22 17:41:18.000000000","message":"this is indented too much, returns  None which breaks things.","commit_id":"eeb6c86873485f7ca50ebf89a1eae0e4380429aa"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3881d0686c992219eeba34c0a52e47158e415be0","unresolved":false,"context_lines":[{"line_number":590,"context_line":"        elif isinstance(configdrive, dict):"},{"line_number":591,"context_line":"            provided_network_data \u003d configdrive.get(\u0027network_data\u0027)"},{"line_number":592,"context_line":"            if ((not provided_network_data"},{"line_number":593,"context_line":"                 and CONF.conductor.inject_network_metadata)"},{"line_number":594,"context_line":"                or (utils.is_invalid_network_metadata(provided_network_data))):"},{"line_number":595,"context_line":"                # BUG 2106073 OR there is data, but no network data in the"},{"line_number":596,"context_line":"                # configuration drive. In such a case, we need to take what"}],"source_content_type":"text/x-python","patch_set":16,"id":"3b51d1f0_efb19d61","line":593,"range":{"start_line":593,"start_character":21,"end_line":593,"end_character":59},"updated":"2025-05-12 15:05:28.000000000","message":"this is not a thing yet.","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"}],"ironic/conductor/utils.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":"a22e7e54820b389f3fe96f69631344b3ea8888cf","unresolved":false,"context_lines":[{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"        # The pattern here is keyed off a list of VIF Ids. We\u0027ll need"},{"line_number":1337,"context_line":"        # this to finish hydrating necessary data."},{"line_number":1338,"context_line":"        vif_id_keys \u003d list(vif_id_to_objects[\u0027portgroups\u0027].keys())"},{"line_number":1339,"context_line":"        vif_id_keys.extend(list(vif_id_to_objects[\u0027portgroups\u0027].keys()))"},{"line_number":1340,"context_line":""},{"line_number":1341,"context_line":"        # This is the starting point for metadata generation. We have three"}],"source_content_type":"text/x-python","patch_set":11,"id":"e7d94f95_f802884c","line":1338,"updated":"2025-04-22 17:41:18.000000000","message":"ports","commit_id":"eeb6c86873485f7ca50ebf89a1eae0e4380429aa"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a22e7e54820b389f3fe96f69631344b3ea8888cf","unresolved":false,"context_lines":[{"line_number":1396,"context_line":"    LOG.error(\u0027An error has been detected in the supplied network \u0027"},{"line_number":1397,"context_line":"              \u0027configuration metadata for the deployment of \u0027"},{"line_number":1398,"context_line":"              \u0027node %s.\u0027, task.node.uuid)"},{"line_number":1399,"context_line":"    metadata \u003d utils.generate_instance_network_data(task)"},{"line_number":1400,"context_line":"    if metadata is None:"},{"line_number":1401,"context_line":"        # We were unable to generate metadta because the underlying"},{"line_number":1402,"context_line":"        # interface"}],"source_content_type":"text/x-python","patch_set":11,"id":"3c05d85c_23382fca","line":1399,"range":{"start_line":1399,"start_character":15,"end_line":1399,"end_character":20},"updated":"2025-04-22 17:41:18.000000000","message":"yeah, this is in the same file... doh.","commit_id":"eeb6c86873485f7ca50ebf89a1eae0e4380429aa"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a22e7e54820b389f3fe96f69631344b3ea8888cf","unresolved":false,"context_lines":[{"line_number":1405,"context_line":"                  \u0027interfaces do not signify neutron support.\u0027,"},{"line_number":1406,"context_line":"                  task.node.uuid)"},{"line_number":1407,"context_line":"        raise exception.ConfigDriveRegenerationFailure()"},{"line_number":1408,"context_line":"    if utils.is_invalid_network_metadata(metadata):"},{"line_number":1409,"context_line":"        # NOTE(TheJulia): This *should* never happen in the scenarios"},{"line_number":1410,"context_line":"        # known to ironic, however *could* happen if there is some sort"},{"line_number":1411,"context_line":"        # of weird state due to drivers. i.e. if someone had a completely"}],"source_content_type":"text/x-python","patch_set":11,"id":"d848a51c_dca0cf25","line":1408,"range":{"start_line":1408,"start_character":7,"end_line":1408,"end_character":12},"updated":"2025-04-22 17:41:18.000000000","message":"and same here... doh.","commit_id":"eeb6c86873485f7ca50ebf89a1eae0e4380429aa"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0e8f9545b5336a3a0db706c077815caaadcadb76","unresolved":true,"context_lines":[{"line_number":1259,"context_line":"                                \u0027node %s appears invalid, and will be \u0027"},{"line_number":1260,"context_line":"                                \u0027regenerated based upon the available \u0027"},{"line_number":1261,"context_line":"                                \u0027metadata.\u0027, task.node.uuid)"},{"line_number":1262,"context_line":"                    network_data \u003d utils.generate_config_metadata(task)"},{"line_number":1263,"context_line":"                    # We have bad metadata from the host, lets replace it!"},{"line_number":1264,"context_line":"                    if len(network_data) \u003e 2048:"},{"line_number":1265,"context_line":"                        LOG.error(\u0027Unhandled case detected where metadata \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"728e22eb_ef3c3fd7","line":1262,"updated":"2025-05-01 19:40:29.000000000","message":"this is wrong, no more utils.","commit_id":"339477dbb6d1af38a289b29efcd1b3f10221230f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":false,"context_lines":[{"line_number":1259,"context_line":"                                \u0027node %s appears invalid, and will be \u0027"},{"line_number":1260,"context_line":"                                \u0027regenerated based upon the available \u0027"},{"line_number":1261,"context_line":"                                \u0027metadata.\u0027, task.node.uuid)"},{"line_number":1262,"context_line":"                    network_data \u003d utils.generate_config_metadata(task)"},{"line_number":1263,"context_line":"                    # We have bad metadata from the host, lets replace it!"},{"line_number":1264,"context_line":"                    if len(network_data) \u003e 2048:"},{"line_number":1265,"context_line":"                        LOG.error(\u0027Unhandled case detected where metadata \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"0f45da01_82182662","line":1262,"in_reply_to":"728e22eb_ef3c3fd7","updated":"2025-05-08 13:31:37.000000000","message":"Done","commit_id":"339477dbb6d1af38a289b29efcd1b3f10221230f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":false,"context_lines":[{"line_number":1261,"context_line":"                                \u0027metadata.\u0027, task.node.uuid)"},{"line_number":1262,"context_line":"                    network_data \u003d utils.generate_config_metadata(task)"},{"line_number":1263,"context_line":"                    # We have bad metadata from the host, lets replace it!"},{"line_number":1264,"context_line":"                    if len(network_data) \u003e 2048:"},{"line_number":1265,"context_line":"                        LOG.error(\u0027Unhandled case detected where metadata \u0027"},{"line_number":1266,"context_line":"                                  \u0027could not be patched.\u0027)"},{"line_number":1267,"context_line":"                        # FIXME We should gracefully handle this"}],"source_content_type":"text/x-python","patch_set":14,"id":"7817e567_6dbab8cf","line":1264,"updated":"2025-05-08 13:31:37.000000000","message":"Okay, huge risk here... Which likely means we need to take a different route and need to master an entirely new iso as opposed to just modify one in place.\n\nA average devstack payload is like 950 bytes. Which means, we\u0027re half way to the cutoff point here.\n\nSo we\u0027re going to need to generate it entirely.","commit_id":"339477dbb6d1af38a289b29efcd1b3f10221230f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0e8f9545b5336a3a0db706c077815caaadcadb76","unresolved":true,"context_lines":[{"line_number":1267,"context_line":"                        # FIXME We should gracefully handle this"},{"line_number":1268,"context_line":"                        return configdrive"},{"line_number":1269,"context_line":"                    new_nd \u003d json.dumps(network_data).encode()"},{"line_number":1270,"context_line":"                    iso.add_fp(io.BytesIO(new_nd),"},{"line_number":1271,"context_line":"                               len(new_nd),"},{"line_number":1272,"context_line":"                               \u0027/openstack/latest/network_data.json;1\u0027)"},{"line_number":1273,"context_line":"                    iso.close()"},{"line_number":1274,"context_line":"                    fileobj.seek(0)"},{"line_number":1275,"context_line":"                    iso.write_fp(fileobj)"}],"source_content_type":"text/x-python","patch_set":14,"id":"cf129ded_5b55d368","line":1272,"range":{"start_line":1270,"start_character":0,"end_line":1272,"end_character":71},"updated":"2025-05-01 19:40:29.000000000","message":"so this is missing in the images....\n\nMay 01 19:15:57 devstack ironic-conductor[578919]: ERROR ironic.conductor.utils [ESC[01;36mNone req-62a0e826-76e8-4f05-aa90-b331e3728b9a ESC[00;36mNone None] ESC[01;35mFailed to process metadata, as the supplied configuration drive ISO for the deployment of node e4ce5971-871d-4491-9654-5cae87bd16bf lacked the openstack/latest/network_data.json file.ESC[00m: pycdlib.pycdlibexception.PyCdlibInvalidInput: Rock Ridge name must be supplied for a Rock Ridge new path","commit_id":"339477dbb6d1af38a289b29efcd1b3f10221230f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"                        # FIXME We should gracefully handle this"},{"line_number":1268,"context_line":"                        return configdrive"},{"line_number":1269,"context_line":"                    new_nd \u003d json.dumps(network_data).encode()"},{"line_number":1270,"context_line":"                    iso.add_fp(io.BytesIO(new_nd),"},{"line_number":1271,"context_line":"                               len(new_nd),"},{"line_number":1272,"context_line":"                               \u0027/openstack/latest/network_data.json;1\u0027)"},{"line_number":1273,"context_line":"                    iso.close()"},{"line_number":1274,"context_line":"                    fileobj.seek(0)"},{"line_number":1275,"context_line":"                    iso.write_fp(fileobj)"}],"source_content_type":"text/x-python","patch_set":14,"id":"d4c35c0e_d6cbbd68","line":1272,"range":{"start_line":1270,"start_character":0,"end_line":1272,"end_character":71},"in_reply_to":"cf129ded_5b55d368","updated":"2025-05-08 13:31:37.000000000","message":"Done","commit_id":"339477dbb6d1af38a289b29efcd1b3f10221230f"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":true,"context_lines":[{"line_number":1225,"context_line":"    try:"},{"line_number":1226,"context_line":"        return ((len(network_data.get(\u0027links\u0027, [])) \u003d\u003d 0)"},{"line_number":1227,"context_line":"                and (len(network_data.get(\u0027networks\u0027, [])) \u003d\u003d 0)"},{"line_number":1228,"context_line":"                and (len(network_data.get(\u0027services\u0027, [])) \u003d\u003d 0))"},{"line_number":1229,"context_line":"    except AttributeError:"},{"line_number":1230,"context_line":"        # Got called with None or something else lacking the attribute."},{"line_number":1231,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":16,"id":"aa1d5a93_94518506","line":1228,"updated":"2025-05-08 13:31:37.000000000","message":"another case we should consider: If MTU is null on links. Or maybe not. Odds are it is relatively safe, but we should at least add a note.","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"    try:"},{"line_number":1226,"context_line":"        return ((len(network_data.get(\u0027links\u0027, [])) \u003d\u003d 0)"},{"line_number":1227,"context_line":"                and (len(network_data.get(\u0027networks\u0027, [])) \u003d\u003d 0)"},{"line_number":1228,"context_line":"                and (len(network_data.get(\u0027services\u0027, [])) \u003d\u003d 0))"},{"line_number":1229,"context_line":"    except AttributeError:"},{"line_number":1230,"context_line":"        # Got called with None or something else lacking the attribute."},{"line_number":1231,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":16,"id":"d26e0027_4962dae2","line":1228,"in_reply_to":"66771cd3_c949a126","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18187f3be2290fd7252c1ffc0bf1ed0b8e3163df","unresolved":true,"context_lines":[{"line_number":1225,"context_line":"    try:"},{"line_number":1226,"context_line":"        return ((len(network_data.get(\u0027links\u0027, [])) \u003d\u003d 0)"},{"line_number":1227,"context_line":"                and (len(network_data.get(\u0027networks\u0027, [])) \u003d\u003d 0)"},{"line_number":1228,"context_line":"                and (len(network_data.get(\u0027services\u0027, [])) \u003d\u003d 0))"},{"line_number":1229,"context_line":"    except AttributeError:"},{"line_number":1230,"context_line":"        # Got called with None or something else lacking the attribute."},{"line_number":1231,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":16,"id":"c161980e_321e4467","line":1228,"in_reply_to":"aa1d5a93_94518506","updated":"2025-05-13 11:14:33.000000000","message":"How does it all works for standalone users which may have arbitrary metadata? (I\u0027m quite sure people don\u0027t always put MTU or services there)","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":true,"context_lines":[{"line_number":1225,"context_line":"    try:"},{"line_number":1226,"context_line":"        return ((len(network_data.get(\u0027links\u0027, [])) \u003d\u003d 0)"},{"line_number":1227,"context_line":"                and (len(network_data.get(\u0027networks\u0027, [])) \u003d\u003d 0)"},{"line_number":1228,"context_line":"                and (len(network_data.get(\u0027services\u0027, [])) \u003d\u003d 0))"},{"line_number":1229,"context_line":"    except AttributeError:"},{"line_number":1230,"context_line":"        # Got called with None or something else lacking the attribute."},{"line_number":1231,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":16,"id":"66771cd3_c949a126","line":1228,"in_reply_to":"c161980e_321e4467","updated":"2025-05-15 16:03:04.000000000","message":"So they would need to provide an empty dict, however if they provide None, they will get captured in the AttributeError. Realistically, we could also catch KeyError as well and it would be the same for standalong users which send partial data across.\n\nTruthfully, it is only looking for an empty dict which gets sent to ironic, and in a later patch malformed data with missing values which are important to users anyhow.","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"                and (len(network_data.get(\u0027networks\u0027, [])) \u003d\u003d 0)"},{"line_number":1228,"context_line":"                and (len(network_data.get(\u0027services\u0027, [])) \u003d\u003d 0))"},{"line_number":1229,"context_line":"    except AttributeError:"},{"line_number":1230,"context_line":"        # Got called with None or something else lacking the attribute."},{"line_number":1231,"context_line":"        return True"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"cb73c4a8_9be3e2a9","line":1230,"updated":"2025-05-08 13:31:37.000000000","message":"Here is where we would turn around and go \"oh, we could inject it for you!\"","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":true,"context_lines":[{"line_number":1231,"context_line":"        return True"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"def check_and_patch_configdrive_network_data(task, configdrive):"},{"line_number":1235,"context_line":"    try:"},{"line_number":1236,"context_line":"        with tempfile.NamedTemporaryFile(dir\u003dCONF.tempdir,"},{"line_number":1237,"context_line":"                                         mode\u003d\"wb+\") as fileobj:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f45b79c_47ff31cf","line":1234,"updated":"2025-05-08 13:31:37.000000000","message":"docstring, and shorten the method name since there is a strong possibility this will evolve as time goes on to include ssh key injection if so requested.","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3881d0686c992219eeba34c0a52e47158e415be0","unresolved":true,"context_lines":[{"line_number":1231,"context_line":"        return True"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"def check_and_patch_configdrive_network_data(task, configdrive):"},{"line_number":1235,"context_line":"    try:"},{"line_number":1236,"context_line":"        with tempfile.NamedTemporaryFile(dir\u003dCONF.tempdir,"},{"line_number":1237,"context_line":"                                         mode\u003d\"wb+\") as fileobj:"}],"source_content_type":"text/x-python","patch_set":16,"id":"accef1c6_ffbd5d26","line":1234,"updated":"2025-05-12 15:05:28.000000000","message":"needs a unit test as well.","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        return True"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"def check_and_patch_configdrive_network_data(task, configdrive):"},{"line_number":1235,"context_line":"    try:"},{"line_number":1236,"context_line":"        with tempfile.NamedTemporaryFile(dir\u003dCONF.tempdir,"},{"line_number":1237,"context_line":"                                         mode\u003d\"wb+\") as fileobj:"}],"source_content_type":"text/x-python","patch_set":16,"id":"df4773f2_b3f5a033","line":1234,"in_reply_to":"3f45b79c_47ff31cf","updated":"2025-05-15 16:03:04.000000000","message":"Done","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        return True"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"def check_and_patch_configdrive_network_data(task, configdrive):"},{"line_number":1235,"context_line":"    try:"},{"line_number":1236,"context_line":"        with tempfile.NamedTemporaryFile(dir\u003dCONF.tempdir,"},{"line_number":1237,"context_line":"                                         mode\u003d\"wb+\") as fileobj:"}],"source_content_type":"text/x-python","patch_set":16,"id":"96825a6f_0925c10c","line":1234,"in_reply_to":"accef1c6_ffbd5d26","updated":"2025-05-15 16:03:04.000000000","message":"Done","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3881d0686c992219eeba34c0a52e47158e415be0","unresolved":true,"context_lines":[{"line_number":1236,"context_line":"        with tempfile.NamedTemporaryFile(dir\u003dCONF.tempdir,"},{"line_number":1237,"context_line":"                                         mode\u003d\"wb+\") as fileobj:"},{"line_number":1238,"context_line":"            # We have a file, we need to extract it and get it to an temp file"},{"line_number":1239,"context_line":"            fileobj.write(gzip.decompress(base64.b64decode(configdrive)))"},{"line_number":1240,"context_line":"            fileobj.flush()"},{"line_number":1241,"context_line":"            # Reset the position back to the start."},{"line_number":1242,"context_line":"            fileobj.seek(0)"}],"source_content_type":"text/x-python","patch_set":16,"id":"dd6370ce_c7b62373","line":1239,"updated":"2025-05-12 15:05:28.000000000","message":"Likely also need to handle extraction errors here.","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":1236,"context_line":"        with tempfile.NamedTemporaryFile(dir\u003dCONF.tempdir,"},{"line_number":1237,"context_line":"                                         mode\u003d\"wb+\") as fileobj:"},{"line_number":1238,"context_line":"            # We have a file, we need to extract it and get it to an temp file"},{"line_number":1239,"context_line":"            fileobj.write(gzip.decompress(base64.b64decode(configdrive)))"},{"line_number":1240,"context_line":"            fileobj.flush()"},{"line_number":1241,"context_line":"            # Reset the position back to the start."},{"line_number":1242,"context_line":"            fileobj.seek(0)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7762281e_ac9d4be6","line":1239,"in_reply_to":"dd6370ce_c7b62373","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":true,"context_lines":[{"line_number":1252,"context_line":"                nd_dict \u003d json.loads(ndfp.read())"},{"line_number":1253,"context_line":"                if not is_invalid_network_metadata(nd_dict):"},{"line_number":1254,"context_line":"                    # We know the config drive is okay, we can return what"},{"line_number":1255,"context_line":"                    # was submitted."},{"line_number":1256,"context_line":"                    return configdrive"},{"line_number":1257,"context_line":"            LOG.warning(\u0027The provided metadata for the deployment of \u0027"},{"line_number":1258,"context_line":"                        \u0027node %s appears invalid, and will be \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"a507525a_9f700364","line":1255,"updated":"2025-05-08 13:31:37.000000000","message":"NOTE: Add a note about \"this is where we would do xyz in the future.","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":false,"context_lines":[{"line_number":1252,"context_line":"                nd_dict \u003d json.loads(ndfp.read())"},{"line_number":1253,"context_line":"                if not is_invalid_network_metadata(nd_dict):"},{"line_number":1254,"context_line":"                    # We know the config drive is okay, we can return what"},{"line_number":1255,"context_line":"                    # was submitted."},{"line_number":1256,"context_line":"                    return configdrive"},{"line_number":1257,"context_line":"            LOG.warning(\u0027The provided metadata for the deployment of \u0027"},{"line_number":1258,"context_line":"                        \u0027node %s appears invalid, and will be \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"4ab5cde6_51143bd4","line":1255,"in_reply_to":"a507525a_9f700364","updated":"2025-05-15 16:03:04.000000000","message":"Done","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"3881d0686c992219eeba34c0a52e47158e415be0","unresolved":true,"context_lines":[{"line_number":1285,"context_line":"    return new_drive"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":""},{"line_number":1288,"context_line":"def regenerate_iso(source, dest, override_files):"},{"line_number":1289,"context_line":"    \"\"\"Utility method to regenerate a config drive ISO image."},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    This method takes the source, extracts the contents in a temporary folder,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7caf9864_cd28eb1a","line":1288,"updated":"2025-05-12 15:05:28.000000000","message":"needs a unit test","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51f2d0ade17235078cd721321ec7c8c3c15c71d3","unresolved":true,"context_lines":[{"line_number":1285,"context_line":"    return new_drive"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":""},{"line_number":1288,"context_line":"def regenerate_iso(source, dest, override_files):"},{"line_number":1289,"context_line":"    \"\"\"Utility method to regenerate a config drive ISO image."},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    This method takes the source, extracts the contents in a temporary folder,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3db1fa4f_58361771","line":1288,"in_reply_to":"1376352e_bbca94f1","updated":"2025-05-30 20:50:20.000000000","message":"moved it all into the same config drive utils.","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":1285,"context_line":"    return new_drive"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":""},{"line_number":1288,"context_line":"def regenerate_iso(source, dest, override_files):"},{"line_number":1289,"context_line":"    \"\"\"Utility method to regenerate a config drive ISO image."},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    This method takes the source, extracts the contents in a temporary folder,"}],"source_content_type":"text/x-python","patch_set":16,"id":"0983c19a_04f13fb9","line":1288,"in_reply_to":"3db1fa4f_58361771","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18187f3be2290fd7252c1ffc0bf1ed0b8e3163df","unresolved":true,"context_lines":[{"line_number":1285,"context_line":"    return new_drive"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":""},{"line_number":1288,"context_line":"def regenerate_iso(source, dest, override_files):"},{"line_number":1289,"context_line":"    \"\"\"Utility method to regenerate a config drive ISO image."},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"    This method takes the source, extracts the contents in a temporary folder,"}],"source_content_type":"text/x-python","patch_set":16,"id":"1376352e_bbca94f1","line":1288,"in_reply_to":"7caf9864_cd28eb1a","updated":"2025-05-13 11:14:33.000000000","message":"This function may be better hosted in image_utils where the ISO generation already is","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4108f467ce2cd19d611624d1e6d51c7582aeb62d","unresolved":true,"context_lines":[{"line_number":1304,"context_line":"        # NOTE(TheJulia): The base extraction logic was sourced from kickstart"},{"line_number":1305,"context_line":"        # utils, as an actually kind of simple base approach to do the needful"},{"line_number":1306,"context_line":"        # extraction."},{"line_number":1307,"context_line":"        LOG.debug(\u0027Extracting configuration drive to %s\u0027, tempfolder)"},{"line_number":1308,"context_line":"        # The default configuration drive format we expect is generally"},{"line_number":1309,"context_line":"        # of a rock ridge format, and to avoid classic dos ISO9660 level"},{"line_number":1310,"context_line":"        # constraints, we will get the path using a rock ridge base path"}],"source_content_type":"text/x-python","patch_set":16,"id":"d22c692a_cbc4852a","line":1307,"updated":"2025-05-08 13:31:37.000000000","message":"Likely not needed","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":false,"context_lines":[{"line_number":1304,"context_line":"        # NOTE(TheJulia): The base extraction logic was sourced from kickstart"},{"line_number":1305,"context_line":"        # utils, as an actually kind of simple base approach to do the needful"},{"line_number":1306,"context_line":"        # extraction."},{"line_number":1307,"context_line":"        LOG.debug(\u0027Extracting configuration drive to %s\u0027, tempfolder)"},{"line_number":1308,"context_line":"        # The default configuration drive format we expect is generally"},{"line_number":1309,"context_line":"        # of a rock ridge format, and to avoid classic dos ISO9660 level"},{"line_number":1310,"context_line":"        # constraints, we will get the path using a rock ridge base path"}],"source_content_type":"text/x-python","patch_set":16,"id":"737f7e1c_bc5f7c45","line":1307,"in_reply_to":"d22c692a_cbc4852a","updated":"2025-05-15 16:03:04.000000000","message":"Done","commit_id":"8b7b28ef3e072ac886f076bb2f52ccdbe50945dd"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18187f3be2290fd7252c1ffc0bf1ed0b8e3163df","unresolved":true,"context_lines":[{"line_number":1239,"context_line":"        return True"},{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":""},{"line_number":1242,"context_line":"def check_and_patch_configdrive(task, configdrive):"},{"line_number":1243,"context_line":"    \"\"\"Evaluates and patches an provided ISO9660 configuration drive file."},{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"    This method is responsible for taking the user requested configuration"}],"source_content_type":"text/x-python","patch_set":24,"id":"a0bf7940_62fcb0b4","line":1242,"updated":"2025-05-13 11:14:33.000000000","message":"Please move it out of utils.py, I think at this stage configdrive handling deserves its own module","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":1239,"context_line":"        return True"},{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":""},{"line_number":1242,"context_line":"def check_and_patch_configdrive(task, configdrive):"},{"line_number":1243,"context_line":"    \"\"\"Evaluates and patches an provided ISO9660 configuration drive file."},{"line_number":1244,"context_line":""},{"line_number":1245,"context_line":"    This method is responsible for taking the user requested configuration"}],"source_content_type":"text/x-python","patch_set":24,"id":"e0a67d35_b021843f","line":1242,"in_reply_to":"a0bf7940_62fcb0b4","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18187f3be2290fd7252c1ffc0bf1ed0b8e3163df","unresolved":true,"context_lines":[{"line_number":1276,"context_line":"                    nd_dict \u003d json.loads(ndfp.read())"},{"line_number":1277,"context_line":"                    # NOTE(TheJulia): This is the area of the code we would"},{"line_number":1278,"context_line":"                    # want to inject any additional checks in for patching in."},{"line_number":1279,"context_line":"                    if is_invalid_network_metadata(nd_dict):"},{"line_number":1280,"context_line":"                        # We know the config drive is okay, we can return what"},{"line_number":1281,"context_line":"                        # was submitted."},{"line_number":1282,"context_line":"                        return configdrive"}],"source_content_type":"text/x-python","patch_set":24,"id":"57e658d5_8b262956","line":1279,"updated":"2025-05-13 11:14:33.000000000","message":"\"if not\" I assume?","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51f2d0ade17235078cd721321ec7c8c3c15c71d3","unresolved":false,"context_lines":[{"line_number":1276,"context_line":"                    nd_dict \u003d json.loads(ndfp.read())"},{"line_number":1277,"context_line":"                    # NOTE(TheJulia): This is the area of the code we would"},{"line_number":1278,"context_line":"                    # want to inject any additional checks in for patching in."},{"line_number":1279,"context_line":"                    if is_invalid_network_metadata(nd_dict):"},{"line_number":1280,"context_line":"                        # We know the config drive is okay, we can return what"},{"line_number":1281,"context_line":"                        # was submitted."},{"line_number":1282,"context_line":"                        return configdrive"}],"source_content_type":"text/x-python","patch_set":24,"id":"8ed10119_592a9221","line":1279,"in_reply_to":"5304853d_e46f5e06","updated":"2025-05-30 20:50:20.000000000","message":"nope, the data is valid, doh!","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":true,"context_lines":[{"line_number":1276,"context_line":"                    nd_dict \u003d json.loads(ndfp.read())"},{"line_number":1277,"context_line":"                    # NOTE(TheJulia): This is the area of the code we would"},{"line_number":1278,"context_line":"                    # want to inject any additional checks in for patching in."},{"line_number":1279,"context_line":"                    if is_invalid_network_metadata(nd_dict):"},{"line_number":1280,"context_line":"                        # We know the config drive is okay, we can return what"},{"line_number":1281,"context_line":"                        # was submitted."},{"line_number":1282,"context_line":"                        return configdrive"}],"source_content_type":"text/x-python","patch_set":24,"id":"5304853d_e46f5e06","line":1279,"in_reply_to":"57e658d5_8b262956","updated":"2025-05-15 16:03:04.000000000","message":"is_invalid_network_metadata returns True when it is invalid, so this is correct. If not would be the inverse and the rest of the code wouldn\u0027t be evaluated.","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18187f3be2290fd7252c1ffc0bf1ed0b8e3163df","unresolved":true,"context_lines":[{"line_number":1284,"context_line":"                    # NOTE(TheJulia): We\u0027ve gotten some sort of invalid data"},{"line_number":1285,"context_line":"                    # which is a possible case. So... just live with it and"},{"line_number":1286,"context_line":"                    # move on."},{"line_number":1287,"context_line":"                    pass"},{"line_number":1288,"context_line":"            LOG.warning(\u0027The provided metadata for the deployment of \u0027"},{"line_number":1289,"context_line":"                        \u0027node %s appears invalid, and will be \u0027"},{"line_number":1290,"context_line":"                        \u0027regenerated based upon the available \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"11faecc2_d6324ec6","line":1287,"updated":"2025-05-13 11:14:33.000000000","message":"worth a debug message?","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":true,"context_lines":[{"line_number":1284,"context_line":"                    # NOTE(TheJulia): We\u0027ve gotten some sort of invalid data"},{"line_number":1285,"context_line":"                    # which is a possible case. So... just live with it and"},{"line_number":1286,"context_line":"                    # move on."},{"line_number":1287,"context_line":"                    pass"},{"line_number":1288,"context_line":"            LOG.warning(\u0027The provided metadata for the deployment of \u0027"},{"line_number":1289,"context_line":"                        \u0027node %s appears invalid, and will be \u0027"},{"line_number":1290,"context_line":"                        \u0027regenerated based upon the available \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"38489282_fecbc803","line":1287,"in_reply_to":"11faecc2_d6324ec6","updated":"2025-05-15 16:03:04.000000000","message":"Yeah, likely! 😊","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"51f2d0ade17235078cd721321ec7c8c3c15c71d3","unresolved":false,"context_lines":[{"line_number":1284,"context_line":"                    # NOTE(TheJulia): We\u0027ve gotten some sort of invalid data"},{"line_number":1285,"context_line":"                    # which is a possible case. So... just live with it and"},{"line_number":1286,"context_line":"                    # move on."},{"line_number":1287,"context_line":"                    pass"},{"line_number":1288,"context_line":"            LOG.warning(\u0027The provided metadata for the deployment of \u0027"},{"line_number":1289,"context_line":"                        \u0027node %s appears invalid, and will be \u0027"},{"line_number":1290,"context_line":"                        \u0027regenerated based upon the available \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff7ab519_75704b1d","line":1287,"in_reply_to":"38489282_fecbc803","updated":"2025-05-30 20:50:20.000000000","message":"Done","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"901adc45115955cdee82a34397fd0f8b7af09071","unresolved":true,"context_lines":[{"line_number":1425,"context_line":"        # generation. If all else fails, just return."},{"line_number":1426,"context_line":"        # NOTE(TheJulia): This style seemed better than isinstancing"},{"line_number":1427,"context_line":"        # the task.driver.network for the NeutronVIFPortIDMixin class."},{"line_number":1428,"context_line":"        if \u0027metadata\u0027 not in task.driver.network.capabilities:"},{"line_number":1429,"context_line":"            return"},{"line_number":1430,"context_line":"    except AttributeError:"},{"line_number":1431,"context_line":"        # In this case, we know it is a network interface driver"}],"source_content_type":"text/x-python","patch_set":24,"id":"906dd155_6673898a","line":1428,"updated":"2025-05-13 11:20:06.000000000","message":"I think this check should be the first thing in this entire flow. If we cannot fix the metadata, we should not even try.","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e0753db44e9139b1fdaa38bb5bb147c3a074eaad","unresolved":false,"context_lines":[{"line_number":1425,"context_line":"        # generation. If all else fails, just return."},{"line_number":1426,"context_line":"        # NOTE(TheJulia): This style seemed better than isinstancing"},{"line_number":1427,"context_line":"        # the task.driver.network for the NeutronVIFPortIDMixin class."},{"line_number":1428,"context_line":"        if \u0027metadata\u0027 not in task.driver.network.capabilities:"},{"line_number":1429,"context_line":"            return"},{"line_number":1430,"context_line":"    except AttributeError:"},{"line_number":1431,"context_line":"        # In this case, we know it is a network interface driver"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f00b2ea_4960e8bb","line":1428,"in_reply_to":"903df36b_30890d5d","updated":"2025-05-20 13:41:32.000000000","message":"Done","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":true,"context_lines":[{"line_number":1425,"context_line":"        # generation. If all else fails, just return."},{"line_number":1426,"context_line":"        # NOTE(TheJulia): This style seemed better than isinstancing"},{"line_number":1427,"context_line":"        # the task.driver.network for the NeutronVIFPortIDMixin class."},{"line_number":1428,"context_line":"        if \u0027metadata\u0027 not in task.driver.network.capabilities:"},{"line_number":1429,"context_line":"            return"},{"line_number":1430,"context_line":"    except AttributeError:"},{"line_number":1431,"context_line":"        # In this case, we know it is a network interface driver"}],"source_content_type":"text/x-python","patch_set":24,"id":"903df36b_30890d5d","line":1428,"in_reply_to":"906dd155_6673898a","updated":"2025-05-15 16:03:04.000000000","message":"I was thinking slightly better to try and determine it a little later, that way we can log if there is something really bad in the data.","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":true,"context_lines":[{"line_number":1561,"context_line":"              \u0027node %s.\u0027, task.node.uuid)"},{"line_number":1562,"context_line":"    metadata \u003d generate_instance_network_data(task)"},{"line_number":1563,"context_line":"    if metadata is None:"},{"line_number":1564,"context_line":"        # We were unable to generate metadta because the underlying"},{"line_number":1565,"context_line":"        # interface configuration, i.e. no neutron support."},{"line_number":1566,"context_line":"        LOG.error(\u0027Failed to generate new network metadata for \u0027"},{"line_number":1567,"context_line":"                  \u0027deployment of node %s as the underlying \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"844b9d59_bbe5ae8e","line":1564,"range":{"start_line":1564,"start_character":37,"end_line":1564,"end_character":44},"updated":"2025-05-15 16:03:04.000000000","message":"spelling","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e0753db44e9139b1fdaa38bb5bb147c3a074eaad","unresolved":false,"context_lines":[{"line_number":1561,"context_line":"              \u0027node %s.\u0027, task.node.uuid)"},{"line_number":1562,"context_line":"    metadata \u003d generate_instance_network_data(task)"},{"line_number":1563,"context_line":"    if metadata is None:"},{"line_number":1564,"context_line":"        # We were unable to generate metadta because the underlying"},{"line_number":1565,"context_line":"        # interface configuration, i.e. no neutron support."},{"line_number":1566,"context_line":"        LOG.error(\u0027Failed to generate new network metadata for \u0027"},{"line_number":1567,"context_line":"                  \u0027deployment of node %s as the underlying \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"bb4a0fde_47a96069","line":1564,"range":{"start_line":1564,"start_character":37,"end_line":1564,"end_character":44},"in_reply_to":"844b9d59_bbe5ae8e","updated":"2025-05-20 13:41:32.000000000","message":"Done","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18187f3be2290fd7252c1ffc0bf1ed0b8e3163df","unresolved":true,"context_lines":[{"line_number":1562,"context_line":"    metadata \u003d generate_instance_network_data(task)"},{"line_number":1563,"context_line":"    if metadata is None:"},{"line_number":1564,"context_line":"        # We were unable to generate metadta because the underlying"},{"line_number":1565,"context_line":"        # interface configuration, i.e. no neutron support."},{"line_number":1566,"context_line":"        LOG.error(\u0027Failed to generate new network metadata for \u0027"},{"line_number":1567,"context_line":"                  \u0027deployment of node %s as the underlying \u0027"},{"line_number":1568,"context_line":"                  \u0027interfaces do not signify neutron support.\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"64d72961_3cd325b6","line":1565,"updated":"2025-05-13 11:14:33.000000000","message":"Same question about standalone users","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e0753db44e9139b1fdaa38bb5bb147c3a074eaad","unresolved":false,"context_lines":[{"line_number":1562,"context_line":"    metadata \u003d generate_instance_network_data(task)"},{"line_number":1563,"context_line":"    if metadata is None:"},{"line_number":1564,"context_line":"        # We were unable to generate metadta because the underlying"},{"line_number":1565,"context_line":"        # interface configuration, i.e. no neutron support."},{"line_number":1566,"context_line":"        LOG.error(\u0027Failed to generate new network metadata for \u0027"},{"line_number":1567,"context_line":"                  \u0027deployment of node %s as the underlying \u0027"},{"line_number":1568,"context_line":"                  \u0027interfaces do not signify neutron support.\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"233127ab_7e373663","line":1565,"in_reply_to":"6490524a_f928b886","updated":"2025-05-20 13:41:32.000000000","message":"Standalone users will no longer head down this path at all. Prevented in deployments.py.","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":true,"context_lines":[{"line_number":1562,"context_line":"    metadata \u003d generate_instance_network_data(task)"},{"line_number":1563,"context_line":"    if metadata is None:"},{"line_number":1564,"context_line":"        # We were unable to generate metadta because the underlying"},{"line_number":1565,"context_line":"        # interface configuration, i.e. no neutron support."},{"line_number":1566,"context_line":"        LOG.error(\u0027Failed to generate new network metadata for \u0027"},{"line_number":1567,"context_line":"                  \u0027deployment of node %s as the underlying \u0027"},{"line_number":1568,"context_line":"                  \u0027interfaces do not signify neutron support.\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"6490524a_f928b886","line":1565,"in_reply_to":"64d72961_3cd325b6","updated":"2025-05-15 16:03:04.000000000","message":"Standalone usage short circuits out of the path but *should* still log if there is an issue. I guess the thing we need to decide is \"logging there was a problem\" important, or not?","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"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":"9d47b3e19de723470014b68c77a8691ce0f61f40","unresolved":true,"context_lines":[{"line_number":1193,"context_line":"                                vendor_data\u003dconfigdrive.get(\u0027vendor_data\u0027))"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"# NOTE(TheJulia): Move this to configdrive_utils at some point in the future."},{"line_number":1197,"context_line":"def get_configdrive_image(node):"},{"line_number":1198,"context_line":"    \"\"\"Get configdrive as an ISO image or a URL."},{"line_number":1199,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"265a2877_f0e0494c","line":1196,"updated":"2025-05-29 17:13:11.000000000","message":"Just noting that filing a low-hanging-fruit bug about this would be a good idea; it\u0027s an ideal task for someone to onboard with.","commit_id":"d47306fc19f489bf4f973fd1afb5308a73f57e46"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":1193,"context_line":"                                vendor_data\u003dconfigdrive.get(\u0027vendor_data\u0027))"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"# NOTE(TheJulia): Move this to configdrive_utils at some point in the future."},{"line_number":1197,"context_line":"def get_configdrive_image(node):"},{"line_number":1198,"context_line":"    \"\"\"Get configdrive as an ISO image or a URL."},{"line_number":1199,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"c930cb04_552197de","line":1196,"in_reply_to":"265a2877_f0e0494c","updated":"2025-06-10 18:19:08.000000000","message":"https://bugs.launchpad.net/ironic/+bug/2113892","commit_id":"d47306fc19f489bf4f973fd1afb5308a73f57e46"}],"ironic/conf/conductor.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":"9d47b3e19de723470014b68c77a8691ce0f61f40","unresolved":true,"context_lines":[{"line_number":546,"context_line":"                    \u0027here are validated as absolute paths and will be rejected\u0027"},{"line_number":547,"context_line":"                    \u0027if they contain path traversal mechanisms, \u0027"},{"line_number":548,"context_line":"                    \u0027such as \"..\".\u0027)),"},{"line_number":549,"context_line":"    cfg.BoolOpt(\u0027disable_config_drive_check\u0027,"},{"line_number":550,"context_line":"                default\u003dFalse,"},{"line_number":551,"context_line":"                mutable\u003dTrue,"},{"line_number":552,"context_line":"                help\u003d_(\u0027Option to disable operations which check and \u0027"}],"source_content_type":"text/x-python","patch_set":27,"id":"b4a6be86_bab0448d","line":549,"updated":"2025-05-29 17:13:11.000000000","message":"Everywhere else in this module/config, we refer to \"configdrive\", not \"config_drive\". Ideally we\u0027d be consistent here.","commit_id":"d47306fc19f489bf4f973fd1afb5308a73f57e46"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":546,"context_line":"                    \u0027here are validated as absolute paths and will be rejected\u0027"},{"line_number":547,"context_line":"                    \u0027if they contain path traversal mechanisms, \u0027"},{"line_number":548,"context_line":"                    \u0027such as \"..\".\u0027)),"},{"line_number":549,"context_line":"    cfg.BoolOpt(\u0027disable_config_drive_check\u0027,"},{"line_number":550,"context_line":"                default\u003dFalse,"},{"line_number":551,"context_line":"                mutable\u003dTrue,"},{"line_number":552,"context_line":"                help\u003d_(\u0027Option to disable operations which check and \u0027"}],"source_content_type":"text/x-python","patch_set":27,"id":"f8029c5d_1948e935","line":549,"in_reply_to":"b4a6be86_bab0448d","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"d47306fc19f489bf4f973fd1afb5308a73f57e46"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":563,"context_line":"                help\u003d_(\u0027Option to disable operations which check and \u0027"},{"line_number":564,"context_line":"                       \u0027potentially fix up configuration drive contents, \u0027"},{"line_number":565,"context_line":"                       \u0027such as invalid network metadata values. When these \u0027"},{"line_number":566,"context_line":"                       \u0027issues are detected, and ironic is able to correct \u0027"},{"line_number":567,"context_line":"                       \u0027the data, Ironic will do so transparently. Setting \u0027"},{"line_number":568,"context_line":"                       \u0027this option to True will disable this \u0027"},{"line_number":569,"context_line":"                       \u0027functionality.\u0027)),"}],"source_content_type":"text/x-python","patch_set":29,"id":"f5b314a9_56f74252","line":566,"updated":"2025-06-06 15:11:54.000000000","message":"nit: inconsistency: ironic or Ironic?","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":563,"context_line":"                help\u003d_(\u0027Option to disable operations which check and \u0027"},{"line_number":564,"context_line":"                       \u0027potentially fix up configuration drive contents, \u0027"},{"line_number":565,"context_line":"                       \u0027such as invalid network metadata values. When these \u0027"},{"line_number":566,"context_line":"                       \u0027issues are detected, and ironic is able to correct \u0027"},{"line_number":567,"context_line":"                       \u0027the data, Ironic will do so transparently. Setting \u0027"},{"line_number":568,"context_line":"                       \u0027this option to True will disable this \u0027"},{"line_number":569,"context_line":"                       \u0027functionality.\u0027)),"}],"source_content_type":"text/x-python","patch_set":29,"id":"77477c5e_b02cdc1f","line":566,"in_reply_to":"f5b314a9_56f74252","updated":"2025-06-10 18:19:08.000000000","message":"Fixed in follow-up.","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"}],"ironic/drivers/modules/network/noop.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":16,"context_line":"class NoopNetwork(base.NetworkInterface):"},{"line_number":17,"context_line":"    \"\"\"Noop network interface.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    capabilities \u003d []"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def port_changed(self, task, port_obj):"},{"line_number":22,"context_line":"        \"\"\"Handle any actions required when a port changes"}],"source_content_type":"text/x-python","patch_set":29,"id":"3344587e_9e6d0148","line":19,"updated":"2025-06-06 15:11:54.000000000","message":"nit: already defined in the base class","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":16,"context_line":"class NoopNetwork(base.NetworkInterface):"},{"line_number":17,"context_line":"    \"\"\"Noop network interface.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    capabilities \u003d []"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    def port_changed(self, task, port_obj):"},{"line_number":22,"context_line":"        \"\"\"Handle any actions required when a port changes"}],"source_content_type":"text/x-python","patch_set":29,"id":"2c800971_1211256f","line":19,"in_reply_to":"3344587e_9e6d0148","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"}],"ironic/tests/unit/common/test_neutron.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":"2c6eacf283b21437300a2c4f556352b779b14f75","unresolved":true,"context_lines":[{"line_number":711,"context_line":"                \u0027id\u0027: \u0027port0\u0027,"},{"line_number":712,"context_line":"                \u0027mtu\u0027: 1500,"},{"line_number":713,"context_line":"                \u0027type\u0027: \u0027bond\u0027,"},{"line_number":714,"context_line":"                \u0027vif_id\u0027: \u002746d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2\u0027"},{"line_number":715,"context_line":"            },"},{"line_number":716,"context_line":"            {"},{"line_number":717,"context_line":"                \u0027ethernet_mac_address\u0027: \u002700:11:22:33:44:55\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"42fda180_4599c091","line":714,"updated":"2025-05-13 22:14:39.000000000","message":"Is this going to be revealing information to the user of the machine they didn\u0027t have access to before? Or is the nova user who provisioned usually going to know their vif id. Similar question with network_id","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7d3823a5fd6e897cc51f161f03cb6173c588cb96","unresolved":true,"context_lines":[{"line_number":711,"context_line":"                \u0027id\u0027: \u0027port0\u0027,"},{"line_number":712,"context_line":"                \u0027mtu\u0027: 1500,"},{"line_number":713,"context_line":"                \u0027type\u0027: \u0027bond\u0027,"},{"line_number":714,"context_line":"                \u0027vif_id\u0027: \u002746d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2\u0027"},{"line_number":715,"context_line":"            },"},{"line_number":716,"context_line":"            {"},{"line_number":717,"context_line":"                \u0027ethernet_mac_address\u0027: \u002700:11:22:33:44:55\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ec3a466a_c6759f76","line":714,"in_reply_to":"42fda180_4599c091","updated":"2025-05-15 16:03:04.000000000","message":"A user who requests a node is able to know their vif ID or request it from neutron, so this is easy to obtain information already and I think already exposed in the existing metadata which is shipped in an informational context. Same applies to network_id, you either have to know it to request an attachment to a network, and you can look it up after the fact if you have a port. Any API surface user in the correct project can determine those items, so this really is not leaking more information, it actually makes it easier to troubleshoot when there are issues becauses today some of the information is sent across as \"if I were going to wire VTEPs, i\u0027d use this interface name\" logic in neutron, which makes it super difficult for baremetal.","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"},{"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":"811264ed3f677787917ae7ae416ccb1ada322d83","unresolved":false,"context_lines":[{"line_number":711,"context_line":"                \u0027id\u0027: \u0027port0\u0027,"},{"line_number":712,"context_line":"                \u0027mtu\u0027: 1500,"},{"line_number":713,"context_line":"                \u0027type\u0027: \u0027bond\u0027,"},{"line_number":714,"context_line":"                \u0027vif_id\u0027: \u002746d4bfb9-b26e-41f3-bd2e-e6dcc1ccedb2\u0027"},{"line_number":715,"context_line":"            },"},{"line_number":716,"context_line":"            {"},{"line_number":717,"context_line":"                \u0027ethernet_mac_address\u0027: \u002700:11:22:33:44:55\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"52aaf750_4f511beb","line":714,"in_reply_to":"ec3a466a_c6759f76","updated":"2025-05-15 16:10:05.000000000","message":"OK, thanks! I always try to be extra-sure when we pass around information that\u0027s usually stored in other services :D","commit_id":"40c8a7df68e00815f56b4fb51316a7be99d5061e"}],"releasenotes/notes/replace-metadata-when-invalid-c10a8c5add9151c8.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a649d81f1c7bd4096c46b8605d6a650648b51603","unresolved":true,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes an issue where a Nova, or other consumer attempting to send network"},{"line_number":5,"context_line":"    data to Ironic can send grossly invalid network metadata which needs to"},{"line_number":6,"context_line":"    be replaced. Ironic now identifies the condition, and regenerates the network"},{"line_number":7,"context_line":"    metadata utilizing the attached VIF records. This results in some minor"},{"line_number":8,"context_line":"    data differences, such as Nova\u0027s internal VIF tap naming which is redundant,"}],"source_content_type":"text/x-yaml","patch_set":29,"id":"ca01cf87_1dab31f1","line":5,"updated":"2025-06-06 15:11:54.000000000","message":"nit: it does not have to be gross :-P","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9a61316f7d26771eee35b2f6d2a5ef4816844338","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes an issue where a Nova, or other consumer attempting to send network"},{"line_number":5,"context_line":"    data to Ironic can send grossly invalid network metadata which needs to"},{"line_number":6,"context_line":"    be replaced. Ironic now identifies the condition, and regenerates the network"},{"line_number":7,"context_line":"    metadata utilizing the attached VIF records. This results in some minor"},{"line_number":8,"context_line":"    data differences, such as Nova\u0027s internal VIF tap naming which is redundant,"}],"source_content_type":"text/x-yaml","patch_set":29,"id":"a61f38a8_f420441c","line":5,"in_reply_to":"ca01cf87_1dab31f1","updated":"2025-06-10 18:19:08.000000000","message":"Done","commit_id":"ea8b3fcc3fd3805a857dccad77f435f6340caf76"}]}
