summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorLuke Kanies <luke@reductivelabs.com>2010-01-06 16:03:33 -0800
committertest branch <puppet-dev@googlegroups.com>2010-02-17 06:50:53 -0800
commitcb169082ea4d8764c25e81183754c862fd170492 (patch)
tree16d546b9cbf7b3a99ad5172f3914acf079270345 /lib/puppet
parent201889bd30260698478d8469517299b290053189 (diff)
downloadpuppet-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.rb8
-rw-r--r--lib/puppet/parser/resource_type_collection.rb60
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)