Skip to content

Commit 5fe1938

Browse files
algoristdanielsdeleo
authored andcommitted
Adding cookbook metadata files to cookbook manifests.
- Using :cookbook_version instead of :version in routes - Adding metadata.rb and README.rdoc to CookbookLoader's view of metadata files - Adding metadata files to a cookbook's manifest
1 parent 687780e commit 5fe1938

3 files changed

Lines changed: 33 additions & 22 deletions

File tree

chef-server-api/app/controllers/cookbooks.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Cookbooks < Application
3232

3333
def params_helper
3434
self.cookbook_name = params[:cookbook_name]
35-
self.cookbook_version = params[:version]
35+
self.cookbook_version = params[:cookbook_version]
3636
end
3737

3838
include Chef::Mixin::Checksum

chef/lib/chef/cookbook.rb

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,10 @@ def segment_files(segment)
312312
files_list = remote_files
313313
when :templates
314314
files_list = template_files
315+
when :metadata_files
316+
files_list = metadata_files
315317
else
316-
raise ArgumentError, "segment must be one of :attributes, :recipes, :definitions, :remote_files, :template_files, :resources, :providers or :libraries"
318+
raise ArgumentError, "segment must be one of :attributes, :recipes, :definitions, :remote_files, :template_files, :resources, :providers, :libraries, or :metadata_files"
317319
end
318320
files_list
319321
end
@@ -344,11 +346,11 @@ def self.json_create(o)
344346
end
345347

346348
def generate_manifest_with_urls(&url_generator)
347-
[ 'resources', 'providers', 'recipes', 'definitions', 'libraries', 'attributes', 'files', 'templates' ].each do |segment|
348-
rendered_manifest = manifest.dup
349+
rendered_manifest = manifest.dup
350+
[ 'resources', 'providers', 'recipes', 'definitions', 'libraries', 'attributes', 'files', 'templates', 'metadata_files' ].each do |segment|
349351
if rendered_manifest.has_key?(segment)
350352
rendered_manifest[segment].each do |segment_file|
351-
url_options = { :cookbook_name => name.to_s, :version => version, :checksum => segment_file["checksum"] }
353+
url_options = { :cookbook_name => name.to_s, :cookbook_version => version, :checksum => segment_file["checksum"] }
352354
segment_file["uri"] = url_generator.call(url_options)
353355
end
354356
end
@@ -457,44 +459,51 @@ def generate_manifest
457459
:files => Array.new,
458460
:templates => Array.new,
459461
:resources => Array.new,
460-
:providers => Array.new
462+
:providers => Array.new,
463+
:metadata_files => Array.new
461464
}
462465
checksums_to_on_disk_paths = {}
463466

464-
[ :resources, :providers, :recipes, :definitions, :libraries, :attributes, :files, :templates ].each do |segment|
467+
[ :resources, :providers, :recipes, :definitions, :libraries, :attributes, :files, :templates, :metadata_files ].each do |segment|
465468
segment_files(segment).each do |segment_file|
466469
next if File.directory?(segment_file)
467470

468471
file_name = nil
469-
file_url = nil
472+
path = nil
470473
file_specificity = nil
471-
url_options = nil
472-
473-
if segment == :templates || segment == :files
474-
matcher = segment_file.match("/#{name}/#{segment}/(.+?)/(.+)")
474+
475+
if segment == :metadata_files
476+
matcher = segment_file.match("/#{name}/(.+)")
477+
file_name = matcher[1]
478+
path = file_name
479+
elsif segment == :templates || segment == :files
480+
matcher = segment_file.match("/#{name}/(#{segment}/(.+?)/(.+))")
475481
unless matcher
476482
Chef::Log.debug("Skipping file #{segment_file}, as it doesn't have a proper segment.")
477483
next
478484
end
479-
specificity = matcher[1]
480-
file_name = matcher[2]
485+
path = matcher[1]
486+
specificity = matcher[2]
487+
file_name = matcher[3]
481488
else
482-
matcher = segment_file.match("/#{name}/#{segment}/(.+)")
483-
file_name = matcher[1]
489+
matcher = segment_file.match("/#{name}/(#{segment}/(.+))")
490+
path = matcher[1]
491+
file_name = matcher[2]
484492
end
485493

486494
csum = checksum(segment_file)
487495
checksums_to_on_disk_paths[csum] = segment_file
488496
rs = {
489497
:name => file_name,
490-
:path => segment_file.match("/#{name}/(#{segment}/.+)")[1],
498+
:path => path,
491499
:checksum => csum
492500
}
493501
rs[:specificity] = specificity if defined?(specificity)
494502

495503
manifest[segment] << rs
496504
end
497505
end
506+
498507
manifest[:cookbook_name] = name.to_s
499508
manifest[:metadata] = metadata
500509
manifest[:version] = metadata.version

chef/lib/chef/cookbook_loader.rb

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,11 @@ def load_cookbooks
9595
File.join(cookbook, "providers"),
9696
cookbook_settings[cookbook_name][:provider_files]
9797
)
98-
99-
if File.exists?(File.join(cookbook, "metadata.json"))
100-
cookbook_settings[cookbook_name][:metadata_files] << File.join(cookbook, "metadata.json")
98+
99+
[ "metadata.json", "metadata.rb", "README.rdoc" ].each do |filename|
100+
if File.exists?(File.join(cookbook, filename))
101+
cookbook_settings[cookbook_name][:metadata_files] << File.join(cookbook, filename)
102+
end
101103
end
102104
end
103105
end
@@ -115,11 +117,11 @@ def load_cookbooks
115117
@cookbook[cookbook].provider_files = cookbook_settings[cookbook][:provider_files].values
116118
@cookbook[cookbook].metadata_files = cookbook_settings[cookbook][:metadata_files]
117119
@metadata[cookbook] = Chef::Cookbook::Metadata.new(@cookbook[cookbook])
118-
cookbook_settings[cookbook][:metadata_files].each do |meta_json|
120+
cookbook_settings[cookbook][:metadata_files].select{|fn| fn =~ /\.json$/}.each do |meta_json|
119121
begin
120122
@metadata[cookbook].from_json(IO.read(meta_json))
121123
rescue JSON::ParserError
122-
puts "Couldn't parse JSON in " + meta_json
124+
Chef::Log.fatal("Couldn't parse JSON in " + meta_json)
123125
raise
124126
end
125127
end

0 commit comments

Comments
 (0)