Module: Chef::Provisioning::ConvergenceStrategy::IgnoreConvergenceFailure

Defined in:
lib/chef/provisioning/convergence_strategy/ignore_convergence_failure.rb

Overview

The purpose of this class is to decore the converge method with logic to catch any convergence failure exceptions, log them and then squelch them. The reason we need this is to prevent 1 provisioned node’s converge failing an entire provisioning recipe.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#ignore_exit_valuesObject

Returns the value of attribute ignore_exit_values.



11
12
13
# File 'lib/chef/provisioning/convergence_strategy/ignore_convergence_failure.rb', line 11

def ignore_exit_values
  @ignore_exit_values
end

#ignore_failures_arrayObject

Returns the value of attribute ignore_failures_array.



11
12
13
# File 'lib/chef/provisioning/convergence_strategy/ignore_convergence_failure.rb', line 11

def ignore_failures_array
  @ignore_failures_array
end

Class Method Details

.extended(instance) ⇒ Object

This module is only meant to be extended into instances, not classes or modules. Different machines may have different settings so we don’t want to extend every install_sh strategy with this logic.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/chef/provisioning/convergence_strategy/ignore_convergence_failure.rb', line 16

def self.extended(instance)
  opts = instance.convergence_options[:ignore_failure]
  instance.ignore_failures_array = []
  instance.ignore_exit_values = []
  if opts == true
    instance.ignore_failures_array << RuntimeError
  else
    # We assume it is integers or errors
    opts = [opts].flatten
    opts.each do |o|
      case
      when o.is_a?(Fixnum)
        instance.ignore_exit_values << o
      when o.is_a?(Range)
        instance.ignore_exit_values += o.to_a
      when o <= Exception
        instance.ignore_failures_array << o
      end
    end
  end
end

Instance Method Details

#converge(action_handler, machine) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/chef/provisioning/convergence_strategy/ignore_convergence_failure.rb', line 38

def converge(action_handler, machine)
  super
rescue SystemExit => e
  if ignore_exit_values.include? e.status
    action_handler.performed_action("Caught SystemExit error #{e.status} from converging node but ignoring it")
  else
    raise
  end
rescue *ignore_failures_array
  action_handler.performed_action("Caught error '#{$!.inspect.gsub(/\n/,'\\n')}' from converging node but ignoring it")
end