Sha256: 60c8ec805243bae7b621fdc2793b6806bb8f950da7153da49ab8cb360dfcfc7e

Contents?: true

Size: 1.82 KB

Versions: 23

Compression:

Stored size: 1.82 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_count('state' => %w(paused stopped), 'result' => 'error')
      success    = sub_plans_count('state' => 'stopped', 'result' => 'success')
      output.update(:total_count   => total - output.fetch(:resumed_count, 0),
                    :pending_count => total - failed - success,
                    :failed_count  => failed - output.fetch(:resumed_count, 0),
                    :success_count => success)
    end
  end
end

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
dynflow-1.3.0 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.2.3 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.2.2 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.2.1 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.2.0 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.2.0.pre1 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.1.6 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.1.5 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.1.4 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.1.3 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.1.2 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.1.1 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.1.0 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.0.5 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.0.4 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.0.3 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.0.2 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.0.1 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-1.0.0 lib/dynflow/action/with_polling_sub_plans.rb
dynflow-0.8.37 lib/dynflow/action/with_polling_sub_plans.rb