diff options
author | John Keiser <jkeiser@opscode.com> | 2014-04-22 09:12:37 -0700 |
---|---|---|
committer | John Keiser <jkeiser@opscode.com> | 2014-04-22 09:12:37 -0700 |
commit | 3b9ca6d6c03613638b6ea8c23d2b18535585d06d (patch) | |
tree | 4b4f68d39c89051564933f3d1c5e730edfe71bda /lib/chef/cookbook/cookbook_version_loader.rb | |
parent | c534d1cf570c5c8b26ae1b58ebbe6c70d43f47ba (diff) | |
download | chef-3b9ca6d6c03613638b6ea8c23d2b18535585d06d.tar.gz |
Support storage of uploaded cookbook version in local mode
(this supports freezing and empty cookbook uploads)
Diffstat (limited to 'lib/chef/cookbook/cookbook_version_loader.rb')
-rw-r--r-- | lib/chef/cookbook/cookbook_version_loader.rb | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/lib/chef/cookbook/cookbook_version_loader.rb b/lib/chef/cookbook/cookbook_version_loader.rb index e98da77d7f..8419a2b46e 100644 --- a/lib/chef/cookbook/cookbook_version_loader.rb +++ b/lib/chef/cookbook/cookbook_version_loader.rb @@ -17,10 +17,13 @@ class Chef :resource_filenames, :provider_filenames] + UPLOADED_COOKBOOK_VERSION_FILE = ".uploaded-cookbook-version.json" attr_reader :cookbook_name attr_reader :cookbook_settings attr_reader :metadata_filenames + attr_reader :uploaded_cookbook_version_file + attr_reader :frozen def initialize(path, chefignore=nil) @cookbook_path = File.expand_path( path ) @@ -55,11 +58,27 @@ class Chef load_root_files remove_ignored_files + if File.exists?(File.join(@cookbook_path, ".uploaded-cookbook-version.json")) + @uploaded_cookbook_version_file = File.join(@cookbook_path, ".uploaded-cookbook-version.json") + end if File.exists?(File.join(@cookbook_path, "metadata.rb")) @metadata_filenames << File.join(@cookbook_path, "metadata.rb") elsif File.exists?(File.join(@cookbook_path, "metadata.json")) @metadata_filenames << File.join(@cookbook_path, "metadata.json") + elsif @uploaded_cookbook_version_file + @metadata_filenames << @uploaded_cookbook_version_file + end + + # Set frozen based on .uploaded-cookbook-version.json + if File.exists?(@uploaded_cookbook_version_file) + begin + data = Chef::JSONCompat.from_json(IO.read(@uploaded_cookbook_version_file), :create_additions => false) + @frozen = data['frozen?'] + rescue JSON::ParserError + Chef::Log.error("Couldn't parse cookbook metadata JSON for #@cookbook_name in " + file) + raise + end end if empty? @@ -84,6 +103,7 @@ class Chef c.root_filenames = cookbook_settings[:root_filenames].values c.metadata_filenames = @metadata_filenames c.metadata = metadata(c) + c.freeze_version if @frozen end end @@ -94,6 +114,8 @@ class Chef case metadata_file when /\.rb$/ apply_ruby_metadata(metadata_file) + when @uploaded_cookbook_version_file + apply_json_cookbook_version_metadata(metadata_file) when /\.json$/ apply_json_metadata(metadata_file) else @@ -104,7 +126,7 @@ class Chef end def empty? - @cookbook_settings.values.all? { |files_hash| files_hash.empty? } + @cookbook_settings.values.all? { |files_hash| files_hash.empty? } && @metadata_filenames.size == 0 end def merge!(other_cookbook_loader) @@ -122,6 +144,7 @@ class Chef def load_root_files Dir.glob(File.join(@cookbook_path, '*'), File::FNM_DOTMATCH).each do |file| next if File.directory?(file) + next if File.basename(file) == '.uploaded-cookbook-version.json' @cookbook_settings[:root_filenames][file[@relative_path, 1]] = file end end @@ -166,6 +189,16 @@ class Chef end end + def apply_json_cookbook_version_metadata(file) + begin + data = Chef::JSONCompat.from_json(IO.read(file), :create_additions => false) + @metadata.from_hash(data['metadata']) + rescue JSON::ParserError + Chef::Log.error("Couldn't parse cookbook metadata JSON for #@cookbook_name in " + file) + raise + end + end + end end end |