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
|
#!/usr/bin/env ruby
$:.unshift("../lib").unshift("../../lib") if __FILE__ =~ /\.rb$/
require 'puppet'
require 'puppet/server'
require 'puppettest'
# $Id: server.rb 1793 2006-10-16 22:01:40Z luke $
if ARGV.length > 0 and ARGV[0] == "short"
$short = true
else
$short = false
end
class TestServer < Test::Unit::TestCase
include PuppetTest::ServerTest
# test that we can connect to the server
# we have to use fork here, because we apparently can't use threads
# to talk to other threads
def test_connect_with_fork
Puppet[:autosign] = true
serverpid, server = mk_status_server
# create a status client, and verify it can talk
client = mk_status_client
retval = nil
assert_nothing_raised() {
retval = client.status
}
assert_equal(1, retval)
end
# similar to the last test, but this time actually run getconfig
def test_getconfig_with_fork
Puppet[:autosign] = true
serverpid = nil
file = mktestmanifest()
server = nil
# make our server again
assert_nothing_raised() {
server = Puppet::Server.new(
:Port => @@port,
:Handlers => {
:CA => {}, # so that certs autogenerate
:Master => {
:UseNodes => false,
:Manifest => file
},
:Status => nil
}
)
}
serverpid = fork {
assert_nothing_raised() {
#trap(:INT) { server.shutdown; Kernel.exit! }
trap(:INT) { server.shutdown }
server.start
}
}
@@tmppids << serverpid
client = nil
# and then start a masterclient
assert_nothing_raised() {
client = Puppet::Client::MasterClient.new(
:Server => "localhost",
:Port => @@port
)
}
retval = nil
# and run getconfig a couple of times
assert_nothing_raised() {
retval = client.getconfig
}
# Try it again, just for kicks
assert_nothing_raised() {
retval = client.getconfig
}
end
def test_setpidfile_setting
Puppet[:setpidfile] = false
server = nil
assert_nothing_raised() {
server = Puppet::Server.new(
:Port => @@port,
:Handlers => {
:CA => {}, # so that certs autogenerate
:Status => nil
}
)
}
assert_nothing_raised {
server.setpidfile
}
assert(! FileTest.exists?(server.pidfile), "PID file was created")
Puppet[:setpidfile] = true
assert_nothing_raised {
server.setpidfile
}
assert(FileTest.exists?(server.pidfile), "PID file was not created")
end
# Test that a client whose cert has been revoked really can't connect
def test_certificate_revocation
Puppet[:autosign] = true
serverpid, server = mk_status_server
client = mk_status_client
status = nil
assert_nothing_raised() {
status = client.status
}
assert_equal(1, status)
client.shutdown
# Revoke the client's cert
ca = Puppet::SSLCertificates::CA.new()
fqdn = client.fqdn
ca.revoke(ca.getclientcert(fqdn)[0].serial)
# Restart the server
@@port += 1
Puppet[:autosign] = false
kill_and_wait(serverpid, server.pidfile)
serverpid, server = mk_status_server
client = mk_status_client
# This time the client should be denied
assert_raise(Puppet::NetworkClientError) {
client.status
}
end
def mk_status_client
client = nil
# Otherwise, the client initalization will trip over itself
# since elements created in the last run are still around
Puppet::Type::allclear
assert_nothing_raised() {
client = Puppet::Client::StatusClient.new(
:Server => "localhost",
:Port => @@port
)
}
client
end
def mk_status_server
server = nil
assert_nothing_raised() {
server = Puppet::Server.new(
:Port => @@port,
:Handlers => {
:CA => {}, # so that certs autogenerate
:Status => nil
}
)
}
pid = fork {
assert_nothing_raised() {
trap(:INT) { server.shutdown }
server.start
}
}
@@tmppids << pid
[pid, server]
end
def kill_and_wait(pid, file)
%x{kill -INT #{pid} 2>/dev/null}
count = 0
while count < 30 && File::exist?(file)
count += 1
sleep(1)
end
assert(count < 30, "Killing server #{pid} failed")
end
end
|