foreman_remote_execution 1.6.3 → 1.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/foreman_remote_execution/template_input.js +0 -10
- data/app/assets/javascripts/foreman_remote_execution/template_invocation.js +1 -12
- data/app/assets/stylesheets/foreman_remote_execution/template_invocation.css.scss +1 -0
- data/app/controllers/api/v2/job_invocations_controller.rb +5 -1
- data/app/helpers/job_invocation_output_helper.rb +5 -4
- data/app/helpers/job_invocations_helper.rb +0 -29
- data/app/helpers/remote_execution_helper.rb +1 -24
- data/app/lib/foreman_remote_execution/renderer/scope/input.rb +28 -8
- data/app/models/concerns/foreman_remote_execution/template_extensions.rb +0 -12
- data/app/models/concerns/foreman_remote_execution/template_input_extensions.rb +9 -0
- data/app/models/concerns/foreman_remote_execution/template_overrides.rb +11 -0
- data/app/models/input_template_renderer.rb +16 -17
- data/app/models/job_invocation.rb +14 -4
- data/app/models/job_invocation_composer.rb +2 -6
- data/app/models/job_template.rb +23 -52
- data/app/models/template_invocation_input_value.rb +12 -1
- data/app/views/api/v2/smart_proxies/pubkey.json.rabl +1 -0
- data/app/views/job_invocations/_form.html.erb +1 -7
- data/app/views/job_templates/_custom_tabs.html.erb +0 -7
- data/app/views/template_invocations/_output_line_set.html.erb +2 -2
- data/app/views/templates/ssh/module_action.erb +67 -0
- data/app/views/templates/ssh/package_action.erb +39 -7
- data/app/views/templates/ssh/power_action.erb +2 -1
- data/app/views/templates/ssh/puppet_run_once.erb +1 -0
- data/app/views/templates/ssh/run_command.erb +1 -0
- data/app/views/templates/ssh/service_action.erb +9 -1
- data/config/routes.rb +0 -1
- data/lib/foreman_remote_execution/engine.rb +4 -0
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/locale/de/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/de/foreman_remote_execution.po +3 -72
- data/locale/en/foreman_remote_execution.po +3 -72
- data/locale/en_GB/foreman_remote_execution.po +3 -72
- data/locale/es/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/es/foreman_remote_execution.po +3 -72
- data/locale/foreman_remote_execution.pot +124 -225
- data/locale/fr/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/fr/foreman_remote_execution.po +3 -72
- data/locale/ja/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ja/foreman_remote_execution.po +3 -72
- data/locale/ko/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ko/foreman_remote_execution.po +3 -72
- data/locale/pt_BR/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/pt_BR/foreman_remote_execution.po +3 -72
- data/locale/ru/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ru/foreman_remote_execution.po +3 -72
- data/locale/zh_CN/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/zh_CN/foreman_remote_execution.po +3 -72
- data/locale/zh_TW/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/zh_TW/foreman_remote_execution.po +3 -72
- data/test/factories/foreman_remote_execution_factories.rb +6 -5
- data/test/functional/api/v2/job_invocations_controller_test.rb +10 -0
- data/test/unit/input_template_renderer_test.rb +52 -21
- data/test/unit/job_invocation_composer_test.rb +2 -2
- data/test/unit/job_invocation_test.rb +36 -0
- metadata +6 -19
- data/app/controllers/api/v2/template_inputs_controller.rb +0 -92
- data/app/controllers/concerns/foreman/controller/parameters/template_input.rb +0 -17
- data/app/models/template_input.rb +0 -179
- data/app/views/api/v2/template_inputs/base.json.rabl +0 -3
- data/app/views/api/v2/template_inputs/create.json.rabl +0 -3
- data/app/views/api/v2/template_inputs/index.json.rabl +0 -3
- data/app/views/api/v2/template_inputs/main.json.rabl +0 -10
- data/app/views/api/v2/template_inputs/show.json.rabl +0 -3
- data/app/views/template_inputs/_form.html.erb +0 -25
- data/app/views/template_inputs/_invocation_form.html.erb +0 -7
- data/db/migrate/20150616080015_create_template_input.rb +0 -19
- data/db/migrate/20150827152730_add_options_to_template_input.rb +0 -5
- data/db/migrate/20160127134031_add_advanced_to_template_input.rb +0 -11
- data/test/functional/api/v2/template_inputs_controller_test.rb +0 -56
- data/test/unit/template_input_test.rb +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cab4376bc924e75310a2a56b5a659a5305a0da5dc8dbbd9e850f41d1a67b95b
|
4
|
+
data.tar.gz: 6d9bf2cefb54c4f8360dad8026c6bf5dd825466f0a6fe74be404016c1e312ca7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06540f56e6585f76429447973081fd15dabda10f8e58da00783999bb3eec0a237fa61703c98a0e667e0bfa89d4c835e949284521005d2a27a5396958e4d05c7c
|
7
|
+
data.tar.gz: 678fa795c597717faedc8595e5f45ee51a367aa4f0bd974af7329300b82415f636751f5fa24ae3cb37bb7b67ced63d4d58907d89fb36ccfb7c618c4cab3a781d
|
@@ -1,13 +1,3 @@
|
|
1
|
-
$(document).on('change', 'select.input_type_selector', function () {
|
2
|
-
update_visibility_after_input_type_change($(this));
|
3
|
-
});
|
4
|
-
|
5
|
-
function update_visibility_after_input_type_change(select){
|
6
|
-
fieldset = select.closest('fieldset');
|
7
|
-
fieldset.find('div.custom_input_type_fields').hide();
|
8
|
-
fieldset.find('div.' + select.val() + '_input_type').show();
|
9
|
-
}
|
10
|
-
|
11
1
|
function update_foreign_input_set_include(include_all_checkbox) {
|
12
2
|
fieldset = $(include_all_checkbox.closest('fieldset'));
|
13
3
|
fieldset.find('input.foreign_input_set_include').prop('disabled', include_all_checkbox.checked);
|
@@ -70,18 +70,7 @@ function job_invocation_form_binds() {
|
|
70
70
|
|
71
71
|
$('select#targeting_bookmark_id').on('change', refresh_search_query);
|
72
72
|
|
73
|
-
|
74
|
-
}
|
75
|
-
|
76
|
-
function toggle_advanced_fields() {
|
77
|
-
switcher = $('a.advanced_fields_switch');
|
78
|
-
original = switcher.html();
|
79
|
-
switcher.html(switcher.data('alternativeLabel'));
|
80
|
-
switcher.data('alternativeLabel', original);
|
81
|
-
|
82
|
-
switcher.siblings('i').toggleClass('fa-angle-right').toggleClass('fa-angle-down');
|
83
|
-
|
84
|
-
$('div.advanced').toggle()
|
73
|
+
tfm.advancedFields.initAdvancedFields()
|
85
74
|
}
|
86
75
|
|
87
76
|
function delayed_refresh(url, data){
|
@@ -4,7 +4,7 @@ module Api
|
|
4
4
|
include ::Api::Version2
|
5
5
|
include ::Foreman::Renderer
|
6
6
|
|
7
|
-
before_action :find_optional_nested_object
|
7
|
+
before_action :find_optional_nested_object, :only => %w{output}
|
8
8
|
before_action :find_host, :only => %w{output}
|
9
9
|
before_action :find_resource, :only => %w{show update destroy clone cancel rerun}
|
10
10
|
|
@@ -123,6 +123,10 @@ module Api
|
|
123
123
|
|
124
124
|
private
|
125
125
|
|
126
|
+
def allowed_nested_id
|
127
|
+
%w(job_invocation_id)
|
128
|
+
end
|
129
|
+
|
126
130
|
def action_permission
|
127
131
|
case params[:action]
|
128
132
|
when 'output'
|
@@ -1,4 +1,5 @@
|
|
1
1
|
module JobInvocationOutputHelper
|
2
|
+
COLOR_PATTERN = /\e\[.*?m/
|
2
3
|
CONSOLE_COLOR = {
|
3
4
|
'31' => 'red',
|
4
5
|
'32' => 'lightgreen',
|
@@ -17,19 +18,19 @@ module JobInvocationOutputHelper
|
|
17
18
|
}.tap { |h| h.default = 'default' }.freeze
|
18
19
|
|
19
20
|
def colorize_line(line)
|
20
|
-
line = line.gsub(
|
21
|
+
line = line.gsub(COLOR_PATTERN) do |seq|
|
21
22
|
color = seq[/(\d+)m/,1]
|
22
23
|
"{{{format color:#{color}}}}"
|
23
24
|
end
|
24
25
|
|
25
|
-
current_color
|
26
|
+
@current_color ||= 'default'
|
26
27
|
out = %{<span style="color: #{@current_color}">}
|
27
28
|
parts = line.split(/({{{format.*?}}})/)
|
28
29
|
parts.each do |console_line|
|
29
30
|
if console_line.include?('{{{format')
|
30
31
|
if (color_index = console_line[/color:(\d+)/, 1]).present?
|
31
|
-
current_color = CONSOLE_COLOR[color_index]
|
32
|
-
out << %{</span><span style="color: #{current_color}">}
|
32
|
+
@current_color = CONSOLE_COLOR[color_index]
|
33
|
+
out << %{</span><span style="color: #{@current_color}">}
|
33
34
|
end
|
34
35
|
else
|
35
36
|
out << h(console_line)
|
@@ -12,35 +12,6 @@ module JobInvocationsHelper
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
def job_invocation_task_buttons(task)
|
16
|
-
job_invocation = task.task_groups.find { |group| group.class == JobInvocationTaskGroup }.job_invocation
|
17
|
-
buttons = []
|
18
|
-
if authorized_for(hash_for_new_job_invocation_path)
|
19
|
-
buttons << link_to(_('Rerun'), rerun_job_invocation_path(:id => job_invocation.id),
|
20
|
-
:class => 'btn btn-default',
|
21
|
-
:title => _('Rerun the job'))
|
22
|
-
end
|
23
|
-
if authorized_for(hash_for_new_job_invocation_path)
|
24
|
-
buttons << link_to(_('Rerun failed'), rerun_job_invocation_path(:id => job_invocation.id, :failed_only => 1),
|
25
|
-
:class => 'btn btn-default',
|
26
|
-
:disabled => task.sub_tasks.none? { |sub_task| task_failed?(sub_task) },
|
27
|
-
:title => _('Rerun on failed hosts'))
|
28
|
-
end
|
29
|
-
if authorized_for(:permission => :view_foreman_tasks, :auth_object => task)
|
30
|
-
buttons << link_to(_('Job Task'), foreman_tasks_task_path(task),
|
31
|
-
:class => 'btn btn-default',
|
32
|
-
:title => _('See the last task details'))
|
33
|
-
end
|
34
|
-
if authorized_for(:permission => :edit_foreman_tasks, :auth_object => task)
|
35
|
-
buttons << link_to(_('Cancel Job'), cancel_foreman_tasks_task_path(task),
|
36
|
-
:class => 'btn btn-danger',
|
37
|
-
:title => _('Try to cancel the job'),
|
38
|
-
:disabled => !task.cancellable?,
|
39
|
-
:method => :post)
|
40
|
-
end
|
41
|
-
buttons
|
42
|
-
end
|
43
|
-
|
44
15
|
def job_invocations_buttons
|
45
16
|
[
|
46
17
|
documentation_button_rex('3.2ExecutingaJob'),
|
@@ -4,10 +4,6 @@ module RemoteExecutionHelper
|
|
4
4
|
RemoteExecutionProvider.providers.map { |key, provider| [ key, _(provider.humanized_name) ] }
|
5
5
|
end
|
6
6
|
|
7
|
-
def template_input_types_options
|
8
|
-
TemplateInput::TYPES.map { |key, name| [ _(name), key ] }
|
9
|
-
end
|
10
|
-
|
11
7
|
def job_hosts_authorizer
|
12
8
|
@job_hosts_authorizer ||= Authorizer.new(User.current, :collection => @hosts)
|
13
9
|
end
|
@@ -78,7 +74,7 @@ module RemoteExecutionHelper
|
|
78
74
|
if authorized_for(hash_for_new_job_invocation_path)
|
79
75
|
buttons << link_to(_('Rerun failed'), rerun_job_invocation_path(:id => job_invocation.id, :failed_only => 1),
|
80
76
|
:class => 'btn btn-default',
|
81
|
-
:disabled =>
|
77
|
+
:disabled => job_invocation.failed_hosts.none?,
|
82
78
|
:title => _('Rerun on failed hosts'))
|
83
79
|
end
|
84
80
|
if authorized_for(:permission => :view_foreman_tasks, :auth_object => task, :authorizer => task_authorizer)
|
@@ -188,15 +184,6 @@ module RemoteExecutionHelper
|
|
188
184
|
documentation_button section, :root_url => url
|
189
185
|
end
|
190
186
|
|
191
|
-
def template_input_header(f, template)
|
192
|
-
header = _('Template input')
|
193
|
-
unless template.locked?
|
194
|
-
header += ' ' + remove_child_link('x', f, {:rel => 'twipsy', :'data-title' => _('remove template input'), :'data-placement' => 'left',
|
195
|
-
:class => 'fr badge badge-danger'})
|
196
|
-
end
|
197
|
-
header.html_safe # rubocop:disable Rails/OutputSafety
|
198
|
-
end
|
199
|
-
|
200
187
|
def description_checkbox_f(f, job_template, disabled)
|
201
188
|
check_box_tag('description_format_override',
|
202
189
|
job_template.generate_description_format,
|
@@ -225,16 +212,6 @@ module RemoteExecutionHelper
|
|
225
212
|
'name using %{job_category} and %{template_name}.').html_safe # rubocop:disable Rails/OutputSafety
|
226
213
|
end
|
227
214
|
|
228
|
-
def advanced_switch_f(default_text, switch_text)
|
229
|
-
content_tag :div, :class => 'form-group' do
|
230
|
-
content_tag(:div, '', :class => 'col-md-2 control-label') +
|
231
|
-
content_tag(:div, :class => 'col-md-4') do
|
232
|
-
content_tag(:i, '', :class => 'fa fa-angle-right') + ' ' +
|
233
|
-
link_to(default_text, '#', :class => 'advanced_fields_switch', :'data-alternative-label' => switch_text)
|
234
|
-
end
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
215
|
def load_template_from_task(template_invocation, target)
|
239
216
|
task = template_invocation.job_invocation.sub_task_for_host(target)
|
240
217
|
return if task.nil?
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module ForemanRemoteExecution
|
2
2
|
module Renderer
|
3
3
|
module Scope
|
4
|
-
class Input < ::Foreman::Renderer::Scope::
|
4
|
+
class Input < ::Foreman::Renderer::Scope::Template
|
5
5
|
include Foreman::Renderer::Scope::Macros::HostTemplate
|
6
6
|
|
7
|
-
attr_reader :template, :host, :invocation, :
|
7
|
+
attr_reader :template, :host, :invocation, :input_template_instance, :current_user
|
8
8
|
delegate :input, to: :input_template_instance
|
9
9
|
|
10
10
|
def render_error(message)
|
@@ -31,10 +31,14 @@ module ForemanRemoteExecution
|
|
31
31
|
self.error_message = _('included template \'%s\' not found') % template_name
|
32
32
|
raise error_message
|
33
33
|
end
|
34
|
+
|
35
|
+
default_values = template.default_input_values(input_values.keys)
|
34
36
|
if with_foreign_input_set
|
35
37
|
input_values = foreign_input_set_values(template, input_values)
|
36
38
|
end
|
37
|
-
|
39
|
+
input_values = default_values.merge(input_values).with_indifferent_access
|
40
|
+
|
41
|
+
included_renderer = InputTemplateRenderer.new(template, host, invocation, input_values, @preview, @templates_stack)
|
38
42
|
out = included_renderer.render
|
39
43
|
if included_renderer.error_message
|
40
44
|
@input_template_instance.error_message = included_renderer.error_message
|
@@ -48,16 +52,32 @@ module ForemanRemoteExecution
|
|
48
52
|
input_set = @template.foreign_input_sets.find_by(:target_template_id => target_template)
|
49
53
|
return overrides if input_set.nil?
|
50
54
|
|
51
|
-
inputs_to_generate = input_set.inputs.map
|
52
|
-
included_renderer = InputTemplateRenderer.new(input_set.target_template, host, invocation, nil, @preview, @templates_stack)
|
55
|
+
inputs_to_generate = input_set.inputs.map { |i| i.name.to_s } - overrides.keys.map(&:to_s)
|
53
56
|
input_values = inputs_to_generate.inject(HashWithIndifferentAccess.new) do |hash, input_name|
|
54
|
-
hash.merge(input_name =>
|
57
|
+
hash.merge(input_name.to_s => input(input_name))
|
58
|
+
end
|
59
|
+
input_values.merge(overrides).with_indifferent_access
|
60
|
+
end
|
61
|
+
|
62
|
+
def input(name)
|
63
|
+
return template_input_values[name.to_s] if template_input_values.key?(name.to_s)
|
64
|
+
input = find_by_name(template.template_inputs_with_foreign, name) # rubocop:disable Rails/DynamicFindBy
|
65
|
+
if input
|
66
|
+
@preview ? input.preview(self) : input.value(self)
|
67
|
+
else
|
68
|
+
error_message = _('input macro with name \'%s\' used, but no input with such name defined for this template') % name
|
69
|
+
raise UndefinedInput, "Rendering failed, no input with name #{name} for input macro found"
|
55
70
|
end
|
56
|
-
input_values.merge(overrides)
|
57
71
|
end
|
58
72
|
|
59
73
|
def allowed_helpers
|
60
|
-
super + [:input, :render_template, :preview?, :render_error]
|
74
|
+
super + [:input, :render_template, :preview?, :render_error, :current_user]
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
def find_by_name(collection, name)
|
80
|
+
collection.detect { |i| i.name == name.to_s }
|
61
81
|
end
|
62
82
|
end
|
63
83
|
end
|
@@ -4,24 +4,12 @@ module ForemanRemoteExecution
|
|
4
4
|
|
5
5
|
included do
|
6
6
|
# autosave => true is required so the changes of inputs are saved even if template was not changed
|
7
|
-
has_many :template_inputs, :dependent => :destroy, :foreign_key => 'template_id', :autosave => true
|
8
7
|
has_many :foreign_input_sets, :dependent => :destroy, :foreign_key => 'template_id', :autosave => true
|
9
8
|
|
10
9
|
def template_inputs_with_foreign(templates_stack = [])
|
11
10
|
self.template_inputs.to_a + foreign_input_sets.map { |set| set.inputs(templates_stack) }.flatten
|
12
11
|
end
|
13
|
-
accepts_nested_attributes_for :template_inputs, :allow_destroy => true
|
14
12
|
accepts_nested_attributes_for :foreign_input_sets, :allow_destroy => true
|
15
13
|
end
|
16
|
-
|
17
|
-
# create or overwrite instance methods...
|
18
|
-
# def instance_method_name
|
19
|
-
# end
|
20
|
-
|
21
|
-
# module ClassMethods
|
22
|
-
# # create or overwrite class methods...
|
23
|
-
# def class_method_name
|
24
|
-
# end
|
25
|
-
# end
|
26
14
|
end
|
27
15
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ForemanRemoteExecution
|
2
|
+
module TemplateOverrides
|
3
|
+
def inputs_unchanged_when_locked
|
4
|
+
inputs_changed = template_inputs.any? { |input| input.changed? || input.new_record? }
|
5
|
+
foreign_input_sets_changed = foreign_input_sets.any? { |input_set| input_set.changed? || input_set.new_record? }
|
6
|
+
if inputs_changed || foreign_input_sets_changed
|
7
|
+
errors.add(:base, _('This template is locked. Please clone it to a new template to customize.'))
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -7,7 +7,7 @@ class InputTemplateRenderer
|
|
7
7
|
|
8
8
|
delegate :logger, to: Rails
|
9
9
|
|
10
|
-
attr_accessor :template, :host, :invocation, :
|
10
|
+
attr_accessor :template, :host, :invocation, :template_input_values, :error_message, :templates_stack, :current_user
|
11
11
|
|
12
12
|
# takes template object that should be rendered
|
13
13
|
# host and template invocation arguments are optional
|
@@ -18,48 +18,40 @@ class InputTemplateRenderer
|
|
18
18
|
@host = host
|
19
19
|
@template = template
|
20
20
|
@invocation = invocation
|
21
|
-
@
|
21
|
+
@template_input_values = input_values
|
22
22
|
@preview = preview
|
23
23
|
@templates_stack = templates_stack + [template]
|
24
24
|
end
|
25
25
|
|
26
26
|
def render
|
27
|
+
@template_input_values ||= values_from_invocation
|
27
28
|
@template.validate_unique_inputs!
|
28
29
|
source = Foreman::Renderer.get_source(
|
29
30
|
template: template,
|
30
31
|
host: host
|
31
32
|
)
|
32
|
-
scope = Foreman::Renderer.get_scope(
|
33
|
+
@scope = Foreman::Renderer.get_scope(
|
33
34
|
host: host,
|
34
35
|
klass: renderer_scope,
|
36
|
+
template_input_values: @template_input_values,
|
35
37
|
variables: {
|
36
38
|
host: host,
|
37
39
|
template: template,
|
38
40
|
preview: @preview,
|
39
41
|
invocation: invocation,
|
40
|
-
input_values:
|
42
|
+
input_values: @template_input_values,
|
41
43
|
templates_stack: templates_stack,
|
42
|
-
input_template_instance: self
|
44
|
+
input_template_instance: self,
|
45
|
+
current_user: User.current.try(:login)
|
43
46
|
}
|
44
47
|
)
|
45
|
-
Foreman::Renderer.render(source, scope)
|
48
|
+
Foreman::Renderer.render(source, @scope)
|
46
49
|
rescue => e
|
47
50
|
self.error_message ||= _('error during rendering: %s') % e.message
|
48
51
|
Foreman::Logging.exception('Error during rendering of a job template', e)
|
49
52
|
false
|
50
53
|
end
|
51
54
|
|
52
|
-
def input(name)
|
53
|
-
return @input_values[name.to_s] if @input_values
|
54
|
-
input = find_by_name(template.template_inputs_with_foreign, name) # rubocop:disable Rails/DynamicFindBy
|
55
|
-
if input
|
56
|
-
@preview ? input.preview(self) : input.value(self)
|
57
|
-
else
|
58
|
-
error_message = _('input macro with name \'%s\' used, but no input with such name defined for this template') % name
|
59
|
-
raise UndefinedInput, "Rendering failed, no input with name #{name} for input macro found"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
55
|
def preview
|
64
56
|
old_preview = @preview
|
65
57
|
@preview = true
|
@@ -70,6 +62,13 @@ class InputTemplateRenderer
|
|
70
62
|
|
71
63
|
private
|
72
64
|
|
65
|
+
def values_from_invocation
|
66
|
+
input_values = @invocation ? Hash[@invocation.input_values.map { |iv| [iv.template_input.name, iv.value] }] : {}
|
67
|
+
default_values = template.default_input_values(input_values.keys)
|
68
|
+
result = @preview ? input_values : default_values.merge(input_values)
|
69
|
+
result.with_indifferent_access
|
70
|
+
end
|
71
|
+
|
73
72
|
def renderer_scope
|
74
73
|
ForemanRemoteExecution::Renderer::Scope::Input
|
75
74
|
end
|
@@ -156,11 +156,16 @@ class JobInvocation < ApplicationRecord
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def failed_host_ids
|
159
|
-
|
159
|
+
failed_hosts.pluck(:id)
|
160
160
|
end
|
161
161
|
|
162
162
|
def failed_hosts
|
163
|
-
|
163
|
+
base = targeting.hosts
|
164
|
+
if finished?
|
165
|
+
base.where.not(:id => not_failed_template_invocations.select(:host_id))
|
166
|
+
else
|
167
|
+
base.where(:id => failed_template_invocations.select(:host_id))
|
168
|
+
end
|
164
169
|
end
|
165
170
|
|
166
171
|
def total_hosts_count
|
@@ -240,7 +245,12 @@ class JobInvocation < ApplicationRecord
|
|
240
245
|
private
|
241
246
|
|
242
247
|
def failed_template_invocations
|
243
|
-
results = TemplateInvocation::TaskResultMap.status_to_task_result(
|
244
|
-
template_invocations.joins(:run_host_job_task).where(
|
248
|
+
results = [:cancelled, :failed].map { |state| TemplateInvocation::TaskResultMap.status_to_task_result(state) }.flatten
|
249
|
+
template_invocations.joins(:run_host_job_task).where(ForemanTasks::Task.table_name => { :result => results })
|
250
|
+
end
|
251
|
+
|
252
|
+
def not_failed_template_invocations
|
253
|
+
results = [:cancelled, :failed].map { |state| TemplateInvocation::TaskResultMap.status_to_task_result(state) }.flatten
|
254
|
+
template_invocations.joins(:run_host_job_task).where.not(ForemanTasks::Task.table_name => { :result => results })
|
245
255
|
end
|
246
256
|
end
|
@@ -461,14 +461,10 @@ class JobInvocationComposer
|
|
461
461
|
pattern_template_invocations.find { |invocation| invocation.template == job_template }
|
462
462
|
end
|
463
463
|
|
464
|
-
def
|
464
|
+
def input_value_for(input)
|
465
465
|
invocations = pattern_template_invocations
|
466
466
|
default = TemplateInvocationInputValue.new
|
467
|
-
|
468
|
-
invocation.input_values.detect { |iv| iv.template_input_id == input.id } || default
|
469
|
-
else
|
470
|
-
default
|
471
|
-
end
|
467
|
+
invocations.map(&:input_values).flatten.detect { |iv| iv.template_input_id == input.id } || default
|
472
468
|
end
|
473
469
|
|
474
470
|
def job_template_ids
|