diff options
author | Luke Kanies <luke@reductivelabs.com> | 2010-01-06 16:03:33 -0800 |
---|---|---|
committer | test branch <puppet-dev@googlegroups.com> | 2010-02-17 06:50:53 -0800 |
commit | cb169082ea4d8764c25e81183754c862fd170492 (patch) | |
tree | 16d546b9cbf7b3a99ad5172f3914acf079270345 /lib/puppet | |
parent | 201889bd30260698478d8469517299b290053189 (diff) | |
download | puppet-cb169082ea4d8764c25e81183754c862fd170492.tar.gz puppet-cb169082ea4d8764c25e81183754c862fd170492.tar.xz puppet-cb169082ea4d8764c25e81183754c862fd170492.zip |
Adding 'known_resource_types' to Environment
Each environment now has its own known collection of resource
types, and it is responsible for caching as necessary.
Signed-off-by: Luke Kanies <luke@reductivelabs.com>
Diffstat (limited to 'lib/puppet')
-rw-r--r-- | lib/puppet/node/environment.rb | 8 | ||||
-rw-r--r-- | lib/puppet/parser/resource_type_collection.rb | 60 |
2 files changed, 54 insertions, 14 deletions
diff --git a/lib/puppet/node/environment.rb b/lib/puppet/node/environment.rb index 395d50657..a6e33703b 100644 --- a/lib/puppet/node/environment.rb +++ b/lib/puppet/node/environment.rb @@ -42,6 +42,14 @@ class Puppet::Node::Environment @name = name end + def known_resource_types + if @known_resource_types.nil? or @known_resource_types.stale? + @known_resource_types = Puppet::Parser::ResourceTypeCollection.new(self) + @known_resource_types.perform_initial_import + end + @known_resource_types + end + def module(name) mod = Puppet::Module.new(name, self) return nil unless mod.exist? diff --git a/lib/puppet/parser/resource_type_collection.rb b/lib/puppet/parser/resource_type_collection.rb index c6a91887a..cb90d9bb9 100644 --- a/lib/puppet/parser/resource_type_collection.rb +++ b/lib/puppet/parser/resource_type_collection.rb @@ -1,18 +1,8 @@ class Puppet::Parser::ResourceTypeCollection attr_reader :environment - @code = {} - - def self.[]=(environment, code) - @code[environment] = code - end - - def self.[](environment) - @code[environment] - end - - def initialize(environment) - @environment = environment + def initialize(env) + @environment = env.is_a?(String) ? Puppet::Node::Environment.new(env) : env @hostclasses = {} @definitions = {} @nodes = {} @@ -20,8 +10,7 @@ class Puppet::Parser::ResourceTypeCollection # So we can keep a list and match the first-defined regex @node_list = [] - # Store the most recently created code collection globally per environment. - self.class[self.environment] = self + @watched_files = {} end def <<(thing) @@ -124,6 +113,49 @@ class Puppet::Parser::ResourceTypeCollection end end + def perform_initial_import + parser = Puppet::Parser::Parser.new(environment) + if code = Puppet.settings.uninterpolated_value(:code, environment.to_s) and code != "" + parser.string = code + else + file = Puppet.settings.value(:manifest, environment.to_s) + return unless File.exist?(file) + parser.file = file + end + parser.parse + rescue => detail + msg = "Could not parse for environment #{environment}: #{detail}" + error = Puppet::Error.new(msg) + error.set_backtrace(detail.backtrace) + raise error + end + + def stale? + @watched_files.values.detect { |file| file.changed? } + end + + def version + return @version if defined?(@version) + + if environment[:config_version] == "" + @version = Time.now.to_i + return @version + end + + @version = Puppet::Util.execute([environment[:config_version]]).strip + + rescue Puppet::ExecutionFailure => e + raise Puppet::ParseError, "Unable to set config_version: #{e.message}" + end + + def watch_file(file) + @watched_files[file] = Puppet::Util::LoadedFile.new(file) + end + + def watching_file?(file) + @watched_files.include?(file) + end + private def find_fully_qualified(name, type) |