summaryrefslogtreecommitdiffstats
path: root/lib/puppet/parser/functions/defined.rb
blob: c3efc5f7656910596f68dee1f97abd3358a9beea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# Test whether a given class or definition is defined
Puppet::Parser::Functions::newfunction(:defined, :type => :rvalue, :doc => "Determine whether
  a given type, class, resource, or node is defined, and return
  true or false. Accepts class names, type names, resource references, and node
  references.
  
  The `defined` function checks both native and defined types, including types
  provided as plugins via modules. Types are checked using their names:
  
      defined(\"file\")
      defined(\"customtype\")
  
  Classes are also checked using their names:
  
      defined(\"foo\")
      defined(\"foo::bar\")
  
  Unlike classes and types, resource definitions are checked using resource
  references, e.g. `defined( File['/tmp/myfile'] )`. Checking whether a given
  resource defined is, unfortunately, dependent on the parse order of the
  configuration, and the following code will not work:
  
      if defined(File['/tmp/foo']) {
          notify(\"This configuration includes the /tmp/foo file.\")
      }
      file {\"/tmp/foo\":
          ensure => present,
      }
  
  However, this order requirement refers to parse order only, and ordering of
  resources in the configuration graph (e.g. with `begin` or `require`) does not
  affect the behavior of `defined`.
  
  You can also use `defined` to check whether a node is defined using syntax
  resembling a resource reference, like `Node[\"testnode.domain.com\"]`. This usage
  is not necessarily recommended, and is included here only in the spirit of
  completeness. Checking for node definitions behaves differently from the other
  uses of `defined`: it will only return true if a definition for the specified
  node (the name of which must match exactly) exists in the manifest **AND** the
  specified node matches the node whose configuration is being compiled (either
  directly or through node inheritance). The `define` function cannot be used to
  introspect information returned by an external node classifier. ") do |vals|
    result = false
    vals = [vals] unless vals.is_a?(Array)
    vals.each do |val|
      case val
      when String
        if Puppet::Type.type(val) or find_definition(val) or find_hostclass(val)
          result = true
          break
        end
      when Puppet::Resource
        if findresource(val.to_s)
          result = true
          break
        end
      else
        raise ArgumentError, "Invalid argument of type '#{val.class}' to 'defined'"
      end
    end
    result
end