diff options
author | Luke Kanies <luke@madstop.com> | 2005-08-23 17:57:08 +0000 |
---|---|---|
committer | Luke Kanies <luke@madstop.com> | 2005-08-23 17:57:08 +0000 |
commit | dde841fa4653c11886bb80b8c402629e4f105ba0 (patch) | |
tree | 8b280a4242459751cc871ff8d5ba2093141233c4 | |
parent | 49e3e3771cdf2eabb71b406167bc975386392354 (diff) | |
download | puppet-dde841fa4653c11886bb80b8c402629e4f105ba0.tar.gz |
Created a Handler base class for all of the server handlers, which allows a lot of the manual work to now be automatic
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@582 980ebf18-57e1-0310-9a29-db15c13687c0
-rw-r--r-- | lib/puppet/client.rb | 5 | ||||
-rw-r--r-- | lib/puppet/server.rb | 110 | ||||
-rw-r--r-- | lib/puppet/server/ca.rb | 12 | ||||
-rwxr-xr-x | lib/puppet/server/fileserver.rb | 16 | ||||
-rw-r--r-- | lib/puppet/server/master.rb | 10 | ||||
-rwxr-xr-x | test/server/tc_fileserver.rb | 50 |
6 files changed, 126 insertions, 77 deletions
diff --git a/lib/puppet/client.rb b/lib/puppet/client.rb index 7998f2ff8..bc5869a76 100644 --- a/lib/puppet/client.rb +++ b/lib/puppet/client.rb @@ -33,9 +33,8 @@ module Puppet class NetworkClient < XMLRPC::Client #include Puppet::Daemon - #@@handlers = [Puppet::FileServer, Puppet::CA, Puppet::Server::Master] - - Puppet::Server.eachhandler { |name, handler| + # add the methods associated with each namespace + Puppet::Server::Handler.each { |handler| interface = handler.interface namespace = interface.prefix diff --git a/lib/puppet/server.rb b/lib/puppet/server.rb index 5707e6f0d..c3ba0b394 100644 --- a/lib/puppet/server.rb +++ b/lib/puppet/server.rb @@ -27,57 +27,9 @@ module Puppet if $noservernetworking Puppet.err "Could not create server: %s" % $noservernetworking else - class ServerStatus - attr_reader :ca - - def self.interface - XMLRPC::Service::Interface.new("status") { |iface| - iface.add_method("int status()") - } - end - - def initialize(hash = {}) - end - - def status(status = nil, request = nil) - Puppet.warning "Returning status" - return 1 - end - end - class Server < WEBrick::HTTPServer include Puppet::Daemon - @@handlers = {} -# # a bit of a hack for now, but eh, wadda ya gonna do? -# @@handlers = { -# :Master => Puppet::Server::Master, -# :CA => Puppet::Server::CA, -# :Status => Puppet::ServerStatus -# } - - def self.addhandler(name, handler) - @@handlers[name] = handler - end - - Puppet::Server.addhandler(:Status, Puppet::ServerStatus) - - def self.eachhandler - @@handlers.each { |name, klass| - yield(name, klass) - } - end - def self.inithandler(handler,args) - unless @@handlers.include?(handler) - raise ServerError, "Invalid handler %s" % handler - end - - hclass = @@handlers[handler] - - obj = hclass.new(args) - return obj - end - def initialize(hash = {}) hash[:Port] ||= Puppet[:masterport] hash[:Logger] ||= self.httplog @@ -92,7 +44,11 @@ module Puppet end @handlers = hash[:Handlers].collect { |handler, args| - self.class.inithandler(handler, args) + hclass = nil + unless hclass = Handler.handler(handler) + raise ServerError, "Invalid handler %s" % handler + end + hclass.new(args) } else raise ServerError, "A server must have handlers" @@ -134,6 +90,62 @@ module Puppet end end + class Server + # the base class for the different handlers + class Handler + @subclasses = [] + + def self.each + @subclasses.each { |c| yield c } + end + + def self.handler(name) + @subclasses.find { |h| + h.name == name + } + end + + def self.inherited(sub) + @subclasses << sub + end + + def self.interface + if defined? @interface + return @interface + else + raise Puppet::DevError, "Handler %s has no defined interface" % + self + end + end + + def self.name + unless defined? @name + @name = self.to_s.sub(/.+::/, '').intern + end + + return @name + end + + def initialize(hash = {}) + end + end + + class ServerStatus < Handler + + @interface = XMLRPC::Service::Interface.new("status") { |iface| + iface.add_method("int status()") + } + + @name = :Status + + def status(status = nil, request = nil) + Puppet.warning "Returning status" + return 1 + end + end + + end + #--------------------------------------------------------------- end diff --git a/lib/puppet/server/ca.rb b/lib/puppet/server/ca.rb index 65074c3f6..20caee9bb 100644 --- a/lib/puppet/server/ca.rb +++ b/lib/puppet/server/ca.rb @@ -9,16 +9,12 @@ require 'xmlrpc/server' module Puppet class Server class CAError < Puppet::Error; end - class CA + class CA < Handler attr_reader :ca - def self.interface - XMLRPC::Service::Interface.new("puppetca") { |iface| - iface.add_method("array getcert(csr)") - } - end - - Puppet::Server.addhandler(:CA, self) + @interface = XMLRPC::Service::Interface.new("puppetca") { |iface| + iface.add_method("array getcert(csr)") + } def autosign?(hostname) # simple values are easy diff --git a/lib/puppet/server/fileserver.rb b/lib/puppet/server/fileserver.rb index 43e08655f..f13c3285f 100755 --- a/lib/puppet/server/fileserver.rb +++ b/lib/puppet/server/fileserver.rb @@ -4,21 +4,17 @@ require 'cgi' module Puppet class Server class FileServerError < Puppet::Error; end - class FileServer + class FileServer < Handler attr_accessor :local #CHECKPARAMS = %w{checksum type mode owner group} CHECKPARAMS = [:mode, :type, :owner, :group, :checksum] - def self.interface - XMLRPC::Service::Interface.new("fileserver") { |iface| - iface.add_method("string describe(string)") - iface.add_method("string list(string, boolean)") - iface.add_method("string retrieve(string)") - } - end - - Puppet::Server.addhandler(:FileServer, self) + @interface = XMLRPC::Service::Interface.new("fileserver") { |iface| + iface.add_method("string describe(string)") + iface.add_method("string list(string, boolean)") + iface.add_method("string retrieve(string)") + } def check(dir) unless FileTest.exists?(dir) diff --git a/lib/puppet/server/master.rb b/lib/puppet/server/master.rb index f3f0411e9..00d62eb5b 100644 --- a/lib/puppet/server/master.rb +++ b/lib/puppet/server/master.rb @@ -7,17 +7,13 @@ require 'xmlrpc/server' module Puppet class Server class MasterError < Puppet::Error; end - class Master + class Master < Handler attr_accessor :ast, :local attr_reader :ca - def self.interface - XMLRPC::Service::Interface.new("puppetmaster") { |iface| + @interface = XMLRPC::Service::Interface.new("puppetmaster") { |iface| iface.add_method("string getconfig(string)") - } - end - - Puppet::Server.addhandler(:Master, self) + } def initialize(hash = {}) diff --git a/test/server/tc_fileserver.rb b/test/server/tc_fileserver.rb index 93b31db58..692981fe3 100755 --- a/test/server/tc_fileserver.rb +++ b/test/server/tc_fileserver.rb @@ -19,9 +19,17 @@ class TestFileServer < TestPuppet Puppet[:loglevel] = :debug end + @@tmppids = [] super end + def teardown + super + @@tmppids.each { |pid| + system("kill -INT %s" % pid) + } + end + def mkrandomdirs(dir, depth, width) assert_nothing_raised { Dir.mkdir(dir) @@ -378,6 +386,48 @@ class TestFileServer < TestPuppet } } end + + def test_networksources + server = nil + Puppet[:ssldir] = "/tmp/serverconnecttesting" + Puppet[:autosign] = true + @@tmpfiles << "/tmp/serverconnecttesting" + serverpid = nil + port = 8080 + assert_nothing_raised() { + server = Puppet::Server.new( + :Port => port, + :Handlers => { + :CA => {}, # so that certs autogenerate + :Status => nil + } + ) + + } + serverpid = fork { + assert_nothing_raised() { + #trap(:INT) { server.shutdown; Kernel.exit! } + trap(:INT) { server.shutdown } + server.start + } + } + @@tmppids << serverpid + + sleep(3) + client = nil + assert_nothing_raised() { + client = XMLRPC::Client.new("localhost", "/RPC2", port, nil, nil, + nil, nil, true, 3) + } + retval = nil + + assert_nothing_raised() { + Puppet.notice "calling status" + retval = client.call("status.status") + } + + assert_equal(1, retval) + end end # $Id$ |