Please review pull request #769: Static Compiler work with several file by resource opened by (emilemorel)
Description:
Static compiler doesn't handle several files in one resource. Now the compiler
take care to check every sources who match with 'puppet:///' for each resource
in the catalog.
- Opened: Mon May 14 07:33:06 UTC 2012
- Based on: puppetlabs:master (639f995c91289b3be9ca5347865247907c7dcb5c)
- Requested merge: emilemorel:improv_static_compiler (f5cab59e2838c619bfeb6826911b9224f000e7b3)
Diff follows:
diff --git a/lib/puppet/indirector/catalog/static_compiler.rb b/lib/puppet/indirector/catalog/static_compiler.rb
index e3e2e2f..6bf33b9 100644
--- a/lib/puppet/indirector/catalog/static_compiler.rb
+++ b/lib/puppet/indirector/catalog/static_compiler.rb
@@ -1,6 +1,7 @@
require 'puppet/node'
require 'puppet/resource/catalog'
require 'puppet/indirector/code'
+require 'puppet/file_bucket/dipper'
class Puppet::Resource::Catalog::StaticCompiler < Puppet::Indirector::Code
def compiler
@@ -14,29 +15,31 @@ def find(request)
catalog.resources.find_all { |res| res.type == "File" }.each do |resource|
next unless source = resource[:source]
- next unless source =~ /^puppet:/
file = resource.to_ral
+ next unless file[:source][0] =~ /^puppet:/
if file.recurse?
add_children(request.key, catalog, resource, file)
else
- find_and_replace_metadata(request.key, resource, file)
+ find_and_replace_metadata(request, resource, file)
end
end
catalog
end
- def find_and_replace_metadata(host, resource, file)
+ def find_and_replace_metadata(request, resource, file)
# We remove URL info from it, so it forces a local copy
# rather than routing through the network.
# Weird, but true.
- newsource = file[:source][0].sub("puppet:///", "")
- file[:source][0] = newsource
-
- raise "Could not get metadata for #{resource[:source]}" unless metadata = file.parameter(:source).metadata
-
- replace_metadata(host, resource, metadata)
+ metadata = nil
+ file[:source].map{ | s |
+ break if s !~ /^puppet:/
+ metadata = file.parameter(:source).metadata_with_request(s.sub("puppet:///", ""), request)
+ break if metadata
+ }
+
+ replace_metadata(request.key, resource, metadata) if metadata
end
def replace_metadata(host, resource, metadata)
@@ -52,7 +55,7 @@ def replace_metadata(host, resource, metadata)
end
end
- store_content(resource) if resource[:ensure] == "file"
+ store_content(metadata) if resource[:ensure] == "file"
old_source = resource.delete(:source)
Puppet.info "Metadata for #{resource} in catalog for '#{host}' added from '#{old_source}'"
end
@@ -119,19 +122,19 @@ def remove_existing_resources(children, catalog)
both.each { |name| children.delete(name) }
end
- def store_content(resource)
+ def store_content(metadata)
@summer ||= Object.new
@summer.extend(Puppet::Util::Checksums)
- type = @summer.sumtype(resource[:content])
- sum = @summer.sumdata(resource[:content])
+ type = @summer.sumtype(metadata.checksum)
+ sum = @summer.sumdata(metadata.checksum)
if Puppet::FileBucket::File.indirection.find("#{type}/#{sum}")
- Puppet.info "Content for '#{resource[:source]}' already exists"
+ Puppet.info "Content for '#{metadata.checksum}' already exists"
else
- Puppet.info "Storing content for source '#{resource[:source]}'"
- content = Puppet::FileServing::Content.indirection.find(resource[:source])
- Puppet::FileBucket::File.indirection.save(Puppet::FileBucket::File.new(content.content))
+ Puppet.info "Storing content for source '#{metadata.path}'"
+ dipper = Puppet::FileBucket::Dipper.new(:Path => Puppet[:bucketdir])
+ dipper.backup(metadata.path)
end
end
end
diff --git a/lib/puppet/type/file/source.rb b/lib/puppet/type/file/source.rb
index 9930809..b3bf84e 100755
--- a/lib/puppet/type/file/source.rb
+++ b/lib/puppet/type/file/source.rb
@@ -154,10 +154,8 @@ def metadata
return nil unless value
value.each do |source|
begin
- if data = "" :environment => resource.catalog.environment)
- @metadata = data
- @metadata.source = source
- break
+ if data = ""
+ break
end
rescue => detail
fail detail, "Could not retrieve file metadata for #{source}: #{detail}"
@@ -167,6 +165,24 @@ def metadata
@metadata
end
+ # Add for static compiler
+ # Same as metadata method except that we specify the request to get
+ # information about the host
+ # This information will given to retrieve the right file in the fileserver
+ def metadata_with_request(source, request=nil)
+ data = ""
+ if request
+ data = "" :node => request.node, :ip => request.ip)
+ else
+ data = ""
+ end
+ if data
+ @metadata = data
+ @metadata.source = source
+ end
+ @metadata
+ end
+
def local?
found? and scheme == "file"
end
-- You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to [email protected].
For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
