Class: Actions::BulkAction
Instance Method Summary
collapse
#humanized_output
Methods inherited from EntryAction
#action_subject, all_action_names, #delay, #drop_all_locks!, #resource_locks, serializer_class
#exclusive_lock!, #link!, #lock!
#serialize_args
Methods inherited from Base
#already_running?, #humanized_errors, #humanized_output, #notify_paused, #serializer_class, #task, #task_input, #task_output
included, #sync_execution_plan_to_task
included, #log_task_state_change
Instance Method Details
#batch(from, size) ⇒ Object
[View source]
69
70
71
|
# File 'app/lib/actions/bulk_action.rb', line 69
def batch(from, size)
input[:target_ids].slice(from, size)
end
|
#check_targets!(targets) ⇒ Object
[View source]
62
63
64
65
66
67
|
# File 'app/lib/actions/bulk_action.rb', line 62
def check_targets!(targets)
raise Foreman::Exception, N_('Empty bulk action') if targets.empty?
if targets.map(&:class).uniq.length > 1
raise Foreman::Exception, N_('The targets are of different types')
end
end
|
#create_sub_plans ⇒ Object
[View source]
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'app/lib/actions/bulk_action.rb', line 47
def create_sub_plans
action_class = input[:action_class].constantize
target_class = input[:target_class].constantize
targets = target_class.unscoped.where(:id => current_batch)
missing = Array.new((current_batch - targets.map(&:id)).count) { nil }
args = input[:args]
args += [input[:kwargs]] unless input[:kwargs].empty?
(targets + missing).map do |target|
trigger(action_class, target, *args)
end
end
|
[View source]
37
38
39
40
41
42
43
|
# File 'app/lib/actions/bulk_action.rb', line 37
def humanized_input
a_sub_task = task.sub_tasks.first
if a_sub_task
[a_sub_task.humanized[:action].to_s.downcase] +
Array(a_sub_task.humanized[:input]) + ['...']
end
end
|
#humanized_name ⇒ Object
[View source]
25
26
27
28
29
30
31
|
# File 'app/lib/actions/bulk_action.rb', line 25
def humanized_name
if task.sub_tasks.first
task.sub_tasks.first.humanized[:action]
else
_('Bulk action')
end
end
|
#plan(action_class, targets, *args, concurrency_limit: nil, **kwargs) ⇒ Object
Parameters:
- actions_class
-
Class of action to trigger on targets
- targets
-
Array of objects on which the action_class should be triggered
- *args
-
Arguments that all the targets share
[View source]
10
11
12
13
14
15
16
17
18
19
|
# File 'app/lib/actions/bulk_action.rb', line 10
def plan(action_class, targets, *args, concurrency_limit: nil, **kwargs)
check_targets!(targets)
= (args, concurrency_limit)
limit_concurrency_level!() if
plan_self(:action_class => action_class.to_s,
:target_ids => targets.map(&:id),
:target_class => targets.first.class.to_s,
:args => args,
:kwargs => kwargs)
end
|
#rescue_strategy ⇒ Object
[View source]
33
34
35
|
# File 'app/lib/actions/bulk_action.rb', line 33
def rescue_strategy
Dynflow::Action::Rescue::Skip
end
|
#run(event = nil) ⇒ Object
[View source]
21
22
23
|
# File 'app/lib/actions/bulk_action.rb', line 21
def run(event = nil)
super unless event == Dynflow::Action::Skip
end
|
#total_count ⇒ Object
[View source]
73
74
75
|
# File 'app/lib/actions/bulk_action.rb', line 73
def total_count
input[:target_ids].count
end
|