summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjkeiser <jkeiser@opscode.com>2012-12-23 18:06:27 -0800
committerjkeiser <jkeiser@opscode.com>2012-12-23 18:06:27 -0800
commit83a1e64fe21d09004b62e3661758aff086094fa5 (patch)
treee1af58a56724bfc0c2d27235da9e402cfa1ec2e8
parent5ef2a78077ef11431ef1625246ff14642ac556d3 (diff)
downloadchef-zero-83a1e64fe21d09004b62e3661758aff086094fa5.tar.gz
Fix server.load_data test APIv0.9
-rw-r--r--lib/chef_zero/cookbook_data.rb61
-rw-r--r--lib/chef_zero/rest_base.rb2
-rw-r--r--lib/chef_zero/server.rb46
3 files changed, 71 insertions, 38 deletions
diff --git a/lib/chef_zero/cookbook_data.rb b/lib/chef_zero/cookbook_data.rb
index c83afaa..b8092ae 100644
--- a/lib/chef_zero/cookbook_data.rb
+++ b/lib/chef_zero/cookbook_data.rb
@@ -3,7 +3,7 @@ require 'chef/cookbook/metadata' # for ruby metadata.rb dsl
module ChefZero
module CookbookData
- def self.to_json(cookbook, name, version=nil)
+ def self.to_hash(cookbook, name, version=nil)
result = files_from(cookbook)
recipe_names = result[:recipes].map do |recipe|
recipe_name = recipe[:name][0..-2]
@@ -34,26 +34,32 @@ module ChefZero
# If both .rb and .json exist, read .rb
# TODO if recipes has 3 recipes in it, and the Ruby/JSON has only one, should
# the resulting recipe list have 1, or 3-4 recipes in it?
- if cookbook['metadata.rb']
- metadata.instance_eval(cookbook['metadata.rb'])
- elsif cookbook['metadata.json']
- metadata.from_json(cookbook['metadata.json'])
+ if directory['metadata.rb']
+ metadata.instance_eval(directory['metadata.rb'])
+ elsif directory['metadata.json']
+ metadata.from_json(directory['metadata.json'])
end
- metadata.to_json
+ result = {}
+ metadata.to_hash.each_pair do |key,value|
+ result[key.to_sym] = value
+ end
+ result[:version] = version
+ result
+
end
- def self.files_from(cookbook)
+ def self.files_from(directory)
# TODO some support .rb only
result = {
- :attributes => load_child_files(cookbook, 'attributes', false),
- :definitions => load_child_files(cookbook, 'definitions', false),
- :recipes => load_child_files(cookbook, 'recipes', false),
- :libraries => load_child_files(cookbook, 'libraries', false),
- :templates => load_child_files(cookbook, 'templates', true, true),
- :files => load_child_files(cookbook, 'files', true, true),
- :resources => load_child_files(cookbook, 'resources', true),
- :providers => load_child_files(cookbook, 'providers', true),
- :root_files => load_files(cookbook, false)
+ :attributes => load_child_files(directory, 'attributes', false),
+ :definitions => load_child_files(directory, 'definitions', false),
+ :recipes => load_child_files(directory, 'recipes', false),
+ :libraries => load_child_files(directory, 'libraries', false),
+ :templates => load_child_files(directory, 'templates', true),
+ :files => load_child_files(directory, 'files', true),
+ :resources => load_child_files(directory, 'resources', true),
+ :providers => load_child_files(directory, 'providers', true),
+ :root_files => load_files(directory, false)
}
set_specificity(result[:templates])
set_specificity(result[:files])
@@ -70,28 +76,27 @@ module ChefZero
def self.load_files(directory, recursive)
result = []
- directory.each_pair do |child_key, child|
- if child.is_a? Hash
- if recursive
- result += load_child_files(directory, child_key, recursive, false)
- end
- else
- result += load_file(child, child_key)
+ if directory
+ directory.each_pair do |child_key, child|
+ if child.is_a? Hash
+ if recursive
+ result += load_child_files(directory, child_key, recursive)
+ end
+ else
+ result += load_file(child, child_key)
+ end
end
end
- result.each do |file|
- file[:path] = "key/#{file[:path]}"
- end
result
end
def self.load_file(value, name)
- result = {
+ [{
:name => name,
:path => name,
:checksum => Digest::MD5.hexdigest(value),
:specificity => 'default'
- }
+ }]
end
def self.set_specificity(files)
diff --git a/lib/chef_zero/rest_base.rb b/lib/chef_zero/rest_base.rb
index ca041b5..a6e7632 100644
--- a/lib/chef_zero/rest_base.rb
+++ b/lib/chef_zero/rest_base.rb
@@ -33,7 +33,7 @@ module ChefZero
error(e.response_code, e.error)
end
rescue
- Chef::Log.error("#{$!.inspect}\n#{$!.backtrace}")
+ Chef::Log.error("#{$!.inspect}\n#{$!.backtrace.join("\n")}")
raise
end
end
diff --git a/lib/chef_zero/server.rb b/lib/chef_zero/server.rb
index 4f6c22d..ff661ca 100644
--- a/lib/chef_zero/server.rb
+++ b/lib/chef_zero/server.rb
@@ -22,6 +22,7 @@ require 'openssl'
require 'chef_zero'
require 'chef_zero/router'
require 'timeout'
+require 'chef_zero/cookbook_data'
require 'chef_zero/endpoints/authenticate_user_endpoint'
require 'chef_zero/endpoints/actors_endpoint'
@@ -97,10 +98,15 @@ module ChefZero
def start_background(timeout = 5)
@thread = Thread.new do
- server.start
+ begin
+ server.start
+ rescue
+ @server_error = $!
+ Chef::Log.error("#{$!.message}\n#{$!.backtrace.join("\n")}")
+ end
end
Timeout::timeout(timeout) do
- until server.running?
+ until server.running? || @server_error
sleep(0.01)
end
end
@@ -113,6 +119,9 @@ module ChefZero
def stop(timeout = 5)
Timeout::timeout(timeout) do
server.stop
+ until !server.running? || !server_error
+ sleep(0.01)
+ end
end
if @thread
@thread.kill
@@ -156,20 +165,33 @@ module ChefZero
# }
# }
def load_data(contents)
- %w(clients data environments nodes roles users).each do |data_type|
- server.data[data_type].merge!(contents[data_type]) if contents[data_type]
+ %w(clients environments nodes roles users).each do |data_type|
+ if contents[data_type]
+ dejsonize_children!(contents[data_type])
+ data[data_type].merge!(contents[data_type])
+ end
+ end
+ if contents['data']
+ contents['data'].values.each do |data_bag|
+ dejsonize_children!(data_bag)
+ end
+ data['data'].merge!(contents['data'])
end
if contents['cookbooks']
contents['cookbooks'].each_pair do |name_version, cookbook|
if name_version =~ /(.+)-(\d+\.\d+\.\d+)$/
- cookbook_data = CookbookData.to_json(cookbook, $1, $2)
+ cookbook_data = CookbookData.to_hash(cookbook, $1, $2)
else
- cookbook_data = CookbookData.to_json(cookbook, name_version)
+ cookbook_data = CookbookData.to_hash(cookbook, name_version)
end
- server.data['cookbooks'][cookbook_data['cookbook_name']][cookbook_data['version']] = cookbook_data
- cookbook_data.each do |files|
+ raise "No version specified" if !cookbook_data[:version]
+ data['cookbooks'][cookbook_data[:cookbook_name]] = {} if !data['cookbooks'][cookbook_data[:cookbook_name]]
+ data['cookbooks'][cookbook_data[:cookbook_name]][cookbook_data[:version]] = JSON.pretty_generate(cookbook_data)
+ cookbook_data.values.each do |files|
next unless files.is_a? Array
- server.data['file_store'][file[:checksum]] = get_file(cookbook, file[:path])
+ files.each do |file|
+ data['file_store'][file[:checksum]] = get_file(cookbook, file[:path])
+ end
end
end
end
@@ -216,6 +238,12 @@ module ChefZero
router
end
+ def dejsonize_children!(hash)
+ hash.each_pair do |key, value|
+ hash[key] = JSON.pretty_generate(value) if value.is_a?(Hash)
+ end
+ end
+
def get_file(directory, path)
value = directory
path.split('/').each do |part|