summaryrefslogtreecommitdiffstats
path: root/spec/unit/indirector/configuration/compiler.rb
blob: cb9dc71620647905b0cd9217f3a80bb9b435e6c0 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#!/usr/bin/env ruby
#
#  Created by Luke Kanies on 2007-9-23.
#  Copyright (c) 2007. All rights reserved.

require File.dirname(__FILE__) + '/../../../spec_helper'

require 'puppet/indirector/configuration/compiler'

describe Puppet::Node::Configuration::Compiler do
    before do
        Puppet.expects(:version).returns(1)
        Facter.expects(:value).with('fqdn').returns("my.server.com")
        Facter.expects(:value).with('ipaddress').returns("my.ip.address")
    end

    it "should gather data about itself" do
        Puppet::Node::Configuration::Compiler.new
    end

    it "should cache the server metadata and reuse it" do
        compiler = Puppet::Node::Configuration::Compiler.new
        node1 = stub 'node1', :merge => nil
        node2 = stub 'node2', :merge => nil
        compiler.stubs(:compile)
        Puppet::Node.stubs(:search).with('node1').returns(node1)
        Puppet::Node.stubs(:search).with('node2').returns(node2)

        compiler.find('node1')
        compiler.find('node2')
    end

    it "should provide a method for determining if the configuration is networked" do
        compiler = Puppet::Node::Configuration::Compiler.new
        compiler.should respond_to(:networked?)
    end
end

describe Puppet::Node::Configuration::Compiler, " when creating the interpreter" do
    before do
        # This gets pretty annoying on a plane where we have no IP address
        Facter.stubs(:value).returns("whatever")
        @compiler = Puppet::Node::Configuration::Compiler.new
    end

    it "should not create the interpreter until it is asked for the first time" do
        interp = mock 'interp'
        Puppet::Parser::Interpreter.expects(:new).with().returns(interp)
        @compiler.interpreter.should equal(interp)
    end

    it "should use the same interpreter for all compiles" do
        interp = mock 'interp'
        Puppet::Parser::Interpreter.expects(:new).with().returns(interp)
        @compiler.interpreter.should equal(interp)
        @compiler.interpreter.should equal(interp)
    end
end

describe Puppet::Node::Configuration::Compiler, " when finding nodes" do
    before do
        Facter.stubs(:value).returns("whatever")
        @compiler = Puppet::Node::Configuration::Compiler.new
        @name = "me"
        @node = mock 'node'
        @compiler.stubs(:compile)
    end

    it "should look node information up via the Node class with the provided key" do
        @node.stubs :merge 
        Puppet::Node.expects(:search).with(@name).returns(@node)
        @compiler.find(@name)
    end

    it "should fail if it cannot find the node" do
        @node.stubs :merge 
        Puppet::Node.expects(:search).with(@name).returns(nil)
        proc { @compiler.find(@name) }.should raise_error(Puppet::Error)
    end
end

describe Puppet::Node::Configuration::Compiler, " after finding nodes" do
    before do
        Puppet.expects(:version).returns(1)
        Puppet.settings.stubs(:value).with(:node_name).returns("cert")
        Facter.expects(:value).with('fqdn').returns("my.server.com")
        Facter.expects(:value).with('ipaddress').returns("my.ip.address")
        @compiler = Puppet::Node::Configuration::Compiler.new
        @name = "me"
        @node = mock 'node'
        @compiler.stubs(:compile)
        Puppet::Node.stubs(:search).with(@name).returns(@node)
    end

    it "should add the server's Puppet version to the node's parameters as 'serverversion'" do
        @node.expects(:merge).with { |args| args["serverversion"] == "1" }
        @compiler.find(@name)
    end

    it "should add the server's fqdn to the node's parameters as 'servername'" do
        @node.expects(:merge).with { |args| args["servername"] == "my.server.com" }
        @compiler.find(@name)
    end

    it "should add the server's IP address to the node's parameters as 'serverip'" do
        @node.expects(:merge).with { |args| args["serverip"] == "my.ip.address" }
        @compiler.find(@name)
    end

    # LAK:TODO This is going to be difficult, because this whole process is so
    # far removed from the actual connection that the certificate information
    # will be quite hard to come by, dum by, gum by.
    it "should search for the name using the client certificate's DN if the :node_name setting is set to 'cert'" do
        pending "Probably will end up in the REST work"
    end
end

describe Puppet::Node::Configuration::Compiler, " when creating configurations" do
    before do
        Facter.stubs(:value).returns("whatever")
        @compiler = Puppet::Node::Configuration::Compiler.new
        @name = "me"
        @node = Puppet::Node.new @name, :environment => "yay"
        @node.stubs(:merge)
        Puppet::Node.stubs(:search).with(@name).returns(@node)
    end

    it "should directly use provided nodes" do
        Puppet::Node.expects(:search).never
        @compiler.interpreter.expects(:compile).with(@node)
        @compiler.find(@node)
    end

    it "should pass the found node to the interpreter for compiling" do
        config = mock 'config'
        @compiler.interpreter.expects(:compile).with(@node)
        @compiler.find(@name)
    end

    it "should return the results of compiling as the configuration" do
        config = mock 'config'
        result = mock 'result', :to_transportable => :configuration

        @compiler.interpreter.expects(:compile).with(@node).returns(result)
        @compiler.find(@name).should == :configuration
    end

    it "should benchmark the compile process" do
        @compiler.stubs(:networked?).returns(true)
        @compiler.expects(:benchmark).with do |level, message|
            level == :notice and message =~ /^Compiled configuration/
        end
        @compiler.interpreter.stubs(:compile).with(@node)
        @compiler.find(@name)
    end
end

describe Puppet::Node::Configuration::Compiler, " when determining a client's available configuration version" do
    before do
        Puppet::Node::Facts.stubs(:find).returns(nil)
        Facter.stubs(:value).returns("whatever")
        @configuration = Puppet::Node::Configuration::Compiler.new
        @name = "johnny"
    end

    it "should provide a mechanism for providing the version of a given client's configuration" do
        @configuration.should respond_to(:version)
    end

    it "should use the client's Facts version as the available configuration version if it is the most recent" do
        Puppet::Node::Facts.expects(:version).with(@name).returns(5)
        Puppet::Node.expects(:version).with(@name).returns(3)
        @configuration.interpreter.stubs(:configuration_version).returns(4)

        @configuration.version(@name).should == 5
    end

    it "should use the client's Node version as the available configuration version if it is the most recent" do
        Puppet::Node::Facts.expects(:version).with(@name).returns(3)
        Puppet::Node.expects(:version).with(@name).returns(5)
        @configuration.interpreter.stubs(:configuration_version).returns(4)

        @configuration.version(@name).should == 5
    end

    it "should use the last parse date as the available configuration version if it is the most recent" do
        Puppet::Node::Facts.expects(:version).with(@name).returns(3)
        Puppet::Node.expects(:version).with(@name).returns(4)
        @configuration.interpreter.stubs(:configuration_version).returns(5)

        @configuration.version(@name).should == 5
    end

    it "should return a version of 0 if no information on the node can be found" do
        Puppet::Node.stubs(:search).returns(nil)
        @configuration.version(@name).should == 0
    end

    it "should indicate when an update is available even if an input has clock skew" do
        pending "Unclear how to implement this"
    end

    it "should not indicate an available update when apparent updates are a result of clock skew" do
        pending "Unclear how to implement this"
    end
end