Class: Actions::ForemanPatch::Invocation::Action

Inherits:
EntryAction
  • Object
show all
Includes:
Helpers::WithDelegatedAction
Defined in:
app/lib/actions/foreman_patch/invocation/action.rb

Defined Under Namespace

Classes: TemplateInvocation, TemplateInvocationInputValue

Instance Method Summary collapse

Instance Method Details

#continuous_output_providersObject



95
96
97
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 95

def continuous_output_providers
  super << self
end

#exit_statusObject



78
79
80
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 78

def exit_status
  delegated_output[:exit_status]
end

#featureObject



82
83
84
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 82

def feature
  @feature ||= ::RemoteExecutionFeature.feature(input[:feature_name])
end

#fill_continuous_output(continuous_output) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 99

def fill_continuous_output(continuous_output)
  delegated_output.fetch('result', []).each do |raw_output|
    continuous_output.add_raw_output(raw_output)
  end

  final_timestamp = (continuous_output.last_timestamp || task.ended_at).to_f + 1

  fill_planning_errors_to_continuous_output(continuous_output) unless exit_status
    
  continuous_output.add_output(_('Exit status: %s') % exit_status, 'stdout', final_timestamp) if exit_status
rescue => e
  continuous_output.add_exception(_('Error loading data from proxy'), e)
end

#humanized_nameObject



117
118
119
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 117

def humanized_name
  input[:feature_name].titleize
end

#live_outputObject



90
91
92
93
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 90

def live_output
  continuous_output.sort!
  continuous_output.raw_outputs
end

#plan(host, feature_name, required = true, **input_values) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 41

def plan(host, feature_name, required = true, **input_values)
  action_subject(host, feature_name: feature_name, required: required, **input_values)

  invocation = TemplateInvocation.new(template, **input_values)

  provider = template.provider
  proxy_selector = provider.required_proxy_selector_for(template) || ::RemoteExecutionProxySelector.new

  proxy = proxy_selector.determine_proxy(host, template.provider_type.to_s)

  renderer = InputTemplateRenderer.new(template, host, invocation)
  script = renderer.render
  raise _('Failed rendering template: %s') % renderer.error_message unless script

  additional_options = {
    hostname: provider.find_ip_or_hostname(host),
    execution_timeout_interval: template.execution_timeout_interval,
    script: script,
    secrets: provider.secrets(host),
  }
  action_options = provider.proxy_command_options(invocation, host).merge(additional_options)

  sequence do
    plan_delegated_action(proxy, provider.proxy_action_class, action_options)
    plan_self
  end
end

#required?Boolean

Returns:

  • (Boolean)


113
114
115
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 113

def required?
  input.fetch(:required, true)
end

#rescue_strategy_for_selfObject



121
122
123
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 121

def rescue_strategy_for_self
  required? ? ::Dynflow::Action::Rescue::Fail : ::Dynflow::Action::Rescue::Skip
end

#resource_locksObject



37
38
39
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 37

def resource_locks
  :link
end

#runObject



69
70
71
72
73
74
75
76
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 69

def run
  if exit_status != 0
    users = ::User.select { |user| user.receives?(:patch_invocation_failure) }.compact

    MailNotification[:patch_invocation_failure].deliver(users: users, host: host, output: live_output) unless users.blank?
    fail(_('Patch step failed: %{step}') % {step: humanized_name})
  end
end

#templateObject



86
87
88
# File 'app/lib/actions/foreman_patch/invocation/action.rb', line 86

def template
  @template ||= feature.job_template
end