)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"edb20df46034b402735dce6dcfab5b6a697109ae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a23ec91a_4e2e7298","updated":"2026-02-25 13:54:34.000000000","message":"Thank you for the patch, Doug. This is a very welcome improvement. Some comments inline. Also: what\u0027s your thinking about handling cases where hardware doesn\u0027t support BootState? To me it feels like IPA fallback may be necessary in this case.","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"a1e876c3906a533ae04a3b089d3212ce984ffd6e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6becf9a8_45c5f720","updated":"2026-02-24 15:15:52.000000000","message":"https://paste.opendev.org/show/b4YLAhf4ay9xOS1R0hwJ/ is a run of this patch on top of stable/2025.2 without the touch_provisioning() call.","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"cb7f2601f11ce1c3934b8b8cfe34534c558127f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f29bb268_3f8a84a5","updated":"2026-02-26 12:51:57.000000000","message":"I rearranged the code so that if BootProgress is not available and BIOS attribute updates are not showing, we will eventually time out the node (instead of touching provisioning and waiting forever).\nPlease critique.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"fe078ca8dc586294a7494f3c86d34735344559c8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"43fcd84b_8faf0c07","updated":"2026-02-26 14:43:25.000000000","message":"Recheck post failure","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e4e18336_fdeaf231","updated":"2026-03-02 10:55:00.000000000","message":"Thank you for your review Dmitry. Pushing revised patch. Responses inline, two-codepaths may benefit from further discussion with Doug.","commit_id":"d64d58946c49bb4ae9210a8d2a6d415f2878a5de"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"3c695f08247742efa133a7e6b53eaef5845eced4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"97b6bccc_9198e199","updated":"2026-03-11 04:51:07.000000000","message":"I investigated the timeout concern, I agree it\u0027s all good.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9b7c0b751d1d4ea21b367838b47dcaff2c793f1e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"6316eb04_746adf08","updated":"2026-03-13 17:38:51.000000000","message":"I\u0027m pretty good with this. Forward progress being key. I suspect this is going to work for some but we\u0027ll find out an edge case here or there based upon the actual hardware vendor\u0027s BMC.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6444bb843cb1a382ee680813a6732e1c387344f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"8798d57d_96ca84d0","updated":"2026-03-16 14:31:22.000000000","message":"Most of my comments are optional, but I think the release note needs fixing to match the latest implementation","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"e4d2ff77fa3d18f4933dc9d6cb1e608d5a4ebdd5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"8032b5be_773af172","in_reply_to":"7e0532d2_a9d34541","updated":"2026-03-17 02:27:42.000000000","message":"I’ve already got the patch as one of my Claude branches. I also refactor some of the cleanup into a decorator so that we don’t miss it. So you can skip this one.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"4d5aa4ff31fb3e2a0a6d4d41ab37c2d0b6b20bd6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"47c4dfb0_50fe8c0a","in_reply_to":"8032b5be_773af172","updated":"2026-03-17 06:15:34.000000000","message":"Noted, thanks Doug.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a14b60e5a4000ce0febc62123cbb8009e2ba86b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7e0532d2_a9d34541","in_reply_to":"8798d57d_96ca84d0","updated":"2026-03-17 01:26:11.000000000","message":"Thank you for your review, Dmitry. Left DII key migration to constants for a follow-up. I understand I leave https://review.opendev.org/c/openstack/ironic/+/977569/comment/dfa1812a_8362058d/ for a follow-up too for sake of forward progress?","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d1e3b31ac411a8fd569d4fb78c69ff1029b3f8b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a15ef8f8_a0bf2bd2","updated":"2026-03-17 09:42:13.000000000","message":"Ship it!","commit_id":"22e6c65b9e3a12761831f17b588bd13b74e5bccf"}],"ironic/drivers/modules/deploy_utils.py":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"edb20df46034b402735dce6dcfab5b6a697109ae","unresolved":true,"context_lines":[{"line_number":1789,"context_line":""},{"line_number":1790,"context_line":""},{"line_number":1791,"context_line":"def is_node_disable_ramdisk(node) -\u003e bool:"},{"line_number":1792,"context_line":"    \"\"\"Is the ramdisk (IPA) requested for the node.\"\"\""},{"line_number":1793,"context_line":"    if node.provision_state in [states.CLEANING, states.CLEANWAIT]:"},{"line_number":1794,"context_line":"        return bool(node.driver_internal_info.get("},{"line_number":1795,"context_line":"            \u0027cleaning_disable_ramdisk\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4a70a_2a8b0649","line":1792,"range":{"start_line":1792,"start_character":28,"end_line":1792,"end_character":37},"updated":"2026-02-25 13:54:34.000000000","message":"the function checks if the ramdisk is disabled - should we say \"disabled\" here also?","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"6f4209f5fcdc5164640f81e7f15862c0074148de","unresolved":true,"context_lines":[{"line_number":1789,"context_line":""},{"line_number":1790,"context_line":""},{"line_number":1791,"context_line":"def is_node_disable_ramdisk(node) -\u003e bool:"},{"line_number":1792,"context_line":"    \"\"\"Is the ramdisk (IPA) requested for the node.\"\"\""},{"line_number":1793,"context_line":"    if node.provision_state in [states.CLEANING, states.CLEANWAIT]:"},{"line_number":1794,"context_line":"        return bool(node.driver_internal_info.get("},{"line_number":1795,"context_line":"            \u0027cleaning_disable_ramdisk\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7e3afe22_151962d7","line":1792,"range":{"start_line":1792,"start_character":28,"end_line":1792,"end_character":37},"in_reply_to":"1fa4a70a_2a8b0649","updated":"2026-02-26 02:58:49.000000000","message":"Yeah makes sense.","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"57522c2c48a7b3fca33ca80fd5965ec7a43d1a69","unresolved":false,"context_lines":[{"line_number":1789,"context_line":""},{"line_number":1790,"context_line":""},{"line_number":1791,"context_line":"def is_node_disable_ramdisk(node) -\u003e bool:"},{"line_number":1792,"context_line":"    \"\"\"Is the ramdisk (IPA) requested for the node.\"\"\""},{"line_number":1793,"context_line":"    if node.provision_state in [states.CLEANING, states.CLEANWAIT]:"},{"line_number":1794,"context_line":"        return bool(node.driver_internal_info.get("},{"line_number":1795,"context_line":"            \u0027cleaning_disable_ramdisk\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"882fc49b_34eeba7e","line":1792,"range":{"start_line":1792,"start_character":28,"end_line":1792,"end_character":37},"in_reply_to":"7e3afe22_151962d7","updated":"2026-02-26 06:10:50.000000000","message":"Done","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"46b810be58b0fb9850d07cf18a15abece995b9af","unresolved":true,"context_lines":[{"line_number":1788,"context_line":"    task.driver.boot.prepare_ramdisk(task, deploy_opts)"},{"line_number":1789,"context_line":""},{"line_number":1790,"context_line":""},{"line_number":1791,"context_line":"def is_node_disable_ramdisk(node) -\u003e bool:"},{"line_number":1792,"context_line":"    \"\"\"Is the ramdisk (IPA) disabled for the node.\"\"\""},{"line_number":1793,"context_line":"    if node.provision_state in [states.CLEANING, states.CLEANWAIT]:"},{"line_number":1794,"context_line":"        return bool(node.driver_internal_info.get("}],"source_content_type":"text/x-python","patch_set":6,"id":"e934da69_b2df0b33","line":1791,"updated":"2026-02-27 13:21:17.000000000","message":"nit: `is_ramdisk_disabled` or `disable_ramdisk_requested`, \"is node\" reads oddly to me here","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":false,"context_lines":[{"line_number":1788,"context_line":"    task.driver.boot.prepare_ramdisk(task, deploy_opts)"},{"line_number":1789,"context_line":""},{"line_number":1790,"context_line":""},{"line_number":1791,"context_line":"def is_node_disable_ramdisk(node) -\u003e bool:"},{"line_number":1792,"context_line":"    \"\"\"Is the ramdisk (IPA) disabled for the node.\"\"\""},{"line_number":1793,"context_line":"    if node.provision_state in [states.CLEANING, states.CLEANWAIT]:"},{"line_number":1794,"context_line":"        return bool(node.driver_internal_info.get("}],"source_content_type":"text/x-python","patch_set":6,"id":"0c899a15_4bc5d0ec","line":1791,"in_reply_to":"e934da69_b2df0b33","updated":"2026-03-02 10:55:00.000000000","message":"Good pickup, done.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6444bb843cb1a382ee680813a6732e1c387344f8","unresolved":true,"context_lines":[{"line_number":1795,"context_line":"            \u0027cleaning_disable_ramdisk\u0027))"},{"line_number":1796,"context_line":"    elif node.provision_state in [states.SERVICING, states.SERVICEWAIT]:"},{"line_number":1797,"context_line":"        return bool(node.driver_internal_info.get("},{"line_number":1798,"context_line":"            \u0027service_disable_ramdisk\u0027))"},{"line_number":1799,"context_line":"    else:"},{"line_number":1800,"context_line":"        return False"},{"line_number":1801,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"d6ed73a1_b1060a28","line":1798,"updated":"2026-03-16 14:31:22.000000000","message":"Love the helper. Still, I\u0027d prefer all these DII keys to be constants somewhere. As a follow-up, obviously.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"4d5aa4ff31fb3e2a0a6d4d41ab37c2d0b6b20bd6","unresolved":false,"context_lines":[{"line_number":1795,"context_line":"            \u0027cleaning_disable_ramdisk\u0027))"},{"line_number":1796,"context_line":"    elif node.provision_state in [states.SERVICING, states.SERVICEWAIT]:"},{"line_number":1797,"context_line":"        return bool(node.driver_internal_info.get("},{"line_number":1798,"context_line":"            \u0027service_disable_ramdisk\u0027))"},{"line_number":1799,"context_line":"    else:"},{"line_number":1800,"context_line":"        return False"},{"line_number":1801,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"02683e43_a780aa52","line":1798,"in_reply_to":"08871958_b3a1a05b","updated":"2026-03-17 06:15:34.000000000","message":"I pushed https://review.opendev.org/c/openstack/ironic/+/980841 moving DII keys to constants, let\u0027s move this part of the discussion there.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"e6a60a33633bed43ab6c681382e00ad283601ebe","unresolved":true,"context_lines":[{"line_number":1795,"context_line":"            \u0027cleaning_disable_ramdisk\u0027))"},{"line_number":1796,"context_line":"    elif node.provision_state in [states.SERVICING, states.SERVICEWAIT]:"},{"line_number":1797,"context_line":"        return bool(node.driver_internal_info.get("},{"line_number":1798,"context_line":"            \u0027service_disable_ramdisk\u0027))"},{"line_number":1799,"context_line":"    else:"},{"line_number":1800,"context_line":"        return False"},{"line_number":1801,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"08871958_b3a1a05b","line":1798,"in_reply_to":"d6ed73a1_b1060a28","updated":"2026-03-17 01:28:22.000000000","message":"Yep. Agreed.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"70322fc2c3cb87aaf40c925fd34f28de4c70ed9c","unresolved":true,"context_lines":[{"line_number":1816,"context_line":"            manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":1817,"context_line":"        prepare_agent_boot(task)"},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"    manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":1820,"context_line":"    return async_steps.get_return_state(task.node)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"b081895d_cd300a32","line":1819,"updated":"2026-03-11 02:26:21.000000000","message":"This has a higher chance of breaking firmware updates, in some cases we set a timeout","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"3c695f08247742efa133a7e6b53eaef5845eced4","unresolved":false,"context_lines":[{"line_number":1816,"context_line":"            manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":1817,"context_line":"        prepare_agent_boot(task)"},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"    manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":1820,"context_line":"    return async_steps.get_return_state(task.node)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"be5e9af6_9f3a16b1","line":1819,"in_reply_to":"a7e34884_6a44f4fa","updated":"2026-03-11 04:51:07.000000000","message":"@iurygregory@gmail.com I had another look and Doug is right. Good thinking but wrong function. The codepath where we added the timeout and actually need it is here:\n\nhttps://opendev.org/openstack/ironic/src/branch/master/ironic/drivers/modules/redfish/firmware.py#L852-L853\n\nwe landed it in https://opendev.org/openstack/ironic/commit/d90824a394fd07e1624602b748b1b3c42963cf9c firmware.py L800-801\n\nApologies for confusion @cardoe@cardoe.com - we had a regression in the code above recently so when Iury asked me about it I thought it\u0027s the same thing.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"8ffba118eb3cca1b5c07cecfe45e08ed594f2434","unresolved":true,"context_lines":[{"line_number":1816,"context_line":"            manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":1817,"context_line":"        prepare_agent_boot(task)"},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"    manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":1820,"context_line":"    return async_steps.get_return_state(task.node)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"a7e34884_6a44f4fa","line":1819,"in_reply_to":"b081895d_cd300a32","updated":"2026-03-11 03:29:43.000000000","message":"No we don’t. It’s unused everywhere. It’s not possible to pass a value in there.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"f1a2c9c91af5eb837a7ff1f0279807e55453657e","unresolved":false,"context_lines":[{"line_number":1816,"context_line":"            manager_utils.node_power_action(task, states.POWER_OFF)"},{"line_number":1817,"context_line":"        prepare_agent_boot(task)"},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"    manager_utils.node_power_action(task, states.REBOOT)"},{"line_number":1820,"context_line":"    return async_steps.get_return_state(task.node)"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5e9cdc21_bd8073e9","line":1819,"in_reply_to":"be5e9af6_9f3a16b1","updated":"2026-03-11 10:49:28.000000000","message":"Yeah, i was confusing with https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/redfish/firmware.py#L852C1-L853C63 , my bad!","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"}],"ironic/drivers/modules/redfish/bios.py":[{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"edb20df46034b402735dce6dcfab5b6a697109ae","unresolved":true,"context_lines":[{"line_number":201,"context_line":"                     requires_ramdisk\u003dFalse)"},{"line_number":202,"context_line":"    @base.deploy_step(priority\u003d0, argsinfo\u003d_APPLY_CONFIGURATION_ARGSINFO)"},{"line_number":203,"context_line":"    @base.cache_bios_settings"},{"line_number":204,"context_line":"    def apply_configuration(self, task, settings):"},{"line_number":205,"context_line":"        \"\"\"Apply the BIOS settings to the node."},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":3,"id":"04113e1b_48ac5b5d","line":204,"range":{"start_line":204,"start_character":8,"end_line":204,"end_character":27},"updated":"2026-02-25 13:54:34.000000000","message":"is it worth setting requires_ramdisk\u003dFalse for factory_reset, too?","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"6f4209f5fcdc5164640f81e7f15862c0074148de","unresolved":true,"context_lines":[{"line_number":201,"context_line":"                     requires_ramdisk\u003dFalse)"},{"line_number":202,"context_line":"    @base.deploy_step(priority\u003d0, argsinfo\u003d_APPLY_CONFIGURATION_ARGSINFO)"},{"line_number":203,"context_line":"    @base.cache_bios_settings"},{"line_number":204,"context_line":"    def apply_configuration(self, task, settings):"},{"line_number":205,"context_line":"        \"\"\"Apply the BIOS settings to the node."},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":3,"id":"1eebf5ed_a66ca31b","line":204,"range":{"start_line":204,"start_character":8,"end_line":204,"end_character":27},"in_reply_to":"04113e1b_48ac5b5d","updated":"2026-02-26 02:58:49.000000000","message":"One change at a time. The detection methods for each of them happening will unfortunately be different so I\u0027m just trying to test one thing at a time.","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"57522c2c48a7b3fca33ca80fd5965ec7a43d1a69","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                     requires_ramdisk\u003dFalse)"},{"line_number":202,"context_line":"    @base.deploy_step(priority\u003d0, argsinfo\u003d_APPLY_CONFIGURATION_ARGSINFO)"},{"line_number":203,"context_line":"    @base.cache_bios_settings"},{"line_number":204,"context_line":"    def apply_configuration(self, task, settings):"},{"line_number":205,"context_line":"        \"\"\"Apply the BIOS settings to the node."},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        :param task: a TaskManager instance containing the node to act on."}],"source_content_type":"text/x-python","patch_set":3,"id":"f9783e5c_aef21d44","line":204,"range":{"start_line":204,"start_character":8,"end_line":204,"end_character":27},"in_reply_to":"1eebf5ed_a66ca31b","updated":"2026-02-26 06:10:50.000000000","message":"Acknowledged","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"8e546e21736f6834a7b17cd4eff57e4acecee21f","unresolved":true,"context_lines":[{"line_number":414,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":415,"context_line":"            return"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        node.touch_provisioning()"},{"line_number":418,"context_line":"        if not self._is_post_bios_reboot_complete(system):"},{"line_number":419,"context_line":"            LOG.debug(\u0027Node %(node)s is still rebooting after BIOS operation. \u0027"},{"line_number":420,"context_line":"                      \u0027Waiting for boot progress to reach OS boot started.\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9818e7c2_72be6cdb","line":417,"updated":"2026-02-23 21:36:08.000000000","message":"@juliaashleykreger@gmail.com I dunno if this is correct?","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"b72cd1472cd0367988e245c75da70372eca986a9","unresolved":true,"context_lines":[{"line_number":414,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":415,"context_line":"            return"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        node.touch_provisioning()"},{"line_number":418,"context_line":"        if not self._is_post_bios_reboot_complete(system):"},{"line_number":419,"context_line":"            LOG.debug(\u0027Node %(node)s is still rebooting after BIOS operation. \u0027"},{"line_number":420,"context_line":"                      \u0027Waiting for boot progress to reach OS boot started.\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df478be3_675991f8","line":417,"in_reply_to":"9818e7c2_72be6cdb","updated":"2026-02-24 14:35:19.000000000","message":"This is just if the agent has triggered. Since its not required, we don\u0027t actually need it here.","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"51f392f98e8b778f0d61ace0d4c4d0f08cf6f285","unresolved":true,"context_lines":[{"line_number":414,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":415,"context_line":"            return"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        node.touch_provisioning()"},{"line_number":418,"context_line":"        if not self._is_post_bios_reboot_complete(system):"},{"line_number":419,"context_line":"            LOG.debug(\u0027Node %(node)s is still rebooting after BIOS operation. \u0027"},{"line_number":420,"context_line":"                      \u0027Waiting for boot progress to reach OS boot started.\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"e2692687_74d0d00f","line":417,"in_reply_to":"df478be3_675991f8","updated":"2026-02-24 15:04:31.000000000","message":"touch_provisioning may be important if you don\u0027t want the general CLEANWAIT/SERVICEWAIT timeout to apply. This is the situation with firmware updates: timeouts there may be much larger.","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"57522c2c48a7b3fca33ca80fd5965ec7a43d1a69","unresolved":false,"context_lines":[{"line_number":414,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":415,"context_line":"            return"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        node.touch_provisioning()"},{"line_number":418,"context_line":"        if not self._is_post_bios_reboot_complete(system):"},{"line_number":419,"context_line":"            LOG.debug(\u0027Node %(node)s is still rebooting after BIOS operation. \u0027"},{"line_number":420,"context_line":"                      \u0027Waiting for boot progress to reach OS boot started.\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"4b8a2e7a_a46c9f38","line":417,"in_reply_to":"e2692687_74d0d00f","updated":"2026-02-26 06:10:50.000000000","message":"Done","commit_id":"044c29bd815d446e40e9a3f5b2f3e0cd2b58bf7a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"46b810be58b0fb9850d07cf18a15abece995b9af","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        node \u003d task.node"},{"line_number":176,"context_line":"        info \u003d node.driver_internal_info"},{"line_number":177,"context_line":"        bios_state \u003d info.get(_DII_STATE) or {}"},{"line_number":178,"context_line":"        reboot_requested \u003d bios_state.get(\u0027reboot_requested\u0027, False)"},{"line_number":179,"context_line":"        if not reboot_requested:"},{"line_number":180,"context_line":"            LOG.debug(\u0027Factory reset BIOS configuration for node %(node)s\u0027,"},{"line_number":181,"context_line":"                      {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":6,"id":"ea6a6ce3_c17be35e","line":178,"updated":"2026-02-27 13:21:17.000000000","message":"nit: add a constant for \u0027reboot_requested\u0027","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        node \u003d task.node"},{"line_number":176,"context_line":"        info \u003d node.driver_internal_info"},{"line_number":177,"context_line":"        bios_state \u003d info.get(_DII_STATE) or {}"},{"line_number":178,"context_line":"        reboot_requested \u003d bios_state.get(\u0027reboot_requested\u0027, False)"},{"line_number":179,"context_line":"        if not reboot_requested:"},{"line_number":180,"context_line":"            LOG.debug(\u0027Factory reset BIOS configuration for node %(node)s\u0027,"},{"line_number":181,"context_line":"                      {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1e389b_1f86fd72","line":178,"in_reply_to":"ea6a6ce3_c17be35e","updated":"2026-03-02 10:55:00.000000000","message":"Good suggestion. Done.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"46b810be58b0fb9850d07cf18a15abece995b9af","unresolved":true,"context_lines":[{"line_number":263,"context_line":"        else:"},{"line_number":264,"context_line":"            # Step 2: Verify requested BIOS settings applied"},{"line_number":265,"context_line":"            requested_attrs \u003d ("},{"line_number":266,"context_line":"                bios_state.get(\u0027requested_bios_attrs\u0027)"},{"line_number":267,"context_line":"                or info.get(\u0027requested_bios_attrs\u0027))"},{"line_number":268,"context_line":"            LOG.debug(\u0027Verify BIOS configuration for node %(node_uuid)s: \u0027"},{"line_number":269,"context_line":"                      \u0027%(attrs)r\u0027, {\u0027node_uuid\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":6,"id":"164b9bba_9dfc4952","line":266,"updated":"2026-02-27 13:21:17.000000000","message":"nit: add a constant for \u0027requested_bios_attrs\u0027","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        else:"},{"line_number":264,"context_line":"            # Step 2: Verify requested BIOS settings applied"},{"line_number":265,"context_line":"            requested_attrs \u003d ("},{"line_number":266,"context_line":"                bios_state.get(\u0027requested_bios_attrs\u0027)"},{"line_number":267,"context_line":"                or info.get(\u0027requested_bios_attrs\u0027))"},{"line_number":268,"context_line":"            LOG.debug(\u0027Verify BIOS configuration for node %(node_uuid)s: \u0027"},{"line_number":269,"context_line":"                      \u0027%(attrs)r\u0027, {\u0027node_uuid\u0027: task.node.uuid,"}],"source_content_type":"text/x-python","patch_set":6,"id":"2288071b_61bb0cf9","line":266,"in_reply_to":"164b9bba_9dfc4952","updated":"2026-03-02 10:55:00.000000000","message":"Done","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"46b810be58b0fb9850d07cf18a15abece995b9af","unresolved":true,"context_lines":[{"line_number":269,"context_line":"                      \u0027%(attrs)r\u0027, {\u0027node_uuid\u0027: task.node.uuid,"},{"line_number":270,"context_line":"                                    \u0027attrs\u0027: requested_attrs})"},{"line_number":271,"context_line":"            self._clear_reboot_requested(task)"},{"line_number":272,"context_line":"            attrs_not_updated \u003d self._check_bios_attrs("},{"line_number":273,"context_line":"                task, requested_attrs, bios)"},{"line_number":274,"context_line":"            if attrs_not_updated:"},{"line_number":275,"context_line":"                LOG.debug(\u0027BIOS settings %(attrs)s for node %(node_uuid)s \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"cd535a44_638a6ed6","line":272,"updated":"2026-02-27 13:21:17.000000000","message":"nit: it feels odd for something that is called `check` to return a positive value on failure. I\u0027d prefer it renamed to something more explicit according to its changed behavior.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":false,"context_lines":[{"line_number":269,"context_line":"                      \u0027%(attrs)r\u0027, {\u0027node_uuid\u0027: task.node.uuid,"},{"line_number":270,"context_line":"                                    \u0027attrs\u0027: requested_attrs})"},{"line_number":271,"context_line":"            self._clear_reboot_requested(task)"},{"line_number":272,"context_line":"            attrs_not_updated \u003d self._check_bios_attrs("},{"line_number":273,"context_line":"                task, requested_attrs, bios)"},{"line_number":274,"context_line":"            if attrs_not_updated:"},{"line_number":275,"context_line":"                LOG.debug(\u0027BIOS settings %(attrs)s for node %(node_uuid)s \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"8c6f1ec3_30824170","line":272,"in_reply_to":"cd535a44_638a6ed6","updated":"2026-03-02 10:55:00.000000000","message":"Good point. Renamed the function.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"46b810be58b0fb9850d07cf18a15abece995b9af","unresolved":true,"context_lines":[{"line_number":349,"context_line":"        :param attributes: the requested BIOS attributes to update."},{"line_number":350,"context_line":"        \"\"\""},{"line_number":351,"context_line":"        node \u003d task.node"},{"line_number":352,"context_line":"        bios_state \u003d {\u0027reboot_requested\u0027: True}"},{"line_number":353,"context_line":"        if attributes:"},{"line_number":354,"context_line":"            bios_state[\u0027requested_bios_attrs\u0027] \u003d attributes"},{"line_number":355,"context_line":"        node.set_driver_internal_info(_DII_STATE, bios_state)"}],"source_content_type":"text/x-python","patch_set":6,"id":"11814ea7_ccfddff2","line":352,"updated":"2026-02-27 13:21:17.000000000","message":"I generally like the changes you\u0027re making to DII fields, but please document the upgrade impact in the release note: no settings steps should be running during the upgrade (which is a reasonable expectation IMO)","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":false,"context_lines":[{"line_number":349,"context_line":"        :param attributes: the requested BIOS attributes to update."},{"line_number":350,"context_line":"        \"\"\""},{"line_number":351,"context_line":"        node \u003d task.node"},{"line_number":352,"context_line":"        bios_state \u003d {\u0027reboot_requested\u0027: True}"},{"line_number":353,"context_line":"        if attributes:"},{"line_number":354,"context_line":"            bios_state[\u0027requested_bios_attrs\u0027] \u003d attributes"},{"line_number":355,"context_line":"        node.set_driver_internal_info(_DII_STATE, bios_state)"}],"source_content_type":"text/x-python","patch_set":6,"id":"b4d55977_863ad709","line":352,"in_reply_to":"11814ea7_ccfddff2","updated":"2026-03-02 10:55:00.000000000","message":"Good point. Expanded the release note to specifically cover this.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"46b810be58b0fb9850d07cf18a15abece995b9af","unresolved":true,"context_lines":[{"line_number":402,"context_line":"    @METRICS.timer(\u0027RedfishBIOS._check_node_redfish_bios_apply\u0027)"},{"line_number":403,"context_line":"    def _check_node_redfish_bios_apply(self, task):"},{"line_number":404,"context_line":"        node \u003d task.node"},{"line_number":405,"context_line":"        if not deploy_utils.is_node_disable_ramdisk(node):"},{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"cb5f8a8d_93939196","line":405,"updated":"2026-02-27 13:21:17.000000000","message":"I don\u0027t quite like making this distinction. This creates two very different code paths depending on what the user requests (and the new one will be undertested because it\u0027s opt-in). What is preventing us from relying only on the new detection process and completely removing IPA from the picture? Or, if disable_ramdisk is not provided, falling back to IPA if we cannot get any conclusive result from polling in N minutes?","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"d801291eacf891be33373061da3e80d6b3ffec26","unresolved":true,"context_lines":[{"line_number":402,"context_line":"    @METRICS.timer(\u0027RedfishBIOS._check_node_redfish_bios_apply\u0027)"},{"line_number":403,"context_line":"    def _check_node_redfish_bios_apply(self, task):"},{"line_number":404,"context_line":"        node \u003d task.node"},{"line_number":405,"context_line":"        if not deploy_utils.is_node_disable_ramdisk(node):"},{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"f329e5a9_b6cf715c","line":405,"in_reply_to":"05aab2f2_7b1abe6a","updated":"2026-03-03 16:47:23.000000000","message":"I agree with the reasoning on why IPA may be needed or not, but I did not like the either/or approach to it. I\u0027d rather the normal flow to default to no IPA. If it fails (no BootProgress, stuck for too long), depending on whether disable_ramdisk was requested, try to boot IPA or simply fail.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"98f410d67de5868a888a2da6b4c9056737ec76ba","unresolved":true,"context_lines":[{"line_number":402,"context_line":"    @METRICS.timer(\u0027RedfishBIOS._check_node_redfish_bios_apply\u0027)"},{"line_number":403,"context_line":"    def _check_node_redfish_bios_apply(self, task):"},{"line_number":404,"context_line":"        node \u003d task.node"},{"line_number":405,"context_line":"        if not deploy_utils.is_node_disable_ramdisk(node):"},{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"ef471906_e6c0dc9c","line":405,"in_reply_to":"92374030_9f368bbd","updated":"2026-03-02 23:06:32.000000000","message":"The issue with falling back to IPA is that in the flow of Ironic I must setup IPA and dnsmasq to boot that. Which means that there\u0027s a check for an interface that\u0027s PXE_enabled\u003dTrue if I\u0027m using a PXE style interface. But if I\u0027ve got a fresh box that I\u0027ve not set any BIOS settings on then I might not have any ports that are pxe_enabled\u003dTrue which results in the failure case as documented https://docs.openstack.org/ironic/latest/admin/drivers/idrac.html#pxe-reset-with-factory-reset-bios-clean-step The goal of this is to get us out of this place.\n\nI\u0027d prefer to make the Redfish flow not use IPA for this at all however there are concerns that there\u0027s hardware that won\u0027t behave correctly so I\u0027ve left this as an escape hatch.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":true,"context_lines":[{"line_number":402,"context_line":"    @METRICS.timer(\u0027RedfishBIOS._check_node_redfish_bios_apply\u0027)"},{"line_number":403,"context_line":"    def _check_node_redfish_bios_apply(self, task):"},{"line_number":404,"context_line":"        node \u003d task.node"},{"line_number":405,"context_line":"        if not deploy_utils.is_node_disable_ramdisk(node):"},{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"92374030_9f368bbd","line":405,"in_reply_to":"cb5f8a8d_93939196","updated":"2026-03-02 10:55:00.000000000","message":"Good insights Dmitry.\n\nPersonally I\u0027d like this to be as hands-off as possible (I like the idea of relying on the detection process and automagically falling back to IPA if ever needed) but at the same time I\u0027m concerned about scope creep which makes me think of handling this in a follow up.\n\nHowever I will pause here and let Doug comment: @cardoe@cardoe.com what\u0027s your thoughts here?","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"8091e2472ebfad89900b5ebec2a3247d3f589589","unresolved":true,"context_lines":[{"line_number":402,"context_line":"    @METRICS.timer(\u0027RedfishBIOS._check_node_redfish_bios_apply\u0027)"},{"line_number":403,"context_line":"    def _check_node_redfish_bios_apply(self, task):"},{"line_number":404,"context_line":"        node \u003d task.node"},{"line_number":405,"context_line":"        if not deploy_utils.is_node_disable_ramdisk(node):"},{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"05aab2f2_7b1abe6a","line":405,"in_reply_to":"ef471906_e6c0dc9c","updated":"2026-03-03 14:05:26.000000000","message":"Thank you for your response, Doug.\n\nThinking throught this in fine detail, while looking after older hardware with no BootProgress support looked like a good idea at a time it may be too much of a burden. While I was the one asking about it https://review.opendev.org/c/openstack/ironic/+/977569/comments/a23ec91a_4e2e7298 I am happy to take a step back from this request if it makes things easier.\n\nLet\u0027s see what Dmitry thinks, if you\u0027re both happy to consider that option we can consider an approach where we only truly support BIOS settings on BootProgress-capable hardware and rest is best-effort only.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6b420746ba401becbe184128b47442b67b1fc2d4","unresolved":false,"context_lines":[{"line_number":402,"context_line":"    @METRICS.timer(\u0027RedfishBIOS._check_node_redfish_bios_apply\u0027)"},{"line_number":403,"context_line":"    def _check_node_redfish_bios_apply(self, task):"},{"line_number":404,"context_line":"        node \u003d task.node"},{"line_number":405,"context_line":"        if not deploy_utils.is_node_disable_ramdisk(node):"},{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"b04dc104_b09dd60e","line":405,"in_reply_to":"f329e5a9_b6cf715c","updated":"2026-03-04 05:41:08.000000000","message":"Agreed. Continuing discussion in the thread below.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"46b810be58b0fb9850d07cf18a15abece995b9af","unresolved":true,"context_lines":[{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"},{"line_number":409,"context_line":"        if not bios_state:"},{"line_number":410,"context_line":"            return"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf4a387a_b42cd5f3","line":409,"updated":"2026-02-27 13:21:17.000000000","message":"What case is this handling? The predicate above makes sure that _DII_STATE is present before locking, so are you trying to handle a race? With what, timeout? It looks like a debug message can be useful here.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            return"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"},{"line_number":409,"context_line":"        if not bios_state:"},{"line_number":410,"context_line":"            return"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ebcd4ba_41d62bc3","line":409,"in_reply_to":"bf4a387a_b42cd5f3","updated":"2026-03-02 10:55:00.000000000","message":"Good point, added DEBUG logging.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6bc863436a297371f4b21d7d61ae648fe6b7c758","unresolved":true,"context_lines":[{"line_number":408,"context_line":"        # When the ramdisk (IPA) is active, the heartbeat mechanism already"},{"line_number":409,"context_line":"        # handles step resumption.  Only poll via Redfish when IPA is not in"},{"line_number":410,"context_line":"        # the picture to avoid competing with the heartbeat path."},{"line_number":411,"context_line":"        if not deploy_utils.is_ramdisk_disabled(node):"},{"line_number":412,"context_line":"            return"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"28583bf6_43d294d7","line":411,"updated":"2026-03-03 16:52:56.000000000","message":"I wonder if we could just drop this line and let both take its course. Reasoning: IPA can take really long to start (up to 10 minutes for our CoreOS-based ramdisk, not counting actual hardware boot). So in most cases this periodic task will kick in first, finishing the step. But if this task cannot handle the completion, the heartbeat logic will still kick in.\n\nOf course, with disable_ramdisk, only the first part will work. Thoughts?","commit_id":"d64d58946c49bb4ae9210a8d2a6d415f2878a5de"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"6b420746ba401becbe184128b47442b67b1fc2d4","unresolved":true,"context_lines":[{"line_number":408,"context_line":"        # When the ramdisk (IPA) is active, the heartbeat mechanism already"},{"line_number":409,"context_line":"        # handles step resumption.  Only poll via Redfish when IPA is not in"},{"line_number":410,"context_line":"        # the picture to avoid competing with the heartbeat path."},{"line_number":411,"context_line":"        if not deploy_utils.is_ramdisk_disabled(node):"},{"line_number":412,"context_line":"            return"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        bios_state \u003d node.driver_internal_info.get(_DII_STATE) or {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"28c01c19_b6893de0","line":411,"in_reply_to":"28583bf6_43d294d7","updated":"2026-03-04 05:41:08.000000000","message":"I think this is reasonable. Proposing a revision with this check removed.\n\nI also proposed https://review.opendev.org/c/openstack/ironic/+/978844 which adds logic auto-setting disable_ramdisk if no clean_step requires IPA.\n\nPlease let me know what you think about both removal of this conditional and the follow up patch. It would be also great to hear what @cardoe@cardoe.com thinks.\n\nI\u0027m tempted to lab-test both this and 978844 together next.","commit_id":"d64d58946c49bb4ae9210a8d2a6d415f2878a5de"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6444bb843cb1a382ee680813a6732e1c387344f8","unresolved":true,"context_lines":[{"line_number":360,"context_line":"        disable_ramdisk \u003d deploy_utils.is_ramdisk_disabled(node)"},{"line_number":361,"context_line":"        deploy_utils.set_async_step_flags(task.node, reboot\u003dTrue,"},{"line_number":362,"context_line":"                                          skip_current_step\u003dFalse,"},{"line_number":363,"context_line":"                                          polling\u003ddisable_ramdisk)"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"    def _clear_reboot_requested(self, task):"},{"line_number":366,"context_line":"        \"\"\"Clear driver_internal_info flags after reboot completed."}],"source_content_type":"text/x-python","patch_set":8,"id":"45d20e01_e3a2f6a0","line":363,"updated":"2026-03-16 14:31:22.000000000","message":"nit: we need an inline comment explaining why it works the way it does","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a14b60e5a4000ce0febc62123cbb8009e2ba86b9","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        disable_ramdisk \u003d deploy_utils.is_ramdisk_disabled(node)"},{"line_number":361,"context_line":"        deploy_utils.set_async_step_flags(task.node, reboot\u003dTrue,"},{"line_number":362,"context_line":"                                          skip_current_step\u003dFalse,"},{"line_number":363,"context_line":"                                          polling\u003ddisable_ramdisk)"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"    def _clear_reboot_requested(self, task):"},{"line_number":366,"context_line":"        \"\"\"Clear driver_internal_info flags after reboot completed."}],"source_content_type":"text/x-python","patch_set":8,"id":"1057af75_0c84d920","line":363,"in_reply_to":"45d20e01_e3a2f6a0","updated":"2026-03-17 01:26:11.000000000","message":"Good point. Done.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6444bb843cb1a382ee680813a6732e1c387344f8","unresolved":true,"context_lines":[{"line_number":418,"context_line":"        except (exception.RedfishError,"},{"line_number":419,"context_line":"                exception.RedfishConnectionError,"},{"line_number":420,"context_line":"                sushy.exceptions.SushyError) as e:"},{"line_number":421,"context_line":"            LOG.debug(\u0027Unable to query Redfish system for node %(node)s \u0027"},{"line_number":422,"context_line":"                      \u0027while waiting for BIOS reboot completion: %(error)s\u0027,"},{"line_number":423,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":424,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f693e0b_209d151b","line":421,"updated":"2026-03-16 14:31:22.000000000","message":"Maybe upgrade to a warning? Unlike with BMC firmware updates, we don\u0027t really expect the BMC to be gone normally?","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a14b60e5a4000ce0febc62123cbb8009e2ba86b9","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        except (exception.RedfishError,"},{"line_number":419,"context_line":"                exception.RedfishConnectionError,"},{"line_number":420,"context_line":"                sushy.exceptions.SushyError) as e:"},{"line_number":421,"context_line":"            LOG.debug(\u0027Unable to query Redfish system for node %(node)s \u0027"},{"line_number":422,"context_line":"                      \u0027while waiting for BIOS reboot completion: %(error)s\u0027,"},{"line_number":423,"context_line":"                      {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":424,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":8,"id":"c0402522_51bffbb1","line":421,"in_reply_to":"1f693e0b_209d151b","updated":"2026-03-17 01:26:11.000000000","message":"Done","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"819d7447925435313cb17d33d3e4944f4b10a78d","unresolved":true,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        requested_attrs \u003d bios_state.get(_REQUESTED_BIOS_ATTRS)"},{"line_number":441,"context_line":"        if requested_attrs:"},{"line_number":442,"context_line":"            attrs_not_updated \u003d self._get_unapplied_bios_attrs("},{"line_number":443,"context_line":"                task, requested_attrs, system.bios)"},{"line_number":444,"context_line":"            if attrs_not_updated:"},{"line_number":445,"context_line":"                LOG.debug(\u0027BIOS settings %(attrs)s for node %(node_uuid)s \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfa1812a_8362058d","line":442,"updated":"2026-03-04 16:40:40.000000000","message":"Thinking out loud here. Is it possible that the attributes are updated too quickly while the machine is still somewhere in the firmware? I\u0027m worried about a potential conflict with the next step.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6444bb843cb1a382ee680813a6732e1c387344f8","unresolved":true,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        requested_attrs \u003d bios_state.get(_REQUESTED_BIOS_ATTRS)"},{"line_number":441,"context_line":"        if requested_attrs:"},{"line_number":442,"context_line":"            attrs_not_updated \u003d self._get_unapplied_bios_attrs("},{"line_number":443,"context_line":"                task, requested_attrs, system.bios)"},{"line_number":444,"context_line":"            if attrs_not_updated:"},{"line_number":445,"context_line":"                LOG.debug(\u0027BIOS settings %(attrs)s for node %(node_uuid)s \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"e7fa04d9_ae1bc8ed","line":442,"in_reply_to":"18def699_00213b8d","updated":"2026-03-16 14:31:22.000000000","message":"We could change this logic so that if boot progress is not present, we still rely on heartbeats if possible. Essentially,\n\n```\nif last_state is None and not disable_ramdisk:\n    LOG.debug(\u0027Boot progress is not available, waiting for IPA to heartbeat\u0027)\n    return\n```\n\nI guess we can also wait and see if my concerns are real..","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9b7c0b751d1d4ea21b367838b47dcaff2c793f1e","unresolved":true,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        requested_attrs \u003d bios_state.get(_REQUESTED_BIOS_ATTRS)"},{"line_number":441,"context_line":"        if requested_attrs:"},{"line_number":442,"context_line":"            attrs_not_updated \u003d self._get_unapplied_bios_attrs("},{"line_number":443,"context_line":"                task, requested_attrs, system.bios)"},{"line_number":444,"context_line":"            if attrs_not_updated:"},{"line_number":445,"context_line":"                LOG.debug(\u0027BIOS settings %(attrs)s for node %(node_uuid)s \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"18def699_00213b8d","line":442,"in_reply_to":"a43f42b5_0f3bc326","updated":"2026-03-13 17:38:51.000000000","message":"So, I had a related discussion yesterday that in theory any pending setting which is *not* in effect yet is supposed to have a task. That being said, the interpretation is different and if the new value has been saved but not latest booted value in effect, some vendors interpret that done and as \"enough\". Others not so much and view the needful is just saving it for the next boot. \n\nTo that point, its a \"gap\" of sorts in the spec where OEMs fit in what makes the most sense in their cases.\n\nTo me, that means the right path is to check if there are pending and unapplied items, and then take the appropriate action from there. That being said, that only works in a reboot case and at that point a further reboot *may* be required to apply them (assuming the request was not made with the apply after time stamp field option).","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"e2428a253f30fd9d558ac3286d44ba6fe28370df","unresolved":true,"context_lines":[{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        requested_attrs \u003d bios_state.get(_REQUESTED_BIOS_ATTRS)"},{"line_number":441,"context_line":"        if requested_attrs:"},{"line_number":442,"context_line":"            attrs_not_updated \u003d self._get_unapplied_bios_attrs("},{"line_number":443,"context_line":"                task, requested_attrs, system.bios)"},{"line_number":444,"context_line":"            if attrs_not_updated:"},{"line_number":445,"context_line":"                LOG.debug(\u0027BIOS settings %(attrs)s for node %(node_uuid)s \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"a43f42b5_0f3bc326","line":442,"in_reply_to":"dfa1812a_8362058d","updated":"2026-03-05 11:08:48.000000000","message":"Good question. Is the concern about this code returning before settings change is well and truly finalised (I don\u0027t think we typically see Tasks in BIOS settings right)? @cardoe@cardoe.com I would be curious what are your thoughts?\nWhen you said firmware I started thinking if it\u0027s possible settings will try to reboot in the tail end of the firmware update but I think/hope Task checking in firmware update should prevent it.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"}],"ironic/tests/unit/drivers/modules/ilo/test_management.py":[{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"70322fc2c3cb87aaf40c925fd34f28de4c70ed9c","unresolved":true,"context_lines":[{"line_number":1681,"context_line":"            ilo_mock_object.do_disk_erase.assert_called_once_with("},{"line_number":1682,"context_line":"                \u0027HDD\u0027, \u0027overwrite\u0027)"},{"line_number":1683,"context_line":"            self.assertEqual(states.CLEANWAIT, result)"},{"line_number":1684,"context_line":"            mock_power.assert_called_once_with(task, states.REBOOT)"},{"line_number":1685,"context_line":""},{"line_number":1686,"context_line":"    @mock.patch.object(deploy_utils, \u0027build_agent_options\u0027,"},{"line_number":1687,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"98c7c06b_0bab2588","line":1684,"updated":"2026-03-11 02:26:21.000000000","message":"this will also need to change based on my comment, check the other tests in this file with changes","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"3c695f08247742efa133a7e6b53eaef5845eced4","unresolved":false,"context_lines":[{"line_number":1681,"context_line":"            ilo_mock_object.do_disk_erase.assert_called_once_with("},{"line_number":1682,"context_line":"                \u0027HDD\u0027, \u0027overwrite\u0027)"},{"line_number":1683,"context_line":"            self.assertEqual(states.CLEANWAIT, result)"},{"line_number":1684,"context_line":"            mock_power.assert_called_once_with(task, states.REBOOT)"},{"line_number":1685,"context_line":""},{"line_number":1686,"context_line":"    @mock.patch.object(deploy_utils, \u0027build_agent_options\u0027,"},{"line_number":1687,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"55e90cc6_c4262674","line":1684,"in_reply_to":"98c7c06b_0bab2588","updated":"2026-03-11 04:51:07.000000000","message":"I think this is OK after all.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"}],"ironic/tests/unit/drivers/modules/ilo/test_raid.py":[{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"70322fc2c3cb87aaf40c925fd34f28de4c70ed9c","unresolved":true,"context_lines":[{"line_number":84,"context_line":"                self.assertFalse("},{"line_number":85,"context_line":"                    task.node.driver_internal_info.get("},{"line_number":86,"context_line":"                        \u0027skip_current_deploy_step\u0027))"},{"line_number":87,"context_line":"            mock_reboot.assert_called_once_with(task, states.REBOOT)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def test__prepare_for_read_raid_create_raid_cleaning(self):"},{"line_number":90,"context_line":"        self.node.clean_step \u003d {\u0027step\u0027: \u0027create_configuration\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"eb71b7e4_4f307e39","line":87,"updated":"2026-03-11 02:26:21.000000000","message":"ditto for the timeout in the tests here","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"3c695f08247742efa133a7e6b53eaef5845eced4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                self.assertFalse("},{"line_number":85,"context_line":"                    task.node.driver_internal_info.get("},{"line_number":86,"context_line":"                        \u0027skip_current_deploy_step\u0027))"},{"line_number":87,"context_line":"            mock_reboot.assert_called_once_with(task, states.REBOOT)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def test__prepare_for_read_raid_create_raid_cleaning(self):"},{"line_number":90,"context_line":"        self.node.clean_step \u003d {\u0027step\u0027: \u0027create_configuration\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"d5b3f69a_43526d2a","line":87,"in_reply_to":"eb71b7e4_4f307e39","updated":"2026-03-11 04:51:07.000000000","message":"I think this is OK after all.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"}],"ironic/tests/unit/drivers/modules/redfish/test_management.py":[{"author":{"_account_id":15519,"name":"Iury Gregory Melo Ferreira","display_name":"Iury Gregory","email":"iurygregory@gmail.com","username":"iurygregory"},"change_message_id":"70322fc2c3cb87aaf40c925fd34f28de4c70ed9c","unresolved":true,"context_lines":[{"line_number":1035,"context_line":"            mock_set_async_step_flags.assert_called_once_with("},{"line_number":1036,"context_line":"                task.node, reboot\u003dTrue, skip_current_step\u003dTrue, polling\u003dTrue)"},{"line_number":1037,"context_line":"            mock_node_power_action.assert_called_once_with("},{"line_number":1038,"context_line":"                task, states.REBOOT)"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    @mock.patch.object(redfish_mgmt.RedfishManagement, \u0027_stage_firmware_file\u0027,"},{"line_number":1041,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"4e8cb67d_e97d76d5","line":1038,"updated":"2026-03-11 02:26:21.000000000","message":"ditto for the timeout in the tests here","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"3c695f08247742efa133a7e6b53eaef5845eced4","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"            mock_set_async_step_flags.assert_called_once_with("},{"line_number":1036,"context_line":"                task.node, reboot\u003dTrue, skip_current_step\u003dTrue, polling\u003dTrue)"},{"line_number":1037,"context_line":"            mock_node_power_action.assert_called_once_with("},{"line_number":1038,"context_line":"                task, states.REBOOT)"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    @mock.patch.object(redfish_mgmt.RedfishManagement, \u0027_stage_firmware_file\u0027,"},{"line_number":1041,"context_line":"                       autospec\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":8,"id":"6b28387a_5c971f0a","line":1038,"in_reply_to":"4e8cb67d_e97d76d5","updated":"2026-03-11 04:51:07.000000000","message":"I think this is OK after all.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"}],"releasenotes/notes/redfish-bios-settings-no-ipa-44c46920613adb2f.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"46b810be58b0fb9850d07cf18a15abece995b9af","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Support setting BIOS settings via the ``redfish`` interface without booting"},{"line_number":5,"context_line":"    into the agent. This solves"},{"line_number":6,"context_line":"    `bug 2075980 \u003chttps://bugs.launchpad.net/ironic/+bug/2075980\u003e`_."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"f6dcf798_226b64de","line":5,"updated":"2026-02-27 13:21:17.000000000","message":"nit: a few details would be useful here, especially if you keep two different code paths based on disable_ramdisk (which I\u0027m not really fond of - see the corresponding comment)","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"9d8f6228b236c6c9ca2c323c50fe1776ed1dd6e5","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Support setting BIOS settings via the ``redfish`` interface without booting"},{"line_number":5,"context_line":"    into the agent. This solves"},{"line_number":6,"context_line":"    `bug 2075980 \u003chttps://bugs.launchpad.net/ironic/+bug/2075980\u003e`_."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"4fe827ab_548ae4fe","line":5,"in_reply_to":"f6dcf798_226b64de","updated":"2026-03-02 10:55:00.000000000","message":"Good point, release note expanded.","commit_id":"d7175a1f403ed8f0e9de800a79081d89038f1f19"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6444bb843cb1a382ee680813a6732e1c387344f8","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The Redfish BIOS ``apply_configuration`` clean and service steps can now"},{"line_number":5,"context_line":"    run without booting into the Ironic Python Agent (IPA). When"},{"line_number":6,"context_line":"    ``disable_ramdisk`` is set, Ironic polls the BMC\u0027s Redfish"},{"line_number":7,"context_line":"    ``BootProgress`` resource (and, for ``apply_configuration``, verifies"},{"line_number":8,"context_line":"    that the requested BIOS attributes have been applied) to detect reboot"},{"line_number":9,"context_line":"    completion instead of waiting for an IPA heartbeat.  This solves the"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"ec7af100_6514f519","line":6,"updated":"2026-03-16 14:31:22.000000000","message":"This is now outdated: Ironic always tries to use BootProgress","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a14b60e5a4000ce0febc62123cbb8009e2ba86b9","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The Redfish BIOS ``apply_configuration`` clean and service steps can now"},{"line_number":5,"context_line":"    run without booting into the Ironic Python Agent (IPA). When"},{"line_number":6,"context_line":"    ``disable_ramdisk`` is set, Ironic polls the BMC\u0027s Redfish"},{"line_number":7,"context_line":"    ``BootProgress`` resource (and, for ``apply_configuration``, verifies"},{"line_number":8,"context_line":"    that the requested BIOS attributes have been applied) to detect reboot"},{"line_number":9,"context_line":"    completion instead of waiting for an IPA heartbeat.  This solves the"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"2cc53549_99883d01","line":6,"in_reply_to":"ec7af100_6514f519","updated":"2026-03-17 01:26:11.000000000","message":"Good pickup, thank you Dmitry. Done.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6444bb843cb1a382ee680813a6732e1c387344f8","unresolved":true,"context_lines":[{"line_number":18,"context_line":"    dict.  Ensure no BIOS clean or service steps are in progress during"},{"line_number":19,"context_line":"    the upgrade.  Any in-flight BIOS operations that were started on the"},{"line_number":20,"context_line":"    old code will be cleaned up automatically on the next step invocation."},{"line_number":21,"context_line":"  - |"},{"line_number":22,"context_line":"    The helper ``deploy_utils.reboot_to_finish_step()`` no longer accepts"},{"line_number":23,"context_line":"    ``timeout`` or ``disable_ramdisk`` keyword arguments.  Out-of-tree"},{"line_number":24,"context_line":"    drivers that passed these arguments must be updated."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"13288c7c_49926ae0","line":21,"updated":"2026-03-16 14:31:22.000000000","message":"This needs to go to `other:` section (because it\u0027s internal API)","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"a14b60e5a4000ce0febc62123cbb8009e2ba86b9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    dict.  Ensure no BIOS clean or service steps are in progress during"},{"line_number":19,"context_line":"    the upgrade.  Any in-flight BIOS operations that were started on the"},{"line_number":20,"context_line":"    old code will be cleaned up automatically on the next step invocation."},{"line_number":21,"context_line":"  - |"},{"line_number":22,"context_line":"    The helper ``deploy_utils.reboot_to_finish_step()`` no longer accepts"},{"line_number":23,"context_line":"    ``timeout`` or ``disable_ramdisk`` keyword arguments.  Out-of-tree"},{"line_number":24,"context_line":"    drivers that passed these arguments must be updated."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"0caca56a_93d27ee2","line":21,"in_reply_to":"13288c7c_49926ae0","updated":"2026-03-17 01:26:11.000000000","message":"Good point. Done.","commit_id":"2afd9dd27f278b033fc8051285cb3ef5f6615f96"}]}
