diff --git a/lib/foreman_tasks.rb b/lib/foreman_tasks.rb index 1ff2f455e..7bb1543f3 100644 --- a/lib/foreman_tasks.rb +++ b/lib/foreman_tasks.rb @@ -62,6 +62,25 @@ def self.delay(action, delay_options, *args) ForemanTasks::Task::DynflowTask.where(:external_id => result.id).first! end + # Chain a task to wait for prerequisite task(s) to finish before executing. + # The chained task remains 'scheduled' until all prerequisites reach 'stopped' state. + # + # @param plan_uuids [String, Array] UUID(s) of prerequisite execution plan(s) + # @param action [Class] Action class to execute + # @param args Arguments to pass to the action + # @return [ForemanTasks::Task::DynflowTask] The chained task + def self.chain(plan_uuids, action, *args) + result = dynflow.world.chain(plan_uuids, action, *args) + ForemanTasks::Task.find_by(:external_id => result.id) || + begin + delayed_plan = dynflow.world.persistence.load_delayed_plan(result.id) + execution_plan = dynflow.world.persistence.load_execution_plan(result.id) + ForemanTasks::Task::DynflowTask.new_for_execution_plan(execution_plan).tap do |task| + task.update_from_dynflow(execution_plan, delayed_plan) + end + end + end + def self.register_scheduled_task(task_class, cronline) ForemanTasks::RecurringLogic.transaction(isolation: :serializable) do return if ForemanTasks::RecurringLogic.joins(:tasks)