foreman_remote_execution 9.0.0 → 9.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/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
|