)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9ca04a32c56ad3083142bed41f2ccf5bd2862a96","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e8f27404_0e837a1c","updated":"2026-07-15 12:11:05.000000000","message":"Please move the Dell-specific call to the iDRAC driver, leaving stubs in the main one.","commit_id":"d32ed88a7bb6a982b4eb3ee607cc055a261e6d4b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"d9ff8c4fea4d6b1b81ab28979744dbb43d49a04d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"64f244af_e9838101","in_reply_to":"6f048664_06013186","updated":"2026-07-16 13:14:52.000000000","message":"Done","commit_id":"d32ed88a7bb6a982b4eb3ee607cc055a261e6d4b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"ac7f0d9b0cb21f1929f24df4acd24ee4f0f3e1a5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6f048664_06013186","in_reply_to":"e8f27404_0e837a1c","updated":"2026-07-15 13:30:10.000000000","message":"ack","commit_id":"d32ed88a7bb6a982b4eb3ee607cc055a261e6d4b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ccccda36294e68a8ff6f158bc33531ebfa6716b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5c701174_4a9be651","updated":"2026-07-15 14:40:15.000000000","message":"Oh, we don\u0027t have a Dell child of RedfishFirmware? This is sad.","commit_id":"961776a87ccc652d839ac1f890c366bc89e812e1"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"e37362932c827f0bc45dbc405285efbc0b8b078c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"944643a9_dbd555da","in_reply_to":"5c701174_4a9be651","updated":"2026-07-16 11:55:34.000000000","message":"yeah :/","commit_id":"961776a87ccc652d839ac1f890c366bc89e812e1"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"cbd82f43bce9aaab834fd2716643ead0227a60ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"cd4496a5_6ae2b6e1","in_reply_to":"944643a9_dbd555da","updated":"2026-07-17 14:48:37.000000000","message":"I actually kinda like we don\u0027t. Let\u0027s start abstracting away the hardware differences a bit.","commit_id":"961776a87ccc652d839ac1f890c366bc89e812e1"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"064a48e565640fe11fa02a1e843613343ab445db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"cebad7b3_2905b20d","in_reply_to":"cd4496a5_6ae2b6e1","updated":"2026-07-20 08:41:16.000000000","message":"I disagree, explicit is better than implicit \nI think we should highlight differences in behavior for us and also for the final user sake\nIronic deals with real physical machines where vendor differences are not cosmetic, they affect firmware update flows, BIOS settings, boot modes, RAID configuration, error handling, and more. Hiding those behind a uniform abstraction gives users a false sense of uniformity that breaks down the moment something goes wrong.\nThe right kind of abstraction is at the interface level while keeping vendor-specific implementations clearly separated and identifiable","commit_id":"961776a87ccc652d839ac1f890c366bc89e812e1"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"12140090fe5a2b52b2be4351a47ba6a540ab5727","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"60f7c3c0_c9fc020d","updated":"2026-07-20 11:11:18.000000000","message":"\u003e Hiding those behind a uniform abstraction gives users a false sense of uniformity that breaks down the moment something goes wrong.\n\nI\u0027ve moved this discussion to IRC, because I believe this ship has sailed, and we cannot pretend it hasn\u0027t.","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18fea54a8e8ceaa412fb901310e5bf8fa4279991","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b8502a1f_5c7c4b55","updated":"2026-07-22 16:15:12.000000000","message":"Sorry, missed a couple of things initially. After that good to go.","commit_id":"268b35a62541449cbaf15dfe64b7a794ee9fb99e"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"097d7b9e83519002b9493c3b8ab514bee6e5b9c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"a5842471_b2fc87b7","updated":"2026-07-20 18:16:49.000000000","message":"recheck weird","commit_id":"268b35a62541449cbaf15dfe64b7a794ee9fb99e"}],"ironic/drivers/modules/drac/firmware.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca816b0ab0d3a88ec31021745a870d42c3c4dd84","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    node \u003d task.node"},{"line_number":43,"context_line":"    task_monitor_uri \u003d current_update.get(\u0027task_monitor\u0027, \u0027\u0027)"},{"line_number":44,"context_line":"    jid \u003d (task_monitor_uri.rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":45,"context_line":"           if task_monitor_uri else \u0027\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    if not jid:"},{"line_number":48,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"0dc859a7_4a33d73c","line":45,"updated":"2026-07-20 11:20:18.000000000","message":"nit: I wonder if there is a more direct way to get a JID","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"129fb14dd876a11020b72ae0ca290cbd7b9b77ed","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    node \u003d task.node"},{"line_number":43,"context_line":"    task_monitor_uri \u003d current_update.get(\u0027task_monitor\u0027, \u0027\u0027)"},{"line_number":44,"context_line":"    jid \u003d (task_monitor_uri.rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":45,"context_line":"           if task_monitor_uri else \u0027\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    if not jid:"},{"line_number":48,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"f3c60897_2f90149f","line":45,"in_reply_to":"0dc859a7_4a33d73c","updated":"2026-07-20 13:01:08.000000000","message":"heh.... The task_monitor URI string is what gets stored in driver_internal_info, that\u0027s just a URI from sushy\nThere\u0027s no structured JID field anywhere in the Redfish or sushy API; the JID is an iDRAC convention baked into the URI path.\nAlso I think we do the parsing everywhere else.","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca816b0ab0d3a88ec31021745a870d42c3c4dd84","unresolved":true,"context_lines":[{"line_number":50,"context_line":"    try:"},{"line_number":51,"context_line":"        system \u003d redfish_utils.get_system(node)"},{"line_number":52,"context_line":"    except Exception as e:"},{"line_number":53,"context_line":"        LOG.debug(\u0027Cannot get system for Dell OEM job check on \u0027"},{"line_number":54,"context_line":"                  \u0027node %(node)s: %(error)s\u0027,"},{"line_number":55,"context_line":"                  {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":56,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"4f9eb454_aa194f70","line":53,"updated":"2026-07-20 11:20:18.000000000","message":"Probably a WARNING, it\u0027s not a normal case.\n\nI assume the only reason why we don\u0027t raise an exception is because the operation will be retried on the next periodic check? Is it actually the case?","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"129fb14dd876a11020b72ae0ca290cbd7b9b77ed","unresolved":true,"context_lines":[{"line_number":50,"context_line":"    try:"},{"line_number":51,"context_line":"        system \u003d redfish_utils.get_system(node)"},{"line_number":52,"context_line":"    except Exception as e:"},{"line_number":53,"context_line":"        LOG.debug(\u0027Cannot get system for Dell OEM job check on \u0027"},{"line_number":54,"context_line":"                  \u0027node %(node)s: %(error)s\u0027,"},{"line_number":55,"context_line":"                  {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":56,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"761bbbea_4494ea10","line":53,"in_reply_to":"4f9eb454_aa194f70","updated":"2026-07-20 13:01:08.000000000","message":"agreed on the WARNING\n\nbut I think we don\u0027t retry on the next periodic check, I think we immediately triggers reboot, so maybe we should consider a retry, although it may be dangerous if the BMC is unreachable from some reason, the node could end up stuck. And probably too much complexity!\nLet me change the message here, I think we can just better clarify what happens.","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"1edd982ffb86ede9647efdce9035823f9a959df0","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    try:"},{"line_number":51,"context_line":"        system \u003d redfish_utils.get_system(node)"},{"line_number":52,"context_line":"    except Exception as e:"},{"line_number":53,"context_line":"        LOG.debug(\u0027Cannot get system for Dell OEM job check on \u0027"},{"line_number":54,"context_line":"                  \u0027node %(node)s: %(error)s\u0027,"},{"line_number":55,"context_line":"                  {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"},{"line_number":56,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":5,"id":"943499a1_70a3f341","line":53,"in_reply_to":"761bbbea_4494ea10","updated":"2026-07-22 08:01:22.000000000","message":"Done","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca816b0ab0d3a88ec31021745a870d42c3c4dd84","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            manager_oem \u003d manager.get_oem_extension(\u0027Dell\u0027)"},{"line_number":64,"context_line":"        except Exception:"},{"line_number":65,"context_line":"            return None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        try:"},{"line_number":68,"context_line":"            unfinished \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"db4393fa_65679e93","line":65,"updated":"2026-07-20 11:20:18.000000000","message":"Let\u0027s log something at DEBUG or even WARNING level. We know it\u0027s a Dell machine, so there is no reason for it to be missing the OEM extension.","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"129fb14dd876a11020b72ae0ca290cbd7b9b77ed","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        try:"},{"line_number":63,"context_line":"            manager_oem \u003d manager.get_oem_extension(\u0027Dell\u0027)"},{"line_number":64,"context_line":"        except Exception:"},{"line_number":65,"context_line":"            return None"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        try:"},{"line_number":68,"context_line":"            unfinished \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"fadff2d1_d5d8b09a","line":65,"in_reply_to":"db4393fa_65679e93","updated":"2026-07-20 13:01:08.000000000","message":"Acknowledged","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca816b0ab0d3a88ec31021745a870d42c3c4dd84","unresolved":true,"context_lines":[{"line_number":80,"context_line":"                {\u0027jid\u0027: jid, \u0027node\u0027: node.uuid})"},{"line_number":81,"context_line":"            return False"},{"line_number":82,"context_line":"        except Exception as e:"},{"line_number":83,"context_line":"            LOG.debug("},{"line_number":84,"context_line":"                \u0027Failed to query Dell iDRAC job collection for \u0027"},{"line_number":85,"context_line":"                \u0027node %(node)s: %(error)s\u0027,"},{"line_number":86,"context_line":"                {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":5,"id":"aae84d72_2fed936f","line":83,"updated":"2026-07-20 11:20:18.000000000","message":"Is it actually something we can safely ignore on iDRAC? At the very least, upgrade it to a WARNING.","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"129fb14dd876a11020b72ae0ca290cbd7b9b77ed","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                {\u0027jid\u0027: jid, \u0027node\u0027: node.uuid})"},{"line_number":81,"context_line":"            return False"},{"line_number":82,"context_line":"        except Exception as e:"},{"line_number":83,"context_line":"            LOG.debug("},{"line_number":84,"context_line":"                \u0027Failed to query Dell iDRAC job collection for \u0027"},{"line_number":85,"context_line":"                \u0027node %(node)s: %(error)s\u0027,"},{"line_number":86,"context_line":"                {\u0027node\u0027: node.uuid, \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":5,"id":"40f01ebb_51b6c7a0","line":83,"in_reply_to":"aae84d72_2fed936f","updated":"2026-07-20 13:01:08.000000000","message":"Acknowledged","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"}],"ironic/drivers/modules/redfish/firmware.py":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"ee70cec363546e82f1612e7cb8a0aa65038c990a","unresolved":true,"context_lines":[{"line_number":1229,"context_line":"            no matching job exists, None if this check is not supported"},{"line_number":1230,"context_line":"        \"\"\""},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            from ironic.drivers.modules.drac import firmware as drac_fw"},{"line_number":1233,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1234,"context_line":"        except ImportError:"},{"line_number":1235,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"422035ec_18f6b01e","line":1232,"updated":"2026-07-15 14:09:03.000000000","message":"Should we import here or top level?","commit_id":"617b57a98b4c2569e1c1472af2a97f531b84463b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"c2088dcddaebbe147e2f3633256610e365d28578","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"            no matching job exists, None if this check is not supported"},{"line_number":1230,"context_line":"        \"\"\""},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            from ironic.drivers.modules.drac import firmware as drac_fw"},{"line_number":1233,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1234,"context_line":"        except ImportError:"},{"line_number":1235,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"886d70d3_3520ad8e","line":1232,"in_reply_to":"22868df2_4375fcec","updated":"2026-07-16 13:14:24.000000000","message":"Done","commit_id":"617b57a98b4c2569e1c1472af2a97f531b84463b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"def82e8128fe5e88db41d4bfceefd7f8d93b1906","unresolved":true,"context_lines":[{"line_number":1229,"context_line":"            no matching job exists, None if this check is not supported"},{"line_number":1230,"context_line":"        \"\"\""},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            from ironic.drivers.modules.drac import firmware as drac_fw"},{"line_number":1233,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1234,"context_line":"        except ImportError:"},{"line_number":1235,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"22868df2_4375fcec","line":1232,"in_reply_to":"422035ec_18f6b01e","updated":"2026-07-15 14:30:07.000000000","message":"top leael is probably cleaner","commit_id":"617b57a98b4c2569e1c1472af2a97f531b84463b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"bc472b004d3d388638cd4d780d91bb60474ee5f8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from ironic.conf import CONF"},{"line_number":29,"context_line":"from ironic.drivers import base"},{"line_number":30,"context_line":"from ironic.drivers.modules.drac import firmware as drac_fw"},{"line_number":31,"context_line":"from ironic.drivers.modules import deploy_utils"},{"line_number":32,"context_line":"from ironic.drivers.modules.redfish import firmware_utils"},{"line_number":33,"context_line":"from ironic.drivers.modules.redfish import utils as redfish_utils"},{"line_number":34,"context_line":"from ironic import objects"}],"source_content_type":"text/x-python","patch_set":3,"id":"c3cbc66f_15619f22","line":31,"updated":"2026-07-15 16:24:04.000000000","message":"pep8: H306: imports not in alphabetical order (ironic.drivers.modules.drac.firmware, ironic.drivers.modules.deploy_utils)","commit_id":"961776a87ccc652d839ac1f890c366bc89e812e1"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"cbd82f43bce9aaab834fd2716643ead0227a60ba","unresolved":true,"context_lines":[{"line_number":1254,"context_line":"        :param update_service: the sushy firmware update service"},{"line_number":1255,"context_line":"        :param settings: firmware update settings"},{"line_number":1256,"context_line":"        \"\"\""},{"line_number":1257,"context_line":"        has_job \u003d self._check_bmc_scheduled_firmware_update("},{"line_number":1258,"context_line":"            task, current_update)"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":"        if has_job is False:"}],"source_content_type":"text/x-python","patch_set":4,"id":"acd672ca_c3bb06c4","line":1257,"updated":"2026-07-17 14:48:37.000000000","message":"Does it matter this unconditionally gets called even on non-Dells?","commit_id":"618caf4a3d5efd803944e991c2d89bf6bb812982"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"064a48e565640fe11fa02a1e843613343ab445db","unresolved":true,"context_lines":[{"line_number":1254,"context_line":"        :param update_service: the sushy firmware update service"},{"line_number":1255,"context_line":"        :param settings: firmware update settings"},{"line_number":1256,"context_line":"        \"\"\""},{"line_number":1257,"context_line":"        has_job \u003d self._check_bmc_scheduled_firmware_update("},{"line_number":1258,"context_line":"            task, current_update)"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":"        if has_job is False:"}],"source_content_type":"text/x-python","patch_set":4,"id":"d8bdba68_9b1ce8e1","line":1257,"in_reply_to":"acd672ca_c3bb06c4","updated":"2026-07-20 08:41:16.000000000","message":"This is exactly why we should keep vendor-specific logic in vendor-specific code paths.\nThe has_job issue you spotted exists precisely because the code tries to treat all hardware the same. More abstraction would make this class of bug more common, not less.\nI was unsure if we needed to move this into the drac side of things, but we definitely need to avoid useless bmc calls in non DELL hardware.","commit_id":"618caf4a3d5efd803944e991c2d89bf6bb812982"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"26ce28eeead1dd627e8545bda0e4604611fa0291","unresolved":false,"context_lines":[{"line_number":1254,"context_line":"        :param update_service: the sushy firmware update service"},{"line_number":1255,"context_line":"        :param settings: firmware update settings"},{"line_number":1256,"context_line":"        \"\"\""},{"line_number":1257,"context_line":"        has_job \u003d self._check_bmc_scheduled_firmware_update("},{"line_number":1258,"context_line":"            task, current_update)"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":"        if has_job is False:"}],"source_content_type":"text/x-python","patch_set":4,"id":"e94eb6ac_155a16b5","line":1257,"in_reply_to":"d8bdba68_9b1ce8e1","updated":"2026-07-20 08:54:59.000000000","message":"Done","commit_id":"618caf4a3d5efd803944e991c2d89bf6bb812982"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca816b0ab0d3a88ec31021745a870d42c3c4dd84","unresolved":true,"context_lines":[{"line_number":1229,"context_line":"        :returns: True if a matching scheduled job was found, False if"},{"line_number":1230,"context_line":"            no matching job exists, None if this check is not supported"},{"line_number":1231,"context_line":"        \"\"\""},{"line_number":1232,"context_line":"        if task.node.driver \u003d\u003d \u0027idrac\u0027:"},{"line_number":1233,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1234,"context_line":"        return None"},{"line_number":1235,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"a9dc523c_36f4e6cb","line":1232,"updated":"2026-07-20 11:20:18.000000000","message":"I\u0027d rather not do it this way. To delineate between drivers, we\u0027d have to introduce DracFirmware and go through the entire deprecation dance. Which we don\u0027t want.\n\nSince the code is in the generic driver, it should rely on the vendor property, not on the driver name.","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"129fb14dd876a11020b72ae0ca290cbd7b9b77ed","unresolved":true,"context_lines":[{"line_number":1229,"context_line":"        :returns: True if a matching scheduled job was found, False if"},{"line_number":1230,"context_line":"            no matching job exists, None if this check is not supported"},{"line_number":1231,"context_line":"        \"\"\""},{"line_number":1232,"context_line":"        if task.node.driver \u003d\u003d \u0027idrac\u0027:"},{"line_number":1233,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1234,"context_line":"        return None"},{"line_number":1235,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"edff5167_015468c6","line":1232,"in_reply_to":"a9dc523c_36f4e6cb","updated":"2026-07-20 13:01:08.000000000","message":"right, we could have a dell node running just redfish driver","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"1edd982ffb86ede9647efdce9035823f9a959df0","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"        :returns: True if a matching scheduled job was found, False if"},{"line_number":1230,"context_line":"            no matching job exists, None if this check is not supported"},{"line_number":1231,"context_line":"        \"\"\""},{"line_number":1232,"context_line":"        if task.node.driver \u003d\u003d \u0027idrac\u0027:"},{"line_number":1233,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1234,"context_line":"        return None"},{"line_number":1235,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"d2f27b48_21ca3b17","line":1232,"in_reply_to":"edff5167_015468c6","updated":"2026-07-22 08:01:22.000000000","message":"Done","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca816b0ab0d3a88ec31021745a870d42c3c4dd84","unresolved":true,"context_lines":[{"line_number":1231,"context_line":"        \"\"\""},{"line_number":1232,"context_line":"        if task.node.driver \u003d\u003d \u0027idrac\u0027:"},{"line_number":1233,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1234,"context_line":"        return None"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"    def _handle_bios_task_monitor_disappeared(self, task, node,"},{"line_number":1237,"context_line":"                                              current_update,"}],"source_content_type":"text/x-python","patch_set":5,"id":"37b657c5_68d7a16e","line":1234,"updated":"2026-07-20 11:20:18.000000000","message":"nit: noop","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"129fb14dd876a11020b72ae0ca290cbd7b9b77ed","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        \"\"\""},{"line_number":1232,"context_line":"        if task.node.driver \u003d\u003d \u0027idrac\u0027:"},{"line_number":1233,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1234,"context_line":"        return None"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"    def _handle_bios_task_monitor_disappeared(self, task, node,"},{"line_number":1237,"context_line":"                                              current_update,"}],"source_content_type":"text/x-python","patch_set":5,"id":"85fa5c88_8ea9cf29","line":1234,"in_reply_to":"37b657c5_68d7a16e","updated":"2026-07-20 13:01:08.000000000","message":"Acknowledged","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca816b0ab0d3a88ec31021745a870d42c3c4dd84","unresolved":true,"context_lines":[{"line_number":1277,"context_line":"                manager_utils.servicing_error_handler(task, error_msg)"},{"line_number":1278,"context_line":"            return"},{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"        if has_job is None:"},{"line_number":1281,"context_line":"            LOG.info(\u0027BMC scheduled job check not supported for node \u0027"},{"line_number":1282,"context_line":"                     \u0027%(node)s. Assuming BIOS firmware staging \u0027"},{"line_number":1283,"context_line":"                     \u0027succeeded and triggering reboot.\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"2e5380c5_83b04ec3","line":1280,"updated":"2026-07-20 11:20:18.000000000","message":"nit: if you move this to the top, you\u0027ll avoid the awkward `is False` check.","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"129fb14dd876a11020b72ae0ca290cbd7b9b77ed","unresolved":false,"context_lines":[{"line_number":1277,"context_line":"                manager_utils.servicing_error_handler(task, error_msg)"},{"line_number":1278,"context_line":"            return"},{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"        if has_job is None:"},{"line_number":1281,"context_line":"            LOG.info(\u0027BMC scheduled job check not supported for node \u0027"},{"line_number":1282,"context_line":"                     \u0027%(node)s. Assuming BIOS firmware staging \u0027"},{"line_number":1283,"context_line":"                     \u0027succeeded and triggering reboot.\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"b7582288_db0ba181","line":1280,"in_reply_to":"2e5380c5_83b04ec3","updated":"2026-07-20 13:01:08.000000000","message":"Acknowledged","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ca816b0ab0d3a88ec31021745a870d42c3c4dd84","unresolved":true,"context_lines":[{"line_number":1283,"context_line":"                     \u0027succeeded and triggering reboot.\u0027,"},{"line_number":1284,"context_line":"                     {\u0027node\u0027: node.uuid})"},{"line_number":1285,"context_line":""},{"line_number":1286,"context_line":"        LOG.info(\u0027BIOS firmware update task disappeared for node \u0027"},{"line_number":1287,"context_line":"                 \u0027%(node)s before reboot was triggered. \u0027"},{"line_number":1288,"context_line":"                 \u0027Triggering reboot now to apply staged firmware.\u0027,"},{"line_number":1289,"context_line":"                 {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":5,"id":"9bfc0606_e5751a64","line":1286,"updated":"2026-07-20 11:20:18.000000000","message":"These are two INFO messages directly one after the other. Let\u0027s either downgrade the first one to DEBUG or somehow merge them so that each branch only results in one INFO message.","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"129fb14dd876a11020b72ae0ca290cbd7b9b77ed","unresolved":false,"context_lines":[{"line_number":1283,"context_line":"                     \u0027succeeded and triggering reboot.\u0027,"},{"line_number":1284,"context_line":"                     {\u0027node\u0027: node.uuid})"},{"line_number":1285,"context_line":""},{"line_number":1286,"context_line":"        LOG.info(\u0027BIOS firmware update task disappeared for node \u0027"},{"line_number":1287,"context_line":"                 \u0027%(node)s before reboot was triggered. \u0027"},{"line_number":1288,"context_line":"                 \u0027Triggering reboot now to apply staged firmware.\u0027,"},{"line_number":1289,"context_line":"                 {\u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":5,"id":"495a69c9_80b0a947","line":1286,"in_reply_to":"9bfc0606_e5751a64","updated":"2026-07-20 13:01:08.000000000","message":"Acknowledged","commit_id":"81b880aca5d4fb6771589587eb9c211e686e0f2b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"2d5010133c6a0c7ddefce310f534b163abd5ea0a","unresolved":true,"context_lines":[{"line_number":1230,"context_line":"            no matching job exists, None if this check is not supported"},{"line_number":1231,"context_line":"        \"\"\""},{"line_number":1232,"context_line":"        vendor \u003d task.node.properties.get(\u0027vendor\u0027, \u0027\u0027)"},{"line_number":1233,"context_line":"        if vendor and vendor.lower() \u003d\u003d \u0027dell\u0027:"},{"line_number":1234,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1235,"context_line":"        return None"},{"line_number":1236,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"4f36e54e_be5c8400","line":1233,"updated":"2026-07-20 14:01:54.000000000","message":"I\u0027m not sure it\u0027s literally \"Dell\" and not something like \"Dell EMC\" or \"Dell Inc.\" or whatever. I see one place where we do `if \u0027Dell\u0027 in vendor.split()`, maybe do the same here?","commit_id":"c96f0fee5f8faa2a2cd8cefc81b18c9e772f1a5e"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"66a7f9beff4b42f227ffa33d5d92ba40024d14cb","unresolved":false,"context_lines":[{"line_number":1230,"context_line":"            no matching job exists, None if this check is not supported"},{"line_number":1231,"context_line":"        \"\"\""},{"line_number":1232,"context_line":"        vendor \u003d task.node.properties.get(\u0027vendor\u0027, \u0027\u0027)"},{"line_number":1233,"context_line":"        if vendor and vendor.lower() \u003d\u003d \u0027dell\u0027:"},{"line_number":1234,"context_line":"            return drac_fw.check_scheduled_idrac_job(task, current_update)"},{"line_number":1235,"context_line":"        return None"},{"line_number":1236,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"cfd730e7_d2a13a04","line":1233,"in_reply_to":"4f36e54e_be5c8400","updated":"2026-07-20 15:04:27.000000000","message":"Acknowledged","commit_id":"c96f0fee5f8faa2a2cd8cefc81b18c9e772f1a5e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18fea54a8e8ceaa412fb901310e5bf8fa4279991","unresolved":true,"context_lines":[{"line_number":1274,"context_line":"                  \u0027failed.\u0027) %"},{"line_number":1275,"context_line":"                {\u0027node\u0027: node.uuid,"},{"line_number":1276,"context_line":"                 \u0027firmware_image\u0027: current_update[\u0027url\u0027]})"},{"line_number":1277,"context_line":"            self._clear_updates(node)"},{"line_number":1278,"context_line":"            if task.node.clean_step:"},{"line_number":1279,"context_line":"                manager_utils.cleaning_error_handler(task, error_msg)"},{"line_number":1280,"context_line":"            elif task.node.deploy_step:"}],"source_content_type":"text/x-python","patch_set":9,"id":"00e62caf_e041186b","line":1277,"updated":"2026-07-22 16:15:12.000000000","message":"You probably need upgrade_lock before this","commit_id":"268b35a62541449cbaf15dfe64b7a794ee9fb99e"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"a1d7cd5f6fec41bcf271e36814098eccae3c4dfd","unresolved":false,"context_lines":[{"line_number":1274,"context_line":"                  \u0027failed.\u0027) %"},{"line_number":1275,"context_line":"                {\u0027node\u0027: node.uuid,"},{"line_number":1276,"context_line":"                 \u0027firmware_image\u0027: current_update[\u0027url\u0027]})"},{"line_number":1277,"context_line":"            self._clear_updates(node)"},{"line_number":1278,"context_line":"            if task.node.clean_step:"},{"line_number":1279,"context_line":"                manager_utils.cleaning_error_handler(task, error_msg)"},{"line_number":1280,"context_line":"            elif task.node.deploy_step:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9198984a_b8433695","line":1277,"in_reply_to":"00e62caf_e041186b","updated":"2026-07-23 13:15:25.000000000","message":"Acknowledged","commit_id":"268b35a62541449cbaf15dfe64b7a794ee9fb99e"}],"ironic/tests/unit/drivers/modules/redfish/test_firmware.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"18fea54a8e8ceaa412fb901310e5bf8fa4279991","unresolved":true,"context_lines":[{"line_number":1238,"context_line":"            result \u003d drac_fw.check_scheduled_idrac_job("},{"line_number":1239,"context_line":"                task, current_update)"},{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":"        self.assertFalse(result)"},{"line_number":1242,"context_line":""},{"line_number":1243,"context_line":"    @mock.patch.object(redfish_utils, \u0027get_system\u0027, autospec\u003dTrue)"},{"line_number":1244,"context_line":"    def test_check_scheduled_idrac_job_oem_not_available("}],"source_content_type":"text/x-python","patch_set":9,"id":"f46435c5_fa90ed2d","line":1241,"updated":"2026-07-22 16:15:12.000000000","message":"None passes assertFalse, use assertIs","commit_id":"268b35a62541449cbaf15dfe64b7a794ee9fb99e"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"a1d7cd5f6fec41bcf271e36814098eccae3c4dfd","unresolved":false,"context_lines":[{"line_number":1238,"context_line":"            result \u003d drac_fw.check_scheduled_idrac_job("},{"line_number":1239,"context_line":"                task, current_update)"},{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":"        self.assertFalse(result)"},{"line_number":1242,"context_line":""},{"line_number":1243,"context_line":"    @mock.patch.object(redfish_utils, \u0027get_system\u0027, autospec\u003dTrue)"},{"line_number":1244,"context_line":"    def test_check_scheduled_idrac_job_oem_not_available("}],"source_content_type":"text/x-python","patch_set":9,"id":"f963c497_4acae15b","line":1241,"in_reply_to":"f46435c5_fa90ed2d","updated":"2026-07-23 13:15:25.000000000","message":"Acknowledged","commit_id":"268b35a62541449cbaf15dfe64b7a794ee9fb99e"}],"releasenotes/notes/fix-dell-silent-failure-b6c93f5434e8311a.yaml":[{"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":"a4783c18ee3acb8dd19a1e0694d7b7969302f880","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Fixes BIOS firmware updates on Dell iDRAC failing silently when the"},{"line_number":5,"context_line":"    Redfish TaskMonitor is purged before Ironic can poll it. Previously,"},{"line_number":6,"context_line":"    Ironic assumed the update succeeded and completed cleaning without"},{"line_number":7,"context_line":"    rebooting, leaving staged firmware unapplied. For nodes with vendor"},{"line_number":8,"context_line":"    property set to ``Dell``, queries the iDRAC Lifecycle Controller job"},{"line_number":9,"context_line":"    collection to determine whether staging actually succeeded. If a"},{"line_number":10,"context_line":"    scheduled LC job exists, a reboot is triggered to apply the firmware."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"83e767a4_b8ae4f68","line":7,"updated":"2026-08-06 16:31:36.000000000","message":"This is not actually describing the old behavior as it exists in the code. The previous code would unconditionally reboot AFAICT.","commit_id":"38c4d763e47b4c274833f0ce0dcaa35356fb8d96"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"5d17ebd64cb34d38654becf4c0b34b0ddb6147af","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Fixes BIOS firmware updates on Dell iDRAC failing silently when the"},{"line_number":5,"context_line":"    Redfish TaskMonitor is purged before Ironic can poll it. Previously,"},{"line_number":6,"context_line":"    Ironic assumed the update succeeded and completed cleaning without"},{"line_number":7,"context_line":"    rebooting, leaving staged firmware unapplied. For nodes with vendor"},{"line_number":8,"context_line":"    property set to ``Dell``, queries the iDRAC Lifecycle Controller job"},{"line_number":9,"context_line":"    collection to determine whether staging actually succeeded. If a"},{"line_number":10,"context_line":"    scheduled LC job exists, a reboot is triggered to apply the firmware."}],"source_content_type":"text/x-yaml","patch_set":10,"id":"8c870243_2b26601e","line":7,"in_reply_to":"83e767a4_b8ae4f68","updated":"2026-08-08 08:48:45.000000000","message":"Done","commit_id":"38c4d763e47b4c274833f0ce0dcaa35356fb8d96"}]}
