summaryrefslogtreecommitdiffstats
path: root/lib/puppet/util/resource_template.rb
blob: 53066a1921c92831035c8e9b295408f179af95cd (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
require 'puppet/util'
require 'puppet/util/logging'
require 'erb'

# A template wrapper that evaluates a template in the
# context of a resource, allowing the resource attributes
# to be looked up from within the template.
#  This provides functionality essentially equivalent to
# the language's template() function.  You pass your file
# path and the resource you want to use into the initialization
# method, then call result() on the instance, and you get back
# a chunk of text.
#  The resource's parameters are available as instance variables
# (as opposed to the language, where we use a method_missing trick).
#  For example, say you have a resource that generates a file.  You would
# need to implement the following style of `generate` method:
#
#   def generate
#       template = Puppet::Util::ResourceTemplate.new("/path/to/template", self)
#
#       return Puppet::Type.type(:file).create :path => "/my/file",
#           :content => template.evaluate
#   end
#
# This generated file gets added to the catalog (which is what `generate` does),
# and its content is the result of the template.  You need to use instance
# variables in your template, so if your template just needs to have the name
# of the generating resource, it would just have:
#
#   <%= @name %>
#
# Since the ResourceTemplate class sets as instance variables all of the resource's
# parameters.
#
# Note that this example uses the generating resource as its source of
# parameters, which is generally most useful, since it allows you to configure
# the generated resource via the generating resource.
class Puppet::Util::ResourceTemplate
    include Puppet::Util::Logging

    def evaluate
        set_resource_variables
        ERB.new(File.read(@file), 0, "-").result(binding)
    end

    def initialize(file, resource)
        raise ArgumentError, "Template %s does not exist" % file unless FileTest.exist?(file)
        @file = file
        @resource = resource
    end

    private

    def set_resource_variables
        @resource.to_hash.each do |param, value|
            var = "@#{param.to_s}"
            instance_variable_set(var, value)
        end
    end
end