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