)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"2809e9821e6ca82c75b8a733edf8de12ead620c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"472ebe04_7f99d4ac","updated":"2025-06-04 21:04:21.000000000","message":"Was so happy it tested clean I missed the release note, updating","commit_id":"5fffaa3817017c19e0f6b8a674ae1d19f84d29a4"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"fe35f7ca875e9da6d1ee7cd29e74ba084b6c111e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"29eff858_5ca6eabf","updated":"2025-06-05 22:23:23.000000000","message":"Is there a reason we are not doing the retrieval, validation, and processing into \u0027just steps\u0027 outside of `ironic/conductor/manager.py`, probably at the API layer, in the NodeStatesController for instance?","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"b0f38920e6f2297502f0855033d8436417727377","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":21,"id":"e17dd524_b85af071","in_reply_to":"0828a3b1_189041ea","updated":"2025-06-11 15:21:43.000000000","message":"SGTM","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"},{"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":"e922542eca9e03b8cf92e8832c590c7ba5e37675","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":21,"id":"d10b49a1_824d711f","in_reply_to":"29eff858_5ca6eabf","updated":"2025-06-06 15:09:46.000000000","message":"Because I didn\u0027t think of it 😞. Seems like a good idea.","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"},{"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":"3f0e3730bc2438d274bff28268bc3a4563cff54b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":21,"id":"0828a3b1_189041ea","in_reply_to":"d10b49a1_824d711f","updated":"2025-06-10 21:17:28.000000000","message":"I went down this route... I don\u0027t think it\u0027s well suited to this case because we *don\u0027t* want it to error at the API level when we can\u0027t automated clean with a runbook; it needs to be treated as a cleaning error after the state transition has happened. Doing this work at the API level will make error handling awkward.\n\nI think this is probably good enough as-is, but if there are other ideas on how to structure it let me know.","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"}],"ironic/conductor/cleaning.py":[{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"f9e0bf0ee280290caef717cf31a0e825badc6870","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"@task_manager.require_exclusive_lock"},{"line_number":32,"context_line":"def do_node_clean(task, clean_steps\u003dNone, disable_ramdisk\u003dFalse,"},{"line_number":33,"context_line":"                  automated_with_steps\u003dFalse):"},{"line_number":34,"context_line":"    \"\"\"Internal RPC method to perform cleaning of a node."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    :param task: a TaskManager instance with an exclusive lock on its node"}],"source_content_type":"text/x-python","patch_set":21,"id":"87850a69_ce68d77d","line":33,"range":{"start_line":33,"start_character":18,"end_line":33,"end_character":44},"updated":"2025-06-05 22:19:45.000000000","message":"nit: missing a docstring description","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"},{"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":"7e8e32177ddde7275608b2736b7de7d665ccc97f","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"@task_manager.require_exclusive_lock"},{"line_number":32,"context_line":"def do_node_clean(task, clean_steps\u003dNone, disable_ramdisk\u003dFalse,"},{"line_number":33,"context_line":"                  automated_with_steps\u003dFalse):"},{"line_number":34,"context_line":"    \"\"\"Internal RPC method to perform cleaning of a node."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    :param task: a TaskManager instance with an exclusive lock on its node"}],"source_content_type":"text/x-python","patch_set":21,"id":"396a0cb1_3dbba412","line":33,"range":{"start_line":33,"start_character":18,"end_line":33,"end_character":44},"in_reply_to":"87850a69_ce68d77d","updated":"2025-06-11 14:31:45.000000000","message":"Done","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"}],"ironic/conductor/steps.py":[{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"f9e0bf0ee280290caef717cf31a0e825badc6870","unresolved":true,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    # NOTE(JayF): This is true when doing manual cleaning or when doing"},{"line_number":320,"context_line":"    #             cleaning via runbook."},{"line_number":321,"context_line":"    if use_existing_steps is True:"},{"line_number":322,"context_line":"        # For manual cleaning, the list of cleaning steps was specified by the"},{"line_number":323,"context_line":"        # user and already saved in node.driver_internal_info[\u0027clean_steps\u0027]."},{"line_number":324,"context_line":"        # Now that we know what the driver\u0027s available clean steps are, we can"}],"source_content_type":"text/x-python","patch_set":21,"id":"32bd3354_d1022aa8","line":321,"range":{"start_line":321,"start_character":0,"end_line":321,"end_character":34},"updated":"2025-06-05 22:19:45.000000000","message":"nit: `use_existing_steps` is same thing as `not manual_clean` (?). We probably do not need the additional parameter, here and everywhere it\u0027s passed down. That also removes the need for a `declarative_cleaning` variable.","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"},{"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":"e922542eca9e03b8cf92e8832c590c7ba5e37675","unresolved":true,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    # NOTE(JayF): This is true when doing manual cleaning or when doing"},{"line_number":320,"context_line":"    #             cleaning via runbook."},{"line_number":321,"context_line":"    if use_existing_steps is True:"},{"line_number":322,"context_line":"        # For manual cleaning, the list of cleaning steps was specified by the"},{"line_number":323,"context_line":"        # user and already saved in node.driver_internal_info[\u0027clean_steps\u0027]."},{"line_number":324,"context_line":"        # Now that we know what the driver\u0027s available clean steps are, we can"}],"source_content_type":"text/x-python","patch_set":21,"id":"721b734d_b396e324","line":321,"range":{"start_line":321,"start_character":0,"end_line":321,"end_character":34},"in_reply_to":"32bd3354_d1022aa8","updated":"2025-06-06 15:09:46.000000000","message":"No it\u0027s not; here are the cases:\n\nexisting_steps True, manual_clean True, -\u003e manual cleaning\nexisting_steps True, manual_clean False -\u003e automated cleaning via runbook\nexisting_steps False, manual_clean False -\u003e automated cleaning via autogenerated steps\n\nSo we need a flag to say \"it\u0027s automated, but I already gave you steps\"","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"b0f38920e6f2297502f0855033d8436417727377","unresolved":true,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    # NOTE(JayF): This is true when doing manual cleaning or when doing"},{"line_number":320,"context_line":"    #             cleaning via runbook."},{"line_number":321,"context_line":"    if use_existing_steps is True:"},{"line_number":322,"context_line":"        # For manual cleaning, the list of cleaning steps was specified by the"},{"line_number":323,"context_line":"        # user and already saved in node.driver_internal_info[\u0027clean_steps\u0027]."},{"line_number":324,"context_line":"        # Now that we know what the driver\u0027s available clean steps are, we can"}],"source_content_type":"text/x-python","patch_set":21,"id":"e15b9449_17e24e64","line":321,"range":{"start_line":321,"start_character":0,"end_line":321,"end_character":34},"in_reply_to":"721b734d_b396e324","updated":"2025-06-11 15:21:43.000000000","message":"Good to know.","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"}],"ironic/conf/conductor.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"f7e58cc4f40aad87edcd8cc401eb2af702f78acb","unresolved":true,"context_lines":[{"line_number":149,"context_line":"                       \u0027that node is managed by; see the individual \u0027"},{"line_number":150,"context_line":"                       \u0027driver\\\u0027s documentation for details.\u0027)),"},{"line_number":151,"context_line":"    # TODO(JayF): I really need to find a better way to refer to autogenerated"},{"line_number":152,"context_line":"    #  than \"traditional ironic method\""},{"line_number":153,"context_line":"    cfg.StrOpt(\u0027automated_cleaning_step_source\u0027,"},{"line_number":154,"context_line":"               default\u003d\u0027autogenerated\u0027,"},{"line_number":155,"context_line":"               mutable\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":18,"id":"c563400b_91a40262","line":152,"updated":"2025-06-04 21:26:10.000000000","message":"suggestions requested, especially if you can find a way to say it without sounding like an encyclopedia.","commit_id":"5fffaa3817017c19e0f6b8a674ae1d19f84d29a4"},{"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":"7e8e32177ddde7275608b2736b7de7d665ccc97f","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                       \u0027that node is managed by; see the individual \u0027"},{"line_number":150,"context_line":"                       \u0027driver\\\u0027s documentation for details.\u0027)),"},{"line_number":151,"context_line":"    # TODO(JayF): I really need to find a better way to refer to autogenerated"},{"line_number":152,"context_line":"    #  than \"traditional ironic method\""},{"line_number":153,"context_line":"    cfg.StrOpt(\u0027automated_cleaning_step_source\u0027,"},{"line_number":154,"context_line":"               default\u003d\u0027autogenerated\u0027,"},{"line_number":155,"context_line":"               mutable\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":18,"id":"5d294568_6d98437a","line":152,"in_reply_to":"c563400b_91a40262","updated":"2025-06-11 14:31:45.000000000","message":"Done","commit_id":"5fffaa3817017c19e0f6b8a674ae1d19f84d29a4"}],"releasenotes/notes/automated-cleaning-by-runbook-b5b4b1f0f51040b0.yaml":[{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"f9e0bf0ee280290caef717cf31a0e825badc6870","unresolved":true,"context_lines":[{"line_number":35,"context_line":"    attempt that resolves to an incompatible runbook will cause an error"},{"line_number":36,"context_line":"    and leave the node uncleaned in a clean fail state."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"ecurity:"},{"line_number":39,"context_line":"  - |"},{"line_number":40,"context_line":"    This change permits declarative cleaning via use of runbooks. Please note"},{"line_number":41,"context_line":"    there is no validation that a runbook performs typical, expected cleaning"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"741c2ad6_a63db157","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":7},"updated":"2025-06-05 22:19:45.000000000","message":"missing an \u0027S\u0027","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"},{"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":"e922542eca9e03b8cf92e8832c590c7ba5e37675","unresolved":true,"context_lines":[{"line_number":35,"context_line":"    attempt that resolves to an incompatible runbook will cause an error"},{"line_number":36,"context_line":"    and leave the node uncleaned in a clean fail state."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"ecurity:"},{"line_number":39,"context_line":"  - |"},{"line_number":40,"context_line":"    This change permits declarative cleaning via use of runbooks. Please note"},{"line_number":41,"context_line":"    there is no validation that a runbook performs typical, expected cleaning"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"e4453e96_866f6529","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":7},"in_reply_to":"741c2ad6_a63db157","updated":"2025-06-06 15:09:46.000000000","message":"This was fixed locally and never git-added :|","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"},{"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":"7e8e32177ddde7275608b2736b7de7d665ccc97f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    attempt that resolves to an incompatible runbook will cause an error"},{"line_number":36,"context_line":"    and leave the node uncleaned in a clean fail state."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"ecurity:"},{"line_number":39,"context_line":"  - |"},{"line_number":40,"context_line":"    This change permits declarative cleaning via use of runbooks. Please note"},{"line_number":41,"context_line":"    there is no validation that a runbook performs typical, expected cleaning"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"a3c42f31_83abc764","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":7},"in_reply_to":"e4453e96_866f6529","updated":"2025-06-11 14:31:45.000000000","message":"Done","commit_id":"0ee5858294b1f492776d3b0a2f877dbe25735e2b"}]}
