summaryrefslogtreecommitdiffstats
path: root/spec/unit/indirector/code/configuration.rb
blob: 0038a038e4d4b92c7bc999401f4e16d5aa764da9 (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
#!/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/code/configuration'

describe Puppet::Indirector::Code::Configuration do
    # LAK:TODO I have no idea how to do this, or even if it should be in this class or test or what.
    # This is used for determining if the client should recompile its configuration, so it's not sufficient
    # to recompile and compare versions.
    #   It might be that the right solution is to require configuration caching, and then compare the cached
    # configuration version to the current version, via some querying mechanism (i.e., the client asks for just
    # the configuration's 'up-to-date' attribute, rather than the whole configuration).
    it "should provide a mechanism for determining if the client's configuration is up to date"
end

describe Puppet::Indirector::Code::Configuration 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::Indirector::Code::Configuration.new
    end

    it "should cache the server metadata and reuse it" do
        compiler = Puppet::Indirector::Code::Configuration.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::Indirector::Code::Configuration.new
        compiler.should respond_to(:networked?)
    end
end

describe Puppet::Indirector::Code::Configuration, " when creating the interpreter" do
    before do
        @compiler = Puppet::Indirector::Code::Configuration.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::Indirector::Code::Configuration, " when finding nodes" do
    before do
        @compiler = Puppet::Indirector::Code::Configuration.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::Indirector::Code::Configuration, " 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::Indirector::Code::Configuration.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'"
end

describe Puppet::Indirector::Code::Configuration, " when creating configurations" do
    before do
        @compiler = Puppet::Indirector::Code::Configuration.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