summaryrefslogtreecommitdiff
path: root/lib/chef_zero/chef_data
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef_zero/chef_data')
-rw-r--r--lib/chef_zero/chef_data/acl_path.rb4
-rw-r--r--lib/chef_zero/chef_data/cookbook_data.rb298
-rw-r--r--lib/chef_zero/chef_data/default_creator.rb10
3 files changed, 157 insertions, 155 deletions
diff --git a/lib/chef_zero/chef_data/acl_path.rb b/lib/chef_zero/chef_data/acl_path.rb
index dd162bd..6286287 100644
--- a/lib/chef_zero/chef_data/acl_path.rb
+++ b/lib/chef_zero/chef_data/acl_path.rb
@@ -104,14 +104,13 @@ module ChefZero
end
end
- private
-
# /acls/root -> nil
# /acls/containers/containers -> /acls/root
# /acls/TYPE/X -> /acls/containers/TYPE
#
# Method *assumes* acl_data_path is valid.
# Returns nil if the path is /acls/root
+ private_class_method
def self.partition_parent_acl_data_path(acl_data_path)
if acl_data_path.size == 3
if acl_data_path == %w{acls containers containers}
@@ -124,6 +123,7 @@ module ChefZero
end
end
+ private_class_method
def self.partition_acl_data_path(path, data_types)
if path.size == 0
%w{acls root}
diff --git a/lib/chef_zero/chef_data/cookbook_data.rb b/lib/chef_zero/chef_data/cookbook_data.rb
index 2766162..d41948b 100644
--- a/lib/chef_zero/chef_data/cookbook_data.rb
+++ b/lib/chef_zero/chef_data/cookbook_data.rb
@@ -4,53 +4,158 @@ require "hashie"
module ChefZero
module ChefData
module CookbookData
- def self.to_hash(cookbook, name, version = nil)
- frozen = false
- if cookbook.has_key?(:frozen)
- frozen = cookbook[:frozen]
- cookbook = cookbook.dup
- cookbook.delete(:frozen)
- end
-
- result = files_from(cookbook)
- recipe_names = result[:all_files].select do |file|
- file[:name].start_with?("recipes/")
- end.map do |recipe|
- recipe_name = recipe[:name][0..-2]
- recipe_name == "default" ? name : "#{name}::#{recipe_name}"
- end
- result[:metadata] = metadata_from(cookbook, name, version, recipe_names)
- result[:name] = "#{name}-#{result[:metadata][:version]}"
- result[:json_class] = "Chef::CookbookVersion"
- result[:cookbook_name] = name
- result[:version] = result[:metadata][:version]
- result[:chef_type] = "cookbook_version"
- result[:frozen?] = true if frozen
- result
- end
+ class << self
+ def to_hash(cookbook, name, version = nil)
+ frozen = false
+ if cookbook.has_key?(:frozen)
+ frozen = cookbook[:frozen]
+ cookbook = cookbook.dup
+ cookbook.delete(:frozen)
+ end
+
+ result = files_from(cookbook)
+ recipe_names = result[:all_files].select do |file|
+ file[:name].start_with?("recipes/")
+ end.map do |recipe|
+ recipe_name = recipe[:name][0..-2]
+ recipe_name == "default" ? name : "#{name}::#{recipe_name}"
+ end
+ result[:metadata] = metadata_from(cookbook, name, version, recipe_names)
+ result[:name] = "#{name}-#{result[:metadata][:version]}"
+ result[:json_class] = "Chef::CookbookVersion"
+ result[:cookbook_name] = name
+ result[:version] = result[:metadata][:version]
+ result[:chef_type] = "cookbook_version"
+ result[:frozen?] = true if frozen
+ result
+ end
+
+ def metadata_from(directory, name, version, recipe_names)
+ metadata = PretendCookbookMetadata.new(PretendCookbook.new(name, recipe_names))
+ # If both .rb and .json exist, read .json
+ if has_child(directory, "metadata.json")
+ metadata.from_json(read_file(directory, "metadata.json"))
+ elsif has_child(directory, "metadata.rb")
+ begin
+ file = filename(directory, "metadata.rb") || "(#{name}/metadata.rb)"
+ metadata.instance_eval(read_file(directory, "metadata.rb"), file)
+ rescue
+ ChefZero::Log.error("Error loading cookbook #{name}: #{$!}\n #{$!.backtrace.join("\n ")}")
+ end
+ end
+ result = {}
+ metadata.to_hash.each_pair do |key, value|
+ result[key.to_sym] = value
+ end
+ result[:version] = version if version
+ result
+ end
+
+ private
- def self.metadata_from(directory, name, version, recipe_names)
- metadata = PretendCookbookMetadata.new(PretendCookbook.new(name, recipe_names))
- # If both .rb and .json exist, read .json
- if has_child(directory, "metadata.json")
- metadata.from_json(read_file(directory, "metadata.json"))
- elsif has_child(directory, "metadata.rb")
- begin
- file = filename(directory, "metadata.rb") || "(#{name}/metadata.rb)"
- metadata.instance_eval(read_file(directory, "metadata.rb"), file)
- rescue
- ChefZero::Log.error("Error loading cookbook #{name}: #{$!}\n #{$!.backtrace.join("\n ")}")
+ def files_from(directory)
+ # TODO some support .rb only
+ result = load_files(directory)
+
+ set_specificity(result, :templates)
+ set_specificity(result, :files)
+
+ result = {
+ all_files: result,
+ }
+ result
+ end
+
+ def has_child(directory, name)
+ if directory.is_a?(Hash)
+ directory.has_key?(name)
+ else
+ directory.child(name).exists?
end
end
- result = {}
- metadata.to_hash.each_pair do |key, value|
- result[key.to_sym] = value
+
+ def read_file(directory, name)
+ if directory.is_a?(Hash)
+ directory[name]
+ else
+ directory.child(name).read
+ end
+ end
+
+ def filename(directory, name)
+ if directory.respond_to?(:file_path)
+ File.join(directory.file_path, name)
+ else
+ nil
+ end
+ end
+
+ def get_directory(directory, name)
+ if directory.is_a?(Hash)
+ directory[name].is_a?(Hash) ? directory[name] : nil
+ else
+ result = directory.child(name)
+ result.dir? ? result : nil
+ end
+ end
+
+ def list(directory)
+ if directory.is_a?(Hash)
+ directory.keys
+ else
+ directory.children.map { |c| c.name }
+ end
+ end
+
+ def load_child_files(parent, key, recursive, part)
+ result = load_files(get_directory(parent, key), recursive, part)
+ result.each do |file|
+ file[:path] = "#{key}/#{file[:path]}"
+ end
+ result
+ end
+
+ def load_files(directory, recursive = true, part = nil)
+ result = []
+ if directory
+ list(directory).each do |child_name|
+ dir = get_directory(directory, child_name)
+ if dir
+ child_part = child_name if part.nil?
+ if recursive
+ result += load_child_files(directory, child_name, recursive, child_part)
+ end
+ else
+ result += load_file(read_file(directory, child_name), child_name, part)
+ end
+ end
+ end
+ result
+ end
+
+ def load_file(value, name, part = nil)
+ specific_name = part ? "#{part}/#{name}" : name
+ [{
+ :name => specific_name,
+ :path => name,
+ :checksum => Digest::MD5.hexdigest(value),
+ :specificity => "default",
+ }]
end
- result[:version] = version if version
- result
- end
- private
+ def set_specificity(files, type)
+ files.each do |file|
+ next unless file[:name].split("/")[0] == type.to_s
+
+ parts = file[:path].split("/")
+ file[:specificity] = if parts.size == 2
+ "default"
+ else
+ parts[1]
+ end
+ end
+ end
+ end
# Just enough cookbook to make a Metadata object
class PretendCookbook
@@ -67,15 +172,15 @@ module ChefZero
class PretendCookbookMetadata < Hash
# @param [String] path
def initialize(cookbook)
- self.name(cookbook.name)
- self.recipes(cookbook.fully_qualified_recipe_names)
+ name(cookbook.name)
+ recipes(cookbook.fully_qualified_recipe_names)
%w{attributes grouping dependencies supports recommendations suggestions conflicting providing replacing recipes}.each do |hash_arg|
self[hash_arg.to_sym] = Hashie::Mash.new
end
end
def from_json(json)
- self.merge!(FFI_Yajl::Parser.parse(json))
+ merge!(FFI_Yajl::Parser.parse(json))
end
private
@@ -121,109 +226,6 @@ module ChefZero
end
end
end
-
- def self.files_from(directory)
- # TODO some support .rb only
- result = load_files(directory)
-
- set_specificity(result, :templates)
- set_specificity(result, :files)
-
- result = {
- all_files: result,
- }
- result
- end
-
- def self.has_child(directory, name)
- if directory.is_a?(Hash)
- directory.has_key?(name)
- else
- directory.child(name).exists?
- end
- end
-
- def self.read_file(directory, name)
- if directory.is_a?(Hash)
- directory[name]
- else
- directory.child(name).read
- end
- end
-
- def self.filename(directory, name)
- if directory.respond_to?(:file_path)
- File.join(directory.file_path, name)
- else
- nil
- end
- end
-
- def self.get_directory(directory, name)
- if directory.is_a?(Hash)
- directory[name].is_a?(Hash) ? directory[name] : nil
- else
- result = directory.child(name)
- result.dir? ? result : nil
- end
- end
-
- def self.list(directory)
- if directory.is_a?(Hash)
- directory.keys
- else
- directory.children.map { |c| c.name }
- end
- end
-
- def self.load_child_files(parent, key, recursive, part)
- result = load_files(get_directory(parent, key), recursive, part)
- result.each do |file|
- file[:path] = "#{key}/#{file[:path]}"
- end
- result
- end
-
- def self.load_files(directory, recursive = true, part = nil)
- result = []
- if directory
- list(directory).each do |child_name|
- dir = get_directory(directory, child_name)
- if dir
- child_part = child_name if part.nil?
- if recursive
- result += load_child_files(directory, child_name, recursive, child_part)
- end
- else
- result += load_file(read_file(directory, child_name), child_name, part)
- end
- end
- end
- result
- end
-
- def self.load_file(value, name, part = nil)
- specific_name = part ? "#{part}/#{name}" : name
- [{
- :name => specific_name,
- :path => name,
- :checksum => Digest::MD5.hexdigest(value),
- :specificity => "default",
- }]
- end
-
- def self.set_specificity(files, type)
- files.each do |file|
- next unless file[:name].split("/")[0] == type.to_s
-
- parts = file[:path].split("/")
- file[:specificity] = if parts.size == 2
- "default"
- else
- parts[1]
- end
- end
- end
end
end
diff --git a/lib/chef_zero/chef_data/default_creator.rb b/lib/chef_zero/chef_data/default_creator.rb
index e70b2c2..46c0165 100644
--- a/lib/chef_zero/chef_data/default_creator.rb
+++ b/lib/chef_zero/chef_data/default_creator.rb
@@ -455,17 +455,17 @@ module ChefZero
when 0, 1
return true
when 2
- return path[0] == "organizations" || (path[0] == "acls" && path[1] != "root")
+ path[0] == "organizations" || (path[0] == "acls" && path[1] != "root")
when 3
# If it has a container, it is a directory.
- return path[0] == "organizations" &&
- (path[2] == "acls" || data.exists?(path[0..1] + [ "containers", path[2] ]))
+ path[0] == "organizations" &&
+ (path[2] == "acls" || data.exists?(path[0..1] + [ "containers", path[2] ]))
when 4
- return path[0] == "organizations" && (
+ path[0] == "organizations" && (
(path[2] == "acls" && path[1] != "root") ||
%w{cookbooks cookbook_artifacts data policies policy_groups}.include?(path[2]))
else
- return false
+ false
end
end
end