Class: ForemanTasksCore::Runner::Dispatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/foreman_tasks_core/runner/dispatcher.rb

Defined Under Namespace

Classes: RunnerActor

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(clock, logger) ⇒ Dispatcher

Returns a new instance of Dispatcher.



102
103
104
105
106
107
108
109
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 102

def initialize(clock, logger)
  @mutex  = Mutex.new
  @clock  = clock
  @logger = logger
  @ticker = ::ForemanTasksCore::Ticker.spawn('dispatcher-ticker', @clock, @logger, refresh_interval)
  @runner_actors = {}
  @runner_suspended_actions = {}
end

Instance Attribute Details

#tickerObject (readonly)

Returns the value of attribute ticker.



101
102
103
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 101

def ticker
  @ticker
end

Class Method Details

.instanceObject



6
7
8
9
10
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 6

def self.instance
  return @instance if @instance
  @instance = new(ForemanTasksCore.dynflow_world.clock,
                  ForemanTasksCore.dynflow_world.logger)
end

Instance Method Details

#external_event(runner_id, external_event) ⇒ Object



153
154
155
156
157
158
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 153

def external_event(runner_id, external_event)
  synchronize do
    runner_actor = @runner_actors[runner_id]
    runner_actor.tell([:external_event, external_event]) if runner_actor
  end
end

#finish(runner_id) ⇒ Object



143
144
145
146
147
148
149
150
151
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 143

def finish(runner_id)
  synchronize do
    begin
      _finish(runner_id)
    rescue => exception
      _handle_command_exception(runner_id, exception, false)
    end
  end
end

#handle_command_exception(*args) ⇒ Object



160
161
162
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 160

def handle_command_exception(*args)
  synchronize { _handle_command_exception(*args) }
end

#kill(runner_id) ⇒ Object



132
133
134
135
136
137
138
139
140
141
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 132

def kill(runner_id)
  synchronize do
    begin
      runner_actor = @runner_actors[runner_id]
      runner_actor.tell(:kill) if runner_actor
    rescue => exception
      _handle_command_exception(runner_id, exception, false)
    end
  end
end

#refresh_intervalObject



164
165
166
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 164

def refresh_interval
  1
end

#start(suspended_action, runner) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 115

def start(suspended_action, runner)
  synchronize do
    begin
      raise "Actor with runner id #{runner.id} already exists" if @runner_actors[runner.id]
      runner.logger = @logger
      runner_actor = RunnerActor.spawn("runner-actor-#{runner.id}", self, suspended_action, runner, @clock, @logger)
      @runner_actors[runner.id] = runner_actor
      @runner_suspended_actions[runner.id] = suspended_action
      runner_actor.tell(:start_runner)
      return runner.id
    rescue => exception
      _handle_command_exception(runner.id, exception)
      return nil
    end
  end
end

#synchronize(&block) ⇒ Object



111
112
113
# File 'lib/foreman_tasks_core/runner/dispatcher.rb', line 111

def synchronize(&block)
  @mutex.synchronize(&block)
end