foreman_remote_execution 3.0.3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|