)]}'
{"/PATCHSET_LEVEL":[{"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":"aba46c46cc659dcbfc6b2b9e829c1a6ed7ea1950","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"4d3205c7_575e052f","updated":"2025-12-09 19:38:30.000000000","message":"This looks like it\u0027s intended to replace an existing config setting paradigm, but doesn\u0027t mention that at all in the release notes. Really confused as to the shape of this generally TBH.","commit_id":"e56c30e3bdd18f257b19b372cd0817c8c5ca79eb"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"d1a48d8def6c87354f53767f750d965afcfb9d8f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"2f15e4e2_4a5bfe19","updated":"2025-12-18 14:45:55.000000000","message":"Dropping vote to +1, from +2. In large part because multiple fix changes behind this change lack mirroring test changes.","commit_id":"eacdbf8023f71b66c707191f940693d428c8d073"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"fd4fdec57364a5173bd7b8ca6e2add411b49795e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"df9e9214_57b96345","updated":"2025-12-22 12:23:24.000000000","message":"I suspect this patch is introducing the issue described in https://review.opendev.org/c/openstack/ironic/+/971058.\n\nTesting a modification to this patch which should resolve this. Let\u0027s hold off merging till we have test results.","commit_id":"eacdbf8023f71b66c707191f940693d428c8d073"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"1dc7008118987b629e7197e034bf4109d5fa4e85","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"5d4a9e56_befd3184","updated":"2025-12-18 13:12:25.000000000","message":"This one is ready for review","commit_id":"eacdbf8023f71b66c707191f940693d428c8d073"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"18ed6073c393766a40a2e1c60bdb930229ee1033","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"d5041dea_cdba0500","in_reply_to":"1b4669a5_5b68406e","updated":"2025-12-19 18:20:08.000000000","message":"Hey Iury, this was largely in regards to the patches chained after this change. That being said, it is looking better so far.","commit_id":"eacdbf8023f71b66c707191f940693d428c8d073"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"23a639f4b511baf005f1773f0d6233e8c79c6633","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"1b4669a5_5b68406e","in_reply_to":"2f15e4e2_4a5bfe19","updated":"2025-12-18 14:48:43.000000000","message":"Hey Julia, can you point out the part I should add more tests? happy to update and push a new version","commit_id":"eacdbf8023f71b66c707191f940693d428c8d073"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"7b38ed1e8fd113f25ffab143edc5e0bf42a1ba6d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"d9f96644_1c84e769","in_reply_to":"df9e9214_57b96345","updated":"2026-01-05 14:44:56.000000000","message":"Thank Jacob, based on the tests we did downstream we won\u0027t need 971058 anymore. I\u0027ve applied the required changes here, we can now move forward with it","commit_id":"eacdbf8023f71b66c707191f940693d428c8d073"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"ad2a32a03a8957649c935351facb96f9a39f4fca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"31ccfd60_aae4bfc3","updated":"2026-01-05 14:56:23.000000000","message":"Thank you Iury. This resolves my past concern (setting the reboot timeout that was accidentally removed is now re-added).","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6a23f1e5a76269349f879960bad26d8ed52f239e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"8bf4b0ff_973ad981","updated":"2026-01-08 09:32:07.000000000","message":"Thank you for your review and spot-on comments, Dmitry. Pushing revised version. I\u0027m positive I resolved the less complex issues, will do one more pass over the locking concerns to think if I managed to resolve these also.","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"27551560_ccf19c18","updated":"2026-01-07 18:15:51.000000000","message":"There is one aspect that I find a bit dangerous (around upgrading locks), so I\u0027d rather highlight it to you and maybe get it fixed before approving.","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"7291014e36929f3d4fc1de0bb3de3b5bff6c6971","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"6961d16d_05be96b6","updated":"2026-01-06 00:30:51.000000000","message":"recheck metal3-integration seems unstable","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"cdbdf13f8e1c2238791011be7ac0784f820bfe9b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"eff1d05c_81307408","updated":"2026-01-08 09:53:17.000000000","message":"Resolving old comments, all/nearly all should be resolved in the past iterations of the patch.","commit_id":"a154c170c3c3ae180a6013a2b7cc69c8a372e82c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a60a59c3a3441c11d15dda12e3dd6edf7367bf1e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"0f981fab_db30b8b3","updated":"2026-01-08 11:33:10.000000000","message":"Thank you for your comments and suggestions, Dmitry. I attempted addressing all. Please let me know if the current revision addresses your concerns - if not I will keep working on it.","commit_id":"8e19a8eae6522f9d0d41f07bd758975d0167fe48"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"55f9e053_e55bd810","updated":"2026-01-13 16:55:07.000000000","message":"LGTM, but please do consider following-up on my comments inline.","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"b2b1b1202e2b0534e44e9e71b45dfe9d011e47f9","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":22,"id":"44680ad0_a1c0e178","updated":"2026-01-13 19:03:53.000000000","message":"So I gave it a +2 before but I\u0027ll admit it did take me a bit to reason about the names and the cleanups. I agree with @dtantsur@protonmail.com review that constants and cleanups would make this a lot more robust.","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e23fdc8990644cdd3b644a9fbac6b4a1fbe30126","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"9835505e_26237c2a","updated":"2026-01-19 16:14:10.000000000","message":"This time: \"No package matching \u0027mysql-client\u0027 is available\" in openstack-tox-py313\nhttps://zuul.opendev.org/t/openstack/build/1ce272c3811d4305acd72fb184bac3ff\nthat just passed in the prior run that failed on tempest POST","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"8fadf4d63b727280e16527d7c7aaddb46e91ab95","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"ed126839_392d5e16","updated":"2026-04-17 03:28:13.000000000","message":"clearing old unresolved comments","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9756b7c283a4b045df8de99ada23e3e6432b153c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"0e40cb83_12c68857","updated":"2026-01-19 14:02:36.000000000","message":"looks like a temporary, random CI issue - this job passed before\n\n++ /opt/stack/ironic/devstack/lib/ironic:downgrade_dnsmasq:4481 : git clone git://thekelleys.org.uk/dnsmasq.git /tmp/dnsmasq.Ze02r5\n\n2026-01-19 12:53:25.780389 | controller | Cloning into \u0027/tmp/dnsmasq.Ze02r5\u0027...\n\n2026-01-19 12:53:35.794673 | controller | fatal: unable to look up thekelleys.org.uk (port 9418) (Temporary failure in name resolution)\n\nlooks DNS related","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6ef3135ceb96c25507a16d956eb35cfede6dc88c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"557a31ac_aa5fde8b","updated":"2026-01-20 07:53:18.000000000","message":"recheck","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"b640c76dcfd0a10fc9a5aefca588e3e008590946","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"62626960_e7d48f31","updated":"2026-01-19 14:00:39.000000000","message":"recheck","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"1384d9c9e215c8576021c61da7eed35840b295f0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"890c41f5_c19d7757","updated":"2026-01-19 16:13:16.000000000","message":"recheck","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"63b196f95cd7adc55804754ef0f92fb69f0d95fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"bca94549_1e3914da","updated":"2026-01-20 14:23:53.000000000","message":"recheck","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"daafd6c55eb450e16a7ad017d8f6ef8b960ea5db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"810e20ba_51551973","updated":"2026-01-19 19:07:58.000000000","message":"recheck openstack-tox-py313","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"0cf1faeb944abdd8995dfa1dc702638a77015012","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"7dd47b1b_c5907908","updated":"2026-01-20 14:24:17.000000000","message":"rerunning CI with https://review.opendev.org/c/openstack/ironic/+/973818 merged. This should resolve earlier issues.","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"c1dc90902eecb5ee1e270dfd0b2dcfae1c3190a9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"6a315062_6e76941d","updated":"2026-04-17 03:36:45.000000000","message":"s/unresolved/resolved. Actually leaving the unresolved one for the record when we get onto refactoring this.","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"97256aef725aede12e135766c5557d7e6fd66497","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"4cda619b_7621aa8f","updated":"2026-01-19 12:26:11.000000000","message":"we discussed with Jacob and I think we\u0027re good to go as far as we have follow ups quickly after the merge","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"}],"ironic/conf/redfish.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":"aba46c46cc659dcbfc6b2b9e829c1a6ed7ea1950","unresolved":true,"context_lines":[{"line_number":92,"context_line":"                      \u0027failed firmware update tasks\u0027)),"},{"line_number":93,"context_line":"    cfg.IntOpt(\u0027firmware_update_wait_unresponsive_bmc\u0027,"},{"line_number":94,"context_line":"               min\u003d0,"},{"line_number":95,"context_line":"               default\u003d0,"},{"line_number":96,"context_line":"               help\u003d_(\u0027Number of seconds to wait before proceeding with the \u0027"},{"line_number":97,"context_line":"                      \u0027reboot to finish the BMC firmware update step\u0027)),"},{"line_number":98,"context_line":"    cfg.IntOpt(\u0027firmware_update_required_successes\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ea989fb8_4bd24bc1","line":95,"updated":"2025-12-09 19:38:30.000000000","message":"Is this setting now obsolete? Curious why the default is changing and if it was intentional","commit_id":"e56c30e3bdd18f257b19b372cd0817c8c5ca79eb"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"058bf3fdb42ea274f4bd0bd9f476589724ec6142","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                      \u0027failed firmware update tasks\u0027)),"},{"line_number":93,"context_line":"    cfg.IntOpt(\u0027firmware_update_wait_unresponsive_bmc\u0027,"},{"line_number":94,"context_line":"               min\u003d0,"},{"line_number":95,"context_line":"               default\u003d0,"},{"line_number":96,"context_line":"               help\u003d_(\u0027Number of seconds to wait before proceeding with the \u0027"},{"line_number":97,"context_line":"                      \u0027reboot to finish the BMC firmware update step\u0027)),"},{"line_number":98,"context_line":"    cfg.IntOpt(\u0027firmware_update_required_successes\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5edc90e4_5f98db43","line":95,"in_reply_to":"ea989fb8_4bd24bc1","updated":"2025-12-11 15:58:31.000000000","message":"We still use it, we are doing some tests in the machines we found some interesting scenarios, the value caused more problems than benefits, so this is more for a downstream testing since we can just change the value in the ironic.conf","commit_id":"e56c30e3bdd18f257b19b372cd0817c8c5ca79eb"}],"ironic/drivers/modules/redfish/firmware.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3fda7655a08b71a1e84c5bea8843a8f909e4655a","unresolved":true,"context_lines":[{"line_number":225,"context_line":"        component \u003d fw_upd.get(\u0027component\u0027, \u0027\u0027)"},{"line_number":226,"context_line":"        component_type \u003d self._get_component_type(component)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        # Component-specific reboot behavior"},{"line_number":229,"context_line":"        if component_type \u003d\u003d \u0027bmc\u0027:"},{"line_number":230,"context_line":"            # BMC: Do not reboot immediately, set up version checking"},{"line_number":231,"context_line":"            # Record current BMC version before update"}],"source_content_type":"text/x-python","patch_set":11,"id":"7138a38e_2304c70d","line":228,"updated":"2025-11-17 10:50:54.000000000","message":"Let\u0027s split out a method per component type to avoid bloating this method (smth like _wait_for_bmc_upgrade, etc).","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"cdbdf13f8e1c2238791011be7ac0784f820bfe9b","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        component \u003d fw_upd.get(\u0027component\u0027, \u0027\u0027)"},{"line_number":226,"context_line":"        component_type \u003d self._get_component_type(component)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        # Component-specific reboot behavior"},{"line_number":229,"context_line":"        if component_type \u003d\u003d \u0027bmc\u0027:"},{"line_number":230,"context_line":"            # BMC: Do not reboot immediately, set up version checking"},{"line_number":231,"context_line":"            # Record current BMC version before update"}],"source_content_type":"text/x-python","patch_set":11,"id":"ac979fac_e8d8bab7","line":228,"in_reply_to":"7138a38e_2304c70d","updated":"2026-01-08 09:53:17.000000000","message":"Done","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"e87e7267494e67cf4a9df25d282aad381f47c5cb","unresolved":true,"context_lines":[{"line_number":226,"context_line":"        component_type \u003d self._get_component_type(component)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        # Component-specific reboot behavior"},{"line_number":229,"context_line":"        if component_type \u003d\u003d \u0027bmc\u0027:"},{"line_number":230,"context_line":"            # BMC: Do not reboot immediately, set up version checking"},{"line_number":231,"context_line":"            # Record current BMC version before update"},{"line_number":232,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"e6eb2d80_ea33b37f","line":229,"range":{"start_line":229,"start_character":29,"end_line":229,"end_character":34},"updated":"2025-11-17 02:52:57.000000000","message":"we can re-use redfish_utils.BMC here","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"cdbdf13f8e1c2238791011be7ac0784f820bfe9b","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        component_type \u003d self._get_component_type(component)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        # Component-specific reboot behavior"},{"line_number":229,"context_line":"        if component_type \u003d\u003d \u0027bmc\u0027:"},{"line_number":230,"context_line":"            # BMC: Do not reboot immediately, set up version checking"},{"line_number":231,"context_line":"            # Record current BMC version before update"},{"line_number":232,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"05972706_c0e7b63c","line":229,"range":{"start_line":229,"start_character":29,"end_line":229,"end_character":34},"in_reply_to":"e6eb2d80_ea33b37f","updated":"2026-01-08 09:53:17.000000000","message":"Done","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3fda7655a08b71a1e84c5bea8843a8f909e4655a","unresolved":true,"context_lines":[{"line_number":249,"context_line":"            if not expected_version:"},{"line_number":250,"context_line":"                # Try to extract from firmware URL"},{"line_number":251,"context_line":"                firmware_url \u003d fw_upd.get(\u0027url\u0027)"},{"line_number":252,"context_line":"                expected_version \u003d self._extract_version_from_url(firmware_url)"},{"line_number":253,"context_line":"                if not expected_version:"},{"line_number":254,"context_line":"                    # Fall back to \u0027pending\u0027 if can\u0027t extract"},{"line_number":255,"context_line":"                    expected_version \u003d \u0027pending\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"9d36c0ef_eb38448b","line":252,"updated":"2025-11-17 10:50:54.000000000","message":"Rather than this potentially fragile logic, can we just check that the version is different (and not null)?","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"cdbdf13f8e1c2238791011be7ac0784f820bfe9b","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            if not expected_version:"},{"line_number":250,"context_line":"                # Try to extract from firmware URL"},{"line_number":251,"context_line":"                firmware_url \u003d fw_upd.get(\u0027url\u0027)"},{"line_number":252,"context_line":"                expected_version \u003d self._extract_version_from_url(firmware_url)"},{"line_number":253,"context_line":"                if not expected_version:"},{"line_number":254,"context_line":"                    # Fall back to \u0027pending\u0027 if can\u0027t extract"},{"line_number":255,"context_line":"                    expected_version \u003d \u0027pending\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a93b18e_f560f501","line":252,"in_reply_to":"9d36c0ef_eb38448b","updated":"2026-01-08 09:53:17.000000000","message":"Done","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"e87e7267494e67cf4a9df25d282aad381f47c5cb","unresolved":true,"context_lines":[{"line_number":244,"context_line":"                            {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":245,"context_line":"                current_bmc_version \u003d None"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"            # Extract expected version from URL if not explicitly provided"},{"line_number":248,"context_line":"            expected_version \u003d fw_upd.get(\u0027expected_version\u0027)"},{"line_number":249,"context_line":"            if not expected_version:"},{"line_number":250,"context_line":"                # Try to extract from firmware URL"},{"line_number":251,"context_line":"                firmware_url \u003d fw_upd.get(\u0027url\u0027)"},{"line_number":252,"context_line":"                expected_version \u003d self._extract_version_from_url(firmware_url)"},{"line_number":253,"context_line":"                if not expected_version:"},{"line_number":254,"context_line":"                    # Fall back to \u0027pending\u0027 if can\u0027t extract"},{"line_number":255,"context_line":"                    expected_version \u003d \u0027pending\u0027"},{"line_number":256,"context_line":"                    LOG.info(\u0027Could not extract version from URL for BMC \u0027"},{"line_number":257,"context_line":"                             \u0027firmware update on node %(node)s. Will use \u0027"},{"line_number":258,"context_line":"                             \u0027timeout-based completion.\u0027,"},{"line_number":259,"context_line":"                             {\u0027node\u0027: node.uuid})"},{"line_number":260,"context_line":"            node.set_driver_internal_info("},{"line_number":261,"context_line":"                \u0027bmc_fw_expected_version\u0027, expected_version)"},{"line_number":262,"context_line":"            node.set_driver_internal_info("}],"source_content_type":"text/x-python","patch_set":11,"id":"cf18faae_1e3c88c4","line":259,"range":{"start_line":247,"start_character":1,"end_line":259,"end_character":49},"updated":"2025-11-17 02:52:57.000000000","message":"I like the idea of trying to figure out the version from the URL, but not sure if it\u0027s worth \u003d(","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"cdbdf13f8e1c2238791011be7ac0784f820bfe9b","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                            {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":245,"context_line":"                current_bmc_version \u003d None"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"            # Extract expected version from URL if not explicitly provided"},{"line_number":248,"context_line":"            expected_version \u003d fw_upd.get(\u0027expected_version\u0027)"},{"line_number":249,"context_line":"            if not expected_version:"},{"line_number":250,"context_line":"                # Try to extract from firmware URL"},{"line_number":251,"context_line":"                firmware_url \u003d fw_upd.get(\u0027url\u0027)"},{"line_number":252,"context_line":"                expected_version \u003d self._extract_version_from_url(firmware_url)"},{"line_number":253,"context_line":"                if not expected_version:"},{"line_number":254,"context_line":"                    # Fall back to \u0027pending\u0027 if can\u0027t extract"},{"line_number":255,"context_line":"                    expected_version \u003d \u0027pending\u0027"},{"line_number":256,"context_line":"                    LOG.info(\u0027Could not extract version from URL for BMC \u0027"},{"line_number":257,"context_line":"                             \u0027firmware update on node %(node)s. Will use \u0027"},{"line_number":258,"context_line":"                             \u0027timeout-based completion.\u0027,"},{"line_number":259,"context_line":"                             {\u0027node\u0027: node.uuid})"},{"line_number":260,"context_line":"            node.set_driver_internal_info("},{"line_number":261,"context_line":"                \u0027bmc_fw_expected_version\u0027, expected_version)"},{"line_number":262,"context_line":"            node.set_driver_internal_info("}],"source_content_type":"text/x-python","patch_set":11,"id":"4fc4afda_7d6df623","line":259,"range":{"start_line":247,"start_character":1,"end_line":259,"end_character":49},"in_reply_to":"9d1fba16_6e1e90f5","updated":"2026-01-08 09:53:17.000000000","message":"Done","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"3fda7655a08b71a1e84c5bea8843a8f909e4655a","unresolved":true,"context_lines":[{"line_number":244,"context_line":"                            {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":245,"context_line":"                current_bmc_version \u003d None"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"            # Extract expected version from URL if not explicitly provided"},{"line_number":248,"context_line":"            expected_version \u003d fw_upd.get(\u0027expected_version\u0027)"},{"line_number":249,"context_line":"            if not expected_version:"},{"line_number":250,"context_line":"                # Try to extract from firmware URL"},{"line_number":251,"context_line":"                firmware_url \u003d fw_upd.get(\u0027url\u0027)"},{"line_number":252,"context_line":"                expected_version \u003d self._extract_version_from_url(firmware_url)"},{"line_number":253,"context_line":"                if not expected_version:"},{"line_number":254,"context_line":"                    # Fall back to \u0027pending\u0027 if can\u0027t extract"},{"line_number":255,"context_line":"                    expected_version \u003d \u0027pending\u0027"},{"line_number":256,"context_line":"                    LOG.info(\u0027Could not extract version from URL for BMC \u0027"},{"line_number":257,"context_line":"                             \u0027firmware update on node %(node)s. Will use \u0027"},{"line_number":258,"context_line":"                             \u0027timeout-based completion.\u0027,"},{"line_number":259,"context_line":"                             {\u0027node\u0027: node.uuid})"},{"line_number":260,"context_line":"            node.set_driver_internal_info("},{"line_number":261,"context_line":"                \u0027bmc_fw_expected_version\u0027, expected_version)"},{"line_number":262,"context_line":"            node.set_driver_internal_info("}],"source_content_type":"text/x-python","patch_set":11,"id":"9d1fba16_6e1e90f5","line":259,"range":{"start_line":247,"start_character":1,"end_line":259,"end_character":49},"in_reply_to":"cf18faae_1e3c88c4","updated":"2025-11-17 10:50:54.000000000","message":"+1","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"e87e7267494e67cf4a9df25d282aad381f47c5cb","unresolved":true,"context_lines":[{"line_number":290,"context_line":"                skip_current_step\u003dTrue,"},{"line_number":291,"context_line":"                polling\u003dTrue"},{"line_number":292,"context_line":"            )"},{"line_number":293,"context_line":"        elif component_type \u003d\u003d \u0027nic\u0027:"},{"line_number":294,"context_line":"            # NIC: Firmware behavior varies by hardware"},{"line_number":295,"context_line":"            # Some NICs update immediately, some need reboot to start"},{"line_number":296,"context_line":"            # The handler will wait 30s and decide whether to reboot"}],"source_content_type":"text/x-python","patch_set":11,"id":"de7eae10_d24ca48e","line":293,"range":{"start_line":293,"start_character":8,"end_line":293,"end_character":37},"updated":"2025-11-17 02:52:57.000000000","message":"This won\u0027t work, you need to check startswith \"nic:\"","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"cdbdf13f8e1c2238791011be7ac0784f820bfe9b","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                skip_current_step\u003dTrue,"},{"line_number":291,"context_line":"                polling\u003dTrue"},{"line_number":292,"context_line":"            )"},{"line_number":293,"context_line":"        elif component_type \u003d\u003d \u0027nic\u0027:"},{"line_number":294,"context_line":"            # NIC: Firmware behavior varies by hardware"},{"line_number":295,"context_line":"            # Some NICs update immediately, some need reboot to start"},{"line_number":296,"context_line":"            # The handler will wait 30s and decide whether to reboot"}],"source_content_type":"text/x-python","patch_set":11,"id":"595aa5b2_e8d68a7e","line":293,"range":{"start_line":293,"start_character":8,"end_line":293,"end_character":37},"in_reply_to":"de7eae10_d24ca48e","updated":"2026-01-08 09:53:17.000000000","message":"Done","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"e87e7267494e67cf4a9df25d282aad381f47c5cb","unresolved":true,"context_lines":[{"line_number":407,"context_line":"        :param component: The component name from settings"},{"line_number":408,"context_line":"        :returns: One of \u0027bios\u0027, \u0027bmc\u0027, \u0027nic\u0027, or None"},{"line_number":409,"context_line":"        \"\"\""},{"line_number":410,"context_line":"        if component \u003d\u003d redfish_utils.BIOS:"},{"line_number":411,"context_line":"            return \u0027bios\u0027"},{"line_number":412,"context_line":"        elif component \u003d\u003d redfish_utils.BMC:"},{"line_number":413,"context_line":"            return \u0027bmc\u0027"},{"line_number":414,"context_line":"        elif component.startswith(redfish_utils.NIC_COMPONENT_PREFIX):"},{"line_number":415,"context_line":"            return \u0027nic\u0027"},{"line_number":416,"context_line":"        return None"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def _get_current_bmc_version(self, node):"},{"line_number":419,"context_line":"        \"\"\"Get current BMC firmware version."},{"line_number":420,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"b8fc290e_d89c7a6d","line":417,"range":{"start_line":410,"start_character":0,"end_line":417,"end_character":1},"updated":"2025-11-17 02:52:57.000000000","message":"oh ok, you are using a function to check the component, but not sure if would be worth or not, let\u0027s see what others think","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"cdbdf13f8e1c2238791011be7ac0784f820bfe9b","unresolved":false,"context_lines":[{"line_number":407,"context_line":"        :param component: The component name from settings"},{"line_number":408,"context_line":"        :returns: One of \u0027bios\u0027, \u0027bmc\u0027, \u0027nic\u0027, or None"},{"line_number":409,"context_line":"        \"\"\""},{"line_number":410,"context_line":"        if component \u003d\u003d redfish_utils.BIOS:"},{"line_number":411,"context_line":"            return \u0027bios\u0027"},{"line_number":412,"context_line":"        elif component \u003d\u003d redfish_utils.BMC:"},{"line_number":413,"context_line":"            return \u0027bmc\u0027"},{"line_number":414,"context_line":"        elif component.startswith(redfish_utils.NIC_COMPONENT_PREFIX):"},{"line_number":415,"context_line":"            return \u0027nic\u0027"},{"line_number":416,"context_line":"        return None"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def _get_current_bmc_version(self, node):"},{"line_number":419,"context_line":"        \"\"\"Get current BMC firmware version."},{"line_number":420,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"66c790ae_3bb8ba8b","line":417,"range":{"start_line":410,"start_character":0,"end_line":417,"end_character":1},"in_reply_to":"b8fc290e_d89c7a6d","updated":"2026-01-08 09:53:17.000000000","message":"Done","commit_id":"896745ac58148e3af132405ef12795b1f20d03c8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":299,"context_line":"        deploy_utils.set_async_step_flags("},{"line_number":300,"context_line":"            node,"},{"line_number":301,"context_line":"            reboot\u003dTrue,"},{"line_number":302,"context_line":"            skip_current_step\u003dTrue,"},{"line_number":303,"context_line":"            polling\u003dTrue"},{"line_number":304,"context_line":"        )"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"97c0cc1f_5ee89aa8","line":302,"updated":"2026-01-07 18:15:51.000000000","message":"Btw I\u0027m not sure that setting skip_current_state makes any sense with polling...","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"d36b9bf8b4a427182fa74ea952a86a9e524b3ec9","unresolved":false,"context_lines":[{"line_number":299,"context_line":"        deploy_utils.set_async_step_flags("},{"line_number":300,"context_line":"            node,"},{"line_number":301,"context_line":"            reboot\u003dTrue,"},{"line_number":302,"context_line":"            skip_current_step\u003dTrue,"},{"line_number":303,"context_line":"            polling\u003dTrue"},{"line_number":304,"context_line":"        )"},{"line_number":305,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"d7bf9846_64d04a1a","line":302,"in_reply_to":"97c0cc1f_5ee89aa8","updated":"2026-01-08 10:42:37.000000000","message":"Good point. Fixed","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":332,"context_line":"        :param node: the Ironic node object"},{"line_number":333,"context_line":"        :param fw_upd: firmware update settings dict"},{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        component \u003d fw_upd.get(\u0027component\u0027, \u0027\u0027)"},{"line_number":336,"context_line":"        LOG.warning("},{"line_number":337,"context_line":"            \u0027Unknown component type %(component)s for node %(node)s. \u0027"},{"line_number":338,"context_line":"            \u0027Using default firmware update behavior.\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"f5f0c9e8_bebc9f17","line":335,"updated":"2026-01-07 18:15:51.000000000","message":"Is it even possible to end up without a component?","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":332,"context_line":"        :param node: the Ironic node object"},{"line_number":333,"context_line":"        :param fw_upd: firmware update settings dict"},{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        component \u003d fw_upd.get(\u0027component\u0027, \u0027\u0027)"},{"line_number":336,"context_line":"        LOG.warning("},{"line_number":337,"context_line":"            \u0027Unknown component type %(component)s for node %(node)s. \u0027"},{"line_number":338,"context_line":"            \u0027Using default firmware update behavior.\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"bb31b909_ab5eefc7","line":335,"in_reply_to":"00c7b102_0cf6b2ae","updated":"2026-01-13 16:55:07.000000000","message":"This structure does not come from the BMC, does it? I think our API requires a component?","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"d36b9bf8b4a427182fa74ea952a86a9e524b3ec9","unresolved":true,"context_lines":[{"line_number":332,"context_line":"        :param node: the Ironic node object"},{"line_number":333,"context_line":"        :param fw_upd: firmware update settings dict"},{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        component \u003d fw_upd.get(\u0027component\u0027, \u0027\u0027)"},{"line_number":336,"context_line":"        LOG.warning("},{"line_number":337,"context_line":"            \u0027Unknown component type %(component)s for node %(node)s. \u0027"},{"line_number":338,"context_line":"            \u0027Using default firmware update behavior.\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"00c7b102_0cf6b2ae","line":335,"in_reply_to":"f5f0c9e8_bebc9f17","updated":"2026-01-08 10:42:37.000000000","message":"To my understanding, this should never happen but knowing BMC craziness I am tempted to leave this in to protect the codepath from it. What\u0027s your thoughts?","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":353,"context_line":"            polling\u003dTrue"},{"line_number":354,"context_line":"        )"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def _get_component_type(self, component):"},{"line_number":357,"context_line":"        \"\"\"Determine the type of firmware component."},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        Note: This helper exists primarily to handle NIC components which use"}],"source_content_type":"text/x-python","patch_set":19,"id":"05cdfbe7_824822a5","line":356,"updated":"2026-01-07 18:15:51.000000000","message":"nit: move to redfish_utils and add a constant for NIC","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6a23f1e5a76269349f879960bad26d8ed52f239e","unresolved":false,"context_lines":[{"line_number":353,"context_line":"            polling\u003dTrue"},{"line_number":354,"context_line":"        )"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"    def _get_component_type(self, component):"},{"line_number":357,"context_line":"        \"\"\"Determine the type of firmware component."},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        Note: This helper exists primarily to handle NIC components which use"}],"source_content_type":"text/x-python","patch_set":19,"id":"2d078933_17b75b94","line":356,"in_reply_to":"05cdfbe7_824822a5","updated":"2026-01-08 09:32:07.000000000","message":"Done","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":742,"context_line":"            node.save()"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"            # Only reboot if the component code requested it."},{"line_number":745,"context_line":"            if task.node.clean_step:"},{"line_number":746,"context_line":"                reboot_field \u003d \u0027cleaning_reboot\u0027"},{"line_number":747,"context_line":"            elif task.node.deploy_step:"},{"line_number":748,"context_line":"                reboot_field \u003d \u0027deploying_reboot\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"603ab0ce_eba7b4bd","line":745,"updated":"2026-01-07 18:15:51.000000000","message":"Please use constants from async_steps (and ideally move this logic as a helper there)","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6a23f1e5a76269349f879960bad26d8ed52f239e","unresolved":false,"context_lines":[{"line_number":742,"context_line":"            node.save()"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"            # Only reboot if the component code requested it."},{"line_number":745,"context_line":"            if task.node.clean_step:"},{"line_number":746,"context_line":"                reboot_field \u003d \u0027cleaning_reboot\u0027"},{"line_number":747,"context_line":"            elif task.node.deploy_step:"},{"line_number":748,"context_line":"                reboot_field \u003d \u0027deploying_reboot\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"92b1eaaa_bc5bd83a","line":745,"in_reply_to":"603ab0ce_eba7b4bd","updated":"2026-01-08 09:32:07.000000000","message":"Done","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":847,"context_line":"                self._handle_bmc_update_completion("},{"line_number":848,"context_line":"                    task, update_service, settings, current_update)"},{"line_number":849,"context_line":"            elif component_type \u003d\u003d \u0027nic\u0027:"},{"line_number":850,"context_line":"                # NIC: Task completed"},{"line_number":851,"context_line":"                # Check if reboot is needed (task went to Running)"},{"line_number":852,"context_line":"                needs_reboot \u003d current_update.get("},{"line_number":853,"context_line":"                    \u0027nic_needs_post_completion_reboot\u0027, False)"}],"source_content_type":"text/x-python","patch_set":19,"id":"e8d5c475_e6456ab5","line":850,"updated":"2026-01-07 18:15:51.000000000","message":"nit: introduce _handle_nic_update_completion for consistency","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6a23f1e5a76269349f879960bad26d8ed52f239e","unresolved":false,"context_lines":[{"line_number":847,"context_line":"                self._handle_bmc_update_completion("},{"line_number":848,"context_line":"                    task, update_service, settings, current_update)"},{"line_number":849,"context_line":"            elif component_type \u003d\u003d \u0027nic\u0027:"},{"line_number":850,"context_line":"                # NIC: Task completed"},{"line_number":851,"context_line":"                # Check if reboot is needed (task went to Running)"},{"line_number":852,"context_line":"                needs_reboot \u003d current_update.get("},{"line_number":853,"context_line":"                    \u0027nic_needs_post_completion_reboot\u0027, False)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5ad676c7_325639e5","line":850,"in_reply_to":"e8d5c475_e6456ab5","updated":"2026-01-08 09:32:07.000000000","message":"Done","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":968,"context_line":"                    node.set_driver_internal_info("},{"line_number":969,"context_line":"                        \u0027redfish_fw_updates\u0027, settings)"},{"line_number":970,"context_line":"                    node.save()"},{"line_number":971,"context_line":"                    LOG.info(\u0027NIC firmware update task for node %(node)s \u0027"},{"line_number":972,"context_line":"                             \u0027is in STARTING state. Waiting 30 seconds to \u0027"},{"line_number":973,"context_line":"                             \u0027determine if reboot is needed to start update.\u0027,"},{"line_number":974,"context_line":"                             {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":19,"id":"12aceb65_c0a2fc4b","line":971,"updated":"2026-01-07 18:15:51.000000000","message":"s/info/debug/ (just a progress update)","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6a23f1e5a76269349f879960bad26d8ed52f239e","unresolved":false,"context_lines":[{"line_number":968,"context_line":"                    node.set_driver_internal_info("},{"line_number":969,"context_line":"                        \u0027redfish_fw_updates\u0027, settings)"},{"line_number":970,"context_line":"                    node.save()"},{"line_number":971,"context_line":"                    LOG.info(\u0027NIC firmware update task for node %(node)s \u0027"},{"line_number":972,"context_line":"                             \u0027is in STARTING state. Waiting 30 seconds to \u0027"},{"line_number":973,"context_line":"                             \u0027determine if reboot is needed to start update.\u0027,"},{"line_number":974,"context_line":"                             {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":19,"id":"10d64994_5fd48ced","line":971,"in_reply_to":"12aceb65_c0a2fc4b","updated":"2026-01-08 09:32:07.000000000","message":"Done","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":978,"context_line":"                start_time \u003d timeutils.parse_isotime(starting_time)"},{"line_number":979,"context_line":"                elapsed \u003d timeutils.utcnow(True) - start_time"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"                if elapsed.seconds \u003c 30:"},{"line_number":982,"context_line":"                    # Still within 30 second window, keep waiting"},{"line_number":983,"context_line":"                    LOG.debug(\u0027NIC update for node %(node)s still in \u0027"},{"line_number":984,"context_line":"                              \u0027STARTING after %(elapsed)s seconds. \u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"4e93c175_be90275c","line":981,"updated":"2026-01-07 18:15:51.000000000","message":"Is 30 something we want as a config option? I mean, we add a lot of config options for such minor things as sleep intervals, looks like this one could be useful.","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6a23f1e5a76269349f879960bad26d8ed52f239e","unresolved":false,"context_lines":[{"line_number":978,"context_line":"                start_time \u003d timeutils.parse_isotime(starting_time)"},{"line_number":979,"context_line":"                elapsed \u003d timeutils.utcnow(True) - start_time"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"                if elapsed.seconds \u003c 30:"},{"line_number":982,"context_line":"                    # Still within 30 second window, keep waiting"},{"line_number":983,"context_line":"                    LOG.debug(\u0027NIC update for node %(node)s still in \u0027"},{"line_number":984,"context_line":"                              \u0027STARTING after %(elapsed)s seconds. \u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"f174f0b8_df646ba6","line":981,"in_reply_to":"4e93c175_be90275c","updated":"2026-01-08 09:32:07.000000000","message":"Done","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"                node.set_driver_internal_info(\u0027redfish_fw_updates\u0027, settings)"},{"line_number":1002,"context_line":"                node.save()"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"                task.upgrade_lock()"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"                # Trigger the reboot to start update"},{"line_number":1007,"context_line":"                power_timeout \u003d current_update.get(\u0027power_timeout\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":19,"id":"58f59e5d_364bce08","line":1004,"updated":"2026-01-07 18:15:51.000000000","message":"You probably want to upgrade the lock before setting nic_reboot_triggered\u003dTrue, otherwise you\u0027re going to be an inconsistent state of the upgrade fails.\n\nAlso.. wait. Are we using shared locks here? We probably should not update driver_internal_info with a shared lock: it\u0027s racy.","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a60a59c3a3441c11d15dda12e3dd6edf7367bf1e","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"                node.set_driver_internal_info(\u0027redfish_fw_updates\u0027, settings)"},{"line_number":1002,"context_line":"                node.save()"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"                task.upgrade_lock()"},{"line_number":1005,"context_line":""},{"line_number":1006,"context_line":"                # Trigger the reboot to start update"},{"line_number":1007,"context_line":"                power_timeout \u003d current_update.get(\u0027power_timeout\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3036f8e9_8bf3e041","line":1004,"in_reply_to":"58f59e5d_364bce08","updated":"2026-01-08 11:33:10.000000000","message":"Done","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":1065,"context_line":"                    \u0027redfish_fw_updates\u0027, settings)"},{"line_number":1066,"context_line":"                node.save()"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"                task.upgrade_lock()"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"                # Trigger the reboot"},{"line_number":1071,"context_line":"                power_timeout \u003d current_update.get(\u0027power_timeout\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":19,"id":"750470e2_49227a70","line":1068,"updated":"2026-01-07 18:15:51.000000000","message":"Same comment on upgrading lock + not modifying DII with a shared lock.","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a60a59c3a3441c11d15dda12e3dd6edf7367bf1e","unresolved":false,"context_lines":[{"line_number":1065,"context_line":"                    \u0027redfish_fw_updates\u0027, settings)"},{"line_number":1066,"context_line":"                node.save()"},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"                task.upgrade_lock()"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"                # Trigger the reboot"},{"line_number":1071,"context_line":"                power_timeout \u003d current_update.get(\u0027power_timeout\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":19,"id":"6a57a525_c3cd85d3","line":1068,"in_reply_to":"750470e2_49227a70","updated":"2026-01-08 11:33:10.000000000","message":"Done","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"498d3bb545ed4b8048c68a87a467ea18fc7f8792","unresolved":true,"context_lines":[{"line_number":1093,"context_line":"        :param current_update: the current firmware update being processed"},{"line_number":1094,"context_line":"        \"\"\""},{"line_number":1095,"context_line":"        node \u003d task.node"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Check if this is BMC version checking"},{"line_number":1098,"context_line":"        if current_update.get(\u0027bmc_version_checking\u0027):"},{"line_number":1099,"context_line":"            current_update.pop(\u0027bmc_version_checking\u0027, None)"}],"source_content_type":"text/x-python","patch_set":19,"id":"b116622c_6c8ed86c","line":1096,"updated":"2026-01-07 18:15:51.000000000","message":"Maybe upgrade_lock more or less in the beginning of all `_handle_*` functions? It looks like they modify DII all the time, so it\u0027s not a frequent case that the upgrade is in vain, and it saves us some braincells.","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"c1dc90902eecb5ee1e270dfd0b2dcfae1c3190a9","unresolved":false,"context_lines":[{"line_number":1093,"context_line":"        :param current_update: the current firmware update being processed"},{"line_number":1094,"context_line":"        \"\"\""},{"line_number":1095,"context_line":"        node \u003d task.node"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Check if this is BMC version checking"},{"line_number":1098,"context_line":"        if current_update.get(\u0027bmc_version_checking\u0027):"},{"line_number":1099,"context_line":"            current_update.pop(\u0027bmc_version_checking\u0027, None)"}],"source_content_type":"text/x-python","patch_set":19,"id":"81c22a87_ac3c481c","line":1096,"in_reply_to":"3a798408_dacfe1ca","updated":"2026-04-17 03:36:45.000000000","message":"Done","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a60a59c3a3441c11d15dda12e3dd6edf7367bf1e","unresolved":true,"context_lines":[{"line_number":1093,"context_line":"        :param current_update: the current firmware update being processed"},{"line_number":1094,"context_line":"        \"\"\""},{"line_number":1095,"context_line":"        node \u003d task.node"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"        # Check if this is BMC version checking"},{"line_number":1098,"context_line":"        if current_update.get(\u0027bmc_version_checking\u0027):"},{"line_number":1099,"context_line":"            current_update.pop(\u0027bmc_version_checking\u0027, None)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a798408_dacfe1ca","line":1096,"in_reply_to":"b116622c_6c8ed86c","updated":"2026-01-08 11:33:10.000000000","message":"Thank you for the pointer, I added this. Please let me know if it resolves the concern or if you\u0027d like me to add more safety.","commit_id":"0004a7e785df9e20d0cd07f888323eb9a8ca5eeb"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":229,"context_line":"        firmware_utils.validate_firmware_interface_update_args(settings)"},{"line_number":230,"context_line":"        node \u003d task.node"},{"line_number":231,"context_line":"        update_service \u003d redfish_utils.get_update_service(node)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        LOG.debug(\u0027Updating Firmware on node %(node_uuid)s with settings \u0027"},{"line_number":234,"context_line":"                  \u0027%(settings)s\u0027,"},{"line_number":235,"context_line":"                  {\u0027node_uuid\u0027: node.uuid, \u0027settings\u0027: settings})"}],"source_content_type":"text/x-python","patch_set":22,"id":"d27e687a_35368002","line":232,"updated":"2026-01-13 16:55:07.000000000","message":"Maybe explicitly clean any temporary fields we use in this process here, so that nothing can potentially interfere, even as we develop the code further?","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"8fadf4d63b727280e16527d7c7aaddb46e91ab95","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        firmware_utils.validate_firmware_interface_update_args(settings)"},{"line_number":230,"context_line":"        node \u003d task.node"},{"line_number":231,"context_line":"        update_service \u003d redfish_utils.get_update_service(node)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        LOG.debug(\u0027Updating Firmware on node %(node_uuid)s with settings \u0027"},{"line_number":234,"context_line":"                  \u0027%(settings)s\u0027,"},{"line_number":235,"context_line":"                  {\u0027node_uuid\u0027: node.uuid, \u0027settings\u0027: settings})"}],"source_content_type":"text/x-python","patch_set":22,"id":"b3bf626d_7df9e8d5","line":232,"in_reply_to":"d27e687a_35368002","updated":"2026-04-17 03:28:13.000000000","message":"Done","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":236,"context_line":"        self._execute_firmware_update(node, update_service, settings)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        # Store updated settings and save"},{"line_number":239,"context_line":"        node.set_driver_internal_info(\u0027redfish_fw_updates\u0027, settings)"},{"line_number":240,"context_line":"        node.save()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        # Return wait state to keep the step active and let polling handle"}],"source_content_type":"text/x-python","patch_set":22,"id":"69bb04f3_b189dc3b","line":239,"updated":"2026-01-13 16:55:07.000000000","message":"Not trying to be annoying, but it\u0027s easy to make a typo in these temporary field names, so let\u0027s maybe add constants for all them? Will also help with clearing them as suggested above.","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"b2b1b1202e2b0534e44e9e71b45dfe9d011e47f9","unresolved":true,"context_lines":[{"line_number":236,"context_line":"        self._execute_firmware_update(node, update_service, settings)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        # Store updated settings and save"},{"line_number":239,"context_line":"        node.set_driver_internal_info(\u0027redfish_fw_updates\u0027, settings)"},{"line_number":240,"context_line":"        node.save()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        # Return wait state to keep the step active and let polling handle"}],"source_content_type":"text/x-python","patch_set":22,"id":"982954ff_b4102e68","line":239,"in_reply_to":"69bb04f3_b189dc3b","updated":"2026-01-13 19:03:53.000000000","message":"+1 to not have constants.","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"8fadf4d63b727280e16527d7c7aaddb46e91ab95","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        self._execute_firmware_update(node, update_service, settings)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        # Store updated settings and save"},{"line_number":239,"context_line":"        node.set_driver_internal_info(\u0027redfish_fw_updates\u0027, settings)"},{"line_number":240,"context_line":"        node.save()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        # Return wait state to keep the step active and let polling handle"}],"source_content_type":"text/x-python","patch_set":22,"id":"f44ca6f4_2e64a634","line":239,"in_reply_to":"982954ff_b4102e68","updated":"2026-04-17 03:28:13.000000000","message":"Done","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":283,"context_line":"        fw_upd[\u0027wait\u0027] \u003d wait_interval"},{"line_number":284,"context_line":"        # Set wait_start_time so polling can detect when task monitor"},{"line_number":285,"context_line":"        # becomes unresponsive and transition to version checking"},{"line_number":286,"context_line":"        fw_upd[\u0027wait_start_time\u0027] \u003d str(timeutils.utcnow().isoformat())"},{"line_number":287,"context_line":"        # Mark this as a BMC update so we can handle timeouts properly"},{"line_number":288,"context_line":"        fw_upd[\u0027component_type\u0027] \u003d redfish_utils.BMC"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"2bf72866_69a1a22b","line":286,"updated":"2026-01-13 16:55:07.000000000","message":"How is this different from bmc_fw_check_start_time?","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"8fadf4d63b727280e16527d7c7aaddb46e91ab95","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        fw_upd[\u0027wait\u0027] \u003d wait_interval"},{"line_number":284,"context_line":"        # Set wait_start_time so polling can detect when task monitor"},{"line_number":285,"context_line":"        # becomes unresponsive and transition to version checking"},{"line_number":286,"context_line":"        fw_upd[\u0027wait_start_time\u0027] \u003d str(timeutils.utcnow().isoformat())"},{"line_number":287,"context_line":"        # Mark this as a BMC update so we can handle timeouts properly"},{"line_number":288,"context_line":"        fw_upd[\u0027component_type\u0027] \u003d redfish_utils.BMC"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"34c94224_3cebbf6a","line":286,"in_reply_to":"2bf72866_69a1a22b","updated":"2026-04-17 03:28:13.000000000","message":"Done","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        # Check if we\u0027ve been checking for too long"},{"line_number":430,"context_line":"        check_start_time \u003d node.driver_internal_info.get("},{"line_number":431,"context_line":"            \u0027bmc_fw_check_start_time\u0027)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if check_start_time:"},{"line_number":434,"context_line":"            check_start \u003d timeutils.parse_isotime(check_start_time)"}],"source_content_type":"text/x-python","patch_set":22,"id":"8cfc5499_1aaee5a2","line":431,"updated":"2026-01-13 16:55:07.000000000","message":"nit: use wait_start_time?","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"8fadf4d63b727280e16527d7c7aaddb46e91ab95","unresolved":false,"context_lines":[{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        # Check if we\u0027ve been checking for too long"},{"line_number":430,"context_line":"        check_start_time \u003d node.driver_internal_info.get("},{"line_number":431,"context_line":"            \u0027bmc_fw_check_start_time\u0027)"},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"        if check_start_time:"},{"line_number":434,"context_line":"            check_start \u003d timeutils.parse_isotime(check_start_time)"}],"source_content_type":"text/x-python","patch_set":22,"id":"01b28c8b_0b426ee8","line":431,"in_reply_to":"8cfc5499_1aaee5a2","updated":"2026-04-17 03:28:13.000000000","message":"Done","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":540,"context_line":"        \"\"\""},{"line_number":541,"context_line":"        fw_upd \u003d settings[0]"},{"line_number":542,"context_line":"        # Store power timeout to use on reboot operations"},{"line_number":543,"context_line":"        fw_upd[\u0027power_timeout\u0027] \u003d CONF.redfish.firmware_update_reboot_delay"},{"line_number":544,"context_line":"        # NOTE(janders) try to get the collection of Systems on the BMC"},{"line_number":545,"context_line":"        # to determine if there may be more than one System"},{"line_number":546,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"70d8c475_ef004c3f","line":543,"updated":"2026-01-13 16:55:07.000000000","message":"Is there any point in storing this value rather than taking from the configuration?","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":760,"context_line":"                      \u0027conductor operations for node %(node)s\u0027,"},{"line_number":761,"context_line":"                      {\u0027node\u0027: node.uuid})"},{"line_number":762,"context_line":"            self._validate_resources_stability(node)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"            if task.node.clean_step:"},{"line_number":765,"context_line":"                manager_utils.notify_conductor_resume_clean(task)"},{"line_number":766,"context_line":"            elif task.node.service_step:"}],"source_content_type":"text/x-python","patch_set":22,"id":"a194e306_acd0a9e0","line":763,"updated":"2026-01-13 16:55:07.000000000","message":"Here is another place where I\u0027d prefer to explicitly clean all the temporary fields from driver_internal_info (maybe make it a helper function too).","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"8fadf4d63b727280e16527d7c7aaddb46e91ab95","unresolved":false,"context_lines":[{"line_number":760,"context_line":"                      \u0027conductor operations for node %(node)s\u0027,"},{"line_number":761,"context_line":"                      {\u0027node\u0027: node.uuid})"},{"line_number":762,"context_line":"            self._validate_resources_stability(node)"},{"line_number":763,"context_line":""},{"line_number":764,"context_line":"            if task.node.clean_step:"},{"line_number":765,"context_line":"                manager_utils.notify_conductor_resume_clean(task)"},{"line_number":766,"context_line":"            elif task.node.service_step:"}],"source_content_type":"text/x-python","patch_set":22,"id":"6465539d_38404245","line":763,"in_reply_to":"a194e306_acd0a9e0","updated":"2026-04-17 03:28:13.000000000","message":"Done","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":872,"context_line":"        if (sushy_task.task_state \u003d\u003d sushy.TASK_STATE_COMPLETED"},{"line_number":873,"context_line":"                and sushy_task.task_status in"},{"line_number":874,"context_line":"                [sushy.HEALTH_OK, sushy.HEALTH_WARNING]):"},{"line_number":875,"context_line":"            LOG.info(\u0027Firmware update task completed for node %(node)s, \u0027"},{"line_number":876,"context_line":"                     \u0027firmware %(firmware_image)s: %(messages)s.\u0027,"},{"line_number":877,"context_line":"                     {\u0027node\u0027: node.uuid,"},{"line_number":878,"context_line":"                      \u0027firmware_image\u0027: current_update[\u0027url\u0027],"}],"source_content_type":"text/x-python","patch_set":22,"id":"0a5761f8_bb0ed6fd","line":875,"updated":"2026-01-13 16:55:07.000000000","message":"s/info/debug/ maybe? Generally, the new logic has a lot of INFO level logging, we need to make sure only major start transitions are recorded here.\n\nIn fact, this one may be confusing. The operator may read it as \"Ironic is done\", while we still have a lot to do. Maybe something along the lines of \"Redfish task reported completed state ...\"","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0820cc34458ad63979caa6cda2c70869440a22a4","unresolved":true,"context_lines":[{"line_number":1289,"context_line":"                        messages.append(msg)"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"            task.upgrade_lock()"},{"line_number":1292,"context_line":"            self._handle_task_completion(task, sushy_task, messages,"},{"line_number":1293,"context_line":"                                         update_service, settings,"},{"line_number":1294,"context_line":"                                         current_update)"},{"line_number":1295,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":22,"id":"8b307240_d94137d5","line":1292,"updated":"2026-01-13 16:55:07.000000000","message":"nit: this patch would be easier to review if all task-related logic was in one function, not spread between here and handle_task_completion","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"8fadf4d63b727280e16527d7c7aaddb46e91ab95","unresolved":false,"context_lines":[{"line_number":1289,"context_line":"                        messages.append(msg)"},{"line_number":1290,"context_line":""},{"line_number":1291,"context_line":"            task.upgrade_lock()"},{"line_number":1292,"context_line":"            self._handle_task_completion(task, sushy_task, messages,"},{"line_number":1293,"context_line":"                                         update_service, settings,"},{"line_number":1294,"context_line":"                                         current_update)"},{"line_number":1295,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa601d54_c07bd3d0","line":1292,"in_reply_to":"8b307240_d94137d5","updated":"2026-04-17 03:28:13.000000000","message":"Done","commit_id":"d90824a394fd07e1624602b748b1b3c42963cf9c"}],"ironic/tests/unit/drivers/modules/redfish/test_firmware.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":"aba46c46cc659dcbfc6b2b9e829c1a6ed7ea1950","unresolved":true,"context_lines":[{"line_number":1092,"context_line":"    @mock.patch.object(redfish_utils, \u0027get_system\u0027, autospec\u003dTrue)"},{"line_number":1093,"context_line":"    @mock.patch.object(redfish_utils, \u0027get_system_collection\u0027, autospec\u003dTrue)"},{"line_number":1094,"context_line":"    @mock.patch.object(time, \u0027sleep\u0027, autospec\u003dTrue)"},{"line_number":1095,"context_line":"    def test__execute_firmware_update_unresponsive_bmc(self, sleep_mock,"},{"line_number":1096,"context_line":"                                                       get_sys_collec_mock,"},{"line_number":1097,"context_line":"                                                       system_mock):"},{"line_number":1098,"context_line":"        cfg.CONF.set_override(\u0027firmware_update_wait_unresponsive_bmc\u0027, 1,"}],"source_content_type":"text/x-python","patch_set":14,"id":"f3979c31_fb6a03d6","side":"PARENT","line":1095,"updated":"2025-12-09 19:38:30.000000000","message":"If we\u0027re retiring this behavior/config variable, it needs to be mentioned in the release note. We shouldn\u0027t just remove the test for the old way unless it\u0027s being removed.","commit_id":"792bc9bed0ce13694ebac9748bdb98178835d783"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"058bf3fdb42ea274f4bd0bd9f476589724ec6142","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"    @mock.patch.object(redfish_utils, \u0027get_system\u0027, autospec\u003dTrue)"},{"line_number":1093,"context_line":"    @mock.patch.object(redfish_utils, \u0027get_system_collection\u0027, autospec\u003dTrue)"},{"line_number":1094,"context_line":"    @mock.patch.object(time, \u0027sleep\u0027, autospec\u003dTrue)"},{"line_number":1095,"context_line":"    def test__execute_firmware_update_unresponsive_bmc(self, sleep_mock,"},{"line_number":1096,"context_line":"                                                       get_sys_collec_mock,"},{"line_number":1097,"context_line":"                                                       system_mock):"},{"line_number":1098,"context_line":"        cfg.CONF.set_override(\u0027firmware_update_wait_unresponsive_bmc\u0027, 1,"}],"source_content_type":"text/x-python","patch_set":14,"id":"a6533ae5_d8cc4408","side":"PARENT","line":1095,"in_reply_to":"f3979c31_fb6a03d6","updated":"2025-12-11 15:58:31.000000000","message":"Agree, I think claude removed by mistake, going to test things again","commit_id":"792bc9bed0ce13694ebac9748bdb98178835d783"}],"releasenotes/notes/conditional-reboot-fwup-6ca14573a2bebba0.yaml":[{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"5c3979c69ee9c0a3f68514088a1b6cca4e63d6ba","unresolved":true,"context_lines":[{"line_number":7,"context_line":"    ``[redfish]firmware_update_reboot_delay``: reboot delay for firmware"},{"line_number":8,"context_line":"    updates of components."},{"line_number":9,"context_line":"    ``[redfish]firmware_update_bmc_version_check_interval``: delay in seconds"},{"line_number":10,"context_line":"      after the firmware update fails before the node is rebooted."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"8d72fd6d_f83838ff","line":10,"updated":"2025-12-15 12:48:11.000000000","message":"I think this indentation is wrong\n\n`2025-12-15 04:19:07.895447 | ubuntu-jammy | \u003creno.sphinxext current branch\u003e:76: ERROR: Unexpected indentation. [docutils]`","commit_id":"61df915e762b766e432b090a4d890613166e9a33"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"1dc7008118987b629e7197e034bf4109d5fa4e85","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    ``[redfish]firmware_update_reboot_delay``: reboot delay for firmware"},{"line_number":8,"context_line":"    updates of components."},{"line_number":9,"context_line":"    ``[redfish]firmware_update_bmc_version_check_interval``: delay in seconds"},{"line_number":10,"context_line":"      after the firmware update fails before the node is rebooted."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"e3949599_6ca6b889","line":10,"in_reply_to":"8d72fd6d_f83838ff","updated":"2025-12-18 13:12:25.000000000","message":"Done","commit_id":"61df915e762b766e432b090a4d890613166e9a33"}]}
