app/lib/actions/proxy_action.rb in foreman-tasks-1.0.1 vs app/lib/actions/proxy_action.rb in foreman-tasks-1.1.0
- old
+ new
@@ -39,16 +39,11 @@
def run(event = nil)
with_connection_error_handling(event) do |event|
case event
when nil
- if remote_task
- on_resume
- else
- trigger_proxy_task
- end
- suspend
+ start_or_resume
when ::Dynflow::Action::Skip
# do nothing
when ::Dynflow::Action::Cancellable::Cancel
cancel_proxy_task
when ::Dynflow::Action::Cancellable::Abort
@@ -75,10 +70,16 @@
remote_task.trigger(proxy_action_name, proxy_input)
output[:proxy_task_id] = remote_task.remote_task_id
end
end
+ def trigger_remote_task
+ suspend do |_suspended_action|
+ ForemanTasks::RemoteTask.batch_trigger(remote_task.operation, [remote_task])
+ end
+ end
+
def proxy_input(task_id = task.id)
input.merge(:callback => { :task_id => task_id,
:step_id => run_step_id })
end
@@ -86,11 +87,11 @@
response = proxy.status_of_task(proxy_task_id)
if %w[stopped paused].include? response['state']
if response['result'] == 'error'
raise ::Foreman::Exception, _('The smart proxy task %s failed.') % proxy_task_id
else
- on_data(response['actions'].find { |block_action| block_action['class'] == proxy_action_name }['output'])
+ on_data(get_proxy_data(response))
end
else
suspend
end
end
@@ -152,14 +153,12 @@
def proxy_output(live = false)
if output.key?(:proxy_output) || state == :error
output.fetch(:proxy_output, {})
elsif live && proxy_task_id
- proxy_data = proxy.status_of_task(proxy_task_id)['actions'].detect do |action|
- action['class'] == proxy_action_name || action.fetch('input', {})['proxy_operation_name'] == proxy_operation_name
- end
- proxy_data.fetch('output', {})
+ response = proxy.status_of_task(proxy_task_id)
+ get_proxy_data(response)
else
{}
end
end
@@ -203,10 +202,30 @@
remote_task.destroy! if remote_task
end
private
+ def start_or_resume
+ if remote_task
+ if remote_task.state == 'external'
+ trigger_remote_task
+ else
+ on_resume
+ end
+ else
+ trigger_proxy_task
+ end
+ suspend
+ end
+
+ def get_proxy_data(response)
+ proxy_data = response['actions'].detect do |action|
+ action['class'] == proxy_action_name || action.fetch('input', {})['proxy_operation_name'] == proxy_operation_name
+ end
+ proxy_data.fetch('output', {})
+ end
+
def proxy_version(proxy)
match = proxy.statuses[:version].version['version'].match(/(\d+)\.(\d+)\.(\d+)/)
{ :major => match[1].to_i, :minor => match[2].to_i, :patch => match[3].to_i }
end
@@ -245,13 +264,15 @@
raise exception
end
end
def prepare_remote_task
+ state = input[:use_concurrency_control] ? 'external' : 'new'
::ForemanTasks::RemoteTask.new(:execution_plan_id => execution_plan_id,
:proxy_url => input[:proxy_url],
:step_id => run_step_id,
- :operation => proxy_operation_name)
+ :operation => proxy_operation_name,
+ :state => state)
end
def proxy_task_id
output[:proxy_task_id] ||= remote_task.try(:remote_task_id)
end