foreman-tasks 0.8.6 → 0.9.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/.rubocop.yml +35 -0
- data/.rubocop_todo.yml +138 -0
- data/app/controllers/foreman_tasks/api/recurring_logics_controller.rb +3 -4
- data/app/controllers/foreman_tasks/api/tasks_controller.rb +56 -72
- data/app/controllers/foreman_tasks/concerns/hosts_controller_extension.rb +2 -4
- data/app/controllers/foreman_tasks/recurring_logics_controller.rb +2 -5
- data/app/controllers/foreman_tasks/tasks_controller.rb +7 -8
- data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +44 -46
- data/app/helpers/foreman_tasks/tasks_helper.rb +1 -1
- data/app/lib/actions/action_with_sub_plans.rb +6 -8
- data/app/lib/actions/base.rb +6 -7
- data/app/lib/actions/bulk_action.rb +13 -9
- data/app/lib/actions/entry_action.rb +1 -3
- data/app/lib/actions/foreman/host/import_facts.rb +2 -5
- data/app/lib/actions/foreman/puppetclass/import.rb +1 -1
- data/app/lib/actions/helpers/args_serialization.rb +0 -1
- data/app/lib/actions/helpers/humanizer.rb +16 -21
- data/app/lib/actions/helpers/with_continuous_output.rb +0 -1
- data/app/lib/actions/helpers/with_delegated_action.rb +2 -2
- data/app/lib/actions/middleware/inherit_task_groups.rb +3 -5
- data/app/lib/actions/middleware/keep_current_user.rb +0 -3
- data/app/lib/actions/middleware/recurring_logic.rb +0 -1
- data/app/lib/actions/proxy_action.rb +8 -8
- data/app/lib/actions/serializers/active_record_serializer.rb +0 -3
- data/app/lib/proxy_api/foreman_dynflow/dynflow_proxy.rb +3 -3
- data/app/models/foreman_tasks/concerns/action_subject.rb +4 -6
- data/app/models/foreman_tasks/concerns/action_triggering.rb +20 -33
- data/app/models/foreman_tasks/concerns/host_action_subject.rb +5 -5
- data/app/models/foreman_tasks/lock.rb +29 -37
- data/app/models/foreman_tasks/recurring_logic.rb +23 -24
- data/app/models/foreman_tasks/task.rb +65 -39
- data/app/models/foreman_tasks/task/dynflow_task.rb +23 -24
- data/app/models/foreman_tasks/task/status_explicator.rb +3 -3
- data/app/models/foreman_tasks/task/summarizer.rb +3 -3
- data/app/models/foreman_tasks/task_group.rb +0 -2
- data/app/models/foreman_tasks/task_group_member.rb +0 -2
- data/app/models/foreman_tasks/task_groups/recurring_logic_task_group.rb +1 -4
- data/app/models/foreman_tasks/triggering.rb +19 -19
- data/app/models/setting/foreman_tasks.rb +8 -11
- data/app/services/foreman_tasks/proxy_selector.rb +4 -5
- data/app/views/foreman_tasks/tasks/_details.html.erb +1 -1
- data/bin/dynflow-executor +1 -1
- data/bin/foreman-tasks +1 -1
- data/config/routes.rb +1 -1
- data/db/migrate/20150814204140_add_task_type_value_index.rb +1 -1
- data/db/migrate/20160924213030_change_tasks_widget_names.rb +8 -8
- data/db/seeds.d/61-foreman_tasks_bookmarks.rb +3 -3
- data/deploy/foreman-tasks.sysconfig +6 -0
- data/extra/dynflow-debug.sh +12 -0
- data/foreman-tasks.gemspec +1 -1
- data/lib/foreman_tasks.rb +3 -3
- data/lib/foreman_tasks/authorizer_ext.rb +1 -1
- data/lib/foreman_tasks/cleaner.rb +14 -16
- data/lib/foreman_tasks/dynflow.rb +11 -9
- data/lib/foreman_tasks/dynflow/configuration.rb +8 -10
- data/lib/foreman_tasks/dynflow/console_authorizer.rb +4 -5
- data/lib/foreman_tasks/dynflow/daemon.rb +17 -19
- data/lib/foreman_tasks/dynflow/persistence.rb +5 -8
- data/lib/foreman_tasks/engine.rb +30 -31
- data/lib/foreman_tasks/task_error.rb +1 -3
- data/lib/foreman_tasks/tasks/cleanup.rake +7 -19
- data/lib/foreman_tasks/tasks/dynflow.rake +1 -1
- data/lib/foreman_tasks/tasks/export_tasks.rake +51 -59
- data/lib/foreman_tasks/test_extensions.rb +1 -1
- data/lib/foreman_tasks/version.rb +1 -1
- data/lib/tasks/gettext.rake +10 -7
- data/locale/action_names.rb +3 -6
- data/locale/en/foreman_tasks.po +189 -177
- data/locale/foreman_tasks.pot +177 -137
- data/test/controllers/api/recurring_logics_controller_test.rb +3 -5
- data/test/controllers/api/tasks_controller_test.rb +5 -7
- data/test/factories/task_factory.rb +8 -8
- data/test/factories/triggering_factory.rb +2 -3
- data/test/helpers/foreman_tasks/tasks_helper_test.rb +11 -11
- data/test/support/dummy_proxy_action.rb +3 -4
- data/test/unit/actions/action_with_sub_plans_test.rb +5 -6
- data/test/unit/actions/proxy_action_test.rb +5 -8
- data/test/unit/cleaner_test.rb +11 -12
- data/test/unit/dynflow_console_authorizer_test.rb +4 -4
- data/test/unit/proxy_selector_test.rb +3 -3
- data/test/unit/recurring_logic_test.rb +19 -17
- data/test/unit/task_groups_test.rb +3 -4
- data/test/unit/task_test.rb +72 -5
- data/test/unit/triggering_test.rb +0 -1
- metadata +7 -6
- data/app/controllers/foreman_tasks/concerns/environments_extension.rb +0 -24
@@ -1,14 +1,12 @@
|
|
1
1
|
module ForemanTasks
|
2
2
|
class RecurringLogicsController < ::ApplicationController
|
3
|
-
|
4
|
-
before_filter :find_recurring_logic, :only => [:show, :cancel]
|
3
|
+
before_action :find_recurring_logic, :only => [:show, :cancel]
|
5
4
|
|
6
5
|
def index
|
7
6
|
@recurring_logics = filter(resource_base)
|
8
7
|
end
|
9
8
|
|
10
|
-
def show
|
11
|
-
end
|
9
|
+
def show; end
|
12
10
|
|
13
11
|
def cancel
|
14
12
|
@recurring_logic.cancel
|
@@ -28,6 +26,5 @@ module ForemanTasks
|
|
28
26
|
def filter(scope)
|
29
27
|
scope.search_for(params[:search]).paginate(:page => params[:page])
|
30
28
|
end
|
31
|
-
|
32
29
|
end
|
33
30
|
end
|
@@ -2,7 +2,7 @@ module ForemanTasks
|
|
2
2
|
class TasksController < ::ApplicationController
|
3
3
|
include Foreman::Controller::AutoCompleteSearch
|
4
4
|
|
5
|
-
|
5
|
+
before_action :restrict_dangerous_actions, :only => [:unlock, :force_unlock]
|
6
6
|
|
7
7
|
def show
|
8
8
|
@task = Task.find(params[:id])
|
@@ -10,7 +10,7 @@ module ForemanTasks
|
|
10
10
|
|
11
11
|
def index
|
12
12
|
params[:order] ||= 'started_at DESC'
|
13
|
-
@tasks
|
13
|
+
@tasks = filter(resource_base)
|
14
14
|
end
|
15
15
|
|
16
16
|
def sub_tasks
|
@@ -21,7 +21,7 @@ module ForemanTasks
|
|
21
21
|
|
22
22
|
def cancel_step
|
23
23
|
task = find_dynflow_task
|
24
|
-
flash[:notice] = _(
|
24
|
+
flash[:notice] = _('Trying to cancel step %s') % params[:step_id]
|
25
25
|
ForemanTasks.dynflow.world.event(task.external_id, params[:step_id].to_i, ::Dynflow::Action::Cancellable::Cancel).wait
|
26
26
|
redirect_to foreman_tasks_task_path(task)
|
27
27
|
end
|
@@ -54,7 +54,7 @@ module ForemanTasks
|
|
54
54
|
task.save!
|
55
55
|
flash[:notice] = _('The task resources were unlocked.')
|
56
56
|
else
|
57
|
-
flash[:warning] =
|
57
|
+
flash[:warning] = _('The execution has to be paused.')
|
58
58
|
end
|
59
59
|
redirect_to :back
|
60
60
|
end
|
@@ -93,7 +93,7 @@ module ForemanTasks
|
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
96
|
-
def resource_scope(
|
96
|
+
def resource_scope(_options = {})
|
97
97
|
@resource_scope ||= ForemanTasks::Task.authorized("#{action_permission}_foreman_tasks")
|
98
98
|
end
|
99
99
|
|
@@ -102,9 +102,8 @@ module ForemanTasks
|
|
102
102
|
end
|
103
103
|
|
104
104
|
def filter(scope)
|
105
|
-
scope.search_for(params[:search], :order => params[:order])
|
106
|
-
|
105
|
+
scope.search_for(params[:search], :order => params[:order])
|
106
|
+
.paginate(:page => params[:page]).select('DISTINCT foreman_tasks_tasks.*')
|
107
107
|
end
|
108
|
-
|
109
108
|
end
|
110
109
|
end
|
@@ -1,18 +1,17 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
module ForemanTasks
|
3
3
|
module ForemanTasksHelper
|
4
|
-
|
5
4
|
def recurring_logic_state(recurring_logic)
|
6
5
|
icon, status = case recurring_logic.state
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
6
|
+
when 'active'
|
7
|
+
'glyphicon-info-sign'
|
8
|
+
when 'finished'
|
9
|
+
['glyphicon-ok-sign', 'status-ok']
|
10
|
+
when 'cancelled'
|
11
|
+
['glyphicon-warning-sign', 'status-error']
|
12
|
+
else
|
13
|
+
'glyphicon-question-sign'
|
14
|
+
end
|
16
15
|
content_tag(:i, ' '.html_safe, :class => "glyphicon #{icon}") + content_tag(:span, recurring_logic.humanized_state, :class => status)
|
17
16
|
end
|
18
17
|
|
@@ -20,14 +19,14 @@ module ForemanTasks
|
|
20
19
|
return 'task-status pficon-help' if task.state != 'stopped'
|
21
20
|
|
22
21
|
icon_class = case task.result
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
when 'success'
|
23
|
+
'pficon-ok'
|
24
|
+
when 'error'
|
25
|
+
'pficon-error-circle-o'
|
26
|
+
when 'warning'
|
27
|
+
'pficon-ok status-warn'
|
28
|
+
else
|
29
|
+
'pficon-help'
|
31
30
|
end
|
32
31
|
|
33
32
|
"task-status #{icon_class}"
|
@@ -38,7 +37,7 @@ module ForemanTasks
|
|
38
37
|
_('N/A')
|
39
38
|
else
|
40
39
|
content_tag :span, (time > Time.now.utc ? _('in %s') : _('%s ago')) % time_ago_in_words(time),
|
41
|
-
|
40
|
+
:'data-original-title' => time.try(:in_time_zone), :rel => 'twipsy'
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
@@ -47,14 +46,14 @@ module ForemanTasks
|
|
47
46
|
_('N/A')
|
48
47
|
else
|
49
48
|
content_tag :span, distance_of_time_in_words(start, finish),
|
50
|
-
|
49
|
+
:'data-original-title' => number_with_delimiter((finish - start).to_i) + _(' seconds'), :rel => 'twipsy'
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
54
53
|
def recurring_logic_action_buttons(recurring_logic)
|
55
54
|
buttons = []
|
56
55
|
if authorized_for(:permission => :edit_recurring_logics, :auth_object => recurring_logic)
|
57
|
-
buttons << link_to(N_(
|
56
|
+
buttons << link_to(N_('Cancel'), cancel_foreman_tasks_recurring_logic_path(recurring_logic), :method => :post, :class => 'btn btn-danger') unless %w(cancelled finished).include? recurring_logic.state
|
58
57
|
end
|
59
58
|
button_group buttons
|
60
59
|
end
|
@@ -107,7 +106,7 @@ module ForemanTasks
|
|
107
106
|
end
|
108
107
|
end
|
109
108
|
|
110
|
-
def trigger_selector(f, triggering = Triggering.new,
|
109
|
+
def trigger_selector(f, triggering = Triggering.new, _options = {})
|
111
110
|
render :partial => 'common/trigger_form', :locals => { :f => f, :triggering => triggering }
|
112
111
|
end
|
113
112
|
|
@@ -116,15 +115,16 @@ module ForemanTasks
|
|
116
115
|
def future_mode_fieldset(f, triggering)
|
117
116
|
tags = []
|
118
117
|
tags << text_f(f, :start_at_raw, :label => _('Start at'), :placeholder => 'YYYY-mm-dd HH:MM')
|
119
|
-
tags << text_f(f, :start_before_raw, :label => _('Start before'), :placeholder => 'YYYY-mm-dd HH:MM',
|
120
|
-
|
118
|
+
tags << text_f(f, :start_before_raw, :label => _('Start before'), :placeholder => 'YYYY-mm-dd HH:MM',
|
119
|
+
:label_help => _('Indicates that the action should be cancelled if it cannot be started before this time.'))
|
120
|
+
content_tag(:fieldset, nil, :id => 'trigger_mode_future', :class => "trigger_mode_form #{'hidden' unless triggering.future?}") do
|
121
121
|
tags.join.html_safe
|
122
122
|
end
|
123
123
|
end
|
124
124
|
|
125
125
|
def recurring_mode_fieldset(f, triggering)
|
126
126
|
tags = []
|
127
|
-
tags << selectable_f(f, :input_type, %w(cronline monthly weekly daily hourly), {}, :label => _(
|
127
|
+
tags << selectable_f(f, :input_type, %w(cronline monthly weekly daily hourly), {}, :label => _('Repeats'), :id => 'input_type_selector')
|
128
128
|
tags += [
|
129
129
|
cronline_fieldset(f, triggering),
|
130
130
|
monthly_fieldset(f, triggering),
|
@@ -150,17 +150,15 @@ module ForemanTasks
|
|
150
150
|
# TRANSLATORS: this translation is referring to an option which is a time interval
|
151
151
|
_('is day of week (range: 0-6)')
|
152
152
|
].map { |opt| content_tag(:li, opt) }.join
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
content_tag(:fieldset, nil, :class => "input_type_form #{'hidden' unless triggering.input_type == :cronline}", :id => "input_type_cronline") do
|
158
|
-
text_f f, :cronline, :label => _('Cron line'), :placeholder => '* * * * *', :help_inline => help
|
153
|
+
|
154
|
+
help = _("Cron line format 'a b c d e', where: %s") % "<br><ol type=\"a\">#{options}</ol>".html_safe
|
155
|
+
content_tag(:fieldset, nil, :class => "input_type_form #{'hidden' unless triggering.input_type == :cronline}", :id => 'input_type_cronline') do
|
156
|
+
text_f f, :cronline, :label => _('Cron line'), :placeholder => '* * * * *', :label_help => help
|
159
157
|
end
|
160
158
|
end
|
161
159
|
|
162
160
|
def monthly_fieldset(f, triggering)
|
163
|
-
content_tag(:fieldset, nil, :id =>
|
161
|
+
content_tag(:fieldset, nil, :id => 'input_type_monthly', :class => "input_type_form #{'hidden' unless triggering.input_type == :monthly}") do
|
164
162
|
text_f(f, :days, :label => _('Days'), :placeholder => '1,2...')
|
165
163
|
end
|
166
164
|
end
|
@@ -170,14 +168,14 @@ module ForemanTasks
|
|
170
168
|
f.fields_for :days_of_week do |days_of_week|
|
171
169
|
inline_checkboxes_f(days_of_week,
|
172
170
|
:weekday,
|
173
|
-
{ :label => _(
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
171
|
+
{ :label => _('Days of week') },
|
172
|
+
1 => _('Mon'),
|
173
|
+
2 => _('Tue'),
|
174
|
+
3 => _('Wed'),
|
175
|
+
4 => _('Thu'),
|
176
|
+
5 => _('Fri'),
|
177
|
+
6 => _('Sat'),
|
178
|
+
7 => _('Sun'))
|
181
179
|
end
|
182
180
|
end
|
183
181
|
end
|
@@ -186,16 +184,16 @@ module ForemanTasks
|
|
186
184
|
tags = []
|
187
185
|
tags << content_tag(:fieldset, nil, :id => 'time_picker', :class => "input_type_form #{'hidden' if triggering.input_type == :cronline}") do
|
188
186
|
# TRANSLATORS: Time widget for when a task should start
|
189
|
-
time_f(f, :time, { :label => _(
|
187
|
+
time_f(f, :time, { :label => _('At'), :id => 'something' }, :time_separator => '')
|
190
188
|
end
|
191
189
|
tags << number_f(f, :max_iteration, :label => _('Repeat N times'), :min => 1, :placeholder => 'N')
|
192
|
-
tags << field(f, :end_time_limit_select, :label => _(
|
193
|
-
radio_button_f(f, :end_time_limited, :value => false, :checked=> true, :text => _(
|
194
|
-
|
195
|
-
|
190
|
+
tags << field(f, :end_time_limit_select, :label => _('Ends'), :control_group_id => 'end_time_limit_select') do
|
191
|
+
radio_button_f(f, :end_time_limited, :value => false, :checked => true, :text => _('Never'), :class => 'end_time_limit_selector') +
|
192
|
+
# TRANSLATORS: Button text for saying when a task should end
|
193
|
+
radio_button_f(f, :end_time_limited, :value => true, :text => _('On'), :class => 'end_time_limit_selector')
|
196
194
|
end
|
197
195
|
tags << content_tag(:fieldset, nil, :id => 'end_time_limit_form', :class => "input_type_form #{'hidden' unless triggering.end_time_limited}") do
|
198
|
-
datetime_f f, :end_time, { :label => _(
|
196
|
+
datetime_f f, :end_time, { :label => _('Ends at') }, :use_month_numbers => true, :use_two_digit_numbers => true, :time_separator => ''
|
199
197
|
end
|
200
198
|
tags.join.html_safe
|
201
199
|
end
|
@@ -1,21 +1,20 @@
|
|
1
1
|
module Actions
|
2
|
-
|
3
2
|
class Actions::ActionWithSubPlans < Actions::EntryAction
|
4
|
-
|
5
3
|
middleware.use Actions::Middleware::KeepCurrentUser
|
6
4
|
|
7
5
|
include Dynflow::Action::WithSubPlans
|
6
|
+
include Dynflow::Action::WithBulkSubPlans
|
8
7
|
|
9
|
-
def plan(*
|
8
|
+
def plan(*_args)
|
10
9
|
raise NotImplementedError
|
11
10
|
end
|
12
11
|
|
13
12
|
def humanized_output
|
14
13
|
return unless counts_set?
|
15
|
-
_(
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
_('%{total} task(s), %{success} success, %{failed} fail') %
|
15
|
+
{ total: output[:total_count],
|
16
|
+
success: output[:success_count],
|
17
|
+
failed: output[:failed_count] }
|
19
18
|
end
|
20
19
|
|
21
20
|
def run_progress
|
@@ -25,6 +24,5 @@ module Actions
|
|
25
24
|
0.1
|
26
25
|
end
|
27
26
|
end
|
28
|
-
|
29
27
|
end
|
30
28
|
end
|
data/app/lib/actions/base.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Actions
|
2
2
|
class Base < Dynflow::Action
|
3
|
-
|
4
3
|
def task
|
5
4
|
@task ||= ::ForemanTasks::Task::DynflowTask.where(:external_id => execution_plan_id).first!
|
6
5
|
end
|
@@ -8,7 +7,7 @@ module Actions
|
|
8
7
|
# This method says what data form input gets into the task details in Rest API
|
9
8
|
# By default, it sends the whole input there.
|
10
9
|
def task_input
|
11
|
-
|
10
|
+
input
|
12
11
|
end
|
13
12
|
|
14
13
|
# This method says what data form output gets into the task details in Rest API
|
@@ -16,7 +15,7 @@ module Actions
|
|
16
15
|
# perhaps also aggraget data from subactions if needed (using +all_actions+) method
|
17
16
|
# of Dynflow::Action::Presenter
|
18
17
|
def task_output
|
19
|
-
|
18
|
+
output
|
20
19
|
end
|
21
20
|
|
22
21
|
# This method should return humanized description of the action, e.g. "Install package"
|
@@ -27,7 +26,7 @@ module Actions
|
|
27
26
|
# This method should return String or Array<String> describing input for the task
|
28
27
|
def humanized_input
|
29
28
|
if task_input.blank?
|
30
|
-
|
29
|
+
''
|
31
30
|
else
|
32
31
|
task_input.pretty_inspect
|
33
32
|
end
|
@@ -38,7 +37,7 @@ module Actions
|
|
38
37
|
# description of restuls of the action
|
39
38
|
def humanized_output
|
40
39
|
if task_output.blank?
|
41
|
-
|
40
|
+
''
|
42
41
|
else
|
43
42
|
task_output.pretty_inspect
|
44
43
|
end
|
@@ -52,8 +51,8 @@ module Actions
|
|
52
51
|
end
|
53
52
|
|
54
53
|
def already_running?
|
55
|
-
ForemanTasks::Task::DynflowTask.for_action(self.class)
|
56
|
-
|
54
|
+
ForemanTasks::Task::DynflowTask.for_action(self.class)
|
55
|
+
.running.where('external_id != ?', execution_plan_id).any?
|
57
56
|
end
|
58
57
|
|
59
58
|
def serializer_class
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Actions
|
2
|
-
|
3
2
|
class BulkAction < Actions::ActionWithSubPlans
|
4
3
|
# == Parameters:
|
5
4
|
# actions_class::
|
@@ -22,9 +21,9 @@ module Actions
|
|
22
21
|
|
23
22
|
def humanized_name
|
24
23
|
if task.sub_tasks.first
|
25
|
-
|
24
|
+
task.sub_tasks.first.humanized[:action]
|
26
25
|
else
|
27
|
-
_(
|
26
|
+
_('Bulk action')
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
@@ -36,7 +35,7 @@ module Actions
|
|
36
35
|
a_sub_task = task.sub_tasks.first
|
37
36
|
if a_sub_task
|
38
37
|
[a_sub_task.humanized[:action].to_s.downcase] +
|
39
|
-
|
38
|
+
Array(a_sub_task.humanized[:input]) + ['...']
|
40
39
|
end
|
41
40
|
end
|
42
41
|
|
@@ -45,7 +44,7 @@ module Actions
|
|
45
44
|
def create_sub_plans
|
46
45
|
action_class = input[:action_class].constantize
|
47
46
|
target_class = input[:target_class].constantize
|
48
|
-
targets = target_class.where(:id =>
|
47
|
+
targets = target_class.where(:id => current_batch)
|
49
48
|
|
50
49
|
targets.map do |target|
|
51
50
|
trigger(action_class, target, *input[:args])
|
@@ -53,13 +52,18 @@ module Actions
|
|
53
52
|
end
|
54
53
|
|
55
54
|
def check_targets!(targets)
|
56
|
-
if targets.empty?
|
57
|
-
fail ::Foreman::Exception.new(N_("Empty bulk action"))
|
58
|
-
end
|
55
|
+
raise Foreman::Exception, N_('Empty bulk action') if targets.empty?
|
59
56
|
if targets.map(&:class).uniq.length > 1
|
60
|
-
|
57
|
+
raise Foreman::Exception, N_('The targets are of different types')
|
61
58
|
end
|
62
59
|
end
|
63
60
|
|
61
|
+
def batch(from, size)
|
62
|
+
input[:target_ids].slice(from, size)
|
63
|
+
end
|
64
|
+
|
65
|
+
def total_count
|
66
|
+
input[:target_ids].count
|
67
|
+
end
|
64
68
|
end
|
65
69
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Actions
|
2
|
-
|
3
2
|
class EntryAction < Actions::Base
|
4
3
|
include Helpers::ArgsSerialization
|
5
4
|
include Helpers::Lock
|
@@ -57,12 +56,11 @@ module Actions
|
|
57
56
|
end
|
58
57
|
|
59
58
|
def delay(_schedule_options, *args)
|
60
|
-
|
59
|
+
serializer_class.new args
|
61
60
|
end
|
62
61
|
|
63
62
|
def self.serializer_class
|
64
63
|
Serializers::ActiveRecordSerializer
|
65
64
|
end
|
66
|
-
|
67
65
|
end
|
68
66
|
end
|
@@ -1,14 +1,12 @@
|
|
1
1
|
module Actions
|
2
2
|
module Foreman
|
3
3
|
module Host
|
4
|
-
|
5
4
|
class ImportFacts < Actions::EntryAction
|
6
|
-
|
7
5
|
def resource_locks
|
8
6
|
:import_facts
|
9
7
|
end
|
10
8
|
|
11
|
-
def plan(
|
9
|
+
def plan(_host_type, host_name, facts, certname, proxy_id)
|
12
10
|
facts['domain'].try(:downcase!)
|
13
11
|
host = ::Host::Base.import_host(host_name, certname, facts, proxy_id)
|
14
12
|
action_subject(host, :facts => facts)
|
@@ -37,7 +35,7 @@ module Actions
|
|
37
35
|
end
|
38
36
|
|
39
37
|
def humanized_name
|
40
|
-
_(
|
38
|
+
_('Import facts')
|
41
39
|
end
|
42
40
|
|
43
41
|
def humanized_input
|
@@ -48,7 +46,6 @@ module Actions
|
|
48
46
|
def self.cleanup_after
|
49
47
|
'30d'
|
50
48
|
end
|
51
|
-
|
52
49
|
end
|
53
50
|
end
|
54
51
|
end
|