foreman_remote_execution 3.0.3 → 3.1.0
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/.hound.yml +2 -1
- data/.rubocop.yml +80 -50
- data/.rubocop_todo.yml +113 -73
- data/Gemfile +4 -0
- data/app/controllers/api/v2/foreign_input_sets_controller.rb +3 -2
- data/app/controllers/api/v2/job_invocations_controller.rb +7 -6
- data/app/controllers/api/v2/job_templates_controller.rb +3 -2
- data/app/controllers/api/v2/remote_execution_features_controller.rb +3 -2
- data/app/controllers/api/v2/template_invocations_controller.rb +1 -1
- data/app/controllers/cockpit_controller.rb +1 -0
- data/app/controllers/concerns/foreman/controller/parameters/foreign_input_set.rb +1 -1
- data/app/controllers/concerns/foreman/controller/parameters/job_template.rb +4 -4
- data/app/controllers/job_invocations_controller.rb +10 -6
- data/app/controllers/job_templates_controller.rb +1 -1
- data/app/controllers/remote_execution_features_controller.rb +3 -2
- data/app/helpers/concerns/foreman_remote_execution/hosts_helper_extensions.rb +16 -5
- data/app/helpers/job_invocations_chart_helper.rb +11 -10
- data/app/helpers/job_invocations_helper.rb +13 -5
- data/app/helpers/remote_execution_helper.rb +43 -46
- data/app/lib/actions/remote_execution/run_host_job.rb +5 -6
- data/app/lib/actions/remote_execution/run_hosts_job.rb +2 -2
- data/app/lib/foreman_remote_execution/renderer/scope/input.rb +1 -0
- data/app/models/concerns/foreman_remote_execution/errors_flattener.rb +0 -2
- data/app/models/concerns/foreman_remote_execution/host_extensions.rb +3 -5
- data/app/models/concerns/foreman_remote_execution/nic_extensions.rb +1 -0
- data/app/models/concerns/foreman_remote_execution/smart_proxy_extensions.rb +1 -0
- data/app/models/foreign_input_set.rb +3 -2
- data/app/models/input_template_renderer.rb +1 -1
- data/app/models/job_invocation.rb +10 -12
- data/app/models/job_invocation_composer.rb +20 -14
- data/app/models/job_invocation_task_group.rb +1 -1
- data/app/models/job_template.rb +3 -3
- data/app/models/remote_execution_feature.rb +0 -2
- data/app/models/remote_execution_provider.rb +4 -2
- data/app/models/setting/remote_execution.rb +54 -56
- data/app/models/ssh_execution_provider.rb +2 -2
- data/app/models/targeting.rb +1 -0
- data/app/models/template_invocation.rb +2 -3
- data/app/views/api/v2/job_invocations/base.json.rabl +1 -1
- data/app/views/api/v2/job_invocations/main.json.rabl +5 -2
- data/app/views/job_invocations/_card_target_hosts.html.erb +12 -0
- data/app/views/job_invocations/_card_user_input.html.erb +1 -1
- data/app/views/job_invocations/_form.html.erb +3 -2
- data/app/views/job_invocations/_rerun_taxonomies.html.erb +22 -0
- data/app/views/job_invocations/_user_input.html.erb +1 -1
- data/app/views/job_invocations/show.html.erb +2 -0
- data/db/migrate/20151215114631_add_host_id_to_template_invocation.rb +1 -0
- data/db/migrate/20180110104432_rename_template_invocation_permission.rb +1 -0
- data/db/seeds.d/50-notification_blueprints.rb +4 -4
- data/db/seeds.d/90-bookmarks.rb +1 -0
- data/extra/cockpit/foreman-cockpit-session +7 -2
- data/lib/foreman_remote_execution/engine.rb +18 -17
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/test/benchmark/run_hosts_job_benchmark.rb +1 -1
- data/test/factories/foreman_remote_execution_factories.rb +1 -1
- data/test/functional/api/v2/job_invocations_controller_test.rb +9 -9
- data/test/functional/api/v2/job_templates_controller_test.rb +1 -1
- data/test/functional/api/v2/remote_execution_features_controller_test.rb +2 -2
- data/test/functional/api/v2/template_invocations_controller_test.rb +4 -4
- data/test/functional/job_invocations_controller_test.rb +11 -11
- data/test/functional/job_templates_controller_test.rb +1 -1
- data/test/unit/actions/run_hosts_job_test.rb +8 -8
- data/test/unit/concerns/foreman_tasks_cleaner_extensions_test.rb +3 -3
- data/test/unit/concerns/host_extensions_test.rb +19 -19
- data/test/unit/concerns/nic_extensions_test.rb +1 -1
- data/test/unit/execution_task_status_mapper_test.rb +10 -10
- data/test/unit/input_template_renderer_test.rb +77 -77
- data/test/unit/job_invocation_composer_test.rb +100 -96
- data/test/unit/job_invocation_test.rb +29 -29
- data/test/unit/job_template_effective_user_test.rb +3 -3
- data/test/unit/job_template_test.rb +31 -31
- data/test/unit/remote_execution_feature_test.rb +19 -19
- data/test/unit/remote_execution_provider_test.rb +29 -29
- data/test/unit/renderer_scope_input.rb +6 -6
- data/test/unit/targeting_test.rb +6 -6
- data/test/unit/template_invocation_input_value_test.rb +3 -3
- metadata +3 -2
@@ -32,7 +32,7 @@ class SSHExecutionProvider < RemoteExecutionProvider
|
|
32
32
|
{
|
33
33
|
:ssh_password => ssh_password(host),
|
34
34
|
:key_passphrase => ssh_key_passphrase(host),
|
35
|
-
:sudo_password => sudo_password(host)
|
35
|
+
:sudo_password => sudo_password(host),
|
36
36
|
}
|
37
37
|
end
|
38
38
|
|
@@ -45,7 +45,7 @@ class SSHExecutionProvider < RemoteExecutionProvider
|
|
45
45
|
:ssh_user => ssh_user(host),
|
46
46
|
:ssh_port => ssh_port(host),
|
47
47
|
:ssh_password => ssh_password(host),
|
48
|
-
:ssh_key_passphrase => ssh_key_passphrase(host)
|
48
|
+
:ssh_key_passphrase => ssh_key_passphrase(host),
|
49
49
|
}
|
50
50
|
end
|
51
51
|
|
data/app/models/targeting.rb
CHANGED
@@ -31,13 +31,12 @@ class TemplateInvocation < ApplicationRecord
|
|
31
31
|
:error => :failed,
|
32
32
|
:pending => :pending,
|
33
33
|
:success => :success,
|
34
|
-
:warning => :failed
|
34
|
+
:warning => :failed,
|
35
35
|
}.with_indifferent_access
|
36
36
|
|
37
|
-
REVERSE_MAP = MAP.
|
37
|
+
REVERSE_MAP = MAP.each_with_object({}) do |(key, value), acc|
|
38
38
|
acc[value] ||= []
|
39
39
|
acc[value] << key
|
40
|
-
acc
|
41
40
|
end.with_indifferent_access
|
42
41
|
|
43
42
|
class << self
|
@@ -7,7 +7,7 @@ node do |invocation|
|
|
7
7
|
:succeeded => invocation_count(invocation, :output_key => :success_count),
|
8
8
|
:failed => invocation_count(invocation, :output_key => :failed_count),
|
9
9
|
:pending => invocation_count(invocation, :output_key => :pending_count),
|
10
|
-
:total => invocation_count(invocation, :output_key => :total_count)
|
10
|
+
:total => invocation_count(invocation, :output_key => :total_count),
|
11
11
|
}
|
12
12
|
end
|
13
13
|
|
@@ -17,7 +17,7 @@ end
|
|
17
17
|
|
18
18
|
child :targeting do
|
19
19
|
attributes :bookmark_id, :search_query, :targeting_type, :user_id, :status, :status_label,
|
20
|
-
|
20
|
+
:randomized_ordering
|
21
21
|
|
22
22
|
child :hosts do
|
23
23
|
extends 'api/v2/hosts/base'
|
@@ -31,6 +31,9 @@ end
|
|
31
31
|
child :template_invocations do
|
32
32
|
attributes :template_id, :template_name
|
33
33
|
child :input_values do
|
34
|
-
attributes :template_input_name, :template_input_id
|
34
|
+
attributes :template_input_name, :template_input_id
|
35
|
+
node :value do |iv|
|
36
|
+
iv.template_input.respond_to?(:hidden_value) && iv.template_input.hidden_value? ? '*' * 5 : iv.value
|
37
|
+
end
|
35
38
|
end
|
36
39
|
end
|
@@ -20,6 +20,18 @@
|
|
20
20
|
<% key = job_invocation.targeting.randomized_ordering ? Targeting::RANDOMIZED : Targeting::ORDERED %>
|
21
21
|
<%= _('Execution order') %>: <strong><%= Targeting::ORDERINGS[key].downcase %></strong>
|
22
22
|
</p>
|
23
|
+
<p>
|
24
|
+
<%= _('Organization') %>:
|
25
|
+
<strong>
|
26
|
+
<%= show_job_organization(@job_organization) %>
|
27
|
+
</strong>
|
28
|
+
</p>
|
29
|
+
<p>
|
30
|
+
<%= _('Location') %>:
|
31
|
+
<strong>
|
32
|
+
<%= show_job_location(@job_location) %>
|
33
|
+
</strong>
|
34
|
+
</p>
|
23
35
|
</div>
|
24
36
|
<div class='card-pf-footer'>
|
25
37
|
<p>
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<p>
|
9
9
|
<ul>
|
10
10
|
<% template_invocation.input_values.joins(:template_input).each do |input_value| %>
|
11
|
-
<li><b><%= input_value.template_input.name %></b>: <%= trunc_with_tooltip(input_value.value, 255) %></li>
|
11
|
+
<li><b><%= input_value.template_input.name %></b>: <%= input_value.template_input.hidden_value ? '*' * 5 : trunc_with_tooltip(input_value.value, 255) %></li>
|
12
12
|
<% end %>
|
13
13
|
</ul>
|
14
14
|
</p>
|
@@ -99,8 +99,8 @@
|
|
99
99
|
</div>
|
100
100
|
|
101
101
|
<div class="advanced hidden">
|
102
|
-
<%= number_f f, :concurrency_level, :label => _('Concurrency level'), :placeholder => 'N', :min => 1, :label_help => N_("Run at most N tasks at a time") %>
|
103
|
-
<%= number_f f, :time_span, :label => _('Time span'), :placeholder => 'N', :min => 1, :label_help => N_("Distribute execution over N seconds")
|
102
|
+
<%= number_f f, :concurrency_level, :label => _('Concurrency level'), :placeholder => 'N', :min => 1, :label_help => N_("Run at most N tasks at a time. If this is set and proxy batch triggering is enabled, then tasks are triggered on the smart proxy in batches of size 1.") %>
|
103
|
+
<%= number_f f, :time_span, :label => _('Time span'), :placeholder => 'N', :min => 1, :label_help => N_("Distribute execution over N seconds. If this is set and proxy batch triggering is enabled, then tasks are triggered on the smart proxy in batches of size 1.") %>
|
104
104
|
</div>
|
105
105
|
|
106
106
|
<div class="form-group advanced hidden">
|
@@ -126,5 +126,6 @@
|
|
126
126
|
|
127
127
|
<%= render :partial => 'preview_hosts_modal' %>
|
128
128
|
|
129
|
+
<%= render partial: 'rerun_taxonomies' if action_name == 'rerun' %>
|
129
130
|
<%= submit_or_cancel f, false, :cancel_path => job_invocations_path, :disabled => !@composer.rerun_possible? %>
|
130
131
|
<% end %>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<% if Organization.current != @job_organization %>
|
2
|
+
<div class="form-group">
|
3
|
+
<div class="col-md-6">
|
4
|
+
<div class="alert alert-warning">
|
5
|
+
<span class="pficon pficon-warning-triangle-o"></span>
|
6
|
+
<%= _("Current organization %{org_c} is different from job's organization %{org_j}.") % { org_c: show_job_organization(Organization.current),
|
7
|
+
org_j: show_job_organization(@job_organization) } %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
12
|
+
<% if Location.current != @job_location %>
|
13
|
+
<div class="form-group">
|
14
|
+
<div class="col-md-6">
|
15
|
+
<div class="alert alert-warning">
|
16
|
+
<span class="pficon pficon-warning-triangle-o"></span>
|
17
|
+
<%= _("Current location %{loc_c} is different from job's location %{loc_j}.") % { loc_c: show_job_location(Location.current),
|
18
|
+
loc_j: show_job_location(@job_location) } %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<% template_invocation.input_values.joins(:template_input).each do |input_value| %>
|
13
13
|
<tr>
|
14
14
|
<td><b><%= input_value.template_input.name %></b></td>
|
15
|
-
<td><%= input_value.value %></td>
|
15
|
+
<td><%= input_value.template_input.hidden_value? ? '*' * 5 : input_value.value %></td>
|
16
16
|
</tr>
|
17
17
|
<% end %>
|
18
18
|
</tbody>
|
@@ -19,6 +19,7 @@
|
|
19
19
|
<% if @job_invocation.recurring_logic.present? %>
|
20
20
|
<li><a href="#recurring_logic" data-toggle="tab"><%= _('Recurring logic') %></a></li>
|
21
21
|
<% end %>
|
22
|
+
<%= render_tab_header_for(:main_tabs, subject: @job_invocation) %>
|
22
23
|
</ul>
|
23
24
|
|
24
25
|
<div class="tab-content">
|
@@ -38,6 +39,7 @@
|
|
38
39
|
</div>
|
39
40
|
</div>
|
40
41
|
<% end %>
|
42
|
+
<%= render_tab_content_for(:main_tabs, subject: @job_invocation) %>
|
41
43
|
</div>
|
42
44
|
|
43
45
|
<script id="job_invocation_refresh" data-refresh-url="<%= job_invocation_path(@job_invocation) %>">
|
@@ -15,6 +15,7 @@ class AddHostIdToTemplateInvocation < ActiveRecord::Migration[4.2]
|
|
15
15
|
:'foreman_tasks_locks.resource_id' => template_invocation.id
|
16
16
|
).first
|
17
17
|
next if task.nil? # skip invocations from very early versions of remote executions
|
18
|
+
|
18
19
|
host_id = task.locks.where(:'foreman_tasks_locks.resource_type' => 'Host::Managed').first.resource_id
|
19
20
|
next unless Host.find_by(id: host_id)
|
20
21
|
|
@@ -14,6 +14,7 @@ class RenameTemplateInvocationPermission < ActiveRecord::Migration[4.2]
|
|
14
14
|
def switch_filtering_permission!(old, new)
|
15
15
|
old_permission = Permission.find_by(:name => old)
|
16
16
|
return if old_permission.nil?
|
17
|
+
|
17
18
|
new_permission = Permission.find_or_create_by(:name => new,
|
18
19
|
:resource_type => 'TemplateInvocation')
|
19
20
|
old_permission.filterings.each do |filtering|
|
data/db/seeds.d/90-bookmarks.rb
CHANGED
@@ -10,6 +10,7 @@ Bookmark.without_auditing do
|
|
10
10
|
next if Bookmark.where(:controller => 'job_invocations').find_by(name: input[:name])
|
11
11
|
# TODO audit should be fixed once core #13109 gets merged
|
12
12
|
next if SeedHelper.audit_modified? Bookmark, input[:name]
|
13
|
+
|
13
14
|
attributes = { :public => true }.merge(input)
|
14
15
|
b = Bookmark.where(:name => input[:name], :controller => input[:controller]).first || Bookmark.new
|
15
16
|
b.attributes = attributes
|
@@ -44,9 +44,11 @@ end
|
|
44
44
|
def read_control
|
45
45
|
size = $stdin.readline.chomp.to_i
|
46
46
|
raise ArgumentError, "Invalid frame: invalid size" if size.zero?
|
47
|
+
|
47
48
|
data = $stdin.read(size)
|
48
49
|
LOG.debug("Received control message #{data.lstrip}")
|
49
50
|
raise ArgumentError, "Invalid frame: too short" if data.nil? || data.length < size
|
51
|
+
|
50
52
|
JSON.parse(data)
|
51
53
|
end
|
52
54
|
|
@@ -67,6 +69,7 @@ def read_auth_reply
|
|
67
69
|
cmd = read_control
|
68
70
|
response = cmd["response"]
|
69
71
|
raise ArgumentError, "Did not receive a valid authorize command" if cmd["command"] != "authorize" || !response
|
72
|
+
|
70
73
|
response
|
71
74
|
end
|
72
75
|
|
@@ -112,8 +115,8 @@ def foreman_call(path, token)
|
|
112
115
|
return JSON.parse(res.body)
|
113
116
|
when "401"
|
114
117
|
exit_with_problem("authentication-failed",
|
115
|
-
|
116
|
-
|
118
|
+
"Token was not valid",
|
119
|
+
{ "password" => "not-tried", "token" => "denied" })
|
117
120
|
when "404"
|
118
121
|
return nil
|
119
122
|
else
|
@@ -135,6 +138,7 @@ def ssh_read_and_handle_response_header(sock, url, params)
|
|
135
138
|
loop do
|
136
139
|
line = sock.readline
|
137
140
|
break unless line && (line != "\r\n")
|
141
|
+
|
138
142
|
header += line
|
139
143
|
end
|
140
144
|
|
@@ -262,6 +266,7 @@ def ssh_with_proxy(proxy, params)
|
|
262
266
|
end
|
263
267
|
|
264
268
|
next unless w.include?($stdout)
|
269
|
+
|
265
270
|
n = $stdout.write(out_buf)
|
266
271
|
$stdout.flush
|
267
272
|
out_buf = out_buf[n..-1]
|
@@ -78,7 +78,7 @@ module ForemanRemoteExecution
|
|
78
78
|
permission :cancel_job_invocations, { :job_invocations => [:cancel], 'api/v2/job_invocations' => [:cancel] }, :resource_type => 'JobInvocation'
|
79
79
|
# this permissions grants user to get auto completion hints when setting up filters
|
80
80
|
permission :filter_autocompletion_for_template_invocation, { :template_invocations => [ :auto_complete_search, :index ] },
|
81
|
-
|
81
|
+
:resource_type => 'TemplateInvocation'
|
82
82
|
permission :cockpit_hosts, { 'cockpit' => [:redirect, :host_ssh_params] }, :resource_type => 'Host'
|
83
83
|
end
|
84
84
|
|
@@ -88,7 +88,7 @@ module ForemanRemoteExecution
|
|
88
88
|
:create_job_invocations,
|
89
89
|
:create_template_invocations,
|
90
90
|
:view_hosts,
|
91
|
-
:view_smart_proxies
|
91
|
+
:view_smart_proxies,
|
92
92
|
].freeze
|
93
93
|
MANAGER_PERMISSIONS = USER_PERMISSIONS + [
|
94
94
|
:cancel_job_invocations,
|
@@ -98,32 +98,32 @@ module ForemanRemoteExecution
|
|
98
98
|
:lock_job_templates,
|
99
99
|
:view_audit_logs,
|
100
100
|
:filter_autocompletion_for_template_invocation,
|
101
|
-
:edit_remote_execution_features
|
101
|
+
:edit_remote_execution_features,
|
102
102
|
]
|
103
103
|
|
104
104
|
# Add a new role called 'Remote Execution User ' if it doesn't exist
|
105
|
-
role 'Remote Execution User', USER_PERMISSIONS
|
106
|
-
role 'Remote Execution Manager', MANAGER_PERMISSIONS
|
105
|
+
role 'Remote Execution User', USER_PERMISSIONS, 'Role with permissions to run remote execution jobs against hosts'
|
106
|
+
role 'Remote Execution Manager', MANAGER_PERMISSIONS, 'Role with permissions to manage job templates, remote execution features, cancel jobs and view audit logs'
|
107
107
|
|
108
108
|
add_all_permissions_to_default_roles
|
109
109
|
|
110
110
|
# add menu entry
|
111
111
|
menu :top_menu, :job_templates,
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
112
|
+
url_hash: { controller: :job_templates, action: :index },
|
113
|
+
caption: N_('Job templates'),
|
114
|
+
parent: :hosts_menu,
|
115
|
+
after: :provisioning_templates
|
116
116
|
menu :admin_menu, :remote_execution_features,
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
117
|
+
url_hash: { controller: :remote_execution_features, action: :index },
|
118
|
+
caption: N_('Remote Execution Features'),
|
119
|
+
parent: :administer_menu,
|
120
|
+
after: :bookmarks
|
121
121
|
|
122
122
|
menu :top_menu, :job_invocations,
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
123
|
+
url_hash: { controller: :job_invocations, action: :index },
|
124
|
+
caption: N_('Jobs'),
|
125
|
+
parent: :monitor_menu,
|
126
|
+
after: :audits
|
127
127
|
|
128
128
|
register_custom_status HostStatus::ExecutionStatus
|
129
129
|
# add dashboard widget
|
@@ -135,6 +135,7 @@ module ForemanRemoteExecution
|
|
135
135
|
end
|
136
136
|
|
137
137
|
extend_rabl_template 'api/v2/smart_proxies/main', 'api/v2/smart_proxies/pubkey'
|
138
|
+
describe_host { overview_buttons_provider :host_overview_buttons }
|
138
139
|
end
|
139
140
|
end
|
140
141
|
|
@@ -37,7 +37,7 @@ class ActionTester
|
|
37
37
|
|
38
38
|
def run_action(*args)
|
39
39
|
action = create_action(Actions::RemoteExecution::RunHostsJob)
|
40
|
-
@task.
|
40
|
+
@task.update(:external_id => action.execution_plan_id)
|
41
41
|
plan_action(action, *args)
|
42
42
|
end
|
43
43
|
end
|
@@ -128,7 +128,7 @@ FactoryBot.modify do
|
|
128
128
|
domain
|
129
129
|
subnet do
|
130
130
|
overrides = {
|
131
|
-
:remote_execution_proxies => [FactoryBot.create(:smart_proxy, :ssh)]
|
131
|
+
:remote_execution_proxies => [FactoryBot.create(:smart_proxy, :ssh)],
|
132
132
|
}
|
133
133
|
|
134
134
|
overrides[:locations] = [location] unless location.nil?
|
@@ -78,9 +78,9 @@ module Api
|
|
78
78
|
context 'with_feature' do
|
79
79
|
setup do
|
80
80
|
@feature = FactoryBot.create(:remote_execution_feature,
|
81
|
-
|
81
|
+
:job_template => @template)
|
82
82
|
@attrs = {
|
83
|
-
feature: @feature.label
|
83
|
+
feature: @feature.label,
|
84
84
|
}
|
85
85
|
end
|
86
86
|
|
@@ -171,7 +171,7 @@ module Api
|
|
171
171
|
assert_equal result['complete'], false
|
172
172
|
assert_equal result['delayed'], true
|
173
173
|
assert_nil result['output']
|
174
|
-
Time.parse(result['start_at']).to_f.must_be_close_to start_time.to_f
|
174
|
+
_(Time.parse(result['start_at']).to_f).must_be_close_to start_time.to_f
|
175
175
|
assert_response :success
|
176
176
|
end
|
177
177
|
|
@@ -227,8 +227,8 @@ module Api
|
|
227
227
|
assert_response :success
|
228
228
|
result = ActiveSupport::JSON.decode(@response.body)
|
229
229
|
targeting = Targeting.find(result['targeting_id'])
|
230
|
-
targeting.user_id.must_equal users(:admin).id
|
231
|
-
targeting.search_query.must_equal @invocation.targeting.search_query
|
230
|
+
_(targeting.user_id).must_equal users(:admin).id
|
231
|
+
_(targeting.search_query).must_equal @invocation.targeting.search_query
|
232
232
|
end
|
233
233
|
|
234
234
|
test 'should not raise an exception when reruning failed has no hosts' do
|
@@ -241,8 +241,8 @@ module Api
|
|
241
241
|
assert_response :success
|
242
242
|
result = ActiveSupport::JSON.decode(@response.body)
|
243
243
|
targeting = Targeting.find(result['targeting_id'])
|
244
|
-
targeting.user_id.must_equal users(:admin).id
|
245
|
-
targeting.search_query.must_equal 'name ^ ()'
|
244
|
+
_(targeting.user_id).must_equal users(:admin).id
|
245
|
+
_(targeting.search_query).must_equal 'name ^ ()'
|
246
246
|
end
|
247
247
|
|
248
248
|
test 'should rerun failed only' do
|
@@ -260,8 +260,8 @@ module Api
|
|
260
260
|
result = ActiveSupport::JSON.decode(@response.body)
|
261
261
|
targeting = Targeting.find(result['targeting_id'])
|
262
262
|
hostnames = @invocation.template_invocations.map { |ti| ti.host.name }
|
263
|
-
targeting.user_id.must_equal users(:admin).id
|
264
|
-
targeting.search_query.must_equal "name ^ (#{hostnames.join(',')})"
|
263
|
+
_(targeting.user_id).must_equal users(:admin).id
|
264
|
+
_(targeting.search_query).must_equal "name ^ (#{hostnames.join(',')})"
|
265
265
|
end
|
266
266
|
|
267
267
|
test 'should return 404 if template is not found' do
|
@@ -39,7 +39,7 @@ module Api
|
|
39
39
|
valid_attrs = { :template => 'This is a test template', :name => 'RandomName', :provider_type => 'ssh' }
|
40
40
|
post :create, params: { :job_template => valid_attrs }
|
41
41
|
template = ActiveSupport::JSON.decode(@response.body)
|
42
|
-
|
42
|
+
assert_equal template['name'], 'RandomName'
|
43
43
|
assert_response :success
|
44
44
|
end
|
45
45
|
|
@@ -5,8 +5,8 @@ module Api
|
|
5
5
|
class RemoteExecutionFeaturesControllerTest < ActionController::TestCase
|
6
6
|
setup do
|
7
7
|
@remote_execution_feature = RemoteExecutionFeature.register(:my_awesome_feature, 'My awesome feature',
|
8
|
-
|
9
|
-
|
8
|
+
:description => 'You will not believe what it does',
|
9
|
+
:provided_inputs => ['awesomeness_level'])
|
10
10
|
@template = FactoryBot.create(:job_template, :with_input)
|
11
11
|
end
|
12
12
|
|
@@ -13,8 +13,8 @@ module Api
|
|
13
13
|
test 'should get template invocations belonging to job invocation' do
|
14
14
|
get :template_invocations, params: { :id => @job.id }
|
15
15
|
invocations = ActiveSupport::JSON.decode(@response.body)
|
16
|
-
invocations['results'].count.must_equal @job.template_invocations.count
|
17
|
-
invocations['total'].must_equal @job.template_invocations.count
|
16
|
+
_(invocations['results'].count).must_equal @job.template_invocations.count
|
17
|
+
_(invocations['total']).must_equal @job.template_invocations.count
|
18
18
|
|
19
19
|
expected_result = {
|
20
20
|
'id' => @template_invocation.id,
|
@@ -23,9 +23,9 @@ module Api
|
|
23
23
|
'template_id' => @template_invocation.template_id,
|
24
24
|
'effective_user' => @template_invocation.effective_user,
|
25
25
|
'job_invocation_id' => @job.id,
|
26
|
-
'run_host_job_task_id' => @template_invocation.run_host_job_task_id
|
26
|
+
'run_host_job_task_id' => @template_invocation.run_host_job_task_id,
|
27
27
|
}
|
28
|
-
invocations['results'].must_equal [expected_result]
|
28
|
+
_(invocations['results']).must_equal [expected_result]
|
29
29
|
assert_response :success
|
30
30
|
end
|
31
31
|
end
|