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.

Reply via email to