Class: Actions::BulkAction
- Inherits:
-
ActionWithSubPlans
- Object
- Dynflow::Action
- Base
- EntryAction
- ActionWithSubPlans
- Actions::BulkAction
- Includes:
- Dynflow::Action::WithBulkSubPlans
- Defined in:
- app/lib/actions/bulk_action.rb
Instance Method Summary collapse
- #batch(from, size) ⇒ Object
- #check_targets!(targets) ⇒ Object
- #create_sub_plans ⇒ Object
- #humanized_input ⇒ Object
- #humanized_name ⇒ Object
-
#plan(action_class, targets, *args) ⇒ 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.
- #rescue_strategy ⇒ Object
- #run(event = nil) ⇒ Object
- #total_count ⇒ Object
Methods inherited from ActionWithSubPlans
#humanized_output, #run_progress
Methods inherited from EntryAction
#action_subject, all_action_names, #delay, #drop_all_locks!, #resource_locks, serializer_class
Methods included from Helpers::Lock
#exclusive_lock!, #link!, #lock!
Methods included from Helpers::ArgsSerialization
Methods inherited from Base
#already_running?, #humanized_errors, #humanized_output, #notify_paused, #serializer_class, #task, #task_input, #task_output
Methods included from TaskSynchronization
included, #sync_execution_plan_to_task
Methods included from Helpers::LifecycleLogging
included, #log_task_state_change
Instance Method Details
#batch(from, size) ⇒ Object
65 66 67 |
# File 'app/lib/actions/bulk_action.rb', line 65 def batch(from, size) input[:target_ids].slice(from, size) end |
#check_targets!(targets) ⇒ Object
58 59 60 61 62 63 |
# File 'app/lib/actions/bulk_action.rb', line 58 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
46 47 48 49 50 51 52 53 54 55 56 |
# File 'app/lib/actions/bulk_action.rb', line 46 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 } (targets + missing).map do |target| trigger(action_class, target, *input[:args]) end end |
#humanized_input ⇒ Object
36 37 38 39 40 41 42 |
# File 'app/lib/actions/bulk_action.rb', line 36 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
24 25 26 27 28 29 30 |
# File 'app/lib/actions/bulk_action.rb', line 24 def humanized_name if task.sub_tasks.first task.sub_tasks.first.humanized[:action] else _('Bulk action') end end |
#plan(action_class, targets, *args) ⇒ 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
12 13 14 15 16 17 18 |
# File 'app/lib/actions/bulk_action.rb', line 12 def plan(action_class, targets, *args) check_targets!(targets) plan_self(:action_class => action_class.to_s, :target_ids => targets.map(&:id), :target_class => targets.first.class.to_s, :args => args) end |
#rescue_strategy ⇒ Object
32 33 34 |
# File 'app/lib/actions/bulk_action.rb', line 32 def rescue_strategy Dynflow::Action::Rescue::Skip end |
#run(event = nil) ⇒ Object
20 21 22 |
# File 'app/lib/actions/bulk_action.rb', line 20 def run(event = nil) super unless event == Dynflow::Action::Skip end |
#total_count ⇒ Object
69 70 71 |
# File 'app/lib/actions/bulk_action.rb', line 69 def total_count input[:target_ids].count end |