)]}'
{"/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":"fd8e673112719e5362fe2777ce78975adcb9c239","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"2906aa4f_6d414724","updated":"2026-04-24 19:19:22.000000000","message":"this is not a full review just a comment, I need to review this without post-ptg-brain","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"}],"specs/approved/deferred-tasks.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ecc5f14eb904af909be383460f249ccfbd3a94fa","unresolved":true,"context_lines":[{"line_number":63,"context_line":"in the long term scope, is to build a mechanism for resumption of tasks."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"This would take:"},{"line_number":66,"context_line":"* A new database table"},{"line_number":67,"context_line":"  * Which holds a node reference, to keep it lightweight and prevent the need"},{"line_number":68,"context_line":"    to poll the nodes table."},{"line_number":69,"context_line":"  * A future \"start after\" time."}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa05405a_1de95e41","line":66,"updated":"2025-07-10 17:19:52.000000000","message":"Strictly speaking, something like Redis (or whatever the fork is called) is actually a better fit for quickly adding/removing rows.\n\nI know, I know","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":false,"context_lines":[{"line_number":63,"context_line":"in the long term scope, is to build a mechanism for resumption of tasks."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"This would take:"},{"line_number":66,"context_line":"* A new database table"},{"line_number":67,"context_line":"  * Which holds a node reference, to keep it lightweight and prevent the need"},{"line_number":68,"context_line":"    to poll the nodes table."},{"line_number":69,"context_line":"  * A future \"start after\" time."}],"source_content_type":"text/x-rst","patch_set":1,"id":"bac81737_0a10896c","line":66,"in_reply_to":"e4c60c6a_87c2b709","updated":"2026-01-06 17:05:51.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"c2f7603ba9ea227afcfc08110f78d428b16027be","unresolved":true,"context_lines":[{"line_number":63,"context_line":"in the long term scope, is to build a mechanism for resumption of tasks."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"This would take:"},{"line_number":66,"context_line":"* A new database table"},{"line_number":67,"context_line":"  * Which holds a node reference, to keep it lightweight and prevent the need"},{"line_number":68,"context_line":"    to poll the nodes table."},{"line_number":69,"context_line":"  * A future \"start after\" time."}],"source_content_type":"text/x-rst","patch_set":1,"id":"e4c60c6a_87c2b709","line":66,"in_reply_to":"fa05405a_1de95e41","updated":"2025-07-10 17:55:57.000000000","message":"lol, yeah. I know in most of our cases, there is a time space deferral we take as well, because we\u0027re dealing with a BMC.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":69,"context_line":"  * A future \"start after\" time."},{"line_number":70,"context_line":"  * A time added field."},{"line_number":71,"context_line":"  * A next step call."},{"line_number":72,"context_line":"* A singluar periodic which would run and trigger new threads after the start"},{"line_number":73,"context_line":"  after time when the following conditions can be met:"},{"line_number":74,"context_line":"  * The start_after time has been exceeded."},{"line_number":75,"context_line":"  * The node matches the conductor on the hash ring."}],"source_content_type":"text/x-rst","patch_set":1,"id":"a72d84d6_85316ff4","line":72,"updated":"2025-07-10 15:43:24.000000000","message":"typo: singular","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":false,"context_lines":[{"line_number":69,"context_line":"  * A future \"start after\" time."},{"line_number":70,"context_line":"  * A time added field."},{"line_number":71,"context_line":"  * A next step call."},{"line_number":72,"context_line":"* A singluar periodic which would run and trigger new threads after the start"},{"line_number":73,"context_line":"  after time when the following conditions can be met:"},{"line_number":74,"context_line":"  * The start_after time has been exceeded."},{"line_number":75,"context_line":"  * The node matches the conductor on the hash ring."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ee98c53a_bfdeb6e8","line":72,"in_reply_to":"a72d84d6_85316ff4","updated":"2026-01-06 17:05:51.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":76,"context_line":"  * The node is *not* presently locked."},{"line_number":77,"context_line":"  * A new thread with a TaskManager object will be triggered, and the next"},{"line_number":78,"context_line":"    step call is then made."},{"line_number":79,"context_line":"  * Once the thread has been started, the entry in the table can be removed."},{"line_number":80,"context_line":"* A helper to create the entry which triggers approprite save() actions"},{"line_number":81,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":82,"context_line":"* An Restful API surface to allow viewing the outstanding steps for the whole"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3679c96c_aa97d87b","line":79,"updated":"2025-07-10 15:43:24.000000000","message":"I think it needs to be slightly more sophisticated to accommodate waiting. Like raising TryLater(seconds).\n\nOr is your intention that the driver method will create another task if the condition is not satisfied (like power state not reached)? It\u0027s worth to be explicit about it.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6f81250b98ff5c5aa7a28c196c00a918f6d0feff","unresolved":true,"context_lines":[{"line_number":76,"context_line":"  * The node is *not* presently locked."},{"line_number":77,"context_line":"  * A new thread with a TaskManager object will be triggered, and the next"},{"line_number":78,"context_line":"    step call is then made."},{"line_number":79,"context_line":"  * Once the thread has been started, the entry in the table can be removed."},{"line_number":80,"context_line":"* A helper to create the entry which triggers approprite save() actions"},{"line_number":81,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":82,"context_line":"* An Restful API surface to allow viewing the outstanding steps for the whole"}],"source_content_type":"text/x-rst","patch_set":1,"id":"6f811d9f_56a87fd8","line":79,"in_reply_to":"3679c96c_aa97d87b","updated":"2025-07-10 17:09:02.000000000","message":"I like the try later idea, I\u0027m just not sure we would need it out of the gate.\n\nI\u0027m thinking the shape would be a helper which would instantiate the task, and call the method on a new thread.\n\nI thought about it the latter way originally that we would check a conditional and then trigger a task, but the more I thought about it, the more it seemed like overkill.  I guess we could go either way, the challenge might be getting an exception back from the thread as a result state. I think it is do-able, but honestly I\u0027m not sure and that worries me.\n\nAlternatively we could have one periodic which does a conditional check and then triggers the task on a new thread and cleans up the DB in a serialized fashion one at a time. That seems slower to me and a bit like overkill for things like \"time.sleep(N)\", but I could be convinced either way.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":76,"context_line":"  * The node is *not* presently locked."},{"line_number":77,"context_line":"  * A new thread with a TaskManager object will be triggered, and the next"},{"line_number":78,"context_line":"    step call is then made."},{"line_number":79,"context_line":"  * Once the thread has been started, the entry in the table can be removed."},{"line_number":80,"context_line":"* A helper to create the entry which triggers approprite save() actions"},{"line_number":81,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":82,"context_line":"* An Restful API surface to allow viewing the outstanding steps for the whole"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3de59880_0b785c1a","line":79,"in_reply_to":"37d648c9_616b03aa","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4fc4ba6697e0ca9d9f9fe801865011a532d6f791","unresolved":true,"context_lines":[{"line_number":76,"context_line":"  * The node is *not* presently locked."},{"line_number":77,"context_line":"  * A new thread with a TaskManager object will be triggered, and the next"},{"line_number":78,"context_line":"    step call is then made."},{"line_number":79,"context_line":"  * Once the thread has been started, the entry in the table can be removed."},{"line_number":80,"context_line":"* A helper to create the entry which triggers approprite save() actions"},{"line_number":81,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":82,"context_line":"* An Restful API surface to allow viewing the outstanding steps for the whole"}],"source_content_type":"text/x-rst","patch_set":1,"id":"be8e309b_d7ef18f3","line":79,"in_reply_to":"6f811d9f_56a87fd8","updated":"2025-07-10 17:18:11.000000000","message":"In many cases we don\u0027t have one sleep, we have a whole `while something: sleep`, which I hope this proposal will cover because otherwise it won\u0027t apply to many useful cases.\n\nI don\u0027t think we can get an exception from a thread, which is a strong argument against the exception approach. I think the approach of letting the called method restart the timer is more robust.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78cbc78a53f3ee2d5bc92fda4d3bf5df6b1e93d6","unresolved":true,"context_lines":[{"line_number":76,"context_line":"  * The node is *not* presently locked."},{"line_number":77,"context_line":"  * A new thread with a TaskManager object will be triggered, and the next"},{"line_number":78,"context_line":"    step call is then made."},{"line_number":79,"context_line":"  * Once the thread has been started, the entry in the table can be removed."},{"line_number":80,"context_line":"* A helper to create the entry which triggers approprite save() actions"},{"line_number":81,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":82,"context_line":"* An Restful API surface to allow viewing the outstanding steps for the whole"}],"source_content_type":"text/x-rst","patch_set":1,"id":"37d648c9_616b03aa","line":79,"in_reply_to":"8f2eb565_e8a85888","updated":"2025-07-11 11:37:13.000000000","message":"What I mean is: you can leave only start_after and let the task itself insert a new row in the same tasks table with its own name and new time.\n\nThis does not necessarily imply a new field. But maybe it\u0027s a good idea? I need to spend somewhat more braincycles on the whole picture next week.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"c2f7603ba9ea227afcfc08110f78d428b16027be","unresolved":true,"context_lines":[{"line_number":76,"context_line":"  * The node is *not* presently locked."},{"line_number":77,"context_line":"  * A new thread with a TaskManager object will be triggered, and the next"},{"line_number":78,"context_line":"    step call is then made."},{"line_number":79,"context_line":"  * Once the thread has been started, the entry in the table can be removed."},{"line_number":80,"context_line":"* A helper to create the entry which triggers approprite save() actions"},{"line_number":81,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":82,"context_line":"* An Restful API surface to allow viewing the outstanding steps for the whole"}],"source_content_type":"text/x-rst","patch_set":1,"id":"8f2eb565_e8a85888","line":79,"in_reply_to":"be8e309b_d7ef18f3","updated":"2025-07-10 17:55:57.000000000","message":"Hmm, fair. I guess we *could*, it would be a little more on the database load side, but really just reading a targetted row and then instantiating a temporary task is not a huge deal. I guess I could go for something along those lines.\n\nSo maybe a stat_after_time and start_after_check as two field names which both would need to be true, and we would need to be able to get a lock on.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":80,"context_line":"* A helper to create the entry which triggers approprite save() actions"},{"line_number":81,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":82,"context_line":"* An Restful API surface to allow viewing the outstanding steps for the whole"},{"line_number":83,"context_line":"  of the Ironic deployment."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"With this overall flow, the periodic itself can hold logic around throttling"},{"line_number":86,"context_line":"future actions. Furthermore, this overall approach would allow for future items"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3cba2abe_a35e0025","line":83,"updated":"2025-07-10 15:43:24.000000000","message":"Not sure about this - see below","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":80,"context_line":"* A helper to create the entry which triggers approprite save() actions"},{"line_number":81,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":82,"context_line":"* An Restful API surface to allow viewing the outstanding steps for the whole"},{"line_number":83,"context_line":"  of the Ironic deployment."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"With this overall flow, the periodic itself can hold logic around throttling"},{"line_number":86,"context_line":"future actions. Furthermore, this overall approach would allow for future items"}],"source_content_type":"text/x-rst","patch_set":1,"id":"6a71017c_9c3fb2ff","line":83,"in_reply_to":"3cba2abe_a35e0025","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":92,"context_line":"Alternatives"},{"line_number":93,"context_line":"------------"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"The clear alternative is to have periodics which can serve as the delination"},{"line_number":96,"context_line":"points, and then have enough logic to figure out what to trigger, but this"},{"line_number":97,"context_line":"could quickly create a similar situation to what we have now, a number of"},{"line_number":98,"context_line":"periodic runnders which are threads in the post-eventlet model as well."}],"source_content_type":"text/x-rst","patch_set":1,"id":"b6b6cd7c_34cdfb6d","line":95,"range":{"start_line":95,"start_character":66,"end_line":95,"end_character":76},"updated":"2025-07-10 15:43:24.000000000","message":"typo: delineation","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":false,"context_lines":[{"line_number":92,"context_line":"Alternatives"},{"line_number":93,"context_line":"------------"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"The clear alternative is to have periodics which can serve as the delination"},{"line_number":96,"context_line":"points, and then have enough logic to figure out what to trigger, but this"},{"line_number":97,"context_line":"could quickly create a similar situation to what we have now, a number of"},{"line_number":98,"context_line":"periodic runnders which are threads in the post-eventlet model as well."}],"source_content_type":"text/x-rst","patch_set":1,"id":"b48f6798_8f473504","line":95,"range":{"start_line":95,"start_character":66,"end_line":95,"end_character":76},"in_reply_to":"b6b6cd7c_34cdfb6d","updated":"2026-01-06 17:05:51.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":95,"context_line":"The clear alternative is to have periodics which can serve as the delination"},{"line_number":96,"context_line":"points, and then have enough logic to figure out what to trigger, but this"},{"line_number":97,"context_line":"could quickly create a similar situation to what we have now, a number of"},{"line_number":98,"context_line":"periodic runnders which are threads in the post-eventlet model as well."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"The downside with that model is the need to hydrate and then extract the data"},{"line_number":101,"context_line":"on a next step, and potentially concealing future work to act upon."}],"source_content_type":"text/x-rst","patch_set":1,"id":"92b5d79a_6e78dbf9","line":98,"updated":"2025-07-10 15:43:24.000000000","message":"typo: runners\n\nI\u0027m honestly not sure your proposal is much different in terms of threads usage but it\u0027s a nicer API. You\u0027re essentially inventing cooperative multi-tasking in Ironic.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6f81250b98ff5c5aa7a28c196c00a918f6d0feff","unresolved":true,"context_lines":[{"line_number":95,"context_line":"The clear alternative is to have periodics which can serve as the delination"},{"line_number":96,"context_line":"points, and then have enough logic to figure out what to trigger, but this"},{"line_number":97,"context_line":"could quickly create a similar situation to what we have now, a number of"},{"line_number":98,"context_line":"periodic runnders which are threads in the post-eventlet model as well."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"The downside with that model is the need to hydrate and then extract the data"},{"line_number":101,"context_line":"on a next step, and potentially concealing future work to act upon."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ca9b4e73_ddb34d19","line":98,"in_reply_to":"92b5d79a_6e78dbf9","updated":"2025-07-10 17:09:02.000000000","message":"Kind of yeah. 😊\n\nIt does sort of solve the \"I need to come back to this *later* which seems like part of the major problem.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":95,"context_line":"The clear alternative is to have periodics which can serve as the delination"},{"line_number":96,"context_line":"points, and then have enough logic to figure out what to trigger, but this"},{"line_number":97,"context_line":"could quickly create a similar situation to what we have now, a number of"},{"line_number":98,"context_line":"periodic runnders which are threads in the post-eventlet model as well."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"The downside with that model is the need to hydrate and then extract the data"},{"line_number":101,"context_line":"on a next step, and potentially concealing future work to act upon."}],"source_content_type":"text/x-rst","patch_set":1,"id":"5139de97_48265dbb","line":98,"in_reply_to":"ca9b4e73_ddb34d19","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78cbc78a53f3ee2d5bc92fda4d3bf5df6b1e93d6","unresolved":true,"context_lines":[{"line_number":109,"context_line":"* ``updated`` field, from base database schema."},{"line_number":110,"context_line":"* ``start_after`` field, storing the future Date Time,"},{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "}],"source_content_type":"text/x-rst","patch_set":1,"id":"379bad91_62773fbd","line":112,"updated":"2025-07-11 11:37:13.000000000","message":"We need fields that are required to map the node to hash ring if you want to avoid reading the Nodes table every time. I assume these are driver, conductor_group and node uuid.\n\nI\u0027d also prefer adding a proper task UUID in case we want to expand this feature with a full API later.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"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":"8e41b21771d49e261c56816311250b324f53cfc6","unresolved":true,"context_lines":[{"line_number":109,"context_line":"* ``updated`` field, from base database schema."},{"line_number":110,"context_line":"* ``start_after`` field, storing the future Date Time,"},{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "}],"source_content_type":"text/x-rst","patch_set":1,"id":"9afa1608_9270b364","line":112,"in_reply_to":"0ab86f8a_62e5c855","updated":"2026-04-17 17:27:58.000000000","message":"If we added such a cache, we\u0027d need logic to check for pending actions on change of a conductor_group.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":true,"context_lines":[{"line_number":109,"context_line":"* ``updated`` field, from base database schema."},{"line_number":110,"context_line":"* ``start_after`` field, storing the future Date Time,"},{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "}],"source_content_type":"text/x-rst","patch_set":1,"id":"0ab86f8a_62e5c855","line":112,"in_reply_to":"379bad91_62773fbd","updated":"2026-01-06 17:05:51.000000000","message":"I was originally thinking a join would be ideal to return the result set query for the launch, as opposed to duplicate field values.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"34f489cf83ce9b2f64167278e3d0c3135935d9a8","unresolved":true,"context_lines":[{"line_number":109,"context_line":"* ``updated`` field, from base database schema."},{"line_number":110,"context_line":"* ``start_after`` field, storing the future Date Time,"},{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "}],"source_content_type":"text/x-rst","patch_set":1,"id":"ac4ffc3e_6f88657a","line":112,"in_reply_to":"9afa1608_9270b364","updated":"2026-04-21 18:36:14.000000000","message":"all we could do is based upon the state of the database, so whatever is in the present state of the database, and then invoke the needful from there.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":109,"context_line":"* ``updated`` field, from base database schema."},{"line_number":110,"context_line":"* ``start_after`` field, storing the future Date Time,"},{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "}],"source_content_type":"text/x-rst","patch_set":1,"id":"5c2e1bb4_7dc8774a","line":112,"in_reply_to":"ac4ffc3e_6f88657a","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "},{"line_number":116,"context_line":"In this structure, the ``start_after`` field will also be indexed."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"07e0e04b_d9c8d889","line":114,"updated":"2025-07-10 15:43:24.000000000","message":"What about a free JSON field with context? It\u0027s possible that the awakened method will need to understand why it was awakened. Currently, we use driver_internal_info for that, but you want to reduce the load on the Node table, and dii is a huge offender.\n\nExample: Redfish may store a Task ID in this structure. Power actions may store the current attempt number to allow timing out.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6f81250b98ff5c5aa7a28c196c00a918f6d0feff","unresolved":true,"context_lines":[{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "},{"line_number":116,"context_line":"In this structure, the ``start_after`` field will also be indexed."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ecda10ba_5d0f3c2e","line":114,"in_reply_to":"07e0e04b_d9c8d889","updated":"2025-07-10 17:09:02.000000000","message":"Context is a super good point, I completely forgot about it, but at the same time most of the internal conductor state context is just None or a base conductor task context... meaning our local context object.\n\nAnd I\u0027m not talking about suspending and waking up a thread, I\u0027m talking about a model where we can let a thread exit and start back where we were sort of at. In order to do so, I wasn\u0027t thinking of storing anything else inside of the node, but actually using the other table to launch a new task and execute the action on that new thread.\n\nThe model I\u0027m thinking, we wouldn\u0027t store a task ID or anything like that on the node, it would be external to the node in it\u0027s own table which the conductor would manage and be visible on the API surface as needed. We can\u0027t expose task.context there, but... If that is the context your thinking about maybe we could save it.\n\nIf your talking about the context of the task, I\u0027d just use the new table so rows can live and be deleted as needed without triggering actions on the nodes table (with the exception of the need to task.node.save() before exiting the stream of work we\u0027re punting on).","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":true,"context_lines":[{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "},{"line_number":116,"context_line":"In this structure, the ``start_after`` field will also be indexed."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"6a903d66_364adfe5","line":114,"in_reply_to":"23af04b1_9645c05b","updated":"2026-01-06 17:05:51.000000000","message":"Augmented to detail this, please review the next revision.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"c2f7603ba9ea227afcfc08110f78d428b16027be","unresolved":true,"context_lines":[{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "},{"line_number":116,"context_line":"In this structure, the ``start_after`` field will also be indexed."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"23af04b1_9645c05b","line":114,"in_reply_to":"56ab0ac5_2741e7a1","updated":"2025-07-10 17:55:57.000000000","message":"Fair, okay.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "},{"line_number":116,"context_line":"In this structure, the ``start_after`` field will also be indexed."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"798ae29e_b6056b02","line":114,"in_reply_to":"6a903d66_364adfe5","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4fc4ba6697e0ca9d9f9fe801865011a532d6f791","unresolved":true,"context_lines":[{"line_number":111,"context_line":"  which can then be queried in asending order."},{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "},{"line_number":116,"context_line":"In this structure, the ``start_after`` field will also be indexed."},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"56ab0ac5_2741e7a1","line":114,"in_reply_to":"ecda10ba_5d0f3c2e","updated":"2025-07-10 17:18:11.000000000","message":"Yeah, I\u0027m specifically talking about adding a new field to *this* table to stop touching Nodes so often. Especially since the context is only relevant until we re-enter the thread.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "},{"line_number":116,"context_line":"In this structure, the ``start_after`` field will also be indexed."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ee5d4528_87bd2d6a","line":115,"updated":"2025-07-10 15:43:24.000000000","message":"nit: trailing space","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":false,"context_lines":[{"line_number":112,"context_line":"* The node ID, which is linked to the nodes table."},{"line_number":113,"context_line":"* The interface and method call to make to resume the overall"},{"line_number":114,"context_line":"  action flow in the form of ``task.driver.interface.method``."},{"line_number":115,"context_line":"  "},{"line_number":116,"context_line":"In this structure, the ``start_after`` field will also be indexed."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"State Machine Impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"72f15cb8_d9c715e0","line":115,"in_reply_to":"ee5d4528_87bd2d6a","updated":"2026-01-06 17:05:51.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":121,"context_line":"No state machine impact is anticipated as part of this, however it may"},{"line_number":122,"context_line":"make sense to toggle some nodes back to WAIT state of a task, but at the same"},{"line_number":123,"context_line":"we need to balance the read/write actions to the needful set of steps as we"},{"line_number":124,"context_line":"need to be mindful of database resource contention."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"REST API impact"},{"line_number":127,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"84345139_1e25ce95","line":124,"updated":"2025-07-10 15:43:24.000000000","message":"If we keep using driver_internal_info for intermediary state, we can just as well change the state (but see above).","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":false,"context_lines":[{"line_number":121,"context_line":"No state machine impact is anticipated as part of this, however it may"},{"line_number":122,"context_line":"make sense to toggle some nodes back to WAIT state of a task, but at the same"},{"line_number":123,"context_line":"we need to balance the read/write actions to the needful set of steps as we"},{"line_number":124,"context_line":"need to be mindful of database resource contention."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"REST API impact"},{"line_number":127,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"e16c1550_b719ef8a","line":124,"in_reply_to":"3f256495_4b37bcc2","updated":"2026-01-06 17:05:51.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6f81250b98ff5c5aa7a28c196c00a918f6d0feff","unresolved":true,"context_lines":[{"line_number":121,"context_line":"No state machine impact is anticipated as part of this, however it may"},{"line_number":122,"context_line":"make sense to toggle some nodes back to WAIT state of a task, but at the same"},{"line_number":123,"context_line":"we need to balance the read/write actions to the needful set of steps as we"},{"line_number":124,"context_line":"need to be mindful of database resource contention."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"REST API impact"},{"line_number":127,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f256495_4b37bcc2","line":124,"in_reply_to":"84345139_1e25ce95","updated":"2025-07-10 17:09:02.000000000","message":"Yeah, no. not driver_internal_info for intermediary state. Hopefully that covers it along with my prior comment.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":false,"context_lines":[{"line_number":123,"context_line":"we need to balance the read/write actions to the needful set of steps as we"},{"line_number":124,"context_line":"need to be mindful of database resource contention."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"REST API impact"},{"line_number":127,"context_line":"---------------"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"Each API method which is either added or changed should have the following"}],"source_content_type":"text/x-rst","patch_set":1,"id":"eb852037_23e989d6","line":126,"updated":"2026-01-06 17:05:51.000000000","message":"2026.1 PTG consensus: Don\u0027t surface an API, maybe extra logging.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":133,"context_line":"  * A description of what the method does, suitable for use in user"},{"line_number":134,"context_line":"    documentation."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"GET /v1/future_tasks, returning 200 by default, which returns a list"},{"line_number":137,"context_line":"of recorded entries as a JSON document which returns a list of entries."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"We expect this API surface impact to be read-only."}],"source_content_type":"text/x-rst","patch_set":1,"id":"11d6939f_7662f711","line":136,"updated":"2025-07-10 15:43:24.000000000","message":"Do we really-really need it now? It could be a bit too early to commit to proper API just yet. Maybe we\u0027ll want to return task ID\u0027s from certain actions and provide task URLs similar to Redfish? I\u0027d keep the opportunities open.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6f81250b98ff5c5aa7a28c196c00a918f6d0feff","unresolved":true,"context_lines":[{"line_number":133,"context_line":"  * A description of what the method does, suitable for use in user"},{"line_number":134,"context_line":"    documentation."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"GET /v1/future_tasks, returning 200 by default, which returns a list"},{"line_number":137,"context_line":"of recorded entries as a JSON document which returns a list of entries."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"We expect this API surface impact to be read-only."}],"source_content_type":"text/x-rst","patch_set":1,"id":"f8fed6d2_7626732d","line":136,"in_reply_to":"11d6939f_7662f711","updated":"2025-07-10 17:09:02.000000000","message":"I was thinking just being able to give operators *something* to be able to see the items which are presently defferred for the time being. We could punt on it, but I wasn\u0027t thinking an API for users to interact with, just for human operator visibility.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"c2f7603ba9ea227afcfc08110f78d428b16027be","unresolved":true,"context_lines":[{"line_number":133,"context_line":"  * A description of what the method does, suitable for use in user"},{"line_number":134,"context_line":"    documentation."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"GET /v1/future_tasks, returning 200 by default, which returns a list"},{"line_number":137,"context_line":"of recorded entries as a JSON document which returns a list of entries."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"We expect this API surface impact to be read-only."}],"source_content_type":"text/x-rst","patch_set":1,"id":"e8b20176_1d3b8821","line":136,"in_reply_to":"24c98c0a_16850f2c","updated":"2025-07-10 17:55:57.000000000","message":"Well, yeah, for getting a list of outstanding items. Are you thinking something to add something to the list?","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"a7460486a67023732849fe1038383b0497316117","unresolved":false,"context_lines":[{"line_number":133,"context_line":"  * A description of what the method does, suitable for use in user"},{"line_number":134,"context_line":"    documentation."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"GET /v1/future_tasks, returning 200 by default, which returns a list"},{"line_number":137,"context_line":"of recorded entries as a JSON document which returns a list of entries."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"We expect this API surface impact to be read-only."}],"source_content_type":"text/x-rst","patch_set":1,"id":"d4b15cf4_9c036a95","line":136,"in_reply_to":"a716ee63_46fdb5f6","updated":"2026-01-06 17:05:51.000000000","message":"All API discussion was resolved during the PTG, which boiled down to \"don\u0027t build an API for this\".","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78cbc78a53f3ee2d5bc92fda4d3bf5df6b1e93d6","unresolved":true,"context_lines":[{"line_number":133,"context_line":"  * A description of what the method does, suitable for use in user"},{"line_number":134,"context_line":"    documentation."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"GET /v1/future_tasks, returning 200 by default, which returns a list"},{"line_number":137,"context_line":"of recorded entries as a JSON document which returns a list of entries."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"We expect this API surface impact to be read-only."}],"source_content_type":"text/x-rst","patch_set":1,"id":"a716ee63_46fdb5f6","line":136,"in_reply_to":"e8b20176_1d3b8821","updated":"2025-07-11 11:37:13.000000000","message":"I think that we\u0027re somewhat overdue for some operator-only CLI that gives direct insight into what is going on with Ironic without exposing everything in the API. This sounds like a good use case. Something like\n\n`ironic-internal-state deferred-tasks`\n\n`ironic-internal-state hashring`\n\nYou know, there are many things that operator would be happy to see, even when they make little sense from the API perspective.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4fc4ba6697e0ca9d9f9fe801865011a532d6f791","unresolved":true,"context_lines":[{"line_number":133,"context_line":"  * A description of what the method does, suitable for use in user"},{"line_number":134,"context_line":"    documentation."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"GET /v1/future_tasks, returning 200 by default, which returns a list"},{"line_number":137,"context_line":"of recorded entries as a JSON document which returns a list of entries."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"We expect this API surface impact to be read-only."}],"source_content_type":"text/x-rst","patch_set":1,"id":"24c98c0a_16850f2c","line":136,"in_reply_to":"f8fed6d2_7626732d","updated":"2025-07-10 17:18:11.000000000","message":"Mmm, a new CLI command?","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"None anticipated, however there is a distinct possibility some of the methods"},{"line_number":169,"context_line":"may be evaluated to be split along the lines of the Driver API interface,"},{"line_number":170,"context_line":"where feasible."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Nova driver impact"},{"line_number":173,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"94e8e839_fe85563c","line":170,"updated":"2025-07-10 15:43:24.000000000","message":"I anticipate a lot of impact, but I\u0027m not sure which 😊\n\nExample: we might need some sort of a generic \"wait_for_power_state\" on *every* interface so that it\u0027s not reinvented every time. So e.g. I do (in pseudopython)\n\n```\nnext_method \u003d f\"{self.full_name()}.continue_firmware_update\"  # full_name() detects the entry point name\nconductor_utils.start_reboot(task)\nconductor_tasks.create_task(\n  task,\n  start_after\u003dconductor_tasks.wait_for_power_state(),  # this returns the datatime based on CONF,\n  method\u003df\"{self.full_name()}.wait_for_power_state\",  # the generic call from BaseInterface\n  context\u003d{\"rebooting\": True,  # just target_power_state is not enough IIRC\n           \"next_method\": next_method}  # what to run after reached\n)\nreturn states.SERVICEWAIT\n```","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"4fc4ba6697e0ca9d9f9fe801865011a532d6f791","unresolved":true,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"None anticipated, however there is a distinct possibility some of the methods"},{"line_number":169,"context_line":"may be evaluated to be split along the lines of the Driver API interface,"},{"line_number":170,"context_line":"where feasible."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Nova driver impact"},{"line_number":173,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"50092eb1_58a14c21","line":170,"in_reply_to":"2841c5c0_ba34247f","updated":"2025-07-10 17:18:11.000000000","message":"\u003e so, start_after was always mentally thought of being a time to start after. Not a method to execute to determine. That time could be immediate or in 10 seconds, or five minutes.\n\nYeah, my example confused you. I meant this `conductor_tasks.wait_for_power_state` to return a datetime object by checking with CONF. So yeah, we\u0027re on the same page here, just my example is a bit convoluted. Replace it with \"42\" for now 😊\n\n\u003e It could make sense but then the caller would need to know where and how to incorporate that in.\n\nI have two examples in my other comments, in both cases the caller knows that.\n\nAlso, I realize, in this comment I\u0027m talking about the desired final state of things, which I believe should come soon, but not necessarily in the first iteration.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"c2f7603ba9ea227afcfc08110f78d428b16027be","unresolved":true,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"None anticipated, however there is a distinct possibility some of the methods"},{"line_number":169,"context_line":"may be evaluated to be split along the lines of the Driver API interface,"},{"line_number":170,"context_line":"where feasible."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Nova driver impact"},{"line_number":173,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"c742e57e_c2b21b32","line":170,"in_reply_to":"50092eb1_58a14c21","updated":"2025-07-10 17:55:57.000000000","message":"lol, Okay! Thanks!","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"6f81250b98ff5c5aa7a28c196c00a918f6d0feff","unresolved":true,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"None anticipated, however there is a distinct possibility some of the methods"},{"line_number":169,"context_line":"may be evaluated to be split along the lines of the Driver API interface,"},{"line_number":170,"context_line":"where feasible."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Nova driver impact"},{"line_number":173,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"2841c5c0_ba34247f","line":170,"in_reply_to":"94e8e839_fe85563c","updated":"2025-07-10 17:09:02.000000000","message":"so, start_after was always mentally thought of being a time to start after. Not a method to execute to determine.  That time could be immediate or in 10 seconds, or five minutes.\n\nThe issue with calling a method is in order to call it, we have to instantiate a task to call it properly which means we\u0027re having to do more intermediate work. I guess it could be feasible though, it just seems more complicated than I was thinking.\n\nFWIW, I see what you meant by context. It could make sense but then the caller would need to know where and how to incorporate that in.\n\nI guess the way your thinking is a huge impact to the driver api, what I was thinking was a bit more light weight mostly modeled around sleeping or waiting and following up on a specific action or resuming next actions.","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b652447533709c33971b53e372394ef9e81493e4","unresolved":true,"context_lines":[{"line_number":236,"context_line":"Primary assignee:"},{"line_number":237,"context_line":"  \u003cIRC handle, email address, or None\u003e"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"Other contributors:"},{"line_number":240,"context_line":"  \u003cIRC handle, email address, None\u003e"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Work Items"}],"source_content_type":"text/x-rst","patch_set":1,"id":"63a60b62_7b357c02","line":239,"updated":"2025-07-10 15:43:24.000000000","message":"Happy to help","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"78cbc78a53f3ee2d5bc92fda4d3bf5df6b1e93d6","unresolved":true,"context_lines":[{"line_number":236,"context_line":"Primary assignee:"},{"line_number":237,"context_line":"  \u003cIRC handle, email address, or None\u003e"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"Other contributors:"},{"line_number":240,"context_line":"  \u003cIRC handle, email address, None\u003e"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Work Items"}],"source_content_type":"text/x-rst","patch_set":1,"id":"b5e4910c_8ee566e4","line":239,"in_reply_to":"63a60b62_7b357c02","updated":"2025-07-11 11:37:13.000000000","message":"Btw I\u0027m also happy to lead this effort if you don\u0027t have cycles","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":236,"context_line":"Primary assignee:"},{"line_number":237,"context_line":"  \u003cIRC handle, email address, or None\u003e"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"Other contributors:"},{"line_number":240,"context_line":"  \u003cIRC handle, email address, None\u003e"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Work Items"}],"source_content_type":"text/x-rst","patch_set":1,"id":"cecf54ba_897ad4cd","line":239,"in_reply_to":"6e766217_68677fa7","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"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":"008cb0ddd1a7a86b82ad0ce1a534df1f7665b601","unresolved":true,"context_lines":[{"line_number":236,"context_line":"Primary assignee:"},{"line_number":237,"context_line":"  \u003cIRC handle, email address, or None\u003e"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"Other contributors:"},{"line_number":240,"context_line":"  \u003cIRC handle, email address, None\u003e"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"Work Items"}],"source_content_type":"text/x-rst","patch_set":1,"id":"6e766217_68677fa7","line":239,"in_reply_to":"b5e4910c_8ee566e4","updated":"2026-05-07 17:07:47.000000000","message":"Happy to be one of the assignees","commit_id":"05da036fdce5df25b84456d446adebb56e1ab71c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9dea330bd99a346b8f7f96901902bbeef64983a3","unresolved":true,"context_lines":[{"line_number":7,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":8,"context_line":"Deferred (resumable) Tasks"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://bugs.launchpad.net/ironic/+bug/2137571"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"While working on the migration away from eventlet, contributors have raised"}],"source_content_type":"text/x-rst","patch_set":4,"id":"25acc5ff_e428c9d0","line":10,"updated":"2026-04-23 16:33:29.000000000","message":"a great idea for a later phase: lazy or asynchronus node update to avoid a  409\n\nFor example: I want to change over driver to redfish from ipmi, but power sync is running and I don\u0027t want to deal with the http 409, so if I can ask for the update to be a lazy task, then I can be in a much happier place operationally.","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9dea330bd99a346b8f7f96901902bbeef64983a3","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"But the biggest issue is the additional memory used by an idle thread which"},{"line_number":29,"context_line":"is just waiting for a very long period of time."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Problem description"},{"line_number":32,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"5e1339ea_fb2656f2","line":30,"updated":"2026-04-23 16:33:29.000000000","message":"Name for this or an api surface:\n\nActions?\nQueued?","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11032c6ff4da90e82614c58c99f09d09dc2617f","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"But the biggest issue is the additional memory used by an idle thread which"},{"line_number":29,"context_line":"is just waiting for a very long period of time."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Problem description"},{"line_number":32,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"f07b3f12_b82c23d9","line":30,"in_reply_to":"5e1339ea_fb2656f2","updated":"2026-04-23 18:50:41.000000000","message":"\"todo_list\" ?\n\n/v1/todo is growing on me.","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"0cba3975f37ad8ce73132b508d4c0662e8099da6","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"But the biggest issue is the additional memory used by an idle thread which"},{"line_number":29,"context_line":"is just waiting for a very long period of time."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Problem description"},{"line_number":32,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ed925668_ec40338e","line":30,"in_reply_to":"a194f07e_3501ab46","updated":"2026-05-05 22:05:26.000000000","message":"What about /v1/jobs ?","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd67947fbc61d7b12a416875ddf8e4828e4579fc","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"But the biggest issue is the additional memory used by an idle thread which"},{"line_number":29,"context_line":"is just waiting for a very long period of time."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Problem description"},{"line_number":32,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"a194f07e_3501ab46","line":30,"in_reply_to":"afaefa72_dd9a1176","updated":"2026-05-05 22:01:15.000000000","message":"That is not a bad point.  I could be good /v1/tasks ? But its not the short term stuff. Queued actions? Dunno.","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"But the biggest issue is the additional memory used by an idle thread which"},{"line_number":29,"context_line":"is just waiting for a very long period of time."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Problem description"},{"line_number":32,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"2d7bfd2b_4b243b27","line":30,"in_reply_to":"ed925668_ec40338e","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"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":"fd8e673112719e5362fe2777ce78975adcb9c239","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"But the biggest issue is the additional memory used by an idle thread which"},{"line_number":29,"context_line":"is just waiting for a very long period of time."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Problem description"},{"line_number":32,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"afaefa72_dd9a1176","line":30,"in_reply_to":"f07b3f12_b82c23d9","updated":"2026-04-24 19:19:22.000000000","message":"My issue with /v1/todo (and I\u0027m still cooking on it, maybe we\u0027ll get a solution) is what to you call a returned entry.\n\na Do? \na todo? \n\nIt just kinda gets awkward when trying to talk about *the object* rather than *the API*.","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11032c6ff4da90e82614c58c99f09d09dc2617f","unresolved":true,"context_lines":[{"line_number":83,"context_line":"  * Once the thread has been started, the entry in the table can be removed."},{"line_number":84,"context_line":"* A helper to create the entry which triggers appropriate save() actions"},{"line_number":85,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":".. NOTE::"},{"line_number":89,"context_line":"   There is an outstanding idea which has been proposed to utilize exceptions"}],"source_content_type":"text/x-rst","patch_set":4,"id":"63ae89e1_1d0641a5","line":86,"updated":"2026-04-23 18:50:41.000000000","message":"So, questions, and this may be maybe more use and consumption oriented?\n\n1) de-duplication from the user side\n2) we likely need to rethink and talk about the work pickup model since we\u0027re still ideally respecting the hash ring, but we need to be mindful of the path into that.\n\nError handling from this model is mostly all about just trying over, but then the discussion of a high level state for a task comes in.\n\nCancelling tasks may also be a thing, but maybe later.\n\n3) Another question is what happens to tasks we can\u0027t act upon, or which are blocked.\n4) Lazy user requested action is another insight which we want to keep an eye on.","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":83,"context_line":"  * Once the thread has been started, the entry in the table can be removed."},{"line_number":84,"context_line":"* A helper to create the entry which triggers appropriate save() actions"},{"line_number":85,"context_line":"  on the attached objects, and injects the record into the future task table."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":".. NOTE::"},{"line_number":89,"context_line":"   There is an outstanding idea which has been proposed to utilize exceptions"}],"source_content_type":"text/x-rst","patch_set":4,"id":"28499211_445fc21b","line":86,"in_reply_to":"63ae89e1_1d0641a5","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"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":"8e41b21771d49e261c56816311250b324f53cfc6","unresolved":true,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Consensus reached during the 2026.1 PTG was to limit the overall scope"},{"line_number":162,"context_line":"of the change and skip creating an API surface for this functionality,"},{"line_number":163,"context_line":"with the trade-off likely being more conductor side logging."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Client (CLI) impact"},{"line_number":166,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"cc538d77_5421030f","line":163,"updated":"2026-04-17 17:27:58.000000000","message":"I think we should revisit this decision -- or at least consider adding an API surface as a documented milestone 2. Admittedly, some of that is because I want this to have the pieces needed for https://review.opendev.org/c/openstack/ironic-specs/+/983183 (bulk node actions) to use the same data table and mechanisms here to provide feedback.","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Consensus reached during the 2026.1 PTG was to limit the overall scope"},{"line_number":162,"context_line":"of the change and skip creating an API surface for this functionality,"},{"line_number":163,"context_line":"with the trade-off likely being more conductor side logging."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Client (CLI) impact"},{"line_number":166,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ef2c2d82_c7cfb606","line":163,"in_reply_to":"54756ec7_69a15783","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"34f489cf83ce9b2f64167278e3d0c3135935d9a8","unresolved":true,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"Consensus reached during the 2026.1 PTG was to limit the overall scope"},{"line_number":162,"context_line":"of the change and skip creating an API surface for this functionality,"},{"line_number":163,"context_line":"with the trade-off likely being more conductor side logging."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Client (CLI) impact"},{"line_number":166,"context_line":"-------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"54756ec7_69a15783","line":163,"in_reply_to":"cc538d77_5421030f","updated":"2026-04-21 18:36:14.000000000","message":"I think that may be reasonable, but we should discuss it.","commit_id":"e0c9f82490eb405b218d20aec1e2ef18b1ba0126"},{"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":"aa7b50ae4b47ccb8a1ab6ff5f711816a3d6297b5","unresolved":true,"context_lines":[{"line_number":128,"context_line":"   the Ironic internal TaskManager which is more about the"},{"line_number":129,"context_line":"   execution of a \"task\". We may choose to name or surface these"},{"line_number":130,"context_line":"   items as \"todo\" items, but naming is also the hardest problem"},{"line_number":131,"context_line":"   which we can grow consensus on over time."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"* A new database table with the following fields:"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"163eaa00_e2421bfa","line":131,"updated":"2026-05-07 16:57:53.000000000","message":"This is 100% why I don\u0027t want our object representing this to be named \"task\" or \"tasks\".\n\nI did some digging around this:\n- Glance has a /v2/tasks API which is not really in active use anymore AIUI https://docs.openstack.org/api-ref/image/v2/index.html#tasks -- and obviously I don\u0027t love duplicating the term \"task\" as we use it internally.\n- Mistral uses the term \"action(s)\" to refer to this. Maybe a /v1/actions that contain Action objects OR perhaps even /v1/todo with Action objects as the items beneath\n- /v1/jobs w/Job objects is another option, I prefer action\n- /v1/missions w/Mission objects is another options, this is the least overloaded of the options but I don\u0027t like how  it sounds when I say it\n\nCID and I both discussed this naming in a pair review, and I think we both have a preference for one of the \"action\" based names -- like /v1/todo containing [Action] or /v1/actions containing [Action]","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":128,"context_line":"   the Ironic internal TaskManager which is more about the"},{"line_number":129,"context_line":"   execution of a \"task\". We may choose to name or surface these"},{"line_number":130,"context_line":"   items as \"todo\" items, but naming is also the hardest problem"},{"line_number":131,"context_line":"   which we can grow consensus on over time."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"* A new database table with the following fields:"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"4aaca046_c581b01f","line":131,"in_reply_to":"163eaa00_e2421bfa","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"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":"aa7b50ae4b47ccb8a1ab6ff5f711816a3d6297b5","unresolved":true,"context_lines":[{"line_number":138,"context_line":"  * A node reference, to keep it lightweight, but have enough"},{"line_number":139,"context_line":"    information to access a Node table record when needed,"},{"line_number":140,"context_line":"    specifically to perform join queries for hash ring"},{"line_number":141,"context_line":"    application."},{"line_number":142,"context_line":"  * A \"state\" field where a new simple state machine will"},{"line_number":143,"context_line":"    represent the state of the task for the conductor and the"},{"line_number":144,"context_line":"    user. The state field will also be the *primary* guard from"}],"source_content_type":"text/x-rst","patch_set":5,"id":"4924463a_b8209a23","line":141,"updated":"2026-05-07 16:57:53.000000000","message":"So I have a concern given some of the use cases for this; let\u0027s think about the idea of bulk node updates, or really ANYTHING that might need to be done \"for each node\".\n\nThese things would now have to insert \"N\" rows for \"N\" nodes synchronously, even to kick off something async, right? So if someone called the (not yet existing) bulk node update API to set a field on 50k nodes, would we be adding 50k rows here?\n\nSo it seems like we might want to orient this in such a way that there\u0027s either a special type of metatask which take a list of nodes, or accept that we may need more than one API endpoint to represent deffered tasks: for instance, nova has instance-actions, maybe we need node-actions for tasks that are shaped this way, and a separate endpoint (like /v1/actions or /v1/jobs, etc) that would allow a more meta-approach to scheduling things.\n\n\n\u003d\u003d\u003d\u003d\u003d\n\nHonestly, if we want tasks shaped this way, with a 1:1 between task and node, I would suggest changing it to \"node actions\" and putting it under /v1/nodes/[id]/actions and moving deferred tasks, generally, to just scope in the Ironic-triggered actions or side-effect actions (e.g. user requests power change, Ironic might implement it via a node action).\n\nThen later, come up with another API endpoint to handle the \"meta\" style tasks which might come in from e.g. a bulk node update (imagine this: I ask the API to update 50k nodes\u0027 deploy_interface, we create a \"job\" that has the list of nodes to operate on, and puts in \"N\" node actions in parallel to implement those jobs, and tracks when they are done to keep queuing node actions until all 50k are done.)","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"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":"f162b5f2ced8da5bbee4ba63572e71c46ca88c75","unresolved":true,"context_lines":[{"line_number":138,"context_line":"  * A node reference, to keep it lightweight, but have enough"},{"line_number":139,"context_line":"    information to access a Node table record when needed,"},{"line_number":140,"context_line":"    specifically to perform join queries for hash ring"},{"line_number":141,"context_line":"    application."},{"line_number":142,"context_line":"  * A \"state\" field where a new simple state machine will"},{"line_number":143,"context_line":"    represent the state of the task for the conductor and the"},{"line_number":144,"context_line":"    user. The state field will also be the *primary* guard from"}],"source_content_type":"text/x-rst","patch_set":5,"id":"70203ae6_2dd2eb62","line":141,"in_reply_to":"4924463a_b8209a23","updated":"2026-05-07 17:00:47.000000000","message":"( this idea is somewhat stolen from https://docs.openstack.org/api-ref/compute/#servers-actions-servers-os-instance-actions FWIW)","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9ee968ba8e89e20f8beac4d2abcb8d15a25c19dc","unresolved":true,"context_lines":[{"line_number":138,"context_line":"  * A node reference, to keep it lightweight, but have enough"},{"line_number":139,"context_line":"    information to access a Node table record when needed,"},{"line_number":140,"context_line":"    specifically to perform join queries for hash ring"},{"line_number":141,"context_line":"    application."},{"line_number":142,"context_line":"  * A \"state\" field where a new simple state machine will"},{"line_number":143,"context_line":"    represent the state of the task for the conductor and the"},{"line_number":144,"context_line":"    user. The state field will also be the *primary* guard from"}],"source_content_type":"text/x-rst","patch_set":5,"id":"74b87108_ef9cced9","line":141,"in_reply_to":"70203ae6_2dd2eb62","updated":"2026-05-11 22:08:12.000000000","message":"So, previously we got into the weeds of implying work and then spawning more work out from it, and honestly those discussions led us down to a level of complexity which which was not bringing clarity because at some point in any process, work has to be split by conductor group, and someone has to take on the role of loading and then splitting the work in our process model.\n\nthat sort of means we need to either take hit on a front end and try to design for that to make it as clean as possible. i.e. under the hood we do bulk record creation in chunks of like a thousand nodes for the work into a relatively small table to ensure we don\u0027t hold the lock too long. The more columns and complexity in the table, the harder that is.\n\nOR, we meta-task it, each conductor then creates self-representing entries, and then somehow, somewhere along the way has to signal that the conductor is done with the enumeration. Which if we do that and we still need to involve the table for work to pickup, then we\u0027re just going to be thrashing the table with individual inserts and creates. Which could deadlock the table with enough activity. Where as if the request gets initial validation and record creation, then we\u0027re at least able to say \"bulk update for x number of rows\" to get the initial records populated and be able to be acted upon. Each conductor beyond that would row level lock on changing the row.\n\nIn other words, its the insert and the delete we get taxed the most on. Delete being lazy, insert needing to be batched.\n\n....\n\nAnd tying with a perception of wanting to tasks to be shaped the way is sort of not what is under discussion. Its about getting a bunch of work recorded and queued quickly and efficiently, and then being able to act on that as we go. It is ultimately the same work, just different sources and the name we associated with that, actions or jobs, or whatever doesn\u0027t really matter.\n\nThe issue is we\u0027re looking at end state and trying to drive the building block directly in that direction.\n\nUltimately, a meta task does sort of make sense, but it could be the immediate request of taking a list and breaking it up for bulk actions. This design sort of doesn\u0027t prevent it, albeit, maybe we allow the Node reference to be None and include a filter reference. Otherwise, we have to just create the entries for each and every node we got. Ideally, at which point under the hood we do a bulk against the table so we insert under a singular lock as opposed to many small locks increasing the round trip time.\n\n---\n\nRe-reading what you posted, I think your more suggesting that maybe we filter the view if we go for the blown out data structure layout. I guess I have no strong opinion, but if I wanted to do a bulk update across many nodes, I suspect I would have a more efficient interaction by interacting with a single API than each node which I might not even know the UUID of without tryign to figure it out again.","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"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":"48a23ebb8b98a5b91f8b04b832fa779aed8eb85c","unresolved":true,"context_lines":[{"line_number":138,"context_line":"  * A node reference, to keep it lightweight, but have enough"},{"line_number":139,"context_line":"    information to access a Node table record when needed,"},{"line_number":140,"context_line":"    specifically to perform join queries for hash ring"},{"line_number":141,"context_line":"    application."},{"line_number":142,"context_line":"  * A \"state\" field where a new simple state machine will"},{"line_number":143,"context_line":"    represent the state of the task for the conductor and the"},{"line_number":144,"context_line":"    user. The state field will also be the *primary* guard from"}],"source_content_type":"text/x-rst","patch_set":5,"id":"d3d9b804_6838f3e7","line":141,"in_reply_to":"74b87108_ef9cced9","updated":"2026-05-14 16:49:26.000000000","message":"Yeah, after our IRC chat, I think the answer is: anything more than \"a single action running on a single node triggered by an existing Ironic API\" is what this spec is scoped to, and we\u0027ll make sure that these 1 node:1 action items are well-suited for bulk-creation as we do the next steps (that will be specified elsewhere).","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"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":"aa7b50ae4b47ccb8a1ab6ff5f711816a3d6297b5","unresolved":true,"context_lines":[{"line_number":144,"context_line":"    user. The state field will also be the *primary* guard from"},{"line_number":145,"context_line":"    a conductor attempting to launch a task multiple times."},{"line_number":146,"context_line":"  * A \"parent_task\" field, for future use which allows for"},{"line_number":147,"context_line":"    structural expansion in future bulk actions."},{"line_number":148,"context_line":"  * A future \"start after\" time."},{"line_number":149,"context_line":"  * A time added field."},{"line_number":150,"context_line":"  * A \"call\" field which relates to the method to be executed."}],"source_content_type":"text/x-rst","patch_set":5,"id":"fe5e8d3c_a4b63199","line":147,"updated":"2026-05-07 16:57:53.000000000","message":"This to me implies we need a way to provide a list of things to act on to avoid the \"N rows to update N nodes\" problem -- like what situation would have a parent/child task relationship where both the parent and child are both associated with the same node? Is there a use case I\u0027m missing (maybe just parent/child node association?)","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9ee968ba8e89e20f8beac4d2abcb8d15a25c19dc","unresolved":true,"context_lines":[{"line_number":144,"context_line":"    user. The state field will also be the *primary* guard from"},{"line_number":145,"context_line":"    a conductor attempting to launch a task multiple times."},{"line_number":146,"context_line":"  * A \"parent_task\" field, for future use which allows for"},{"line_number":147,"context_line":"    structural expansion in future bulk actions."},{"line_number":148,"context_line":"  * A future \"start after\" time."},{"line_number":149,"context_line":"  * A time added field."},{"line_number":150,"context_line":"  * A \"call\" field which relates to the method to be executed."}],"source_content_type":"text/x-rst","patch_set":5,"id":"5e173f39_8ff77d83","line":147,"in_reply_to":"fe5e8d3c_a4b63199","updated":"2026-05-11 22:08:12.000000000","message":"I think we have to embrace the n rows to update n nodes problem. Otherwise we have no ability to say we\u0027re done because we have to distribute the work out.\n\nThink of it as this way. IF we have a way for each conductor to evaluate a statement, then we have to then spawn that to each conductor potentialy. Potentially each conductor should then say \"oh, I\u0027m done or not\", and then they would need to provide details back. So, in an environment with say 15k nodes, 30 conductors, you\u0027ll have 31 rows from a single request. Carrying the \"meta\" data around increases the table size which means overall interaction slows down. Each conductor then has to update some level of status most likely. Without adding a new row, then your just sort of guessing and you can\u0027t reconcile an individual node failure, for example the node is locked by another thread. And then, when all is said and done, something has to then declare the original meta task is done.\n\nI think we just need to do it with efficiency in mind and not try to do it the python object way. That might be read as sacrilege, but turning a giant list of nodes into a bulk update allows for the write to be a single transaction with a single pass by the server to parse, singular index update as opposed to N number of index updates and then those work items to be burned down as they can be. Locks, okay, move on, we can return to it.\n\nI guess at the end of the day, we\u0027re talking about building blocks. Lower layer tools and mechanisms to efficiently, reliably, and accurately act upon requests. Our node and work model is also built around individual nodes via the hash ring. Trying to push away from that because we\u0027re afraid of the huge number of rows feels wrong to me, but I\u0027m happy to discuss. I just thing it boils down to a question of \"Do we try to shift, hide, and best effort it on first try\", or \"do we front-load and efficiently and accurately try our best\"","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"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":"aa7b50ae4b47ccb8a1ab6ff5f711816a3d6297b5","unresolved":true,"context_lines":[{"line_number":153,"context_line":"  * A boolean \"background\" field to signify the task was created"},{"line_number":154,"context_line":"    as part of a normal internal operation as opposed to external"},{"line_number":155,"context_line":"    input. This field is for internal bookkeeping and is not"},{"line_number":156,"context_line":"    exposed via the REST API."},{"line_number":157,"context_line":"  * A \"result\" field which is a string field. Results to this"},{"line_number":158,"context_line":"    field are for user convenience, but also expected to be"},{"line_number":159,"context_line":"    written to a node\u0027s history."}],"source_content_type":"text/x-rst","patch_set":5,"id":"bc7649f6_af4915b3","line":156,"updated":"2026-05-07 16:57:53.000000000","message":"I think operators would appreciate seeing if a task/job/action was created via direct operator action or internal Ironic action. Maybe even make this a string field, which either is the project that created it, \"admin\", or \"internal\"?","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9ee968ba8e89e20f8beac4d2abcb8d15a25c19dc","unresolved":true,"context_lines":[{"line_number":153,"context_line":"  * A boolean \"background\" field to signify the task was created"},{"line_number":154,"context_line":"    as part of a normal internal operation as opposed to external"},{"line_number":155,"context_line":"    input. This field is for internal bookkeeping and is not"},{"line_number":156,"context_line":"    exposed via the REST API."},{"line_number":157,"context_line":"  * A \"result\" field which is a string field. Results to this"},{"line_number":158,"context_line":"    field are for user convenience, but also expected to be"},{"line_number":159,"context_line":"    written to a node\u0027s history."}],"source_content_type":"text/x-rst","patch_set":5,"id":"f308ec1f_c707332d","line":156,"in_reply_to":"bc7649f6_af4915b3","updated":"2026-05-11 22:08:12.000000000","message":"The requesting user id, or just \"ironic\", could make a lot of sense. It would have the same end meaning. My thought here was also that maybe we could sort to help front load these, but honestly this is likely better treated as informational and to just model on timing because we do also want to try and get as much as possible completed as quickly as possible.","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":153,"context_line":"  * A boolean \"background\" field to signify the task was created"},{"line_number":154,"context_line":"    as part of a normal internal operation as opposed to external"},{"line_number":155,"context_line":"    input. This field is for internal bookkeeping and is not"},{"line_number":156,"context_line":"    exposed via the REST API."},{"line_number":157,"context_line":"  * A \"result\" field which is a string field. Results to this"},{"line_number":158,"context_line":"    field are for user convenience, but also expected to be"},{"line_number":159,"context_line":"    written to a node\u0027s history."}],"source_content_type":"text/x-rst","patch_set":5,"id":"c4fd6a36_8b92cc89","line":156,"in_reply_to":"f308ec1f_c707332d","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"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":"aa7b50ae4b47ccb8a1ab6ff5f711816a3d6297b5","unresolved":true,"context_lines":[{"line_number":175,"context_line":".. NOTE::"},{"line_number":176,"context_line":"   Field names in this specification are **NOT** final field"},{"line_number":177,"context_line":"   names, and may be subject to change as the community evolves"},{"line_number":178,"context_line":"   this feature."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"* A new high level \"task\" object for each database row to be"},{"line_number":181,"context_line":"  loaded in from."}],"source_content_type":"text/x-rst","patch_set":5,"id":"ca46da07_bf78fbbe","line":178,"updated":"2026-05-07 16:57:53.000000000","message":"I agree with this sentiment generally, but I do think the concerns I laid out need to be figured out before we write too much code 🙂.","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"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":"aa7b50ae4b47ccb8a1ab6ff5f711816a3d6297b5","unresolved":true,"context_lines":[{"line_number":180,"context_line":"* A new high level \"task\" object for each database row to be"},{"line_number":181,"context_line":"  loaded in from."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* A \"launcher\" periodic task which queries the new database table"},{"line_number":184,"context_line":"  to collect and fill the thread pool with new items up to a"},{"line_number":185,"context_line":"  configurable maximum number of threads to be consumed. This"},{"line_number":186,"context_line":"  periodic runs on a configurable interval. The launcher centers"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dd73e215_dda29027","line":183,"updated":"2026-05-07 16:57:53.000000000","message":"Again, this is all based on the assumption of a 1:1 mapping of node:task which, I think, would lead this table to balloon rapidly.","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"9ee968ba8e89e20f8beac4d2abcb8d15a25c19dc","unresolved":true,"context_lines":[{"line_number":180,"context_line":"* A new high level \"task\" object for each database row to be"},{"line_number":181,"context_line":"  loaded in from."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* A \"launcher\" periodic task which queries the new database table"},{"line_number":184,"context_line":"  to collect and fill the thread pool with new items up to a"},{"line_number":185,"context_line":"  configurable maximum number of threads to be consumed. This"},{"line_number":186,"context_line":"  periodic runs on a configurable interval. The launcher centers"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7504afde_161b9bb3","line":183,"in_reply_to":"dd73e215_dda29027","updated":"2026-05-11 22:08:12.000000000","message":"The intent is for the table to be auto-pruned rather aggressively, fwiw. Yes, that means someone who asks for 50k nodes, might get 50k entries out of the gate, but in rapid order conductors begin working on individual items, marking them done, and eventually they are dropped from the list because the purge logic has triggered.\n\nWhich makes me wonder, if that is agreeable, maybe we actually filter out the list so anything which has been done \u003e15 seconds just disappears. Putting my operator hat in, I care more about knowing there is progress and seeing items disappearing, and finally then knowing what was not able to be acted upon or what is failing.","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"cd67947fbc61d7b12a416875ddf8e4828e4579fc","unresolved":true,"context_lines":[{"line_number":466,"context_line":".. NOTE:: The ``arguments`` and ``call`` fields may be redacted"},{"line_number":467,"context_line":"   for project-scoped users depending on the access rights"},{"line_number":468,"context_line":"   presented, similar to how ``driver_info`` is handled on"},{"line_number":469,"context_line":"   nodes. The ``background`` and ``retry_remaining`` fields are"},{"line_number":470,"context_line":"   internal and not exposed via the API."},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"RBAC"}],"source_content_type":"text/x-rst","patch_set":5,"id":"25494653_fb5c10a9","line":469,"range":{"start_line":469,"start_character":35,"end_line":469,"end_character":50},"updated":"2026-05-05 22:01:15.000000000","message":"nah, this should be exposed.","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"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":"aa7b50ae4b47ccb8a1ab6ff5f711816a3d6297b5","unresolved":true,"context_lines":[{"line_number":466,"context_line":".. NOTE:: The ``arguments`` and ``call`` fields may be redacted"},{"line_number":467,"context_line":"   for project-scoped users depending on the access rights"},{"line_number":468,"context_line":"   presented, similar to how ``driver_info`` is handled on"},{"line_number":469,"context_line":"   nodes. The ``background`` and ``retry_remaining`` fields are"},{"line_number":470,"context_line":"   internal and not exposed via the API."},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"RBAC"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3450022d_07a6b733","line":469,"range":{"start_line":469,"start_character":35,"end_line":469,"end_character":50},"in_reply_to":"25494653_fb5c10a9","updated":"2026-05-07 16:57:53.000000000","message":"++","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"676c9bb3c54a34ce4b51dc65858f4fbd37c220fd","unresolved":false,"context_lines":[{"line_number":466,"context_line":".. NOTE:: The ``arguments`` and ``call`` fields may be redacted"},{"line_number":467,"context_line":"   for project-scoped users depending on the access rights"},{"line_number":468,"context_line":"   presented, similar to how ``driver_info`` is handled on"},{"line_number":469,"context_line":"   nodes. The ``background`` and ``retry_remaining`` fields are"},{"line_number":470,"context_line":"   internal and not exposed via the API."},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"RBAC"}],"source_content_type":"text/x-rst","patch_set":5,"id":"4c822735_22dabd5b","line":469,"range":{"start_line":469,"start_character":35,"end_line":469,"end_character":50},"in_reply_to":"3450022d_07a6b733","updated":"2026-05-20 14:50:34.000000000","message":"Done","commit_id":"4ecebfc0dc6f774b9b71e80cc6d784435ea03667"}]}
