From 83a1e64fe21d09004b62e3661758aff086094fa5 Mon Sep 17 00:00:00 2001 From: jkeiser Date: Sun, 23 Dec 2012 18:06:27 -0800 Subject: Fix server.load_data test API --- lib/chef_zero/cookbook_data.rb | 61 +++++++++++++++++++++++------------------- lib/chef_zero/rest_base.rb | 2 +- lib/chef_zero/server.rb | 46 ++++++++++++++++++++++++------- 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| -- cgit v1.2.1