)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6ec8ca859160639fb6a8af4aca4765e95ea53aac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5476383e_4911ff86","updated":"2026-02-02 18:11:52.000000000","message":"Seems to work in my testing.","commit_id":"9ad1fb58548edc6dfefded550da01a0f9ccc9bd8"},{"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":"1bccfcc96a60e214607ccc222afcea53b2f9c732","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"04e3d2cc_a8be2255","updated":"2026-03-02 15:18:07.000000000","message":"Making abort actually abort in all cases will be a follow up, and treated as a bug. Per 3/2 meeting.","commit_id":"128fdc5fc6c92f0423a86892f2d33ad67d7b9d3a"}],"doc/source/contributor/webapi-version-history.rst":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"3b1887b2dffb9da707a228d3871a6005b339d9fb","unresolved":true,"context_lines":[{"line_number":11,"context_line":"------------------------"},{"line_number":12,"context_line":"Add support for ``disable_ramdisk`` parameter to provisioning endpoint"},{"line_number":13,"context_line":"``/v1/nodes/{node_ident}/states/provision`` for the \u0027service\u0027 verb."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"1.107 (Gazpacho)"},{"line_number":16,"context_line":"------------------------"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"2cefd873_6de59a5a","side":"PARENT","line":14,"updated":"2026-02-04 09:30:17.000000000","message":"nit: blank line removed?","commit_id":"24303abdfa9bb3417ab74f7501794c165c7ede3a"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"4af90d116475d2a3b77dcb073f35ba53526fc8d8","unresolved":false,"context_lines":[{"line_number":11,"context_line":"------------------------"},{"line_number":12,"context_line":"Add support for ``disable_ramdisk`` parameter to provisioning endpoint"},{"line_number":13,"context_line":"``/v1/nodes/{node_ident}/states/provision`` for the \u0027service\u0027 verb."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"1.107 (Gazpacho)"},{"line_number":16,"context_line":"------------------------"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"b92947c3_abb7c707","side":"PARENT","line":14,"in_reply_to":"2cefd873_6de59a5a","updated":"2026-02-04 16:18:56.000000000","message":"Done","commit_id":"24303abdfa9bb3417ab74f7501794c165c7ede3a"}],"ironic/conductor/deployments.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"20af73638cb8b446d51f4689bb798e6310f04c02","unresolved":true,"context_lines":[{"line_number":538,"context_line":"    \"\"\""},{"line_number":539,"context_line":"    node \u003d task.node"},{"line_number":540,"context_line":"    try:"},{"line_number":541,"context_line":"        task.driver.deploy.clean_up(task)"},{"line_number":542,"context_line":"    except Exception as e:"},{"line_number":543,"context_line":"        log_msg \u003d (_(\u0027Failed to clean up deploying for node %(node)s \u0027"},{"line_number":544,"context_line":"                     \u0027after aborting the operation. Error: %(err)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":2,"id":"60c49384_a5852e31","line":541,"updated":"2026-01-30 15:17:53.000000000","message":"Should I call clean_up or tear_down? I no longer remember","commit_id":"08ad2f5f22026b112582a4dd3d34500c5c4e3106"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ac6f4afaee74e0cd7169a79a3413d4a515b49d8f","unresolved":false,"context_lines":[{"line_number":538,"context_line":"    \"\"\""},{"line_number":539,"context_line":"    node \u003d task.node"},{"line_number":540,"context_line":"    try:"},{"line_number":541,"context_line":"        task.driver.deploy.clean_up(task)"},{"line_number":542,"context_line":"    except Exception as e:"},{"line_number":543,"context_line":"        log_msg \u003d (_(\u0027Failed to clean up deploying for node %(node)s \u0027"},{"line_number":544,"context_line":"                     \u0027after aborting the operation. Error: %(err)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":2,"id":"dddc470b_3ac3c3ea","line":541,"in_reply_to":"60c49384_a5852e31","updated":"2026-02-02 17:31:02.000000000","message":"I think tear_down is for a successful deployment, so calling clean_up is correct.","commit_id":"08ad2f5f22026b112582a4dd3d34500c5c4e3106"},{"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":"801b2b128e34bc494dda56c89f0d1fbb7e102f1f","unresolved":true,"context_lines":[{"line_number":548,"context_line":"                  \u0027completed. However, since there are no more \u0027"},{"line_number":549,"context_line":"                  \u0027deploy steps after this, the abort is not going \u0027"},{"line_number":550,"context_line":"                  \u0027to be done.\u0027, {\u0027node\u0027: node.uuid,"},{"line_number":551,"context_line":"                                  \u0027step\u0027: step_name})"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    do_next_deploy_step(task, next_step_index)"},{"line_number":554,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"55c3c1db_62f7ee71","line":551,"updated":"2026-02-10 18:50:24.000000000","message":"I have an issue with this behavior -- if an operator issues an `abort` call, even if the technical steps of the deployment have completed, it seems wrong to not honor that abort. Think about an abuse scenario where I\u0027m trying to prevent a deployment from completing for someone who is abusing my services.","commit_id":"128fdc5fc6c92f0423a86892f2d33ad67d7b9d3a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"72188c898cc91811a685eb787335a3631033371b","unresolved":true,"context_lines":[{"line_number":548,"context_line":"                  \u0027completed. However, since there are no more \u0027"},{"line_number":549,"context_line":"                  \u0027deploy steps after this, the abort is not going \u0027"},{"line_number":550,"context_line":"                  \u0027to be done.\u0027, {\u0027node\u0027: node.uuid,"},{"line_number":551,"context_line":"                                  \u0027step\u0027: step_name})"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    do_next_deploy_step(task, next_step_index)"},{"line_number":554,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"a724fdf0_99a5f760","line":551,"in_reply_to":"0d46981f_f5c230c5","updated":"2026-02-27 19:17:51.000000000","message":"SGTM","commit_id":"128fdc5fc6c92f0423a86892f2d33ad67d7b9d3a"},{"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":"ac5842f7ddf7b7f725e322e863eaca11eb71f215","unresolved":true,"context_lines":[{"line_number":548,"context_line":"                  \u0027completed. However, since there are no more \u0027"},{"line_number":549,"context_line":"                  \u0027deploy steps after this, the abort is not going \u0027"},{"line_number":550,"context_line":"                  \u0027to be done.\u0027, {\u0027node\u0027: node.uuid,"},{"line_number":551,"context_line":"                                  \u0027step\u0027: step_name})"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    do_next_deploy_step(task, next_step_index)"},{"line_number":554,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"0d46981f_f5c230c5","line":551,"in_reply_to":"1ecdf89a_4088cfd2","updated":"2026-02-27 18:55:36.000000000","message":"I discussed with Dmitry on IRC, I think the best course of action is:\n- Merge this with consistent behavior\n- Bug (for a later todo) or fix (immediately as a follow up) the behavior across all interfaces","commit_id":"128fdc5fc6c92f0423a86892f2d33ad67d7b9d3a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"361b6d0cd4bcfe56555591d0db4edb9269507ec8","unresolved":true,"context_lines":[{"line_number":548,"context_line":"                  \u0027completed. However, since there are no more \u0027"},{"line_number":549,"context_line":"                  \u0027deploy steps after this, the abort is not going \u0027"},{"line_number":550,"context_line":"                  \u0027to be done.\u0027, {\u0027node\u0027: node.uuid,"},{"line_number":551,"context_line":"                                  \u0027step\u0027: step_name})"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"    do_next_deploy_step(task, next_step_index)"},{"line_number":554,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ecdf89a_4088cfd2","line":551,"in_reply_to":"55c3c1db_62f7ee71","updated":"2026-02-27 16:33:12.000000000","message":"I agree with your logic, but we do the same thing for cleaning and servicing. Per IRC discussion, we may prefer to land this change as it is and then update all 3 cases with a release note. But I don\u0027t mind updating this change either. I guess we decide on Monday.","commit_id":"128fdc5fc6c92f0423a86892f2d33ad67d7b9d3a"}],"ironic/conductor/manager.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"20af73638cb8b446d51f4689bb798e6310f04c02","unresolved":true,"context_lines":[{"line_number":1576,"context_line":"                          \u0027node\u0027: node.uuid})"},{"line_number":1577,"context_line":"                deploy_step \u003d node.deploy_step"},{"line_number":1578,"context_line":"                if not deploy_step.get(\u0027abort_after\u0027):"},{"line_number":1579,"context_line":"                    deploy_step[\u0027abort_after\u0027] \u003d True"},{"line_number":1580,"context_line":"                    node.deploy_step \u003d deploy_step"},{"line_number":1581,"context_line":"                    node.save()"},{"line_number":1582,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":2,"id":"b7f737ce_79c6009a","line":1579,"updated":"2026-01-30 15:17:53.000000000","message":"Note to myself: ensure abort_after is handled","commit_id":"08ad2f5f22026b112582a4dd3d34500c5c4e3106"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ac6f4afaee74e0cd7169a79a3413d4a515b49d8f","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"                          \u0027node\u0027: node.uuid})"},{"line_number":1577,"context_line":"                deploy_step \u003d node.deploy_step"},{"line_number":1578,"context_line":"                if not deploy_step.get(\u0027abort_after\u0027):"},{"line_number":1579,"context_line":"                    deploy_step[\u0027abort_after\u0027] \u003d True"},{"line_number":1580,"context_line":"                    node.deploy_step \u003d deploy_step"},{"line_number":1581,"context_line":"                    node.save()"},{"line_number":1582,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":2,"id":"4aff0f3f_dd26f31b","line":1579,"in_reply_to":"b7f737ce_79c6009a","updated":"2026-02-02 17:31:02.000000000","message":"Done","commit_id":"08ad2f5f22026b112582a4dd3d34500c5c4e3106"}],"releasenotes/notes/deploywait-abort-e8f9a2b4c7d3e1f5.yaml":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"3b1887b2dffb9da707a228d3871a6005b339d9fb","unresolved":true,"context_lines":[{"line_number":13,"context_line":"    This allows operators to investigate the issue or retry deployment without"},{"line_number":14,"context_line":"    waiting for a full cleaning cycle."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    This feature is available starting with API version 1.107. When a node"},{"line_number":17,"context_line":"    is in DEPLOYWAIT and has a non-abortable deploy step running, the abort"},{"line_number":18,"context_line":"    request will flag the step to be aborted after completion, similar to"},{"line_number":19,"context_line":"    the behavior for cleaning and servicing."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"1ed9834f_e01efd85","line":16,"range":{"start_line":16,"start_character":55,"end_line":16,"end_character":61},"updated":"2026-02-04 09:30:17.000000000","message":"1.110 ?","commit_id":"9ad1fb58548edc6dfefded550da01a0f9ccc9bd8"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"4af90d116475d2a3b77dcb073f35ba53526fc8d8","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    This allows operators to investigate the issue or retry deployment without"},{"line_number":14,"context_line":"    waiting for a full cleaning cycle."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    This feature is available starting with API version 1.107. When a node"},{"line_number":17,"context_line":"    is in DEPLOYWAIT and has a non-abortable deploy step running, the abort"},{"line_number":18,"context_line":"    request will flag the step to be aborted after completion, similar to"},{"line_number":19,"context_line":"    the behavior for cleaning and servicing."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"a73f9f94_7bcfd260","line":16,"range":{"start_line":16,"start_character":55,"end_line":16,"end_character":61},"in_reply_to":"1ed9834f_e01efd85","updated":"2026-02-04 16:18:56.000000000","message":"Done","commit_id":"9ad1fb58548edc6dfefded550da01a0f9ccc9bd8"},{"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":"801b2b128e34bc494dda56c89f0d1fbb7e102f1f","unresolved":true,"context_lines":[{"line_number":11,"context_line":"    cleaning, aborting from DEPLOYWAIT performs a deployment cleanup and"},{"line_number":12,"context_line":"    leaves the node in DEPLOYFAIL state without triggering automated cleaning."},{"line_number":13,"context_line":"    This allows operators to investigate the issue or retry deployment without"},{"line_number":14,"context_line":"    waiting for a full cleaning cycle."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    This feature is available starting with API version 1.110. When a node"},{"line_number":17,"context_line":"    is in DEPLOYWAIT and has a non-abortable deploy step running, the abort"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"4dea8d24_eb8ac777","line":14,"updated":"2026-02-10 18:50:24.000000000","message":"I\u0027ll note this doc is misleading based on behavior if you attempt to abort the last step in a deployment, and it\u0027s abortable\u003dFalse (that deployment will succeed, subverting operator expectations+intent)","commit_id":"128fdc5fc6c92f0423a86892f2d33ad67d7b9d3a"},{"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":"ac5842f7ddf7b7f725e322e863eaca11eb71f215","unresolved":true,"context_lines":[{"line_number":11,"context_line":"    cleaning, aborting from DEPLOYWAIT performs a deployment cleanup and"},{"line_number":12,"context_line":"    leaves the node in DEPLOYFAIL state without triggering automated cleaning."},{"line_number":13,"context_line":"    This allows operators to investigate the issue or retry deployment without"},{"line_number":14,"context_line":"    waiting for a full cleaning cycle."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    This feature is available starting with API version 1.110. When a node"},{"line_number":17,"context_line":"    is in DEPLOYWAIT and has a non-abortable deploy step running, the abort"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"a00533b4_d0e742a0","line":14,"in_reply_to":"4dea8d24_eb8ac777","updated":"2026-02-27 18:55:36.000000000","message":"We should still fix the documentation here, IMO.","commit_id":"128fdc5fc6c92f0423a86892f2d33ad67d7b9d3a"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"72188c898cc91811a685eb787335a3631033371b","unresolved":true,"context_lines":[{"line_number":11,"context_line":"    cleaning, aborting from DEPLOYWAIT performs a deployment cleanup and"},{"line_number":12,"context_line":"    leaves the node in DEPLOYFAIL state without triggering automated cleaning."},{"line_number":13,"context_line":"    This allows operators to investigate the issue or retry deployment without"},{"line_number":14,"context_line":"    waiting for a full cleaning cycle."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"    This feature is available starting with API version 1.110. When a node"},{"line_number":17,"context_line":"    is in DEPLOYWAIT and has a non-abortable deploy step running, the abort"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"97276aa5_10d74568","line":14,"in_reply_to":"a00533b4_d0e742a0","updated":"2026-02-27 19:17:51.000000000","message":"I\u0027m good with merging if we fix it with a quick or maybe not super quick follow-up on monday. My vote will reflect as such.","commit_id":"128fdc5fc6c92f0423a86892f2d33ad67d7b9d3a"}]}
