)]}'
{"/COMMIT_MSG":[{"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":"1b95cc72158d1553494b9b0fb4f4902a8c1ff05e","unresolved":true,"context_lines":[{"line_number":16,"context_line":"autodetect deploy interface to fail loudly if any of it\u0027s non-existent"},{"line_number":17,"context_line":"concrete method implementations are called."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Closes-Bug: #2163017"},{"line_number":20,"context_line":"Change-Id: Id96e9e04ca9024e3e1b82139de66439c62e7a861"},{"line_number":21,"context_line":"Signed-off-by: Jed Preist \u003cjed@stackhpc.com\u003e"},{"line_number":22,"context_line":"Signed-off-by: Jay Faulkner \u003cjay@jvf.cc\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"955ada78_556395c1","line":19,"updated":"2026-08-07 17:25:55.000000000","message":"Add assisted-by claude opus","commit_id":"e5f0e6db96809fdbd08d818e3d0fcc77a9be8370"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":16,"context_line":"autodetect deploy interface to fail loudly if any of it\u0027s non-existent"},{"line_number":17,"context_line":"concrete method implementations are called."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Closes-Bug: #2163017"},{"line_number":20,"context_line":"Change-Id: Id96e9e04ca9024e3e1b82139de66439c62e7a861"},{"line_number":21,"context_line":"Signed-off-by: Jed Preist \u003cjed@stackhpc.com\u003e"},{"line_number":22,"context_line":"Signed-off-by: Jay Faulkner \u003cjay@jvf.cc\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"e3b1cec2_36f574ca","line":19,"in_reply_to":"955ada78_556395c1","updated":"2026-08-07 21:50:46.000000000","message":"Done","commit_id":"e5f0e6db96809fdbd08d818e3d0fcc77a9be8370"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"7807243e6887d3495816b11ebd5df0d235e51980","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"84ddef57_1eec0916","updated":"2026-08-07 13:24:06.000000000","message":"Thank you for spotting this and for the patch.\nUnfortunately I think inheriting from AgentBaseMixin is not the right solution here, that would transform autodetect into a \"deploy interface\", while its purpose is to select one.\nWe probably just need to be able to switch the interface before cleaning, as we do for deployment.","commit_id":"edf712b5b0683b46273fa4bb30da55d7f6b55e36"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"351c821620f62c36b3646b7e0de58d0e3ccf5b18","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"20539b57_93862ec9","updated":"2026-08-07 14:33:00.000000000","message":"we should probably override prepare_cleaning in AutodetectDeploy to call switch_interface and then delegate to the switched interface\u0027s prepare_cleaning","commit_id":"edf712b5b0683b46273fa4bb30da55d7f6b55e36"},{"author":{"_account_id":39213,"name":"Jed Preist","display_name":"Jed Preist","email":"jed@stackhpc.com","username":"jed-preist"},"change_message_id":"1e6e55550b7c271e36c9e8f1f7a6f191c1b2dab0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7060862f_2d1ea012","in_reply_to":"20539b57_93862ec9","updated":"2026-08-07 15:42:12.000000000","message":"That makes sense, thanks. I\u0027ll take a look at implementing it on Monday","commit_id":"edf712b5b0683b46273fa4bb30da55d7f6b55e36"},{"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":"55efddb1716c124f1643472dc695b45c25954fad","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"591bf162_634e8b10","updated":"2026-08-07 17:59:45.000000000","message":"Lots of claude-isms for me to cleanup; none of them are so critical to fix before I get CI feedback.","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"5e691529737732f1fe730d0602cfd2e949e26f9d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4a379797_568b36f9","updated":"2026-08-07 21:52:45.000000000","message":"This should be manually validated via devstack or a CI job that runs cleaning first-thing before it merges. I have not tested this in devstack.","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"f465e7511fad9c718a89b99701bb80357682c546","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7276d367_104a60ad","in_reply_to":"4a379797_568b36f9","updated":"2026-08-08 08:59:38.000000000","message":"https://github.com/metal3-io/baremetal-operator/pull/3495 already tests that so I\u0027ve overrided the branch in the BMO test with that in https://review.opendev.org/c/openstack/ironic/+/1000176 (next DNM patch in the chain) to verify the fix\nonce we verify it, we can merge the BMO change (it will pass) and it will be automatically adopted in the BMO ironic test","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"9392dd47956aac7c18e9d00947f4f5c036a9b57b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"0510e389_2f5eec90","updated":"2026-08-13 21:37:27.000000000","message":"This needs a little more TLC.","commit_id":"96b666a0a63ff8ac008f43e276abd50ad166e1da"}],"ironic/conductor/cleaning.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8991c32f3dc78bc477c3c0e4992d7f84eb43b404","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":126,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":127,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":128,"context_line":"    except Exception as e:"},{"line_number":129,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for cleaning node \u0027"},{"line_number":130,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":131,"context_line":"        return utils.cleaning_error_handler(task, msg,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5012d79b_257a9c91","line":128,"updated":"2026-08-07 17:59:26.000000000","message":"I guess this feels like a claude-ism, but at the same time I\u0027m curious what would actually get raised/captured/returned to fail cleaning, in any case, the execution of cleaning_error_handler is key.","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"55efddb1716c124f1643472dc695b45c25954fad","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":126,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":127,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":128,"context_line":"    except Exception as e:"},{"line_number":129,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for cleaning node \u0027"},{"line_number":130,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":131,"context_line":"        return utils.cleaning_error_handler(task, msg,"}],"source_content_type":"text/x-python","patch_set":3,"id":"c4fd9b7e_ee69256c","line":128,"updated":"2026-08-07 17:59:45.000000000","message":"except Exception (claude loves these)","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":126,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":127,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":128,"context_line":"    except Exception as e:"},{"line_number":129,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for cleaning node \u0027"},{"line_number":130,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":131,"context_line":"        return utils.cleaning_error_handler(task, msg,"}],"source_content_type":"text/x-python","patch_set":3,"id":"094661f0_6a5d3c61","line":128,"in_reply_to":"4abb8501_6b7e9ced","updated":"2026-08-07 21:50:46.000000000","message":"Done as a note, Autodetect will throw InvalidParameterValue if an autodetect interface doesn\u0027t exist. We can likely fix that throw with some configuration validation as well, but I\u0027m scoping it out for this change.","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"4d97e076fd5cf386f3cc99cab11bdb4688667d2b","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":126,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":127,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":128,"context_line":"    except Exception as e:"},{"line_number":129,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for cleaning node \u0027"},{"line_number":130,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":131,"context_line":"        return utils.cleaning_error_handler(task, msg,"}],"source_content_type":"text/x-python","patch_set":3,"id":"4abb8501_6b7e9ced","line":128,"in_reply_to":"5012d79b_257a9c91","updated":"2026-08-07 18:06:20.000000000","message":"Yeah my thought is more \"switch_interface should never throw and if I does I should know EXACTLY what would get thrown here\"","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":126,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":127,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":128,"context_line":"    except Exception as e:"},{"line_number":129,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for cleaning node \u0027"},{"line_number":130,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":131,"context_line":"        return utils.cleaning_error_handler(task, msg,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7704af_5874d61d","line":128,"in_reply_to":"c4fd9b7e_ee69256c","updated":"2026-08-07 21:50:46.000000000","message":"Done","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ce04558c4221c39e9a76c009547acaadc8566b03","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        # e.g. the autodetect deploy interface needs to resolve to a"},{"line_number":125,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":126,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":127,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":128,"context_line":"    except exception.InvalidParameterValue as e:"},{"line_number":129,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for cleaning node \u0027"},{"line_number":130,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":5,"id":"58a63ec9_98d49f05","line":127,"updated":"2026-08-11 14:21:12.000000000","message":"Do we need to undo this change after cleaning? Otherwise, the next deployment will use the concrete interface.","commit_id":"96b666a0a63ff8ac008f43e276abd50ad166e1da"},{"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":"bb57bd331895aa2fe85e186fae8dd9a601c2968b","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        # e.g. the autodetect deploy interface needs to resolve to a"},{"line_number":125,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":126,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":127,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":128,"context_line":"    except exception.InvalidParameterValue as e:"},{"line_number":129,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for cleaning node \u0027"},{"line_number":130,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"}],"source_content_type":"text/x-python","patch_set":5,"id":"be02646d_75acc432","line":127,"in_reply_to":"58a63ec9_98d49f05","updated":"2026-08-19 20:25:09.000000000","message":"Yes, and it does. LN105 in this file for the skip case, LN 388 in this file for the success case, LN611 in utils.py for error handling, and LN498 in this file for abort (abort was fixed in PS6)","commit_id":"96b666a0a63ff8ac008f43e276abd50ad166e1da"}],"ironic/conductor/manager.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"55efddb1716c124f1643472dc695b45c25954fad","unresolved":true,"context_lines":[{"line_number":2067,"context_line":""},{"line_number":2068,"context_line":"            # NOTE(JayF): _do_takeover() gives the deploy interface the"},{"line_number":2069,"context_line":"            # opportunity to switch interfaces, which the autodetect deploy"},{"line_number":2070,"context_line":"            # interface needs before takeover."},{"line_number":2071,"context_line":"            self._do_takeover(task)"},{"line_number":2072,"context_line":""},{"line_number":2073,"context_line":"            LOG.info(\"Successfully adopted node %(node)s\","}],"source_content_type":"text/x-python","patch_set":3,"id":"98264985_941dc4db","line":2070,"updated":"2026-08-07 17:59:45.000000000","message":"useless claude note","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":2067,"context_line":""},{"line_number":2068,"context_line":"            # NOTE(JayF): _do_takeover() gives the deploy interface the"},{"line_number":2069,"context_line":"            # opportunity to switch interfaces, which the autodetect deploy"},{"line_number":2070,"context_line":"            # interface needs before takeover."},{"line_number":2071,"context_line":"            self._do_takeover(task)"},{"line_number":2072,"context_line":""},{"line_number":2073,"context_line":"            LOG.info(\"Successfully adopted node %(node)s\","}],"source_content_type":"text/x-python","patch_set":3,"id":"7756a980_9810e7d4","line":2070,"in_reply_to":"98264985_941dc4db","updated":"2026-08-07 21:50:46.000000000","message":"Done","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ce04558c4221c39e9a76c009547acaadc8566b03","unresolved":true,"context_lines":[{"line_number":2102,"context_line":"        # e.g. the autodetect deploy interface needs to resolve to a"},{"line_number":2103,"context_line":"        # concrete interface before takeover. This is a no-op when the node"},{"line_number":2104,"context_line":"        # already uses a concrete interface, including when _do_adoption"},{"line_number":2105,"context_line":"        # has already switched it."},{"line_number":2106,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":2107,"context_line":"        task.driver.deploy.prepare(task)"},{"line_number":2108,"context_line":"        task.driver.deploy.take_over(task)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3774b97f_c7bf1c5f","line":2105,"updated":"2026-08-11 14:21:12.000000000","message":"_do_adoption no longer does it with your patch","commit_id":"96b666a0a63ff8ac008f43e276abd50ad166e1da"},{"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":"bb57bd331895aa2fe85e186fae8dd9a601c2968b","unresolved":false,"context_lines":[{"line_number":2102,"context_line":"        # e.g. the autodetect deploy interface needs to resolve to a"},{"line_number":2103,"context_line":"        # concrete interface before takeover. This is a no-op when the node"},{"line_number":2104,"context_line":"        # already uses a concrete interface, including when _do_adoption"},{"line_number":2105,"context_line":"        # has already switched it."},{"line_number":2106,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":2107,"context_line":"        task.driver.deploy.prepare(task)"},{"line_number":2108,"context_line":"        task.driver.deploy.take_over(task)"}],"source_content_type":"text/x-python","patch_set":5,"id":"b5cd4299_785db4e8","line":2105,"in_reply_to":"3774b97f_c7bf1c5f","updated":"2026-08-19 20:25:09.000000000","message":"Done","commit_id":"96b666a0a63ff8ac008f43e276abd50ad166e1da"}],"ironic/conductor/servicing.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"55efddb1716c124f1643472dc695b45c25954fad","unresolved":true,"context_lines":[{"line_number":46,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":47,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":48,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":49,"context_line":"    except Exception as e:"},{"line_number":50,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for servicing node \u0027"},{"line_number":51,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":52,"context_line":"        return utils.servicing_error_handler(task, msg,"}],"source_content_type":"text/x-python","patch_set":3,"id":"2a3ed205_ce7b0ead","line":49,"updated":"2026-08-07 17:59:45.000000000","message":"except Exception\n\nCan this even raise? I don\u0027t think it can...","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        # concrete interface before it can prepare the ramdisk. Nothing has"},{"line_number":47,"context_line":"        # been prepared yet, so there is nothing to tear down on failure."},{"line_number":48,"context_line":"        task.driver.deploy.switch_interface(task)"},{"line_number":49,"context_line":"    except Exception as e:"},{"line_number":50,"context_line":"        msg \u003d (_(\u0027Failed to select a deploy interface for servicing node \u0027"},{"line_number":51,"context_line":"                 \u0027%(node)s: %(err)s\u0027) % {\u0027node\u0027: node.uuid, \u0027err\u0027: e})"},{"line_number":52,"context_line":"        return utils.servicing_error_handler(task, msg,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a9429ce_91bb2194","line":49,"in_reply_to":"2a3ed205_ce7b0ead","updated":"2026-08-07 21:50:46.000000000","message":"Done","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"}],"ironic/drivers/modules/autodetect.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"1b95cc72158d1553494b9b0fb4f4902a8c1ff05e","unresolved":true,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        :param task: A TaskManager instance containing the node to act on."},{"line_number":216,"context_line":"        \"\"\""},{"line_number":217,"context_line":"        return self._switch_and_delegate(task, \u0027tear_down_cleaning\u0027)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    @METRICS.timer(\u0027AutodetectDeploy.prepare_service\u0027)"},{"line_number":220,"context_line":"    def prepare_service(self, task):"}],"source_content_type":"text/x-python","patch_set":2,"id":"8d07120c_57ff2052","line":217,"updated":"2026-08-07 17:25:55.000000000","message":"I don\u0027t think it should be possible that we get here without a concrete interface unless something weird has happened, we should probably just fail_not_switched in the tear_down cases...","commit_id":"e5f0e6db96809fdbd08d818e3d0fcc77a9be8370"},{"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":"55efddb1716c124f1643472dc695b45c25954fad","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        :param task: A TaskManager instance containing the node to act on."},{"line_number":216,"context_line":"        \"\"\""},{"line_number":217,"context_line":"        return self._switch_and_delegate(task, \u0027tear_down_cleaning\u0027)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    @METRICS.timer(\u0027AutodetectDeploy.prepare_service\u0027)"},{"line_number":220,"context_line":"    def prepare_service(self, task):"}],"source_content_type":"text/x-python","patch_set":2,"id":"08ee746c_4eb39584","line":217,"in_reply_to":"8d07120c_57ff2052","updated":"2026-08-07 17:59:45.000000000","message":"Done","commit_id":"e5f0e6db96809fdbd08d818e3d0fcc77a9be8370"},{"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":"55efddb1716c124f1643472dc695b45c25954fad","unresolved":true,"context_lines":[{"line_number":123,"context_line":"    def prepare(self, task):"},{"line_number":124,"context_line":"        \"\"\"Prepare the deployment environment for the task\u0027s node."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        This method should not be called directly, see deploy()."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        :param task: A TaskManager instance containing the node to act on."},{"line_number":129,"context_line":"        :raises: InstanceDeployFailure always."}],"source_content_type":"text/x-python","patch_set":3,"id":"24ece2aa_d674f79d","line":126,"updated":"2026-08-07 17:59:45.000000000","message":"these docstrings generally are weird, human cleanup desired","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    def prepare(self, task):"},{"line_number":124,"context_line":"        \"\"\"Prepare the deployment environment for the task\u0027s node."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        This method should not be called directly, see deploy()."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        :param task: A TaskManager instance containing the node to act on."},{"line_number":129,"context_line":"        :raises: InstanceDeployFailure always."}],"source_content_type":"text/x-python","patch_set":3,"id":"e54ab32a_4c110688","line":126,"in_reply_to":"24ece2aa_d674f79d","updated":"2026-08-07 21:50:46.000000000","message":"Done","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"}],"ironic/tests/unit/conductor/test_cleaning.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"55efddb1716c124f1643472dc695b45c25954fad","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @mock.patch.object(fake.FakeDeploy, \u0027tear_down_cleaning\u0027, autospec\u003dTrue)"},{"line_number":96,"context_line":"    @mock.patch.object(fake.FakeDeploy, \u0027switch_interface\u0027, autospec\u003dTrue)"},{"line_number":97,"context_line":"    def test__do_node_clean_switch_interface_fail(self, mock_switch,"},{"line_number":98,"context_line":"                                                  mock_tear_down):"},{"line_number":99,"context_line":"        \"\"\"Test a failure to resolve an interface fails the clean."},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6ae6a2_fa5fb4fd","line":97,"updated":"2026-08-07 17:59:45.000000000","message":"I think this test is testing something that can\u0027t happen?","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @mock.patch.object(fake.FakeDeploy, \u0027tear_down_cleaning\u0027, autospec\u003dTrue)"},{"line_number":96,"context_line":"    @mock.patch.object(fake.FakeDeploy, \u0027switch_interface\u0027, autospec\u003dTrue)"},{"line_number":97,"context_line":"    def test__do_node_clean_switch_interface_fail(self, mock_switch,"},{"line_number":98,"context_line":"                                                  mock_tear_down):"},{"line_number":99,"context_line":"        \"\"\"Test a failure to resolve an interface fails the clean."},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2b4a40e9_91fbfd1e","line":97,"in_reply_to":"9f6ae6a2_fa5fb4fd","updated":"2026-08-07 21:50:46.000000000","message":"I was wrong.","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"}],"ironic/tests/unit/conductor/test_servicing.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"55efddb1716c124f1643472dc695b45c25954fad","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        Nothing has been prepared at that point, so there must be no"},{"line_number":101,"context_line":"        attempt to tear anything down."},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        mock_switch.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":104,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":105,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":106,"context_line":"            provision_state\u003dstates.SERVICING,"}],"source_content_type":"text/x-python","patch_set":3,"id":"a8d08de4_d607403b","line":103,"updated":"2026-08-07 17:59:45.000000000","message":"Same deal here; I\u0027m unsure how this could fail late?","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        Nothing has been prepared at that point, so there must be no"},{"line_number":101,"context_line":"        attempt to tear anything down."},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        mock_switch.side_effect \u003d exception.InvalidParameterValue(\u0027error\u0027)"},{"line_number":104,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":105,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":106,"context_line":"            provision_state\u003dstates.SERVICING,"}],"source_content_type":"text/x-python","patch_set":3,"id":"2528bf52_89550223","line":103,"in_reply_to":"a8d08de4_d607403b","updated":"2026-08-07 21:50:46.000000000","message":"I was wrong.","commit_id":"4c47b7e73c3bffd515cab7739b53680903f54cae"}],"releasenotes/notes/fix-autodetect-cleaning-59d4d419a6b26013.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":"3b661e4b6ba31e69b4d776ae54773cdd8118e6a4","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes an issue where initial cleanings performed by the ``autodetect``"},{"line_number":5,"context_line":"    ``deploy_interface`` before a deployment was attempted would be silently"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"8df65dd9_47f061b9","line":2,"updated":"2026-08-07 17:27:48.000000000","message":"this should be security:, too","commit_id":"e5f0e6db96809fdbd08d818e3d0fcc77a9be8370"},{"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":"a5c1e1e90b0327b0c13e33dc487fad2e1db70afe","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Fixes an issue where initial cleanings performed by the ``autodetect``"},{"line_number":5,"context_line":"    ``deploy_interface`` before a deployment was attempted would be silently"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"7761489c_f38889d7","line":2,"in_reply_to":"8df65dd9_47f061b9","updated":"2026-08-07 21:50:46.000000000","message":"Done","commit_id":"e5f0e6db96809fdbd08d818e3d0fcc77a9be8370"}]}
