Class: Actions::BulkAction

Inherits:
ActionWithSubPlans show all
Defined in:
app/lib/actions/bulk_action.rb

Instance Method Summary collapse

Methods inherited from ActionWithSubPlans

#humanized_output

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

#serialize_args

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

[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

Raises:

  • (Foreman::Exception)
[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_plansObject

[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

#humanized_inputObject

[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_nameObject

[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)
  extracted_concurrency_limit = extract_concurrency_limit(args, concurrency_limit)
  limit_concurrency_level!(extracted_concurrency_limit) if extracted_concurrency_limit
  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_strategyObject

[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_countObject

[View source]

73
74
75
# File 'app/lib/actions/bulk_action.rb', line 73

def total_count
  input[:target_ids].count
end