app/lib/actions/proxy_action.rb in foreman-tasks-0.8.0 vs app/lib/actions/proxy_action.rb in foreman-tasks-0.8.1
- old
+ new
@@ -1,8 +1,7 @@
module Actions
class ProxyAction < Base
-
include ::Dynflow::Action::Cancellable
include ::Dynflow::Action::Timeouts
class CallbackData
attr_reader :data
@@ -10,14 +9,14 @@
def initialize(data)
@data = data
end
end
- def plan(proxy, options)
+ def plan(proxy, klass, options)
options[:connection_options] ||= {}
default_connection_options.each { |key, value| options[:connection_options][key] ||= value }
- plan_self(options.merge(:proxy_url => proxy.url))
+ plan_self(options.merge(:proxy_url => proxy.url, :proxy_action_name => klass.to_s))
end
def run(event = nil)
with_connection_error_handling(event) do |event|
case event
@@ -89,21 +88,37 @@
output[:proxy_output] = data
end
# @override String name of an action to be triggered on server
def proxy_action_name
- raise NotImplemented
+ input[:proxy_action_name]
end
def proxy
ProxyAPI::ForemanDynflow::DynflowProxy.new(:url => input[:proxy_url])
end
- def proxy_output
- output[:proxy_output]
+ def proxy_output(live = false)
+ if output.key?(:proxy_output)
+ output.fetch(:proxy_output) || {}
+ elsif live && output[:proxy_task_id]
+ proxy_data = proxy.status_of_task(output[:proxy_task_id])['actions'].detect { |action| action['class'] == proxy_action_name }
+ proxy_data.fetch('output', {})
+ else
+ {}
+ end
end
+ # The proxy action is able to contribute to continuous output
+ def fill_continuous_output(continuous_output)
+ failed_proxy_tasks.each do |failure_data|
+ message = _('Initialization error: %s') %
+ "#{failure_data[:exception_class]} - #{failure_data[:exception_message]}"
+ continuous_output.add_output(message, 'debug', failure_data[:timestamp])
+ end
+ end
+
def proxy_output=(output)
output[:proxy_output] = output
end
def metadata
@@ -134,10 +149,14 @@
:timeout => Setting['foreman_tasks_proxy_action_start_timeout'] || 60 }
end
private
+ def failed_proxy_tasks
+ metadata[:failed_proxy_tasks] ||= []
+ end
+
def with_connection_error_handling(event = nil)
yield event
rescue ::RestClient::Exception, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ETIMEDOUT => e
if event.class == CallbackData || event == ::Dynflow::Action::Timeouts::Timeout
raise e
@@ -152,14 +171,13 @@
:exception_message => exception.message,
:timestamp => Time.now.to_f }
end
def handle_connection_exception(exception, event = nil)
- metadata[:failed_proxy_tasks] ||= []
options = input[:connection_options]
- metadata[:failed_proxy_tasks] << format_exception(exception)
+ failed_proxy_tasks << format_exception(exception)
output[:proxy_task_id] = nil
- if metadata[:failed_proxy_tasks].count < options[:retry_count]
+ if failed_proxy_tasks.count < options[:retry_count]
suspend do |suspended_action|
@world.clock.ping suspended_action,
Time.now + options[:retry_interval],
event
end