)]}'
{"/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":"b8c477d35db6fb73106fba06dc859fb4210cf06d","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Afonne-CID \u003cafonnepaulc@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-26 18:58:58 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"A specification for a node power lock feature"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is a proposal for a power lock functionality that allows operators"},{"line_number":10,"context_line":"to freeze a node\u0027s power state, blocking all power and provisioning"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"c6c317a8_146b24a3","line":7,"updated":"2026-04-16 22:36:30.000000000","message":"nit: just \"Node Power Lock Feature\" is sufficient","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"},{"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":"b8c477d35db6fb73106fba06dc859fb4210cf06d","unresolved":true,"context_lines":[{"line_number":10,"context_line":"to freeze a node\u0027s power state, blocking all power and provisioning"},{"line_number":11,"context_line":"operations."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Assisted-by: Claude Sonnet 4.6"},{"line_number":14,"context_line":"Change-Id: Iab959fab2f57cb6005b8587655380eb193e600d6"},{"line_number":15,"context_line":"Signed-off-by: Afonne-CID \u003cafonnepaulc@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ed59074d_861fca4f","line":13,"updated":"2026-04-16 22:36:30.000000000","message":"Ideally we have an RFE attached to this","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"}],"/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":"5755a61b6d8821535983b330847391ff753afcac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"894464d8_fd52a29d","updated":"2026-01-27 20:21:55.000000000","message":"For other reviewer context, this is one part of the split of the \"big red button\" spec.\n\nThe idea is to:\n- Add a power lockout (this)\n- Add a bulk-actions endpoint once completed (do X thing to nodes matching Y pattern)\n- Use the two together to bulk-power-lockout in case of emergency.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"6efc54b615883191107caf4e518fe47255786fda","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"73f994d0_57fb1e5c","updated":"2026-01-27 16:25:09.000000000","message":"I\u0027m a +1 on this. Only question for others if we should generically call it \"lock\". Don\u0027t let the node be deleted either when its locked. I believe nova has this functionality as well.\n\nI could then see two variants... operator lock and lessee lock. I\u0027m a lessee and I want to convey to my operator that this is a critical node so I lock it with a reason. But the operator could override because of legal, power, etc reasons. Then the operator lock couldn\u0027t be overridden by the lessee.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"b8c477d35db6fb73106fba06dc859fb4210cf06d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"afc241c6_d4785914","updated":"2026-04-16 22:36:30.000000000","message":"Mainly want us to have more certainty around how this impacts the nova driver.","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"}],"specs/approved/node-maintenance-extension.rst":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6d48c7498067ddc9c0f08f98511fae6c9fe70f7e","unresolved":true,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"``node.maintenance`` and ``node.maintenance_reason`` remain canonical at"},{"line_number":56,"context_line":"the API surface. Flips of the boolean are mirrored into the new table,"},{"line_number":57,"context_line":"so external consumers see the same maintenance state through both."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"This milestone ships the table, the data-layer primitives, and a single"},{"line_number":60,"context_line":"type ``legacy`` that mirrors the existing boolean. **No user-visible"}],"source_content_type":"text/x-rst","patch_set":3,"id":"69dcc091_fa7fe825","line":57,"updated":"2026-05-26 20:59:05.000000000","message":"Can you elaborate on the fate of the ``node.maintenance`` and ``node.maintenance_reason`` database table fields? Will maintenance changes be reflected in the node table as de-normalised data? Or will the maintenance state be determined with a join against the node_maintenance table? If it is the latter then that *might* have a scalability impact.","commit_id":"98596f5260103102b968dbb3fab167bb081e318f"},{"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":"8c3f348127cd9ecdaad488ab7f35f0272a470c08","unresolved":true,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"``node.maintenance`` and ``node.maintenance_reason`` remain canonical at"},{"line_number":56,"context_line":"the API surface. Flips of the boolean are mirrored into the new table,"},{"line_number":57,"context_line":"so external consumers see the same maintenance state through both."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"This milestone ships the table, the data-layer primitives, and a single"},{"line_number":60,"context_line":"type ``legacy`` that mirrors the existing boolean. **No user-visible"}],"source_content_type":"text/x-rst","patch_set":3,"id":"c0e691fb_a6d8f509","line":57,"in_reply_to":"69dcc091_fa7fe825","updated":"2026-05-26 21:49:11.000000000","message":"+1 good thought. I think ideally we\u0027d not have node.maintenance/maintenance_reason fields, but if we need a cache we could keep it. Calculating node.maintenance for storing a bool() is easy (And likely all our programatic checks need), calculating it for reason is not. \n\nEither way, I suspect our \"is node maintenanced?\" checks will evolve more nuance now that we have a way for it to","commit_id":"98596f5260103102b968dbb3fab167bb081e318f"},{"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":"8c3f348127cd9ecdaad488ab7f35f0272a470c08","unresolved":true,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"Indexes on ``(node_id)``, ``(node_id, released_at)``, and"},{"line_number":119,"context_line":"``(node_id, type, asserted_by)`` so future per-type readers and"},{"line_number":120,"context_line":"multi-party scenarios are covered without further migrations."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"No changes to the ``nodes`` table. Migration backfills one ``legacy``"},{"line_number":123,"context_line":"row per currently maintained node, copying ``maintenance_reason``."}],"source_content_type":"text/x-rst","patch_set":3,"id":"0afcbe31_13f5708b","line":120,"updated":"2026-05-26 21:49:11.000000000","message":"Do we have any mechanism for cleaning these up ala node history? \n\nI might suggest just doing full-deletes here, not soft-deletes, and removing the \"released_by/released_at\" fields and instead encoding that information in node history.","commit_id":"98596f5260103102b968dbb3fab167bb081e318f"},{"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":"8c3f348127cd9ecdaad488ab7f35f0272a470c08","unresolved":true,"context_lines":[{"line_number":133,"context_line":"None in this milestone. ``PUT`` / ``DELETE`` on"},{"line_number":134,"context_line":"``/v1/nodes/{ident}/maintenance`` keep operating identically; entries"},{"line_number":135,"context_line":"are mirrored as ``legacy``. Future types may add type-aware endpoints,"},{"line_number":136,"context_line":"each gated by its own microversion in its own spec."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"Client (CLI) impact"},{"line_number":139,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"0789afbb_1e37529c","line":136,"updated":"2026-05-26 21:49:11.000000000","message":"This is not sufficient for a moving-forward API. It\u0027s the ideal case for backwards compatability. We don\u0027t have to tackle the \"lock out\" case yet, per se, but we do need to define a new way to add/remove maintenances since there can be multiple.\n\nThis may require us to define some of the types ahead of time, which would probably be good for here. We already have:\n\n- Legacy\n- Ironic-set (with specific faults we could potentially map to types but don\u0027t have to?)\n- Maybe something to indicate failed hardware as a first-stab at a new, more specific type.\n\n\nI\u0027ll note that scoping also has to be considered here -- we\u0027re storing it, and it will impact the API -- for instance, will default policy allow a \"system\" scope maintenance to be unset by someone at \"project\" scope?\n\nI think we should consider these and put together some concrete use cases with example API calls/CLI commands, e.g.\n\n# Project owner knows machine is going for hardware replacement\nopenstack baremetal node myNode maintenance add --type HARDWARE_FAILURE --reason \"Disk 3 has bad sectors, scheduled for replacement see ticket http://myjira/ITTEAM-3743\"\n\n[include example REST API body to service this request here]\n\nAlso I\u0027d include examples for:\n- setting extra maintenance on machines already maintenance (e.g. 2 maints simultaneously)\n- removing one at a time\n- removing all at a time\n- RBAC errors (e.g. I can\u0027t remove this maintenance at this time)","commit_id":"98596f5260103102b968dbb3fab167bb081e318f"},{"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":"6d758f1a237021300135770e6f9157364604cca1","unresolved":true,"context_lines":[{"line_number":133,"context_line":"None in this milestone. ``PUT`` / ``DELETE`` on"},{"line_number":134,"context_line":"``/v1/nodes/{ident}/maintenance`` keep operating identically; entries"},{"line_number":135,"context_line":"are mirrored as ``legacy``. Future types may add type-aware endpoints,"},{"line_number":136,"context_line":"each gated by its own microversion in its own spec."},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"Client (CLI) impact"},{"line_number":139,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5f03a276_946a2b64","line":136,"in_reply_to":"0789afbb_1e37529c","updated":"2026-05-26 21:49:37.000000000","message":"ugh.\n\n```\n# Project owner knows machine is going for hardware replacement\nopenstack baremetal node myNode maintenance add --type HARDWARE_FAILURE --reason \"Disk 3 has bad sectors, scheduled for replacement see ticket http://myjira/ITTEAM-3743\"\n```\n\ndoes this render?","commit_id":"98596f5260103102b968dbb3fab167bb081e318f"}],"specs/approved/node-power-lock.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":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":17,"context_line":"While maintenance mode prevents scheduling, operators can still manually"},{"line_number":18,"context_line":"execute power operations on nodes in maintenance. There is no mechanism"},{"line_number":19,"context_line":"to hard-block all power state changes for safety, compliance or any other"},{"line_number":20,"context_line":"purposes."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Proposed change"},{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ac472100_772d5e5c","line":20,"updated":"2026-03-20 14:07:46.000000000","message":"Well, short of shutting down Ironic. :)  Might be worth while to point out.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":false,"context_lines":[{"line_number":17,"context_line":"While maintenance mode prevents scheduling, operators can still manually"},{"line_number":18,"context_line":"execute power operations on nodes in maintenance. There is no mechanism"},{"line_number":19,"context_line":"to hard-block all power state changes for safety, compliance or any other"},{"line_number":20,"context_line":"purposes."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Proposed change"},{"line_number":23,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"c3ae5e77_eb6a0b22","line":20,"in_reply_to":"ac472100_772d5e5c","updated":"2026-03-26 18:01:42.000000000","message":"Acknowledged","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":33,"context_line":"- Clean (includes power cycles during cleaning steps)"},{"line_number":34,"context_line":"- Rescue (requires power operations to boot rescue ramdisk)"},{"line_number":35,"context_line":"- Inspect (may require power operations depending on driver)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"These operations involve intentional power state changes, which would violate"},{"line_number":38,"context_line":"the guarantee of a frozen power state."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"b4a6af48_3d9a85f5","line":36,"updated":"2026-03-20 14:07:46.000000000","message":"Most of these are through the set_provision_state logic, I guess I\u0027m curious if the block would be there in the logic, or lower down in the logic. I think it would be best to be higher in the logic so when we get the request we block it overall, and then we explicitly also wrap the internal power setting logic to internally raise an exception if called.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":false,"context_lines":[{"line_number":33,"context_line":"- Clean (includes power cycles during cleaning steps)"},{"line_number":34,"context_line":"- Rescue (requires power operations to boot rescue ramdisk)"},{"line_number":35,"context_line":"- Inspect (may require power operations depending on driver)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"These operations involve intentional power state changes, which would violate"},{"line_number":38,"context_line":"the guarantee of a frozen power state."},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bd41fc3d_df1a6561","line":36,"in_reply_to":"b4a6af48_3d9a85f5","updated":"2026-03-26 18:01:42.000000000","message":"Acknowledged","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"**Field in ``nodes`` table:**"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"- ``power_lock`` (Boolean, default\u003dfalse, indexed)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"**New ``node_power_lockouts`` table:**"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"84b09cb4_d9e77122","line":50,"updated":"2026-03-20 14:07:46.000000000","message":"Cool, so if set, then and only then do we need to do a second level DB query. Okay.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"**Field in ``nodes`` table:**"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"- ``power_lock`` (Boolean, default\u003dfalse, indexed)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"**New ``node_power_lockouts`` table:**"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"630644b1_86b0b45f","line":50,"in_reply_to":"84b09cb4_d9e77122","updated":"2026-03-26 18:01:42.000000000","message":"Acknowledged","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":69,"context_line":"No new states."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Power lock check added before power and provisioning"},{"line_number":72,"context_line":"operations in both API and conductor layers."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Power-sync behavior: When ``power_lock\u003dtrue``, the power-sync task skips"},{"line_number":75,"context_line":"the node regardless of the ``[conductor]force_power_state_during_sync``"}],"source_content_type":"text/x-rst","patch_set":1,"id":"baa7a7d5_fe32643f","line":72,"updated":"2026-03-20 14:07:46.000000000","message":"Okay, I guess disregard my previous comment about what and where, but it might be good to echo it.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":false,"context_lines":[{"line_number":69,"context_line":"No new states."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Power lock check added before power and provisioning"},{"line_number":72,"context_line":"operations in both API and conductor layers."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Power-sync behavior: When ``power_lock\u003dtrue``, the power-sync task skips"},{"line_number":75,"context_line":"the node regardless of the ``[conductor]force_power_state_during_sync``"}],"source_content_type":"text/x-rst","patch_set":1,"id":"80cf0233_7eb0f99d","line":72,"in_reply_to":"baa7a7d5_fe32643f","updated":"2026-03-26 18:01:42.000000000","message":"Acknowledged","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"5755a61b6d8821535983b330847391ff753afcac","unresolved":true,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"If the node is currently reserved by a conductor for an in-flight operation,"},{"line_number":99,"context_line":"power-lock returns 409 Conflict. The operator should retry after the"},{"line_number":100,"context_line":"operation completes. Power-lock does not interrupt in-flight operations."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"DELETE /v1/nodes/{node_ident}/power-lock"},{"line_number":103,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"68f7b931_898bada1","line":100,"updated":"2026-01-27 20:21:55.000000000","message":"I think this is a given, but explicitly: all power lock/unlock operations need to be in node history, too.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"If the node is currently reserved by a conductor for an in-flight operation,"},{"line_number":99,"context_line":"power-lock returns 409 Conflict. The operator should retry after the"},{"line_number":100,"context_line":"operation completes. Power-lock does not interrupt in-flight operations."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"DELETE /v1/nodes/{node_ident}/power-lock"},{"line_number":103,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"d9d66d95_7e06e1c8","line":100,"in_reply_to":"68f7b931_898bada1","updated":"2026-03-20 14:07:46.000000000","message":"++, That way there is a discoverable \"what happened\".","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"If the node is currently reserved by a conductor for an in-flight operation,"},{"line_number":99,"context_line":"power-lock returns 409 Conflict. The operator should retry after the"},{"line_number":100,"context_line":"operation completes. Power-lock does not interrupt in-flight operations."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"DELETE /v1/nodes/{node_ident}/power-lock"},{"line_number":103,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"124538c8_fa141a32","line":100,"in_reply_to":"d9d66d95_7e06e1c8","updated":"2026-03-26 18:01:42.000000000","message":"Acknowledged","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":99,"context_line":"power-lock returns 409 Conflict. The operator should retry after the"},{"line_number":100,"context_line":"operation completes. Power-lock does not interrupt in-flight operations."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"DELETE /v1/nodes/{node_ident}/power-lock"},{"line_number":103,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Power-unlocks a node. Clears power lock fields."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Response: 204 No Content"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Errors: 403, 404"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"GET /v1/nodes/{node_ident}/power-lock"},{"line_number":112,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"6ec73b71_03a71df6","line":109,"range":{"start_line":102,"start_character":0,"end_line":109,"end_character":16},"updated":"2026-03-20 14:07:46.000000000","message":"Question to ponder, is this really the right way?\n\nFor example, in lockout/tagout practices, typically you can have *multiple* individuals lockout equipment, and you want them with their key to unlock the lock:\n\nExample lockout: \nhttps://www.uline.com/Product/Detail/H-3426/Lockout-Tagout/Steel-Lockout-Hasp-1\n\nWe have a table with reasons, why only have a singular unlock action? Do we explicitly want to respect the long held physical tradition model of any worker who has access to the equipment in that context to be able to lockout the equipment?","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"b8c477d35db6fb73106fba06dc859fb4210cf06d","unresolved":true,"context_lines":[{"line_number":99,"context_line":"power-lock returns 409 Conflict. The operator should retry after the"},{"line_number":100,"context_line":"operation completes. Power-lock does not interrupt in-flight operations."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"DELETE /v1/nodes/{node_ident}/power-lock"},{"line_number":103,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Power-unlocks a node. Clears power lock fields."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Response: 204 No Content"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Errors: 403, 404"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"GET /v1/nodes/{node_ident}/power-lock"},{"line_number":112,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"abded4c7_3d40cdd9","line":109,"range":{"start_line":102,"start_character":0,"end_line":109,"end_character":16},"in_reply_to":"58a16a37_303f97bd","updated":"2026-04-16 22:36:30.000000000","message":"Yeah like, it\u0027s useful for multiple use cases; I think the answer here is going to be project-based, with some kind of priority:\n\n- lock placed by lessee can be removed by lessee project, owner project, or system admin\n- lock placed by owner can only be removed by owner project or system admin\n- lock placed by system admin can only be removed by system admin\n\nbut I could forsee a case where folks wouldn\u0027t like the idea that the lessee is \"below\" the owner","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":true,"context_lines":[{"line_number":99,"context_line":"power-lock returns 409 Conflict. The operator should retry after the"},{"line_number":100,"context_line":"operation completes. Power-lock does not interrupt in-flight operations."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"DELETE /v1/nodes/{node_ident}/power-lock"},{"line_number":103,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Power-unlocks a node. Clears power lock fields."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Response: 204 No Content"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Errors: 403, 404"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"GET /v1/nodes/{node_ident}/power-lock"},{"line_number":112,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"e7116b6f_d7f7726c","line":109,"range":{"start_line":102,"start_character":0,"end_line":109,"end_character":16},"in_reply_to":"6ec73b71_03a71df6","updated":"2026-03-26 18:01:42.000000000","message":"Added to the PTG topic as an open question.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"04973768540398edc93c38fb107992d9b1afc7a5","unresolved":true,"context_lines":[{"line_number":99,"context_line":"power-lock returns 409 Conflict. The operator should retry after the"},{"line_number":100,"context_line":"operation completes. Power-lock does not interrupt in-flight operations."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"DELETE /v1/nodes/{node_ident}/power-lock"},{"line_number":103,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Power-unlocks a node. Clears power lock fields."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Response: 204 No Content"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Errors: 403, 404"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"GET /v1/nodes/{node_ident}/power-lock"},{"line_number":112,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":1,"id":"58a16a37_303f97bd","line":109,"range":{"start_line":102,"start_character":0,"end_line":109,"end_character":16},"in_reply_to":"e7116b6f_d7f7726c","updated":"2026-04-12 06:11:46.000000000","message":"I still think there’s two locks here. Lessee lock and operator lock. Lessee might lock it to say don’t screw me. While the operator might have a billing or legal reason.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":118,"context_line":".. code-block:: json"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    {"},{"line_number":121,"context_line":"        \"power_lock\": true,"},{"line_number":122,"context_line":"        \"reason\": \"DC cooling emergency\","},{"line_number":123,"context_line":"        \"locked_at\": \"2024-01-15T10:30:00Z\""},{"line_number":124,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":1,"id":"53874041_36a30ba3","line":121,"range":{"start_line":121,"start_character":9,"end_line":121,"end_character":19},"updated":"2026-03-20 14:07:46.000000000","message":"so, there is an inconsistency which bothers me here.\n\nLine 102: power-lock\nLine 111: power-lock\nLine 121: power_lock\nLine 126: power_lock\nLine 135: power_lock","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":true,"context_lines":[{"line_number":118,"context_line":".. code-block:: json"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    {"},{"line_number":121,"context_line":"        \"power_lock\": true,"},{"line_number":122,"context_line":"        \"reason\": \"DC cooling emergency\","},{"line_number":123,"context_line":"        \"locked_at\": \"2024-01-15T10:30:00Z\""},{"line_number":124,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":1,"id":"cc6fdf48_e903971b","line":121,"range":{"start_line":121,"start_character":9,"end_line":121,"end_character":19},"in_reply_to":"53874041_36a30ba3","updated":"2026-03-26 18:01:42.000000000","message":"Do you suggest it\u0027s normalized to underscores even for URL paths?","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"5755a61b6d8821535983b330847391ff753afcac","unresolved":true,"context_lines":[{"line_number":177,"context_line":"Nova driver impact"},{"line_number":178,"context_line":"------------------"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"None. Nova receives error responses for power-locked nodes."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"Ramdisk impact"},{"line_number":183,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"044c21eb_d46facd5","line":180,"updated":"2026-01-27 20:21:55.000000000","message":"It seems to me that if we have nodes that are \"power locked out\" we should consider seeing if we can make Nova consider them unavailable for scheduling.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":177,"context_line":"Nova driver impact"},{"line_number":178,"context_line":"------------------"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"None. Nova receives error responses for power-locked nodes."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"Ramdisk impact"},{"line_number":183,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"de419498_f019dd17","line":180,"in_reply_to":"044c21eb_d46facd5","updated":"2026-03-20 14:07:46.000000000","message":"++, Once the field exists, then it would just be a logic update to the driver. That being said, nova will require a blueprint for such.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":false,"context_lines":[{"line_number":177,"context_line":"Nova driver impact"},{"line_number":178,"context_line":"------------------"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"None. Nova receives error responses for power-locked nodes."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"Ramdisk impact"},{"line_number":183,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"e6e642fe_41687977","line":180,"in_reply_to":"de419498_f019dd17","updated":"2026-03-26 18:01:42.000000000","message":"Acknowledged","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"5755a61b6d8821535983b330847391ff753afcac","unresolved":true,"context_lines":[{"line_number":193,"context_line":"- ``baremetal:node:power_unlock``"},{"line_number":194,"context_line":"- ``baremetal:node:get_power_lock``"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"Access controlled via RBAC policies."},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"Other end user impact"},{"line_number":199,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1c78f7bb_76906aae","line":196,"updated":"2026-01-27 20:21:55.000000000","message":"We should add more detail about how the access is controlled, given locking power behind a higher RBAC default is part of the goal.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":193,"context_line":"- ``baremetal:node:power_unlock``"},{"line_number":194,"context_line":"- ``baremetal:node:get_power_lock``"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"Access controlled via RBAC policies."},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"Other end user impact"},{"line_number":199,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"c4efe31c_cc961168","line":196,"in_reply_to":"1c78f7bb_76906aae","updated":"2026-03-20 14:07:46.000000000","message":"I concur, I suspect this part likely needs some discussion.","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":false,"context_lines":[{"line_number":193,"context_line":"- ``baremetal:node:power_unlock``"},{"line_number":194,"context_line":"- ``baremetal:node:get_power_lock``"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"Access controlled via RBAC policies."},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"Other end user impact"},{"line_number":199,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bc522a55_01bd1b8a","line":196,"in_reply_to":"c4efe31c_cc961168","updated":"2026-03-26 18:01:42.000000000","message":"Acknowledged","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0c06821b9364a99ef4c3af3773fde65ee3f37bba","unresolved":true,"context_lines":[{"line_number":208,"context_line":"Performance Impact"},{"line_number":209,"context_line":"------------------"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"Minimal. Single field check per operation."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"Other deployer impact"},{"line_number":214,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fd5652b1_0608f4bd","line":211,"updated":"2026-03-20 14:07:46.000000000","message":"From a hydrated node object as well. :)","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"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":"df277df4b7db867b2a6ea1549410480270d50e94","unresolved":false,"context_lines":[{"line_number":208,"context_line":"Performance Impact"},{"line_number":209,"context_line":"------------------"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"Minimal. Single field check per operation."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"Other deployer impact"},{"line_number":214,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"0f836cef_705fdf80","line":211,"in_reply_to":"fd5652b1_0608f4bd","updated":"2026-03-26 18:01:42.000000000","message":"Acknowledged","commit_id":"67cd3b26d95d3bc12b621a8e3e12a74304f60d89"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"78e43c76edce2bd4eed3d7969461bd8c0aba3de7","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Alternatives"},{"line_number":45,"context_line":"------------"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"None"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"dee65556_cb2d41be","line":46,"updated":"2026-04-13 11:43:59.000000000","message":"By introducing a new api, I am thinking is it reasonable to extend the protected feature to cover such case?","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"7e9f38f88206f71bfcf5af6695e2f1e928ccb824","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Alternatives"},{"line_number":45,"context_line":"------------"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"None"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1e8c20f4_aa10c28b","line":46,"in_reply_to":"56d58c32_ae7f0af8","updated":"2026-04-22 11:48:21.000000000","message":"I am talking about node.protected field, as power lock is a kind of protect mechanism, maybe we can deal it with a more general way.","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"},{"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":"b8c477d35db6fb73106fba06dc859fb4210cf06d","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Alternatives"},{"line_number":45,"context_line":"------------"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"None"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"56d58c32_ae7f0af8","line":46,"in_reply_to":"dee65556_cb2d41be","updated":"2026-04-16 22:36:30.000000000","message":"I don\u0027t understand what you\u0027re suggesting?","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"78e43c76edce2bd4eed3d7969461bd8c0aba3de7","unresolved":true,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"- ``get_node_power_lockout(context, node_id)`` - retrieve lockout record"},{"line_number":177,"context_line":"- ``create_node_power_lockout(context, node_id, reason)`` - create lockout"},{"line_number":178,"context_line":"- ``destroy_node_power_lockout(context, node_id)`` - remove lockout"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"Driver API impact"},{"line_number":181,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"d90eb579_68b0f0b5","line":178,"range":{"start_line":178,"start_character":11,"end_line":178,"end_character":12},"updated":"2026-04-13 11:43:59.000000000","message":"maybe set_node_power_lockou is enough like maintenance, by a boolean and an optional reason?","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"},{"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":"b8c477d35db6fb73106fba06dc859fb4210cf06d","unresolved":true,"context_lines":[{"line_number":189,"context_line":"nodes. Ideally, Nova should consider power-locked nodes unavailable for"},{"line_number":190,"context_line":"scheduling. Once ``power_lock`` exists on the node object, this is a logic"},{"line_number":191,"context_line":"update in the Nova Ironic virt driver — but requires a separate Nova"},{"line_number":192,"context_line":"blueprint and is out of scope for this spec."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Ramdisk impact"},{"line_number":195,"context_line":"--------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"a2551b76_c428f857","line":192,"updated":"2026-04-16 22:36:30.000000000","message":"We need to be certain, via testing or reviewing the Ironic virt driver, that we won\u0027t negatively impact Nova. Specifically, I\u0027m curious what\u0027d happen if someone called `stop` (power off in nova parlance) from the nova API on a locked node. As long as it fails without putting the Instance/node in a bad state, we\u0027re good. I suspect we already have this case around `maintenance`, but I\u0027m unsure if we have specific code in Nova driver guarding that.","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"},{"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":"b8c477d35db6fb73106fba06dc859fb4210cf06d","unresolved":true,"context_lines":[{"line_number":206,"context_line":"- ``baremetal:node:get_power_lock``"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"Default policies restrict ``power_lock`` and ``power_unlock`` to"},{"line_number":209,"context_line":"``is_admin:True``. ``get_power_lock`` defaults to the same level as"},{"line_number":210,"context_line":"reading node details."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"Other end user impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"590c36c5_d56ec60a","line":209,"updated":"2026-04-16 22:36:30.000000000","message":"I am not 100% sure, but isn\u0027t `is_admin:True` an old-RBACism?","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"},{"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":"b8c477d35db6fb73106fba06dc859fb4210cf06d","unresolved":true,"context_lines":[{"line_number":249,"context_line":"-----------"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"Primary assignee:"},{"line_number":252,"context_line":"  None"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"Other contributors:"},{"line_number":255,"context_line":"  None"}],"source_content_type":"text/x-rst","patch_set":2,"id":"535aeeec_2e6ea59c","line":252,"updated":"2026-04-16 22:36:30.000000000","message":"you?","commit_id":"416d129158f5b3f249d7b61fd96c885fd6906e23"}]}
