lib/chef/knife/cook.rb in knife-solo-0.0.8 vs lib/chef/knife/cook.rb in knife-solo-0.0.9
- old
+ new
@@ -1,46 +1,59 @@
require 'pathname'
require 'chef/knife'
require 'chef/config'
+require 'chef/cookbook/chefignore'
require 'knife-solo/ssh_command'
require 'knife-solo/kitchen_command'
+require 'knife-solo/tools'
class Chef
class Knife
# Approach ported from spatula (https://github.com/trotter/spatula)
# Copyright 2009, Trotter Cashion
class Cook < Knife
include KnifeSolo::SshCommand
include KnifeSolo::KitchenCommand
+ include KnifeSolo::Tools
banner "knife cook [user@]hostname [json] (options)"
option :skip_chef_check,
:long => '--skip-chef-check',
:boolean => true,
:description => "Skip the version check on the Chef gem"
+ option :sync_only,
+ :long => '--sync-only',
+ :boolean => false,
+ :description => "Only sync the cookbook - do not run Chef"
+
+ option :skip_syntax_check,
+ :long => '--skip-syntax-check',
+ :boolean => true,
+ :description => "Skip Ruby syntax checks"
+
def run
super
- check_syntax
+ check_syntax unless config[:skip_syntax_check]
Chef::Config.from_file('solo.rb')
check_chef_version unless config[:skip_chef_check]
rsync_kitchen
add_patches
- cook
+ cook unless config[:sync_only]
end
def check_syntax
ui.msg('Checking cookbook syntax...')
- Dir["**/*.rb"].each do |recipe|
+ chefignore.remove_ignores_from(Dir["**/*.rb"]).each do |recipe|
ok = system "ruby -c #{recipe} >/dev/null 2>&1"
raise "Syntax error in #{recipe}" if not ok
end
- Dir["**/*.json"].each do |json|
+ chefignore.remove_ignores_from(Dir["**/*.json"]).each do |json|
begin
require 'json'
# parse without instantiating Chef classes
JSON.parse File.read(json), :create_additions => false
rescue => error
@@ -55,34 +68,58 @@
def chef_path
Chef::Config.file_cache_path
end
+ def chefignore
+ @chefignore ||= ::Chef::Cookbook::Chefignore.new("./")
+ end
+
+ # cygwin rsync path must be adjusted to work
+ def adjust_rsync_path(path)
+ return path unless windows_node?
+ path.gsub(/^(\w):/) { "/cygdrive/#{$1}" }
+ end
+
def patch_path
Array(Chef::Config.cookbook_path).first + "/chef_solo_patches/libraries"
end
+ def rsync_exclude
+ (%w{revision-deploys tmp '.*'} + chefignore.ignores).uniq
+ end
+
def rsync_kitchen
- system %Q{rsync -rlP --rsh="ssh #{ssh_args}" --delete --exclude '.*' ./ :#{chef_path}}
+ system! %Q{rsync -rl --rsh="ssh #{ssh_args}" --delete #{rsync_exclude.collect{ |ignore| "--exclude #{ignore} " }.join} ./ :#{adjust_rsync_path(chef_path)}}
end
def add_patches
- run_command "mkdir -p #{patch_path}"
+ run_portable_mkdir_p(patch_path)
Dir[Pathname.new(__FILE__).dirname.join("patches", "*.rb")].each do |patch|
- system %Q{rsync -rlP --rsh="ssh #{ssh_args}" #{patch} :#{patch_path}}
+ system! %Q{rsync -rl --rsh="ssh #{ssh_args}" #{patch} :#{adjust_rsync_path(patch_path)}}
end
end
def check_chef_version
constraint = "~>0.10.4"
result = run_command <<-BASH
- ruby -rubygems -e "gem 'chef', '#{constraint}'"
+ opscode_ruby="/opt/opscode/embedded/bin/ruby"
+
+ if command -v $opscode_ruby &>/dev/null
+ then
+ ruby_bin=$opscode_ruby
+ else
+ ruby_bin="ruby"
+ fi
+
+ $ruby_bin -rubygems -e "gem 'chef', '#{constraint}'"
BASH
raise "The chef gem on #{host} is out of date. Please run `#{$0} prepare #{ssh_args}` to upgrade Chef to #{constraint}." unless result.success?
end
def cook
logging_arg = "-l debug" if config[:verbosity] > 0
+
stream_command <<-BASH
sudo chef-solo -c #{chef_path}/solo.rb \
-j #{chef_path}/#{node_config} \
#{logging_arg}
BASH