Class: Chef::Resource::Conditional

Inherits:
Object
  • Object
show all
Includes:
Mixin::ShellOut
Defined in:
lib/chef/resource/conditional.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Mixin::ShellOut

#a_to_s, #clean_array, #shell_out, #shell_out!, #shell_out_compact, #shell_out_compact!, #shell_out_compact_timeout, #shell_out_compact_timeout!, #shell_out_with_systems_locale, #shell_out_with_systems_locale!

Methods included from Mixin::PathSanity

#enforce_path_sanity, #sanitized_path

Constructor Details

#initialize(positivity, parent_resource, command = nil, command_opts = {}, &block) ⇒ Conditional

Returns a new instance of Conditional

Raises:

  • (ArgumentError)


46
47
48
49
50
51
52
53
54
# File 'lib/chef/resource/conditional.rb', line 46

def initialize(positivity, parent_resource, command = nil, command_opts = {}, &block)
  @positivity = positivity
  @command, @command_opts = command, command_opts
  @block = block
  @block_given = block_given?
  @parent_resource = parent_resource

  raise ArgumentError, "only_if/not_if requires either a command or a block" unless command || block_given?
end

Instance Attribute Details

#blockObject (readonly)

Returns the value of attribute block



44
45
46
# File 'lib/chef/resource/conditional.rb', line 44

def block
  @block
end

#commandObject (readonly)

Returns the value of attribute command



42
43
44
# File 'lib/chef/resource/conditional.rb', line 42

def command
  @command
end

#command_optsObject (readonly)

Returns the value of attribute command_opts



43
44
45
# File 'lib/chef/resource/conditional.rb', line 43

def command_opts
  @command_opts
end

#positivityObject (readonly)

Returns the value of attribute positivity



41
42
43
# File 'lib/chef/resource/conditional.rb', line 41

def positivity
  @positivity
end

Class Method Details

.not_if(parent_resource, command = nil, command_opts = {}, &block) ⇒ Object



33
34
35
# File 'lib/chef/resource/conditional.rb', line 33

def self.not_if(parent_resource, command = nil, command_opts = {}, &block)
  new(:not_if, parent_resource, command, command_opts, &block)
end

.only_if(parent_resource, command = nil, command_opts = {}, &block) ⇒ Object



37
38
39
# File 'lib/chef/resource/conditional.rb', line 37

def self.only_if(parent_resource, command = nil, command_opts = {}, &block)
  new(:only_if, parent_resource, command, command_opts, &block)
end

Instance Method Details

#configureObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/chef/resource/conditional.rb', line 56

def configure
  case @command
  when String, Array
    @guard_interpreter = Chef::GuardInterpreter.for_resource(@parent_resource, @command, @command_opts)
    @block = nil
  when nil
    # We should have a block if we get here
    # Check to see if the user set the guard_interpreter on the parent resource. Note that
    # this error will not be raised when using the default_guard_interpreter
    if @parent_resource.guard_interpreter != @parent_resource.default_guard_interpreter
      msg = "#{@parent_resource.name} was given a guard_interpreter of #{@parent_resource.guard_interpreter}, "
      msg << "but not given a command as a string. guard_interpreter does not support blocks (because they just contain ruby)."
      raise ArgumentError, msg
    end

    @guard_interpreter = nil
    @command, @command_opts = nil, nil
  else
    # command was passed, but it wasn't a String
    raise ArgumentError, "Invalid only_if/not_if command, expected a string: #{command.inspect} (#{command.class})"
  end
end

#continue?Boolean

this is run during convergence via Chef::Resource#run_action -> Chef::Resource#should_skip?



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/chef/resource/conditional.rb', line 80

def continue?
  # configure late in case guard_interpreter is specified on the resource after the conditional
  configure

  case @positivity
  when :only_if
    evaluate
  when :not_if
    !evaluate
  else
    raise "Cannot evaluate resource conditional of type #{@positivity}"
  end
end

#descriptionObject



121
122
123
124
# File 'lib/chef/resource/conditional.rb', line 121

def description
  cmd_or_block = @command ? "command `#{@command}`" : "ruby block"
  "#{@positivity} #{cmd_or_block}"
end

#evaluateObject



94
95
96
# File 'lib/chef/resource/conditional.rb', line 94

def evaluate
  @guard_interpreter ? evaluate_command : evaluate_block
end

#evaluate_blockObject



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/chef/resource/conditional.rb', line 105

def evaluate_block
  @block.call.tap do |rv|
    if rv.is_a?(String) && !rv.empty?
      # This is probably a mistake:
      #   not_if { "command" }
      sanitized_rv = @parent_resource.sensitive ? "a string" : rv.inspect
      Chef::Log.warn("#{@positivity} block for #{@parent_resource} returned #{sanitized_rv}, did you mean to run a command?" +
        (@parent_resource.sensitive ? "" : " If so use '#{@positivity} #{sanitized_rv}' in your code."))
    end
  end
end

#evaluate_commandObject



98
99
100
101
102
103
# File 'lib/chef/resource/conditional.rb', line 98

def evaluate_command
  @guard_interpreter.evaluate
rescue Chef::Exceptions::CommandTimeout
  Chef::Log.warn "Command '#{@command}' timed out"
  false
end

#short_descriptionObject



117
118
119
# File 'lib/chef/resource/conditional.rb', line 117

def short_description
  @positivity
end

#to_textObject



126
127
128
129
130
131
132
# File 'lib/chef/resource/conditional.rb', line 126

def to_text
  if @command
    "#{positivity} \"#{@command}\""
  else
    "#{@positivity} { #code block }"
  end
end