summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2007-10-05 00:07:38 -0500
committerLuke Kanies <luke@madstop.com>2007-10-05 00:07:38 -0500
commit0e336bf62b818aaa31fcc323ab5d31e5eb92eb46 (patch)
tree2f29d3e668aad2cade6059c74cbba60d60873561 /lib
parent1fa591287a4ab921cec628aa0c5bf58d61fbdef2 (diff)
downloadpuppet-0e336bf62b818aaa31fcc323ab5d31e5eb92eb46.tar.gz
puppet-0e336bf62b818aaa31fcc323ab5d31e5eb92eb46.tar.xz
puppet-0e336bf62b818aaa31fcc323ab5d31e5eb92eb46.zip
This commit is focused on getting the 'puppet' executable
to work. As a result, it involves a lot of integration-level testing, and a lot of small design changes to make the code actually work. In particular, indirections can now have default termini, so that configurations and facts default to their code terminus Also, I've removed the ability to manually control whether ast nodes are used. I might need to add it back in later, but if so it will be in the form of a global setting, rather than the previous system of passing it through 10 different classes. Instead, the parser detects whether there are AST nodes defined and requires them if so or ignores them if not. About 75 tests are still failing in the main set of tests, but it's going to be a long slog to get them working -- there are significant design issues around them, as most of the failures are a result of tests trying to emulate both the client and server sides of a connection, which normally would have different fact termini but in this case must have the same terminus just because they're in the same process and are global. The next step, then, is to figure that process out, thus finding a way to make this all work.
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/indirector.rb13
-rw-r--r--lib/puppet/indirector/code/configuration.rb60
-rw-r--r--lib/puppet/network/client/master.rb1
-rw-r--r--lib/puppet/node/configuration.rb2
-rwxr-xr-xlib/puppet/node/facts.rb2
-rw-r--r--lib/puppet/parser/compile.rb4
-rw-r--r--lib/puppet/parser/interpreter.rb7
7 files changed, 53 insertions, 36 deletions
diff --git a/lib/puppet/indirector.rb b/lib/puppet/indirector.rb
index 7821e809c..7ceaa43e2 100644
--- a/lib/puppet/indirector.rb
+++ b/lib/puppet/indirector.rb
@@ -15,7 +15,7 @@ module Puppet::Indirector
# default, not the value -- if it's the value, then it gets
# evaluated at parse time, which is before the user has had a chance
# to override it.
- def indirects(indirection)
+ def indirects(indirection, options = {})
raise(ArgumentError, "Already handling indirection for %s; cannot also handle %s" % [@indirection.name, indirection]) if defined?(@indirection) and @indirection
# populate this class with the various new methods
extend ClassMethods
@@ -24,6 +24,17 @@ module Puppet::Indirector
# instantiate the actual Terminus for that type and this name (:ldap, w/ args :node)
# & hook the instantiated Terminus into this class (Node: @indirection = terminus)
@indirection = Puppet::Indirector::Indirection.new(self, indirection)
+
+ unless options.empty?
+ options.each do |param, value|
+ case param
+ when :terminus_class: @indirection.terminus_class = value
+ else
+ raise ArgumenError, "Invalid option '%s' to 'indirects'" % param
+ end
+ end
+ end
+ @indirection
end
module ClassMethods
diff --git a/lib/puppet/indirector/code/configuration.rb b/lib/puppet/indirector/code/configuration.rb
index 6d0317204..b3a4c67dd 100644
--- a/lib/puppet/indirector/code/configuration.rb
+++ b/lib/puppet/indirector/code/configuration.rb
@@ -15,21 +15,12 @@ class Puppet::Indirector::Code::Configuration < Puppet::Indirector::Code
# Compile a node's configuration.
def find(key, client = nil, clientip = nil)
- # If we want to use the cert name as our key
- if Puppet[:node_name] == 'cert' and client
- key = client
- end
-
- # Note that this is reasonable, because either their node source should actually
- # know about the node, or they should be using the ``none`` node source, which
- # will always return data.
- unless node = Puppet::Node.search(key)
- raise Puppet::Error, "Could not find node '%s'" % key
+ if key.is_a?(Puppet::Node)
+ node = key
+ else
+ node = find_node(key)
end
- # Add any external data to the node.
- add_node_data(node)
-
configuration = compile(node)
return configuration
@@ -47,6 +38,11 @@ class Puppet::Indirector::Code::Configuration < Puppet::Indirector::Code
@interpreter
end
+ # Is our compiler part of a network, or are we just local?
+ def networked?
+ $0 =~ /puppetmasterd/
+ end
+
# Return the configuration version.
def version(client = nil, clientip = nil)
if client and node = Puppet::Node.search(client)
@@ -76,22 +72,17 @@ class Puppet::Indirector::Code::Configuration < Puppet::Indirector::Code
end
config = nil
+ loglevel = networked? ? :notice : :none
+
# LAK:FIXME This should log at :none when our client is
# local, since we don't want 'puppet' (vs. puppetmasterd) to
# log compile times.
- benchmark(:notice, "Compiled configuration for %s" % node.name) do
+ benchmark(loglevel, "Compiled configuration for %s" % node.name) do
begin
config = interpreter.compile(node)
rescue Puppet::Error => detail
- if Puppet[:trace]
- puts detail.backtrace
- end
- unless local?
- Puppet.err detail.to_s
- end
- raise XMLRPC::FaultException.new(
- 1, detail.to_s
- )
+ Puppet.err(detail.to_s) if networked?
+ raise
end
end
@@ -117,6 +108,27 @@ class Puppet::Indirector::Code::Configuration < Puppet::Indirector::Code
return Puppet::Parser::Interpreter.new(args)
end
+ # Turn our host name into a node object.
+ def find_node(key)
+ # If we want to use the cert name as our key
+ # LAK:FIXME This needs to be figured out somehow, but it requires the routing.
+ #if Puppet[:node_name] == 'cert' and client
+ # key = client
+ #end
+
+ # Note that this is reasonable, because either their node source should actually
+ # know about the node, or they should be using the ``none`` node source, which
+ # will always return data.
+ unless node = Puppet::Node.search(key)
+ raise Puppet::Error, "Could not find node '%s'" % key
+ end
+
+ # Add any external data to the node.
+ add_node_data(node)
+
+ node
+ end
+
# Initialize our server fact hash; we add these to each client, and they
# won't change while we're running, so it's safe to cache the values.
def set_server_facts
@@ -150,7 +162,7 @@ class Puppet::Indirector::Code::Configuration < Puppet::Indirector::Code
# LAK:FIXME This method should probably be part of the protocol, but it
# shouldn't be here.
def translate(config)
- if local?
+ unless networked?
config
else
CGI.escape(config.to_yaml(:UseBlock => true))
diff --git a/lib/puppet/network/client/master.rb b/lib/puppet/network/client/master.rb
index f950a6059..989d6dca2 100644
--- a/lib/puppet/network/client/master.rb
+++ b/lib/puppet/network/client/master.rb
@@ -544,6 +544,7 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
end
rescue => detail
+ puts detail.backtrace
Puppet.err "Could not retrieve configuration: %s" % detail
unless Puppet[:usecacheonfailure]
diff --git a/lib/puppet/node/configuration.rb b/lib/puppet/node/configuration.rb
index 3571eecda..084bdf880 100644
--- a/lib/puppet/node/configuration.rb
+++ b/lib/puppet/node/configuration.rb
@@ -7,7 +7,7 @@ require 'puppet/external/gratr/digraph'
# and the relationships between them.
class Puppet::Node::Configuration < Puppet::PGraph
extend Puppet::Indirector
- indirects :configuration
+ indirects :configuration, :terminus_class => :code
# The host name this is a configuration for.
attr_accessor :name
diff --git a/lib/puppet/node/facts.rb b/lib/puppet/node/facts.rb
index a2e6d9c04..2da6c488e 100755
--- a/lib/puppet/node/facts.rb
+++ b/lib/puppet/node/facts.rb
@@ -9,7 +9,7 @@ class Puppet::Node::Facts
extend Puppet::Indirector
# Use the node source as the indirection terminus.
- indirects :facts
+ indirects :facts, :terminus_class => :code
attr_accessor :name, :values
diff --git a/lib/puppet/parser/compile.rb b/lib/puppet/parser/compile.rb
index 6aeebeaae..992b165e5 100644
--- a/lib/puppet/parser/compile.rb
+++ b/lib/puppet/parser/compile.rb
@@ -16,8 +16,6 @@ class Puppet::Parser::Compile
include Puppet::Util::Errors
attr_reader :topscope, :parser, :node, :facts, :collections, :configuration
- attr_writer :ast_nodes
-
# Add a collection to the global list.
def add_collection(coll)
@collections << coll
@@ -25,7 +23,7 @@ class Puppet::Parser::Compile
# Do we use nodes found in the code, vs. the external node sources?
def ast_nodes?
- defined?(@ast_nodes) and @ast_nodes
+ parser.nodes.length > 0
end
# Store the fact that we've evaluated a class, and store a reference to
diff --git a/lib/puppet/parser/interpreter.rb b/lib/puppet/parser/interpreter.rb
index 0b8c035ba..8c727118c 100644
--- a/lib/puppet/parser/interpreter.rb
+++ b/lib/puppet/parser/interpreter.rb
@@ -26,7 +26,7 @@ class Puppet::Parser::Interpreter
# evaluate our whole tree
def compile(node)
raise Puppet::ParseError, "Could not parse configuration; cannot compile" unless env_parser = parser(node.environment)
- return Puppet::Parser::Compile.new(node, env_parser, :ast_nodes => usenodes?).compile
+ return Puppet::Parser::Compile.new(node, env_parser).compile
end
# create our interpreter
@@ -53,11 +53,6 @@ class Puppet::Parser::Interpreter
@parsers = {}
end
- # Should we parse ast nodes?
- def usenodes?
- defined?(@usenodes) and @usenodes
- end
-
private
# Create a new parser object and pre-parse the configuration.