)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a0070de846e2a79a1efaa34f6de37ff9ec306a4c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"59a13007_4bb76482","updated":"2026-04-10 19:09:18.000000000","message":"One quick issue, the link to not-implemented is not present. That will be needed to be able to click into it on the sample build.","commit_id":"b7944a1006df90da1b330f90fa52682808ff89da"},{"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":"bce53f188d5e9d238d4566f2b22b390e46100240","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"39957eee_c2a7e45c","updated":"2026-04-13 17:17:59.000000000","message":"Update incoming.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"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":"d511a3ba324ea77f7552655aa63197b0eaec05be","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"05613e3f_e0af9746","updated":"2026-05-04 15:46:39.000000000","message":"This will need to be updated based on the shape \"Deferred Tasks\" takes since it will be central to this work.","commit_id":"9a583f084dfe0820b926b8482e795003e65538aa"}],"specs/approved/bulk-node-operations.rst":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"44c883d5365eeeb2433955a32d291a327b68c068","unresolved":true,"context_lines":[{"line_number":41,"context_line":"  ``resource_class``, ``conductor_group``, ``maintenance``, ``retired``,"},{"line_number":42,"context_line":"  ``fault``, ``project``, ``chassis_uuid``, ``conductor``,"},{"line_number":43,"context_line":"  ``description_contains``, ``parent_node``, ``sharded``,"},{"line_number":44,"context_line":"  ``power_lock``, etc."},{"line_number":45,"context_line":"- The patch body uses the same JSON Patch format as the existing"},{"line_number":46,"context_line":"  single-node PATCH endpoint."},{"line_number":47,"context_line":"- At least one filter is required. Unfiltered bulk updates are rejected"}],"source_content_type":"text/x-rst","patch_set":2,"id":"e58e57d9_4cb53c9a","line":44,"updated":"2026-04-13 17:03:26.000000000","message":"We likely want to explicitly ensure we have a test for limit, because I could see client side initiators also likely wanting to pass an explicit limit across.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"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":"bce53f188d5e9d238d4566f2b22b390e46100240","unresolved":true,"context_lines":[{"line_number":41,"context_line":"  ``resource_class``, ``conductor_group``, ``maintenance``, ``retired``,"},{"line_number":42,"context_line":"  ``fault``, ``project``, ``chassis_uuid``, ``conductor``,"},{"line_number":43,"context_line":"  ``description_contains``, ``parent_node``, ``sharded``,"},{"line_number":44,"context_line":"  ``power_lock``, etc."},{"line_number":45,"context_line":"- The patch body uses the same JSON Patch format as the existing"},{"line_number":46,"context_line":"  single-node PATCH endpoint."},{"line_number":47,"context_line":"- At least one filter is required. Unfiltered bulk updates are rejected"}],"source_content_type":"text/x-rst","patch_set":2,"id":"82da1a7f_b6a807a5","line":44,"in_reply_to":"e58e57d9_4cb53c9a","updated":"2026-04-13 17:17:59.000000000","message":"A unit test you mean?","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"44c883d5365eeeb2433955a32d291a327b68c068","unresolved":true,"context_lines":[{"line_number":46,"context_line":"  single-node PATCH endpoint."},{"line_number":47,"context_line":"- At least one filter is required. Unfiltered bulk updates are rejected"},{"line_number":48,"context_line":"  to prevent accidental fleet-wide changes."},{"line_number":49,"context_line":"- A configurable cap limits the number of nodes affected per call"},{"line_number":50,"context_line":"  (default: 1000). If the filter matches more nodes than the cap, the"},{"line_number":51,"context_line":"  request is rejected with 400."},{"line_number":52,"context_line":"- The operation is synchronous. Each matching node is patched in"},{"line_number":53,"context_line":"  sequence within a single API request. For most field updates this is"},{"line_number":54,"context_line":"  fast; the cap bounds worst-case latency."}],"source_content_type":"text/x-rst","patch_set":2,"id":"1b8ad55a_143f1dba","line":51,"range":{"start_line":49,"start_character":0,"end_line":51,"end_character":31},"updated":"2026-04-13 17:03:26.000000000","message":"So a key item which comes to mind is the overall request flow and who handles the processes. I guess 1000 nodes in sequence is super problematic, but perhaps a client could somehow chunk the requests?\n\nI\u0027 guess I\u0027m worried about batching up 1000 node ops on the API side in terms of front-end preparation and then back-end request spawn because 1000 would be a scaled environment already for the number of tasks a conductor can handle.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"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":"bce53f188d5e9d238d4566f2b22b390e46100240","unresolved":true,"context_lines":[{"line_number":46,"context_line":"  single-node PATCH endpoint."},{"line_number":47,"context_line":"- At least one filter is required. Unfiltered bulk updates are rejected"},{"line_number":48,"context_line":"  to prevent accidental fleet-wide changes."},{"line_number":49,"context_line":"- A configurable cap limits the number of nodes affected per call"},{"line_number":50,"context_line":"  (default: 1000). If the filter matches more nodes than the cap, the"},{"line_number":51,"context_line":"  request is rejected with 400."},{"line_number":52,"context_line":"- The operation is synchronous. Each matching node is patched in"},{"line_number":53,"context_line":"  sequence within a single API request. For most field updates this is"},{"line_number":54,"context_line":"  fast; the cap bounds worst-case latency."}],"source_content_type":"text/x-rst","patch_set":2,"id":"528a33d0_00de5c07","line":51,"range":{"start_line":49,"start_character":0,"end_line":51,"end_character":31},"in_reply_to":"1b8ad55a_143f1dba","updated":"2026-04-13 17:17:59.000000000","message":"Do we reduce the default value or you\u0027re thinking about the method of execution. Maybe the deferred tasks feature can be handy here.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"44c883d5365eeeb2433955a32d291a327b68c068","unresolved":true,"context_lines":[{"line_number":56,"context_line":"  operation continues for remaining nodes. The response body contains"},{"line_number":57,"context_line":"  per-node results so the caller knows exactly what succeeded and what"},{"line_number":58,"context_line":"  failed."},{"line_number":59,"context_line":"- RBAC: the same field-level policies that apply to single-node PATCH"},{"line_number":60,"context_line":"  are enforced per node. If the caller lacks permission for a specific"},{"line_number":61,"context_line":"  node (e.g., owner-scoped policy), that node is skipped with a 403"},{"line_number":62,"context_line":"  entry in the results."},{"line_number":63,"context_line":"- Nodes with an active target provision state are skipped with a 409"},{"line_number":64,"context_line":"  entry, consistent with single-node PATCH behavior."},{"line_number":65,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9939ed00_94fea8d8","line":62,"range":{"start_line":59,"start_character":1,"end_line":62,"end_character":23},"updated":"2026-04-13 17:03:26.000000000","message":"so, minimally, if project is passed across as an argument, as it does in the query pattern under the hood., they can at least see and the nodes will be in the query result set to be acted upon.\n\nSo I guess we\u0027re heading into a pattern of:\n* Query the node list\n* API surface takes the node list and starts executing policy checks for each node with the supplied credentials\n* The API then starts sending messages over RPC to the conductors with the actual patch actions...\n\nThe issue here is if someone doesn\u0027t have access, we shouldn\u0027t 403 the entire operation,  Are we going to pre-flight every access check? and then batch out the RPC actions? I guess we could...","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"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":"bce53f188d5e9d238d4566f2b22b390e46100240","unresolved":true,"context_lines":[{"line_number":56,"context_line":"  operation continues for remaining nodes. The response body contains"},{"line_number":57,"context_line":"  per-node results so the caller knows exactly what succeeded and what"},{"line_number":58,"context_line":"  failed."},{"line_number":59,"context_line":"- RBAC: the same field-level policies that apply to single-node PATCH"},{"line_number":60,"context_line":"  are enforced per node. If the caller lacks permission for a specific"},{"line_number":61,"context_line":"  node (e.g., owner-scoped policy), that node is skipped with a 403"},{"line_number":62,"context_line":"  entry in the results."},{"line_number":63,"context_line":"- Nodes with an active target provision state are skipped with a 409"},{"line_number":64,"context_line":"  entry, consistent with single-node PATCH behavior."},{"line_number":65,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"a2f5c86b_df8d689f","line":62,"range":{"start_line":59,"start_character":1,"end_line":62,"end_character":23},"in_reply_to":"9939ed00_94fea8d8","updated":"2026-04-13 17:17:59.000000000","message":"I think pre-flight check is on the table. I wasn\u0027t also thinking we 403 hthe entire operation, just for that node.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"361b6e3a5694a29727316579665167dc529389fc","unresolved":true,"context_lines":[{"line_number":56,"context_line":"  operation continues for remaining nodes. The response body contains"},{"line_number":57,"context_line":"  per-node results so the caller knows exactly what succeeded and what"},{"line_number":58,"context_line":"  failed."},{"line_number":59,"context_line":"- RBAC: the same field-level policies that apply to single-node PATCH"},{"line_number":60,"context_line":"  are enforced per node. If the caller lacks permission for a specific"},{"line_number":61,"context_line":"  node (e.g., owner-scoped policy), that node is skipped with a 403"},{"line_number":62,"context_line":"  entry in the results."},{"line_number":63,"context_line":"- Nodes with an active target provision state are skipped with a 409"},{"line_number":64,"context_line":"  entry, consistent with single-node PATCH behavior."},{"line_number":65,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"f1d8eb4f_467dc03a","line":62,"range":{"start_line":59,"start_character":1,"end_line":62,"end_character":23},"in_reply_to":"a2f5c86b_df8d689f","updated":"2026-04-20 15:41:08.000000000","message":"Well, if query based, then they shouldn\u0027t be able to *see* the node.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"44c883d5365eeeb2433955a32d291a327b68c068","unresolved":true,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"The ``filters`` object uses the same keys as the query parameters on"},{"line_number":112,"context_line":"``GET /v1/nodes``. List-valued filters (e.g., ``shard``) accept arrays."},{"line_number":113,"context_line":"At least one filter key is required."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"The ``patch`` array uses the same JSON Patch format as"},{"line_number":116,"context_line":"``PATCH /v1/nodes/{node_ident}``."}],"source_content_type":"text/x-rst","patch_set":2,"id":"abdb346b_de1cc3cb","line":113,"updated":"2026-04-13 17:03:26.000000000","message":"I\u0027d prefer we include a note that the project filter would be checked and auto-injected for the query generation and rbac to be honored.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"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":"bce53f188d5e9d238d4566f2b22b390e46100240","unresolved":true,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"The ``filters`` object uses the same keys as the query parameters on"},{"line_number":112,"context_line":"``GET /v1/nodes``. List-valued filters (e.g., ``shard``) accept arrays."},{"line_number":113,"context_line":"At least one filter key is required."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"The ``patch`` array uses the same JSON Patch format as"},{"line_number":116,"context_line":"``PATCH /v1/nodes/{node_ident}``."}],"source_content_type":"text/x-rst","patch_set":2,"id":"336b1b8e_d41a6de4","line":113,"in_reply_to":"abdb346b_de1cc3cb","updated":"2026-04-13 17:17:59.000000000","message":"++","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"44c883d5365eeeb2433955a32d291a327b68c068","unresolved":true,"context_lines":[{"line_number":133,"context_line":"             \"error\": \"Node is in state transition\","},{"line_number":134,"context_line":"             \"code\": 409},"},{"line_number":135,"context_line":"            {\"node_uuid\": \"ddd-...\", \"status\": \"failed\","},{"line_number":136,"context_line":"             \"error\": \"Forbidden\", \"code\": 403}"},{"line_number":137,"context_line":"        ]"},{"line_number":138,"context_line":"    }"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"eaf82e8e_f4a5aa5a","line":136,"updated":"2026-04-13 17:03:26.000000000","message":"Okay, this is a little weird that we\u0027re returning an http error code in the body. I... guess it works.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"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":"bce53f188d5e9d238d4566f2b22b390e46100240","unresolved":true,"context_lines":[{"line_number":133,"context_line":"             \"error\": \"Node is in state transition\","},{"line_number":134,"context_line":"             \"code\": 409},"},{"line_number":135,"context_line":"            {\"node_uuid\": \"ddd-...\", \"status\": \"failed\","},{"line_number":136,"context_line":"             \"error\": \"Forbidden\", \"code\": 403}"},{"line_number":137,"context_line":"        ]"},{"line_number":138,"context_line":"    }"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9861cbe1_41a1863c","line":136,"in_reply_to":"eaf82e8e_f4a5aa5a","updated":"2026-04-13 17:17:59.000000000","message":"I will update to match what happens todays.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"44c883d5365eeeb2433955a32d291a327b68c068","unresolved":true,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"None. The API controller handles the bulk operation directly by"},{"line_number":205,"context_line":"iterating over matched nodes and calling the existing per-node update"},{"line_number":206,"context_line":"logic. No new RPC methods are needed because field updates do not"},{"line_number":207,"context_line":"require conductor-side execution."},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"Driver API impact"},{"line_number":210,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"437604e6_438909ae","line":207,"range":{"start_line":206,"start_character":6,"end_line":207,"end_character":33},"updated":"2026-04-13 17:03:26.000000000","message":"Uhh, I think you might want to check this statement. That being said, existing RPC update_node calls can occur, because locking still applies on bulk updates.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"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":"bce53f188d5e9d238d4566f2b22b390e46100240","unresolved":true,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"None. The API controller handles the bulk operation directly by"},{"line_number":205,"context_line":"iterating over matched nodes and calling the existing per-node update"},{"line_number":206,"context_line":"logic. No new RPC methods are needed because field updates do not"},{"line_number":207,"context_line":"require conductor-side execution."},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"Driver API impact"},{"line_number":210,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"4ffeeebd_82565747","line":207,"range":{"start_line":206,"start_character":6,"end_line":207,"end_character":33},"in_reply_to":"437604e6_438909ae","updated":"2026-04-13 17:17:59.000000000","message":"++","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"44c883d5365eeeb2433955a32d291a327b68c068","unresolved":true,"context_lines":[{"line_number":227,"context_line":"New RBAC rules:"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"- ``baremetal:node:bulk_patch`` — gates access to the bulk patch"},{"line_number":230,"context_line":"  endpoint. Default: ``is_admin:True``."},{"line_number":231,"context_line":"- ``baremetal:node:bulk_patch_preview`` — gates access to the preview"},{"line_number":232,"context_line":"  endpoint. Default: same as ``baremetal:node:list``."},{"line_number":233,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"a4b9c969_670e3fce","line":230,"range":{"start_line":230,"start_character":22,"end_line":230,"end_character":36},"updated":"2026-04-13 17:03:26.000000000","message":"-1, don\u0027t use is_admin:True.  Lets define a full policy.","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"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":"bce53f188d5e9d238d4566f2b22b390e46100240","unresolved":false,"context_lines":[{"line_number":227,"context_line":"New RBAC rules:"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"- ``baremetal:node:bulk_patch`` — gates access to the bulk patch"},{"line_number":230,"context_line":"  endpoint. Default: ``is_admin:True``."},{"line_number":231,"context_line":"- ``baremetal:node:bulk_patch_preview`` — gates access to the preview"},{"line_number":232,"context_line":"  endpoint. Default: same as ``baremetal:node:list``."},{"line_number":233,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"f7843d69_0d9df951","line":230,"range":{"start_line":230,"start_character":22,"end_line":230,"end_character":36},"in_reply_to":"a4b9c969_670e3fce","updated":"2026-04-13 17:17:59.000000000","message":"Acknowledged","commit_id":"79218d66f1c0c07bf5722cd9b1921a882c71ea49"},{"author":{"_account_id":37924,"name":"Abhishek Bongale","display_name":"abongale","email":"abhishekbongale@outlook.com","username":"abhibongale"},"change_message_id":"526580ddd76ba504d31d56c60bc180bf2033a27e","unresolved":true,"context_lines":[{"line_number":24,"context_line":"Proposed change"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Add a new ``POST /v1/nodes/bulk/patch`` endpoint that accepts filter"},{"line_number":28,"context_line":"criteria and a JSON Patch body. The API applies the patch to every node"},{"line_number":29,"context_line":"matching the filters, reusing the same filter parameters already"},{"line_number":30,"context_line":"available on ``GET /v1/nodes``."}],"source_content_type":"text/x-rst","patch_set":3,"id":"33a3e1f7_acc3cd4e","line":27,"range":{"start_line":27,"start_character":21,"end_line":27,"end_character":26},"updated":"2026-04-16 13:08:34.000000000","message":"Since, it\u0027s POST request it will be non-idempotent, right?\n\nIf bulk patch request times out after lets say 700/100 nodes succeeded due to network failure, can I just retry the full request? will it skip the those 700 nodes? \n\njust want to help to understand, retries","commit_id":"9a583f084dfe0820b926b8482e795003e65538aa"},{"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":"e726cfd015a40b847db52cb281056516d1a41bdc","unresolved":true,"context_lines":[{"line_number":24,"context_line":"Proposed change"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Add a new ``POST /v1/nodes/bulk/patch`` endpoint that accepts filter"},{"line_number":28,"context_line":"criteria and a JSON Patch body. The API applies the patch to every node"},{"line_number":29,"context_line":"matching the filters, reusing the same filter parameters already"},{"line_number":30,"context_line":"available on ``GET /v1/nodes``."}],"source_content_type":"text/x-rst","patch_set":3,"id":"d92c277f_e01bd806","line":27,"range":{"start_line":27,"start_character":21,"end_line":27,"end_character":26},"in_reply_to":"33a3e1f7_acc3cd4e","updated":"2026-04-20 14:50:48.000000000","message":"So, if we are filtering by a field that changes after a successful request, those nodes will obviously not be part of the batch. Also, yeah, I think we should prevent same value overrides.","commit_id":"9a583f084dfe0820b926b8482e795003e65538aa"},{"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":"4546bb9c81c4c5aa12f330308d0e10e149865710","unresolved":true,"context_lines":[{"line_number":91,"context_line":"   lacks atomicity reporting, and pushes complexity to every operator."},{"line_number":92,"context_line":"2. An async job-based approach. Adds significant complexity (job"},{"line_number":93,"context_line":"   tracking, polling) for an operation that is bounded by the cap and"},{"line_number":94,"context_line":"   typically completes in seconds. Could be added later if needed."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Data model impact"},{"line_number":97,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"22ff5e8a_26880800","line":94,"updated":"2026-04-16 22:39:52.000000000","message":"I think we need to take this scope on -- we\u0027ll need https://review.opendev.org/c/openstack/ironic-specs/+/954612 or something like it first, then the job of this bulk endpoint will be to populate a bunch of tasks. Then we can glom onto whatever error handling/retry logic is there.\n\nIf we want to force scope to synchronous only, we\u0027ll likely have to limit the items we\u0027ll accept in the patch. I\u0027m not sure I love that.\n\nEspecially for use cases like what dtantsur has, where he wants to kick off a bunch of firmware updates: that is going to *require* async behavior, unlike a simple database update.","commit_id":"9a583f084dfe0820b926b8482e795003e65538aa"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"808c0a769f5b58978dbbc38f67fd0c69d606b231","unresolved":true,"context_lines":[{"line_number":106,"context_line":"REST API impact"},{"line_number":107,"context_line":"---------------"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"POST /v1/nodes/bulk/patch"},{"line_number":110,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Applies a JSON Patch to all nodes matching the given filters. Request"}],"source_content_type":"text/x-rst","patch_set":3,"id":"32c107cf_4a7d5d95","line":109,"updated":"2026-04-20 15:35:18.000000000","message":"Please don\u0027t put anything under /v1/nodes, now we need to make sure nobody calls their node \"bulk\" :) Also, let\u0027s think about all this API as CRUD around tasks","commit_id":"9a583f084dfe0820b926b8482e795003e65538aa"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"808c0a769f5b58978dbbc38f67fd0c69d606b231","unresolved":true,"context_lines":[{"line_number":183,"context_line":"without applying any changes. Useful for operators to verify filters"},{"line_number":184,"context_line":"before executing."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"Request body: same ``filters`` object as above. ``patch`` is ignored if"},{"line_number":187,"context_line":"present."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"Response: 200 OK"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3da1fa6e_b28cde95","line":186,"updated":"2026-04-20 15:35:18.000000000","message":"GET with a body is unconventional. It may even work, but we better not do that.","commit_id":"9a583f084dfe0820b926b8482e795003e65538aa"}]}
