foreman_remote_execution 9.0.0 → 9.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/api/v2/job_invocations_controller.rb +1 -0
- data/app/controllers/job_invocations_controller.rb +10 -0
- data/app/controllers/ui_job_wizard_controller.rb +6 -1
- data/app/helpers/remote_execution_helper.rb +1 -1
- data/app/lib/actions/remote_execution/run_hosts_job.rb +28 -2
- data/app/models/remote_execution_feature.rb +11 -8
- data/app/views/api/v2/job_invocations/base.json.rabl +1 -1
- data/app/views/job_invocations/show.html.erb +1 -1
- data/app/views/job_invocations/welcome.html.erb +1 -1
- data/config/routes.rb +1 -0
- data/db/migrate/20210816100932_rex_setting_category_to_dsl.rb +1 -1
- data/db/migrate/20220426145007_add_unique_feature_label_index.rb +14 -0
- data/lib/foreman_remote_execution/engine.rb +1 -1
- data/lib/foreman_remote_execution/version.rb +1 -1
- data/locale/action_names.rb +2 -2
- data/locale/de/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/de/foreman_remote_execution.po +266 -154
- data/locale/en/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/en/foreman_remote_execution.po +132 -24
- data/locale/en_GB/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/en_GB/foreman_remote_execution.po +149 -41
- data/locale/es/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/es/foreman_remote_execution.po +320 -210
- data/locale/foreman_remote_execution.pot +394 -211
- data/locale/fr/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/fr/foreman_remote_execution.po +353 -241
- data/locale/ja/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ja/foreman_remote_execution.po +368 -261
- data/locale/ko/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ko/foreman_remote_execution.po +161 -53
- data/locale/pt_BR/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/pt_BR/foreman_remote_execution.po +335 -225
- data/locale/ru/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/ru/foreman_remote_execution.po +161 -53
- data/locale/zh_CN/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/zh_CN/foreman_remote_execution.po +465 -359
- data/locale/zh_TW/LC_MESSAGES/foreman_remote_execution.mo +0 -0
- data/locale/zh_TW/foreman_remote_execution.po +162 -54
- data/package.json +6 -6
- data/webpack/JobWizard/JobWizard.js +97 -32
- data/webpack/JobWizard/StartsBeforeErrorAlert.js +17 -0
- data/webpack/JobWizard/__tests__/__snapshots__/integration.test.js.snap +8 -0
- data/webpack/JobWizard/__tests__/fixtures.js +5 -0
- data/webpack/JobWizard/__tests__/integration.test.js +15 -0
- data/webpack/JobWizard/__tests__/validation.test.js +27 -0
- data/webpack/JobWizard/autofill.js +1 -0
- data/webpack/JobWizard/steps/AdvancedFields/__tests__/AdvancedFields.test.js +29 -10
- data/webpack/JobWizard/steps/AdvancedFields/__tests__/__snapshots__/AdvancedFields.test.js.snap +8 -0
- data/webpack/JobWizard/steps/HostsAndInputs/HostPreviewModal.js +3 -0
- data/webpack/JobWizard/steps/HostsAndInputs/__tests__/HostsAndInputs.test.js +38 -1
- data/webpack/JobWizard/steps/HostsAndInputs/buildHostQuery.js +16 -10
- data/webpack/JobWizard/steps/HostsAndInputs/index.js +51 -3
- data/webpack/JobWizard/steps/Schedule/__tests__/Schedule.test.js +33 -13
- data/webpack/JobWizard/steps/form/DateTimePicker.js +1 -1
- data/webpack/JobWizard/submit.js +14 -3
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81407b69460f3a75ba7c4c49d66c499af7075afd1546222ff2e02c56bc4e459e
|
4
|
+
data.tar.gz: c3b6c06eb6ba6a44d1e827e5a3507787a974264c30e58d93170d5d66e4eaa3b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23980086920902efd40d77912e472e0ebd9421c5429dfec561d96c4d7fdfc5cabdde3ff4a999b9ee50227c1163af1a4cffb676b939352d464ab5a6af29899027
|
7
|
+
data.tar.gz: 121f36e745fb79d7364cf42f9de7d875d5da1b1af91ef5138688241f8c520d9c14f0de3b8e584b6d50d0cb7ada113b0c3aa666cba5482214fee978d522c87fe4
|
@@ -71,6 +71,7 @@ module Api
|
|
71
71
|
param :description_format, String, :required => false, :desc => N_('Override the description format from the template for this invocation only')
|
72
72
|
param :execution_timeout_interval, Integer, :required => false, :desc => N_('Override the timeout interval from the template for this invocation only')
|
73
73
|
param :feature, String, :required => false, :desc => N_('Remote execution feature label that should be triggered, job template assigned to this feature will be used')
|
74
|
+
param :time_to_pickup, Integer, :required => false, :desc => N_('Override the global time to pickup interval for this invocation only')
|
74
75
|
|
75
76
|
RemoteExecutionProvider.providers.each_value do |provider|
|
76
77
|
next if !provider.respond_to?(:provider_inputs_doc) || provider.provider_inputs_doc.empty?
|
@@ -40,6 +40,16 @@ class JobInvocationsController < ApplicationController
|
|
40
40
|
render :action => 'new'
|
41
41
|
end
|
42
42
|
|
43
|
+
def legacy_create
|
44
|
+
@composer = prepare_composer
|
45
|
+
if @composer.trigger
|
46
|
+
redirect_to job_invocation_path(@composer.job_invocation)
|
47
|
+
else
|
48
|
+
@composer.job_invocation.description_format = nil if params.fetch(:job_invocation, {}).key?(:description_override)
|
49
|
+
render :action => 'new'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
43
53
|
def create
|
44
54
|
@composer = prepare_composer
|
45
55
|
if @composer.trigger
|
@@ -13,11 +13,13 @@ class UiJobWizardController < ApplicationController
|
|
13
13
|
def template
|
14
14
|
job_template = JobTemplate.authorized.find(params[:id])
|
15
15
|
advanced_template_inputs, template_inputs = map_template_inputs(job_template.template_inputs_with_foreign).partition { |x| x["advanced"] }
|
16
|
+
provider_inputs = job_template.provider.provider_inputs.map { |input| input.instance_values.merge({:provider_input => true, default: input.value }) }
|
16
17
|
render :json => {
|
17
18
|
:job_template => job_template,
|
18
19
|
:effective_user => job_template.effective_user,
|
19
20
|
:template_inputs => template_inputs,
|
20
|
-
:
|
21
|
+
:provider_name => job_template.provider.provider_input_namespace,
|
22
|
+
:advanced_template_inputs => advanced_template_inputs+provider_inputs,
|
21
23
|
}
|
22
24
|
end
|
23
25
|
|
@@ -66,6 +68,9 @@ class UiJobWizardController < ApplicationController
|
|
66
68
|
job_organization = Taxonomy.find_by(id: job.task.input[:current_organization_id])
|
67
69
|
job_location = Taxonomy.find_by(id: job.task.input[:current_location_id])
|
68
70
|
render :json => {
|
71
|
+
:provider_input_values => composer[:template_invocations][0][:provider_input_values],
|
72
|
+
:provider_input_values1 => job[:provider_input_values],
|
73
|
+
:job2 => composer[:template_invocations][0],
|
69
74
|
:job => composer,
|
70
75
|
:job_organization => job_organization,
|
71
76
|
:job_location => job_location,
|
@@ -238,7 +238,7 @@ module RemoteExecutionHelper
|
|
238
238
|
|
239
239
|
def load_template_from_task(template_invocation, target)
|
240
240
|
task = template_invocation.job_invocation.sub_task_for_host(target)
|
241
|
-
return if
|
241
|
+
return if [nil, 'scheduled', 'planning'].include?(task&.state)
|
242
242
|
|
243
243
|
task.execution_plan.actions[1].try(:input).try(:[], 'script')
|
244
244
|
end
|
@@ -5,6 +5,7 @@ module Actions
|
|
5
5
|
include Dynflow::Action::WithBulkSubPlans
|
6
6
|
include Dynflow::Action::WithPollingSubPlans
|
7
7
|
include Actions::RecurringAction
|
8
|
+
include Actions::ObservableAction
|
8
9
|
|
9
10
|
middleware.use Actions::Middleware::BindJobInvocation
|
10
11
|
middleware.use Actions::Middleware::RecurringLogic
|
@@ -12,6 +13,7 @@ module Actions
|
|
12
13
|
|
13
14
|
execution_plan_hooks.use :notify_on_success, :on => :success
|
14
15
|
execution_plan_hooks.use :notify_on_failure, :on => :failure
|
16
|
+
execution_plan_hooks.use :emit_event_running, :on => :running
|
15
17
|
|
16
18
|
class CheckOnProxyActions; end
|
17
19
|
|
@@ -94,9 +96,12 @@ module Actions
|
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
99
|
+
def job_invocation_id
|
100
|
+
input[:job_invocation_id] || input.fetch(:job_invocation, {})[:id]
|
101
|
+
end
|
102
|
+
|
97
103
|
def job_invocation
|
98
|
-
|
99
|
-
@job_invocation ||= JobInvocation.find(id)
|
104
|
+
@job_invocation ||= JobInvocation.find(job_invocation_id)
|
100
105
|
end
|
101
106
|
|
102
107
|
def batch(from, size)
|
@@ -152,6 +157,14 @@ module Actions
|
|
152
157
|
input[:proxy_batch_size]
|
153
158
|
end
|
154
159
|
|
160
|
+
def self.event_names
|
161
|
+
super + [event_name_base + '_' + event_name_suffix('running')]
|
162
|
+
end
|
163
|
+
|
164
|
+
def emit_event_running(plan)
|
165
|
+
emit_event(plan, :running)
|
166
|
+
end
|
167
|
+
|
155
168
|
private
|
156
169
|
|
157
170
|
def mail_notification_preference
|
@@ -163,6 +176,19 @@ module Actions
|
|
163
176
|
|
164
177
|
/\A#{JobInvocation::CACHE_PREFIX}_#{job_invocation_id}/
|
165
178
|
end
|
179
|
+
|
180
|
+
extend ApipieDSL::Class
|
181
|
+
apipie :class, "An action representing execution of a job against a set of hosts" do
|
182
|
+
name 'Actions::RemoteExecution::RunHostsJob'
|
183
|
+
refs 'Actions::RemoteExecution::RunHostsJob'
|
184
|
+
sections only: %w[all webhooks]
|
185
|
+
property :task, object_of: 'Task', desc: 'Returns the task to which this action belongs'
|
186
|
+
property :job_invocation_id, Integer, desc: "Returns the id of the job invocation"
|
187
|
+
property :job_invocation, object_of: 'JobInvocation', desc: "Returns the job invocation"
|
188
|
+
end
|
189
|
+
class Jail < ::Actions::ObservableAction::Jail
|
190
|
+
allow :job_invocation_id, :job_invocation
|
191
|
+
end
|
166
192
|
end
|
167
193
|
end
|
168
194
|
end
|
@@ -43,8 +43,12 @@ class RemoteExecutionFeature < ApplicationRecord
|
|
43
43
|
feature = self.find_by(label: label)
|
44
44
|
builder = options[:notification_builder] ? options[:notification_builder].to_s : nil
|
45
45
|
|
46
|
+
if options[:provided_inputs]
|
47
|
+
provided_inputs = Array(options[:provided_inputs]).join(',')
|
48
|
+
end
|
49
|
+
|
46
50
|
attributes = { :name => name,
|
47
|
-
:
|
51
|
+
:provided_inputs => provided_inputs,
|
48
52
|
:description => options[:description],
|
49
53
|
:host_action_button => options[:host_action_button],
|
50
54
|
:proxy_selector_override => options[:proxy_selector_override],
|
@@ -58,13 +62,12 @@ class RemoteExecutionFeature < ApplicationRecord
|
|
58
62
|
end
|
59
63
|
|
60
64
|
self.without_auditing do
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
return feature
|
65
|
+
# The only validation we currently have is uniqueness validation, which
|
66
|
+
# the upsert will enforce
|
67
|
+
# rubocop:disable Rails/SkipsModelValidations
|
68
|
+
result = self.upsert({ label: label }.merge(attributes), unique_by: :label)
|
69
|
+
self.find(result.first.to_h['id'])
|
70
|
+
# rubocop:enable Rails/SkipsModelValidations
|
68
71
|
end
|
69
72
|
end
|
70
73
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
object @job_invocation
|
2
2
|
|
3
|
-
attributes :id, :description, :job_category, :targeting_id, :status, :start_at, :status_label, :ssh_user
|
3
|
+
attributes :id, :description, :job_category, :targeting_id, :status, :start_at, :status_label, :ssh_user, :time_to_pickup
|
4
4
|
|
5
5
|
node do |invocation|
|
6
6
|
{
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<% title @job_invocation.description %>
|
2
2
|
<% stylesheet 'foreman_remote_execution/foreman_remote_execution' %>
|
3
|
-
<% javascript '
|
3
|
+
<% javascript 'foreman_remote_execution/template_invocation' %>
|
4
4
|
<% javascript *webpack_asset_paths('foreman_remote_execution', :extension => 'js') %>
|
5
5
|
<% content_for(:stylesheets) do %>
|
6
6
|
<%= webpacked_plugins_css_for :foreman_remote_execution %>
|
@@ -9,6 +9,6 @@
|
|
9
9
|
<p><%= link_to _('Learn more about this in the documentation.'),
|
10
10
|
documentation_url('1.ForemanRemoteExecution1.3Manual', :root_url => 'https://www.theforeman.org/plugins/foreman_remote_execution/1.3/index.html#'), :rel => 'external' %></p>
|
11
11
|
<div class="blank-slate-pf-main-action">
|
12
|
-
<%=
|
12
|
+
<%= display_link_if_authorized(_("Run Job"), { :action => :create }, { :class => "btn btn-primary btn-lg" }) %>
|
13
13
|
</div>
|
14
14
|
</div>
|
data/config/routes.rb
CHANGED
@@ -18,6 +18,7 @@ Rails.application.routes.draw do
|
|
18
18
|
|
19
19
|
match 'job_invocations/new', to: 'react#index', :via => [:get], as: 'new_job_invocation'
|
20
20
|
match 'job_invocations/new', to: 'job_invocations#create', via: [:post], as: 'create_job_invocation'
|
21
|
+
match 'job_invocations/', to: 'job_invocations#legacy_create', via: [:post], as: 'legacy_create_job_invocation'
|
21
22
|
match 'job_invocations/:id/rerun', to: 'react#index', :via => [:get], as: 'rerun_job_invocation'
|
22
23
|
match 'old/job_invocations/new', to: 'job_invocations#new', via: [:get], as: 'form_new_job_invocation'
|
23
24
|
match 'old/job_invocations/:id/rerun', to: 'job_invocations#rerun', via: [:get, :post], as: 'form_rerun_job_invocation'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class RexSettingCategoryToDsl < ActiveRecord::Migration[6.0]
|
2
2
|
def up
|
3
|
-
Setting.where(category: 'Setting::RemoteExecution').update_all(category: 'Setting')
|
3
|
+
Setting.where(category: 'Setting::RemoteExecution').update_all(category: 'Setting') if column_exists?(:settings, :category)
|
4
4
|
end
|
5
5
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class AddUniqueFeatureLabelIndex < ActiveRecord::Migration[6.0]
|
4
|
+
def change
|
5
|
+
remove_index :remote_execution_features, :label
|
6
|
+
|
7
|
+
counts = RemoteExecutionFeature.group(:label).count
|
8
|
+
counts.select { |_, count| count > 1 }.each do |label, count|
|
9
|
+
RemoteExecutionFeature.where(label: label).limit(count - 1).delete_all
|
10
|
+
end
|
11
|
+
|
12
|
+
add_index :remote_execution_features, :label, unique: true
|
13
|
+
end
|
14
|
+
end
|
@@ -181,7 +181,7 @@ module ForemanRemoteExecution
|
|
181
181
|
permission :destroy_job_templates, { :job_templates => [:destroy],
|
182
182
|
:'api/v2/job_templates' => [:destroy] }, :resource_type => 'JobTemplate'
|
183
183
|
permission :lock_job_templates, { :job_templates => [:lock, :unlock] }, :resource_type => 'JobTemplate'
|
184
|
-
permission :create_job_invocations, { :job_invocations => [:new, :create, :refresh, :rerun, :preview_hosts],
|
184
|
+
permission :create_job_invocations, { :job_invocations => [:new, :create, :legacy_create, :refresh, :rerun, :preview_hosts],
|
185
185
|
'api/v2/job_invocations' => [:create, :rerun] }, :resource_type => 'JobInvocation'
|
186
186
|
permission :view_job_invocations, { :job_invocations => [:index, :chart, :show, :auto_complete_search], :template_invocations => [:show],
|
187
187
|
'api/v2/job_invocations' => [:index, :show, :output, :raw_output, :outputs] }, :resource_type => 'JobInvocation'
|
data/locale/action_names.rb
CHANGED
Binary file
|