)]}'
{"ironic/common/exception.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":1157,"context_line":"                 \"for node %(node)s and network %(vif_id)s\")"},{"line_number":1158,"context_line":""},{"line_number":1159,"context_line":""},{"line_number":1160,"context_line":"class DeferredActionNotFound(NotFound):"},{"line_number":1161,"context_line":"    _msg_fmt \u003d _(\"Deferred action %(action)s could not be found.\")"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"05fe3743_d9b38951","line":1160,"updated":"2026-06-25 16:13:36.000000000","message":"nit: docstrings","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":""},{"line_number":1164,"context_line":"class DeferredActionAlreadyExists(Conflict):"},{"line_number":1165,"context_line":"    _msg_fmt \u003d _(\"A deferred action with UUID %(uuid)s \""},{"line_number":1166,"context_line":"                 \"already exists.\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"2813fb81_89bc4ac7","line":1165,"updated":"2026-06-25 16:13:36.000000000","message":"ditto.","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"}],"ironic/db/api.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":1798,"context_line":"        \"\"\"Create a new deferred action."},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"        :param values: Dict of values to create the action with."},{"line_number":1801,"context_line":"        :returns: A deferred action."},{"line_number":1802,"context_line":"        :raises: DeferredActionAlreadyExists"},{"line_number":1803,"context_line":"        \"\"\""},{"line_number":1804,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"58a43f30_437a1a69","line":1801,"updated":"2026-06-25 16:13:36.000000000","message":"nit: A deferred action object.","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":1807,"context_line":"        \"\"\"Return a deferred action by its id."},{"line_number":1808,"context_line":""},{"line_number":1809,"context_line":"        :param action_id: The id of the deferred action."},{"line_number":1810,"context_line":"        :returns: A deferred action."},{"line_number":1811,"context_line":"        :raises: DeferredActionNotFound"},{"line_number":1812,"context_line":"        \"\"\""},{"line_number":1813,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5c319963_4339a4df","line":1810,"updated":"2026-06-25 16:13:36.000000000","message":"nit: A deferred action object.","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":1816,"context_line":"        \"\"\"Return a deferred action by its uuid."},{"line_number":1817,"context_line":""},{"line_number":1818,"context_line":"        :param action_uuid: The uuid of the deferred action."},{"line_number":1819,"context_line":"        :returns: A deferred action."},{"line_number":1820,"context_line":"        :raises: DeferredActionNotFound"},{"line_number":1821,"context_line":"        \"\"\""},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c490e003_ceb1d50f","line":1819,"updated":"2026-06-25 16:13:36.000000000","message":"nit: object!","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"}],"ironic/db/sqlalchemy/alembic/versions/d2025051800_add_deferred_actions_table.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":37,"context_line":"                  autoincrement\u003dTrue),"},{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.Column(\u0027state\u0027, sa.String(length\u003d15), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sa.Column(\u0027parent_action\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027start_after\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":43,"context_line":"        sa.Column(\u0027call\u0027, sa.String(length\u003d255), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"a548adf8_397c5691","line":40,"updated":"2026-06-25 16:13:36.000000000","message":"Nit: this might want to be True, in order to kick a action back into gear, but... eh. Likely not MVP.","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        sa.Column(\u0027uuid\u0027, sa.String(length\u003d36), nullable\u003dFalse),"},{"line_number":39,"context_line":"        sa.Column(\u0027node_id\u0027, sa.Integer(), nullable\u003dFalse),"},{"line_number":40,"context_line":"        sa.Column(\u0027state\u0027, sa.String(length\u003d15), nullable\u003dFalse),"},{"line_number":41,"context_line":"        sa.Column(\u0027parent_action\u0027, sa.Integer(), nullable\u003dTrue),"},{"line_number":42,"context_line":"        sa.Column(\u0027start_after\u0027, sa.DateTime(), nullable\u003dTrue),"},{"line_number":43,"context_line":"        sa.Column(\u0027call\u0027, sa.String(length\u003d255), nullable\u003dFalse),"},{"line_number":44,"context_line":"        sa.Column(\u0027arguments\u0027, db_types.JsonEncodedDict(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"d0d531ad_33a2a117","line":41,"updated":"2026-06-25 16:13:36.000000000","message":"strictly speaking, I don\u0027t think parent action is really needed right now, as a self referential pointer at the moment, but is something cid\u0027s work will need later.","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":52,"context_line":"        sa.UniqueConstraint(\u0027uuid\u0027,"},{"line_number":53,"context_line":"                            name\u003d\u0027uniq_deferredactions0uuid\u0027),"},{"line_number":54,"context_line":"        sa.ForeignKeyConstraint([\u0027node_id\u0027], [\u0027nodes.id\u0027]),"},{"line_number":55,"context_line":"        sa.ForeignKeyConstraint([\u0027parent_action\u0027],"},{"line_number":56,"context_line":"                                [\u0027deferred_actions.id\u0027]),"},{"line_number":57,"context_line":"        sa.Index(\u0027deferred_actions_state_idx\u0027, \u0027state\u0027),"},{"line_number":58,"context_line":"        sa.Index(\u0027deferred_actions_start_after_idx\u0027,"},{"line_number":59,"context_line":"                 \u0027start_after\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"865bebc1_f7788ad0","line":56,"range":{"start_line":55,"start_character":0,"end_line":56,"end_character":57},"updated":"2026-06-25 16:13:36.000000000","message":"Thinking outloud, and this is not an issue here, but in cleanup logic later: deletions may fail for the id\u0027s referenecd in parent actions until all of the linked IDs are deleted. That seems to be okay to me.","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"}],"ironic/db/sqlalchemy/api.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":false,"context_lines":[{"line_number":3602,"context_line":""},{"line_number":3603,"context_line":"    @oslo_db_api.retry_on_deadlock"},{"line_number":3604,"context_line":"    def update_deferred_action(self, action_id, values):"},{"line_number":3605,"context_line":"        if \u0027uuid\u0027 in values:"},{"line_number":3606,"context_line":"            msg \u003d _(\"Cannot overwrite UUID for a deferred \""},{"line_number":3607,"context_line":"                    \"action.\")"},{"line_number":3608,"context_line":"            raise exception.InvalidParameterValue(err\u003dmsg)"},{"line_number":3609,"context_line":"        try:"},{"line_number":3610,"context_line":"            with _session_for_write() as session:"},{"line_number":3611,"context_line":"                query \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"5fe06f24_5a2a916d","line":3608,"range":{"start_line":3605,"start_character":0,"end_line":3608,"end_character":58},"updated":"2026-06-25 16:13:36.000000000","message":"How nice and defensive at a low level!","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"900b71a8a0b345d58affd9408dc90c7650e199b2","unresolved":true,"context_lines":[{"line_number":3637,"context_line":"    @oslo_db_api.retry_on_deadlock"},{"line_number":3638,"context_line":"    def purge_old_deferred_actions(self, cutoff, batch_size\u003d100):"},{"line_number":3639,"context_line":"        total \u003d 0"},{"line_number":3640,"context_line":"        while True:"},{"line_number":3641,"context_line":"            with _session_for_write() as session:"},{"line_number":3642,"context_line":"                res \u003d session.execute("},{"line_number":3643,"context_line":"                    sa.delete(models.DeferredAction)"}],"source_content_type":"text/x-python","patch_set":2,"id":"2fb8633e_019e8584","line":3640,"range":{"start_line":3640,"start_character":7,"end_line":3640,"end_character":19},"updated":"2026-06-25 16:13:36.000000000","message":"No. We can\u0027t put a while True in here. In fact, their is no *gain* to doing so. This method needs to be executed via a periodic task. The right way to do this is to do similar to what we do for node_history. Specificially query_node_history_records_for_purge and then bulk delete the records to minimize locking time. As previously noted though we also need to handle deletions around nested action objects. I think the right thing to do is to drop this method, and implement it specifically in a two step model which also can navigate the foreign key failure issues as well. On a plus side, this is kind of still being defensive.","commit_id":"a2917fbe646cf2b73ba2b1c6fa09ade7f8bb79a1"}]}
