class Dynflow::Director::PlanningWorkItem

Public Instance Methods

execute() click to toggle source
# File lib/dynflow/director.rb, line 113
def execute
  plan = world.persistence.load_delayed_plan(execution_plan_id)
  return if plan.nil? || plan.execution_plan.state != :scheduled

  if plan.start_before.nil?
    blocker_ids = world.persistence.find_execution_plan_dependencies(execution_plan_id)
    statuses = world.persistence.find_execution_plan_statuses({ filters: { uuid: blocker_ids } })
    failed = statuses.select { |_uuid, status| status[:state] == 'stopped' && status[:result] == 'error' }
    if failed.any?
      plan.failed_dependencies(failed.keys)
      return
    end
  elsif plan.start_before < Time.now.utc()
    plan.timeout
    return
  end

  world.coordinator.acquire(Coordinator::PlanningLock.new(world, plan.execution_plan_uuid)) do
    plan.plan
  end
  plan.execute
rescue => e
  world.logger.warn e.message
  world.logger.debug e.backtrace.join("\n")
end