lib/chef/provider/template.rb in chef-0.8.16 vs lib/chef/provider/template.rb in chef-0.9.0.a3

- old
+ new

@@ -1,8 +1,9 @@ # # Author:: Adam Jacob (<adam@opscode.com>) -# Copyright:: Copyright (c) 2008 Opscode, Inc. +# Author:: Daniel DeLeo (<dan@opscode.com>) +# Copyright:: Copyright (c) 2008, 2010 Opscode, Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -17,162 +18,176 @@ # require 'chef/provider/file' require 'chef/mixin/template' require 'chef/mixin/checksum' -require 'chef/mixin/find_preferred_file' -require 'chef/rest' -require 'chef/file_cache' -require 'uri' -require 'tempfile' +require 'chef/file_access_control' +#require 'chef/mixin/find_preferred_file' +#require 'chef/rest' +#require 'chef/file_cache' +#require 'uri' +#require 'tempfile' + class Chef class Provider class Template < Chef::Provider::File - include Chef::Mixin::Checksum + #include Chef::Mixin::Checksum include Chef::Mixin::Template - include Chef::Mixin::FindPreferredFile + #include Chef::Mixin::FindPreferredFile def action_create - raw_template_file = nil - - Chef::Log.debug("looking for template #{@new_resource.source} in cookbook #{cookbook_name.inspect}") - - cache_file_name = "cookbooks/#{cookbook_name}/templates/default/#{@new_resource.source}" - template_cache_name = "#{cookbook_name}_#{@new_resource.source}" - - if @new_resource.local - cache_file_name = @new_resource.source - elsif Chef::Config[:solo] - cache_file_name = solo_cache_file_name - else - raw_template_file = fetch_template_via_rest(cache_file_name, template_cache_name) - end - - if template_updated? - Chef::Log.debug("Updating template for #{@new_resource} in the cache") - Chef::FileCache.move_to(raw_template_file.path, cache_file_name) - end - - render_with_context(cache_file_name) do |template_file| - - update = false - - if ::File.exists?(@new_resource.path) - @new_resource.checksum(checksum(template_file.path)) - if @new_resource.checksum != @current_resource.checksum - Chef::Log.debug("#{@new_resource} changed from #{@current_resource.checksum} to #{@new_resource.checksum}") - Chef::Log.info("Updating #{@new_resource} at #{@new_resource.path}") - update = true - end + render_with_context(template_location) do |rendered_template| + rendered(rendered_template) + if ::File.exist?(@new_resource.path) && content_matches? + Chef::Log.debug("#{@new_resource} content has not changed.") + set_all_access_controls(@new_resource.path) else - Chef::Log.info("Creating #{@new_resource} at #{@new_resource.path}") - update = true - end - - if update + Chef::Log.info("Writing updated content for #{@new_resource} to #{@new_resource.path}") backup - FileUtils.cp(template_file.path, @new_resource.path) + set_all_access_controls(rendered_template.path) + FileUtils.cp(rendered_template.path, @new_resource.path) @new_resource.updated = true - else - Chef::Log.debug("#{@new_resource} is unchanged") end end - - set_owner if @new_resource.owner != nil - set_group if @new_resource.group != nil - set_mode if @new_resource.mode != nil end def action_create_if_missing if ::File.exists?(@new_resource.path) Chef::Log.debug("Template #{@new_resource} exists, taking no action.") else action_create end end - private - - def template_updated - @template_updated = true + def template_location + Chef::Log.debug("looking for template #{@new_resource.source} in cookbook #{cookbook_name.inspect}") + @template_file_cache_location ||= begin + if @new_resource.local + @new_resource.source + else + cookbook = run_context.cookbook_collection[resource_cookbook] + cookbook.preferred_filename_on_disk_location(node, :templates, @new_resource.source) + end + end end - - def template_not_updated - @template_updated = false + + def resource_cookbook + @new_resource.cookbook || @new_resource.cookbook_name end - def template_updated? - @template_updated + def rendered(rendered_template) + @new_resource.checksum(checksum(rendered_template.path)) + Chef::Log.debug("Current content's checksum: #{@current_resource.checksum}") + Chef::Log.debug("Rendered content's checksum: #{@new_resource.checksum}") end - def cookbook_name - @cookbook_name = (@new_resource.cookbook || @new_resource.cookbook_name) + def content_matches? + @current_resource.checksum == @new_resource.checksum end - def render_with_context(cache_file_name, &block) - context = {} - context.merge!(@new_resource.variables) - context[:node] = @node - render_template(Chef::FileCache.load(cache_file_name), context, &block) + def set_all_access_controls(file) + access_controls = Chef::FileAccessControl.new(@new_resource, file) + access_controls.set_all + @new_resource.updated = access_controls.modified? end - def solo_cache_file_name - filename = find_preferred_file( - cookbook_name, - :template, - @new_resource.source, - @node[:fqdn], - @node[:platform], - @node[:platform_version] - ) - Chef::Log.debug("Using local file for template:#{filename}") - Pathname.new(filename).relative_path_from(Pathname.new(Chef::Config[:file_cache_path])).to_s - end + # def locate_or_fetch_template + # Chef::Log.debug("looking for template #{@new_resource.source} in cookbook #{cookbook_name.inspect}") + # + # cache_file_name = "cookbooks/#{cookbook_name}/templates/default/#{@new_resource.source}" + # template_cache_name = "#{cookbook_name}_#{@new_resource.source}" + # + # if @new_resource.local + # cache_file_name = @new_resource.source + # elsif Chef::Config[:solo] + # cache_file_name = solo_cache_file_name + # else + # raw_template_file = fetch_template_via_rest(cache_file_name, template_cache_name) + # end + # + # if template_updated? + # Chef::Log.debug("Updating template for #{@new_resource} in the cache") + # Chef::FileCache.move_to(raw_template_file.path, cache_file_name) + # end + # cache_file_name + # end - def fetch_template_via_rest(cache_file_name, template_cache_name) - if @node.run_state[:template_cache].has_key?(template_cache_name) - Chef::Log.debug("I have already fetched the template for #{@new_resource} once this run, not checking again.") - template_not_updated - return false - end + private - r = Chef::REST.new(Chef::Config[:template_url]) + # def template_updated + # @template_updated = true + # end + # + # def template_not_updated + # @template_updated = false + # end + # + # def template_updated? + # @template_updated + # end + # + # def cookbook_name + # @cookbook_name = (@new_resource.cookbook || @new_resource.cookbook_name) + # end - current_checksum = nil - - if Chef::FileCache.has_key?(cache_file_name) - current_checksum = self.checksum(Chef::FileCache.load(cache_file_name, false)) - else - Chef::Log.debug("Template #{@new_resource} is not in the template cache") - end - - template_url = generate_url( - @new_resource.source, - "templates", - { - :checksum => current_checksum - } - ) - - begin - raw_template_file = r.get_rest(template_url, true) - template_updated - rescue Net::HTTPRetriableError => e - if e.response.kind_of?(Net::HTTPNotModified) - Chef::Log.debug("Cached template for #{@new_resource} is unchanged") - else - raise e - end - end - - # We have checked the cache for this template this run - @node.run_state[:template_cache][template_cache_name] = true - - raw_template_file + def render_with_context(template_location, &block) + context = {} + context.merge!(@new_resource.variables) + context[:node] = node + render_template(IO.read(template_location), context, &block) end + + # def solo_cache_file_name + # filename = find_preferred_file( + # cookbook_name, + # :template, + # @new_resource.source, + # node[:fqdn], + # node[:platform], + # node[:platform_version] + # ) + # Chef::Log.debug("Using local file for template:#{filename}") + # Pathname.new(filename).relative_path_from(Pathname.new(Chef::Config[:file_cache_path])).to_s + # end + # + # def fetch_template_via_rest(cache_file_name, template_cache_name) + # if node.run_state[:template_cache].has_key?(template_cache_name) + # Chef::Log.debug("I have already fetched the template for #{@new_resource} once this run, not checking again.") + # template_not_updated + # return false + # end + # + # r = Chef::REST.new(Chef::Config[:template_url]) + # + # current_checksum = nil + # + # if Chef::FileCache.has_key?(cache_file_name) + # current_checksum = self.checksum(Chef::FileCache.load(cache_file_name, false)) + # else + # Chef::Log.debug("Template #{@new_resource} is not in the template cache") + # end + # + # template_url = generate_url(@new_resource.source, "templates", :checksum => current_checksum) + # + # begin + # raw_template_file = r.get_rest(template_url, true) + # template_updated + # rescue Net::HTTPRetriableError + # if e.response.kind_of?(Net::HTTPNotModified) + # Chef::Log.debug("Cached template for #{@new_resource} is unchanged") + # else + # raise + # end + # end + # + # # We have checked the cache for this template this run + # node.run_state[:template_cache][template_cache_name] = true + # + # raw_template_file + # end end end end