Sha256: 6806013e14dd359765d7d7c49e0f5a58d50de5c08737a6726d49292381a39d32

Contents?: true

Size: 1.8 KB

Versions: 8

Compression:

Stored size: 1.8 KB

Contents

module Dynflow
  module Action::WithPollingSubPlans

    REFRESH_INTERVAL = 10
    Poll = Algebrick.atom

    def run(event = nil)
      case event
      when Poll
        poll
      else
        super(event)
      end
    end

    def poll
      recalculate_counts
      try_to_finish || suspend_and_ping
    end

    def initiate
      ping suspended_action
      super
    end

    def wait_for_sub_plans(sub_plans)
      increase_counts(sub_plans.count, 0)
      suspend
    end

    def resume
      if sub_plans.all? { |sub_plan| sub_plan.error_in_plan? }
        output[:resumed_count] ||= 0
        output[:resumed_count] += output[:failed_count]
        # We're starting over and need to reset the counts
        %w(total failed pending success).each { |key| output.delete("#{key}_count".to_sym) }
        initiate
      else
        if self.is_a?(::Dynflow::Action::WithBulkSubPlans) && can_spawn_next_batch?
          # Not everything was spawned
          ping suspended_action
          spawn_plans
          suspend
        else
          poll
        end
      end
    end

    def notify_on_finish(_sub_plans)
      suspend
    end

    def suspend_and_ping
      suspend { |suspended_action| ping suspended_action }
    end

    def ping(suspended_action)
      world.clock.ping suspended_action, REFRESH_INTERVAL, Poll
    end

    def recalculate_counts
      total      = sub_plans.count
      failed     = sub_plans('state' => %w(paused stopped), 'result' => 'error').count
      success    = sub_plans('state' => 'stopped', 'result' => 'success').count
      output.update(:total_count   => total - output.fetch(:resumed_count, 0),
                    :pending_count => 0,
                    :failed_count  => failed - output.fetch(:resumed_count, 0),
                    :success_count => success)
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
dynflow-0.8.33 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-0.8.32 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-0.8.31 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-0.8.30 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-0.8.29 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-0.8.28 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-0.8.27 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-0.8.26 lib/dynflow/action/with_polling_sub_plans.rb