chef 0.10.0.beta.6 → 0.10.0.beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. data/lib/chef/application.rb +3 -0
  2. data/lib/chef/application/client.rb +34 -2
  3. data/lib/chef/checksum.rb +2 -2
  4. data/lib/chef/checksum_cache.rb +2 -2
  5. data/lib/chef/client.rb +7 -5
  6. data/lib/chef/cookbook/remote_file_vendor.rb +1 -1
  7. data/lib/chef/cookbook/syntax_check.rb +2 -2
  8. data/lib/chef/cookbook_version.rb +5 -0
  9. data/lib/chef/data_bag_item.rb +1 -1
  10. data/lib/chef/environment.rb +31 -9
  11. data/lib/chef/file_access_control.rb +7 -3
  12. data/lib/chef/index_queue/indexable.rb +2 -2
  13. data/lib/chef/knife.rb +1 -1
  14. data/lib/chef/knife/bootstrap.rb +1 -1
  15. data/lib/chef/knife/cookbook_site_install.rb +1 -1
  16. data/lib/chef/knife/cookbook_site_share.rb +2 -2
  17. data/lib/chef/knife/cookbook_upload.rb +32 -11
  18. data/lib/chef/knife/core/subcommand_loader.rb +24 -13
  19. data/lib/chef/knife/core/text_formatter.rb +2 -2
  20. data/lib/chef/knife/core/ui.rb +1 -1
  21. data/lib/chef/knife/search.rb +1 -1
  22. data/lib/chef/knife/ssh.rb +1 -0
  23. data/lib/chef/mixin/shell_out.rb +2 -2
  24. data/lib/chef/node.rb +7 -4
  25. data/lib/chef/provider/cookbook_file.rb +4 -5
  26. data/lib/chef/provider/cron.rb +3 -3
  27. data/lib/chef/provider/cron/solaris.rb +7 -7
  28. data/lib/chef/provider/deploy.rb +52 -29
  29. data/lib/chef/provider/directory.rb +8 -8
  30. data/lib/chef/provider/env.rb +8 -8
  31. data/lib/chef/provider/erl_call.rb +7 -6
  32. data/lib/chef/provider/execute.rb +7 -2
  33. data/lib/chef/provider/file.rb +9 -9
  34. data/lib/chef/provider/git.rb +17 -8
  35. data/lib/chef/provider/group.rb +6 -6
  36. data/lib/chef/provider/group/aix.rb +1 -1
  37. data/lib/chef/provider/group/dscl.rb +2 -2
  38. data/lib/chef/provider/group/gpasswd.rb +3 -3
  39. data/lib/chef/provider/group/groupadd.rb +1 -1
  40. data/lib/chef/provider/group/pw.rb +3 -3
  41. data/lib/chef/provider/group/usermod.rb +2 -2
  42. data/lib/chef/provider/group/windows.rb +1 -1
  43. data/lib/chef/provider/ifconfig.rb +9 -7
  44. data/lib/chef/provider/link.rb +27 -24
  45. data/lib/chef/provider/mdadm.rb +10 -10
  46. data/lib/chef/provider/mount.rb +10 -13
  47. data/lib/chef/provider/mount/mount.rb +10 -10
  48. data/lib/chef/provider/mount/windows.rb +4 -3
  49. data/lib/chef/provider/ohai.rb +2 -1
  50. data/lib/chef/provider/package.rb +10 -6
  51. data/lib/chef/provider/package/apt.rb +18 -18
  52. data/lib/chef/provider/package/dpkg.rb +3 -3
  53. data/lib/chef/provider/package/easy_install.rb +2 -2
  54. data/lib/chef/provider/package/freebsd.rb +4 -5
  55. data/lib/chef/provider/package/macports.rb +2 -2
  56. data/lib/chef/provider/package/pacman.rb +2 -2
  57. data/lib/chef/provider/package/portage.rb +1 -1
  58. data/lib/chef/provider/package/rpm.rb +3 -3
  59. data/lib/chef/provider/package/rubygems.rb +7 -7
  60. data/lib/chef/provider/package/solaris.rb +9 -9
  61. data/lib/chef/provider/package/yum.rb +4 -4
  62. data/lib/chef/provider/package/zypper.rb +5 -11
  63. data/lib/chef/provider/remote_directory.rb +15 -14
  64. data/lib/chef/provider/remote_file.rb +11 -12
  65. data/lib/chef/provider/route.rb +8 -10
  66. data/lib/chef/provider/ruby_block.rb +1 -0
  67. data/lib/chef/provider/service.rb +10 -16
  68. data/lib/chef/provider/service/debian.rb +1 -1
  69. data/lib/chef/provider/service/freebsd.rb +16 -18
  70. data/lib/chef/provider/service/gentoo.rb +2 -3
  71. data/lib/chef/provider/service/simple.rb +7 -5
  72. data/lib/chef/provider/service/upstart.rb +8 -8
  73. data/lib/chef/provider/service/windows.rb +3 -3
  74. data/lib/chef/provider/subversion.rb +12 -9
  75. data/lib/chef/provider/template.rb +2 -3
  76. data/lib/chef/provider/user.rb +13 -14
  77. data/lib/chef/provider/user/dscl.rb +2 -2
  78. data/lib/chef/provider/user/pw.rb +4 -4
  79. data/lib/chef/provider/user/useradd.rb +3 -3
  80. data/lib/chef/provider/user/windows.rb +3 -3
  81. data/lib/chef/resource.rb +4 -3
  82. data/lib/chef/resource/deploy.rb +1 -1
  83. data/lib/chef/rest/rest_request.rb +2 -2
  84. data/lib/chef/run_context.rb +1 -1
  85. data/lib/chef/shell_out.rb +13 -1
  86. data/lib/chef/solr_query.rb +1 -1
  87. data/lib/chef/solr_query/solr_http_request.rb +1 -1
  88. data/lib/chef/tasks/chef_repo.rake +74 -0
  89. data/lib/chef/version.rb +1 -1
  90. metadata +2 -2
@@ -1,5 +1,3 @@
1
- #
2
- # Author:: Adam Jacob (<adam@opscode.com>)
3
1
  # Author:: Christopher Brown (<cb@opscode.com>)
4
2
  # Author:: Daniel DeLeo (<dan@opscode.com>)
5
3
  # Copyright:: Copyright (c) 2009, 2011 Opscode, Inc.
@@ -19,7 +17,6 @@
19
17
  #
20
18
 
21
19
  require 'chef/version'
22
-
23
20
  class Chef
24
21
  class Knife
25
22
  class SubcommandLoader
@@ -32,11 +29,12 @@ class Chef
32
29
 
33
30
  def initialize(chef_config_dir, env=ENV)
34
31
  @chef_config_dir, @env = chef_config_dir, env
32
+ @forced_activate = {}
35
33
  end
36
34
 
37
35
  # Load all the sub-commands
38
36
  def load_commands
39
- subcommand_files.each { |subcommand| require subcommand }
37
+ subcommand_files.each { |subcommand| Kernel.load subcommand }
40
38
  true
41
39
  end
42
40
 
@@ -52,12 +50,18 @@ class Chef
52
50
  # finally search ~/.chef/plugins/knife/*.rb
53
51
  user_specific_files.concat Dir.glob(File.join(env['HOME'], '.chef', 'plugins', 'knife', '*.rb'))
54
52
 
55
- user_specific_files.map! { |path| path[/(.+).rb/, 1] }
56
53
  user_specific_files
57
54
  end
58
55
 
59
- # Returns an Array of paths to knife commands built-in to chef, or installed via gem.
56
+ # Returns a Hash of paths to knife commands built-in to chef, or installed via gem.
60
57
  # If rubygems is not installed, falls back to globbing the knife directory.
58
+ # The Hash is of the form {"relative/path" => "/absolute/path"}
59
+ #--
60
+ # Note: the "right" way to load the plugins is to require the relative path, i.e.,
61
+ # require 'chef/knife/command'
62
+ # but we're getting frustrated by bugs at every turn, and it's slow besides. So
63
+ # subcommand loader has been modified to load the plugins by using Kernel.load
64
+ # with the absolute path.
61
65
  def gem_and_builtin_subcommands
62
66
  # search all gems for chef/knife/*.rb
63
67
  require 'rubygems'
@@ -67,23 +71,30 @@ class Chef
67
71
  end
68
72
 
69
73
  def subcommand_files
70
- @subcommand_files ||= (gem_and_builtin_subcommands + site_subcommands).flatten.uniq
74
+ @subcommand_files ||= (gem_and_builtin_subcommands.values + site_subcommands).flatten.uniq
71
75
  end
72
76
 
73
77
  def find_subcommands_via_dirglob
74
78
  # The "require paths" of the core knife subcommands bundled with chef
75
79
  files = Dir[File.expand_path('../../../knife/*.rb', __FILE__)]
76
- files.map! { |knife_file| knife_file[/#{CHEF_ROOT}#{Regexp.escape(File::SEPARATOR)}(.*)\.rb/,1] }
77
- files
80
+ subcommand_files = {}
81
+ files.each do |knife_file|
82
+ rel_path = knife_file[/#{CHEF_ROOT}#{Regexp.escape(File::SEPARATOR)}(.*)\.rb/,1]
83
+ subcommand_files[rel_path] = knife_file
84
+ end
85
+ subcommand_files
78
86
  end
79
87
 
80
88
  def find_subcommands_via_rubygems
81
89
  files = Gem.find_files 'chef/knife/*.rb'
82
90
  files.reject! {|f| from_old_gem?(f) }
83
- files.map! do |file|
84
- file[/(#{Regexp.escape File.join('chef', 'knife', '')}.*)\.rb/, 1]
85
- end.uniq!
86
- files
91
+ subcommand_files = {}
92
+ files.each do |file|
93
+ rel_path = file[/(#{Regexp.escape File.join('chef', 'knife', '')}.*)\.rb/, 1]
94
+ subcommand_files[rel_path] = file
95
+ end
96
+
97
+ subcommand_files.merge(find_subcommands_via_dirglob)
87
98
  end
88
99
 
89
100
  private
@@ -72,7 +72,7 @@ class Chef
72
72
  # Ruby 1.8 Strings include enumberable, which is not what we want. So
73
73
  # we have this heuristic to detect hashes and arrays instead.
74
74
  def should_enumerate?(value)
75
- ((value.respond_to?(:keys) && !value.empty? ) || ( value.kind_of?(Array) && value.size > 1 ))
75
+ ((value.respond_to?(:keys) && !value.empty? ) || ( value.kind_of?(Array) && (value.size > 1 || should_enumerate?(value.first) )))
76
76
  end
77
77
 
78
78
  def indent_line(string, indent)
@@ -90,7 +90,7 @@ class Chef
90
90
  end
91
91
 
92
92
  def stringify_value(data)
93
- data.kind_of?(String) ? data : data.inspect
93
+ data.kind_of?(String) ? data : data.to_s
94
94
  end
95
95
 
96
96
  end
@@ -93,7 +93,7 @@ class Chef
93
93
  # determined by the value of `config[:color]`. When output is not to a
94
94
  # terminal, colored output is never used
95
95
  def color?
96
- config[:color] && stdout.tty?
96
+ Chef::Config[:color] && stdout.tty?
97
97
  end
98
98
 
99
99
  def ask(*args, &block)
@@ -17,6 +17,7 @@
17
17
  #
18
18
 
19
19
  require 'chef/knife'
20
+ require 'chef/knife/core/node_presenter'
20
21
 
21
22
  class Chef
22
23
  class Knife
@@ -24,7 +25,6 @@ class Chef
24
25
 
25
26
  deps do
26
27
  require 'chef/search/query'
27
- require 'chef/knife/core/node_presenter'
28
28
  end
29
29
 
30
30
  include Knife::Core::NodeFormattingOptions
@@ -25,6 +25,7 @@ class Chef
25
25
  deps do
26
26
  require 'net/ssh'
27
27
  require 'net/ssh/multi'
28
+ require 'readline'
28
29
  require 'chef/search/query'
29
30
  end
30
31
 
@@ -24,8 +24,8 @@ class Chef
24
24
 
25
25
  def shell_out(*command_args)
26
26
  cmd = Chef::ShellOut.new(*command_args)
27
- if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.info?
28
- cmd.live_stream ||= STDOUT
27
+ if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.debug?
28
+ cmd.live_stream = STDOUT
29
29
  end
30
30
  cmd.run_command
31
31
  cmd
@@ -447,10 +447,13 @@ class Chef
447
447
  # Apply the default and overrides attributes from the expansion
448
448
  # passed in, which came from roles.
449
449
  def apply_expansion_attributes(expansion)
450
- @default_attrs = Chef::Mixin::DeepMerge.merge(default_attrs, expansion.default_attrs)
451
- environment_attrs = chef_environment == "_default" ? {} : Chef::Environment.load(chef_environment).attributes
450
+ load_chef_environment_object = (chef_environment == "_default" ? nil : Chef::Environment.load(chef_environment))
451
+ environment_default_attrs = load_chef_environment_object.nil? ? {} : load_chef_environment_object.default_attributes
452
+ default_before_roles = Chef::Mixin::DeepMerge.merge(default_attrs, environment_default_attrs)
453
+ @default_attrs = Chef::Mixin::DeepMerge.merge(default_before_roles, expansion.default_attrs)
454
+ environment_override_attrs = load_chef_environment_object.nil? ? {} : load_chef_environment_object.override_attributes
452
455
  overrides_before_environments = Chef::Mixin::DeepMerge.merge(override_attrs, expansion.override_attrs)
453
- @override_attrs = Chef::Mixin::DeepMerge.merge(overrides_before_environments, environment_attrs)
456
+ @override_attrs = Chef::Mixin::DeepMerge.merge(overrides_before_environments, environment_override_attrs)
454
457
  end
455
458
 
456
459
  # Transform the node to a Hash
@@ -647,7 +650,7 @@ class Chef
647
650
  def load_attributes
648
651
  cookbook_collection.values.each do |cookbook|
649
652
  cookbook.segment_filenames(:attributes).each do |segment_filename|
650
- Chef::Log.debug("node #{name} loading cookbook #{cookbook.name}'s attribute file #{segment_filename}")
653
+ Chef::Log.debug("Node #{name} loading cookbook #{cookbook.name}'s attribute file #{segment_filename}")
651
654
  self.from_file(segment_filename)
652
655
  end
653
656
  end
@@ -31,18 +31,18 @@ class Chef
31
31
  @current_resource
32
32
  end
33
33
 
34
-
35
34
  def action_create
36
35
  assert_enclosing_directory_exists!
37
36
  if file_cache_location && content_stale?
38
- Chef::Log.debug("content of file #{@new_resource.path} requires update")
37
+ Chef::Log.debug("#{@new_resource} has new contents")
39
38
  backup_new_resource
40
39
  Tempfile.open(::File.basename(@new_resource.name)) do |staging_file|
41
- Chef::Log.debug("staging #{file_cache_location} to #{staging_file.path}")
40
+ Chef::Log.debug("#{@new_resource} staging #{file_cache_location} to #{staging_file.path}")
42
41
  staging_file.close
43
42
  stage_file_to_tmpdir(staging_file.path)
44
43
  FileUtils.mv(staging_file.path, @new_resource.path)
45
44
  end
45
+ Chef::Log.info("#{@new_resource} created file #{@new_resource.path}")
46
46
  @new_resource.updated_by_last_action(true)
47
47
  else
48
48
  set_all_access_controls(@new_resource.path)
@@ -52,7 +52,7 @@ class Chef
52
52
 
53
53
  def action_create_if_missing
54
54
  if ::File.exists?(@new_resource.path)
55
- Chef::Log.debug("File #{@new_resource.path} exists, taking no action.")
55
+ Chef::Log.debug("#{@new_resource} exists at #{@new_resource.path} taking no action.")
56
56
  else
57
57
  action_create
58
58
  end
@@ -87,7 +87,6 @@ class Chef
87
87
 
88
88
  def backup_new_resource
89
89
  if ::File.exists?(@new_resource.path)
90
- Chef::Log.info "Backing up current file at #{@new_resource.path}"
91
90
  backup @new_resource.path
92
91
  end
93
92
  end
@@ -132,7 +132,7 @@ class Chef
132
132
  status = popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
133
133
  crontab.each_line { |line| stdin.puts "#{line}" }
134
134
  end
135
- Chef::Log.info("Updated cron '#{@new_resource.name}'")
135
+ Chef::Log.info("#{@new_resource} updated crontab entry")
136
136
  @new_resource.updated_by_last_action(true)
137
137
  else
138
138
  unless @cron_empty
@@ -146,7 +146,7 @@ class Chef
146
146
  status = popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
147
147
  crontab.each_line { |line| stdin.puts "#{line}" }
148
148
  end
149
- Chef::Log.info("Added cron '#{@new_resource.name}'")
149
+ Chef::Log.info("#{@new_resource} added crontab entry")
150
150
  @new_resource.updated_by_last_action(true)
151
151
  end
152
152
  end
@@ -176,7 +176,7 @@ class Chef
176
176
  status = popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr|
177
177
  crontab.each_line { |line| stdin.puts "#{line}" }
178
178
  end
179
- Chef::Log.debug("Deleted cron '#{@new_resource.name}'")
179
+ Chef::Log.info("#{@new_resource} deleted crontab entry")
180
180
  @new_resource.updated_by_last_action(true)
181
181
  end
182
182
  end
@@ -51,7 +51,7 @@ class Chef
51
51
  crontab_lines.each do |line|
52
52
  case line.chomp
53
53
  when "# Chef Name: #{@new_resource.name}"
54
- Chef::Log.debug("Found cron '#{@new_resource.name}'")
54
+ Chef::Log.debug("#{@new_resource} found cron '#{@new_resource.name}'")
55
55
  cron_found = true
56
56
  @cron_exists = true
57
57
  next
@@ -82,9 +82,9 @@ class Chef
82
82
  next
83
83
  end
84
84
  end
85
- Chef::Log.debug("Cron '#{@new_resource.name}' not found") unless @cron_exists
85
+ Chef::Log.debug("#{@new_resource} cron '#{@new_resource.name}' not found") unless @cron_exists
86
86
  elsif status.exitstatus == 1
87
- Chef::Log.debug("Cron empty for '#{@new_resource.user}'")
87
+ Chef::Log.debug("#{@new_resource} cron empty for '#{@new_resource.user}'")
88
88
  @cron_empty = true
89
89
  end
90
90
 
@@ -125,7 +125,7 @@ class Chef
125
125
 
126
126
  if @cron_exists
127
127
  unless compare_cron
128
- Chef::Log.debug("Skipping existing cron entry '#{@new_resource.name}'")
128
+ Chef::Log.debug("#{@new_resource} skipping existing cron entry '#{@new_resource.name}'")
129
129
  return
130
130
  end
131
131
  status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
@@ -148,7 +148,7 @@ class Chef
148
148
  end
149
149
 
150
150
  status = write_crontab(crontab)
151
- Chef::Log.info("Updated cron '#{@new_resource.name}'")
151
+ Chef::Log.info("#{@new_resource} updated crontab entry")
152
152
  else
153
153
  unless @cron_empty
154
154
  status = popen4("crontab -l #{@new_resource.user}") do |pid, stdin, stdout, stderr|
@@ -158,7 +158,7 @@ class Chef
158
158
 
159
159
  crontab << newcron
160
160
  status = write_crontab(crontab)
161
- Chef::Log.info("Added cron '#{@new_resource.name}'")
161
+ Chef::Log.info("#{@new_resource} added crontab entry")
162
162
  end
163
163
  end
164
164
 
@@ -185,7 +185,7 @@ class Chef
185
185
  end
186
186
 
187
187
  status = write_crontab(crontab)
188
- Chef::Log.info("Deleted cron '#{@new_resource.name}'")
188
+ Chef::Log.info("#{@new_resource} deleted crontab entry")
189
189
  end
190
190
  end
191
191
 
@@ -61,9 +61,8 @@ class Chef
61
61
  def action_deploy
62
62
  if all_releases.include?(release_path)
63
63
  if all_releases[-1] == release_path
64
- Chef::Log.debug("Already deployed app at #{release_path}, and it is the latest revision. Use action :force_deploy to re-deploy this revision.")
64
+ Chef::Log.debug("#{@new_resource} is the latest version")
65
65
  else
66
- Chef::Log.info("Already deployed app at #{release_path}. Rolling back to it - use action :force_deploy to re-checkout this revision.")
67
66
  action_rollback
68
67
  end
69
68
  else
@@ -74,8 +73,8 @@ class Chef
74
73
 
75
74
  def action_force_deploy
76
75
  if all_releases.include?(release_path)
77
- Chef::Log.info("Already deployed app at #{release_path}, forcing.")
78
76
  FileUtils.rm_rf(release_path)
77
+ Chef::Log.info("#{@new_resource} forcing deploy of already deployed app at #{release_path}")
79
78
  end
80
79
  deploy
81
80
  @new_resource.updated_by_last_action(true)
@@ -93,12 +92,12 @@ class Chef
93
92
  releases_to_nuke = [ all_releases.last ]
94
93
  end
95
94
 
96
- Chef::Log.info "rolling back to previous release: #{release_path}"
95
+ Chef::Log.info "#{@new_resource} rolling back to previous release #{release_path}"
97
96
  symlink
98
- Chef::Log.info "restarting with previous release"
97
+ Chef::Log.info "#{@new_resource} restarting with previous release"
99
98
  restart
100
99
  releases_to_nuke.each do |i|
101
- Chef::Log.info "Removing release: #{i}"
100
+ Chef::Log.info "#{@new_resource} removing release: #{i}"
102
101
  FileUtils.rm_rf i
103
102
  release_deleted(i)
104
103
  end
@@ -106,7 +105,6 @@ class Chef
106
105
  end
107
106
 
108
107
  def deploy
109
- Chef::Log.info "deploying branch: #{@new_resource.branch}"
110
108
  enforce_ownership
111
109
  update_cached_repo
112
110
  copy_cached_repo
@@ -120,13 +118,14 @@ class Chef
120
118
  restart
121
119
  callback(:after_restart, @new_resource.after_restart)
122
120
  cleanup!
121
+ Chef::Log.info "#{@new_resource} deployed to #{@new_resource.deploy_to}"
123
122
  end
124
123
 
125
124
  def callback(what, callback_code=nil)
126
125
  @collection = Chef::ResourceCollection.new
127
126
  case callback_code
128
127
  when Proc
129
- Chef::Log.info "Running callback #{what} code block"
128
+ Chef::Log.info "#{@new_resource} running callback #{what}"
130
129
  recipe_eval(&callback_code)
131
130
  when String
132
131
  callback_file = "#{release_path}/#{callback_code}"
@@ -152,26 +151,25 @@ class Chef
152
151
  "#{key_and_val.first}='#{key_and_val.last}'"
153
152
  end.join(" ")
154
153
 
155
- Chef::Log.info "Migrating: running #{@new_resource.migration_command} as #{@new_resource.user} " +
156
- "with environment #{env_info}"
157
- run_command(run_options(:command => @new_resource.migration_command, :cwd=>release_path))
154
+ Chef::Log.info "#{@new_resource} migrating #{@new_resource.user} with environment #{env_info}"
155
+ run_command(run_options(:command => @new_resource.migration_command, :cwd=>release_path, :command_log_level => :info))
158
156
  end
159
157
  end
160
158
 
161
159
  def symlink
162
- Chef::Log.info "Symlinking"
163
160
  purge_tempfiles_from_current_release
164
161
  link_tempfiles_to_current_release
165
162
  link_current_release_to_production
163
+ Chef::Log.info "#{@new_resource} updated symlinks"
166
164
  end
167
165
 
168
166
  def restart
169
167
  if restart_cmd = @new_resource.restart_command
170
168
  if restart_cmd.kind_of?(Proc)
171
- Chef::Log.info("Restarting app with embedded recipe")
169
+ Chef::Log.info("#{@new_resource} restarting app with embedded recipe")
172
170
  recipe_eval(&restart_cmd)
173
171
  else
174
- Chef::Log.info("Restarting app with #{@new_resource.restart_command} in #{@new_resource.current_path}")
172
+ Chef::Log.info("#{@new_resource} restarting app")
175
173
  run_command(run_options(:command => @new_resource.restart_command, :cwd => @new_resource.current_path))
176
174
  end
177
175
  end
@@ -179,7 +177,7 @@ class Chef
179
177
 
180
178
  def cleanup!
181
179
  all_releases[0..-6].each do |old_release|
182
- Chef::Log.info "Removing old release #{old_release}"
180
+ Chef::Log.info "#{@new_resource} removing old release #{old_release}"
183
181
  FileUtils.rm_rf(old_release)
184
182
  release_deleted(old_release)
185
183
  end
@@ -199,52 +197,70 @@ class Chef
199
197
  end
200
198
 
201
199
  def run_scm_sync
202
- Chef::Log.info "updating the cached checkout"
203
200
  @scm_provider.action_sync
204
201
  end
205
202
 
206
203
  def svn_force_export
207
- Chef::Log.info "exporting source repository to #{@new_resource.destination}"
204
+ Chef::Log.info "#{@new_resource} exporting source repository"
208
205
  @scm_provider.action_force_export
209
206
  end
210
207
 
211
208
  def copy_cached_repo
212
- Chef::Log.info "copying the cached checkout to #{release_path}"
213
209
  FileUtils.mkdir_p(@new_resource.deploy_to + "/releases")
214
210
  run_command(:command => "cp -RPp #{::File.join(@new_resource.destination, ".")} #{release_path}")
211
+ Chef::Log.info "#{@new_resource} copied the cached checkout to #{release_path}"
215
212
  release_created(release_path)
216
213
  end
217
214
 
218
215
  def enforce_ownership
219
- Chef::Log.info "ensuring proper ownership"
220
216
  FileUtils.chown_R(@new_resource.user, @new_resource.group, @new_resource.deploy_to)
217
+ Chef::Log.info("#{@new_resource} set user to #{@new_resource.user}") if @new_resource.user
218
+ Chef::Log.info("#{@new_resource} set group to #{@new_resource.group}") if @new_resource.group
221
219
  end
222
220
 
223
221
  def link_current_release_to_production
224
- Chef::Log.info "Linking release #{release_path} into production at #{@new_resource.current_path}"
225
222
  FileUtils.rm_f(@new_resource.current_path)
226
- FileUtils.ln_sf(release_path, @new_resource.current_path)
223
+ begin
224
+ FileUtils.ln_sf(release_path, @new_resource.current_path)
225
+ rescue => e
226
+ raise Chef::Exceptions::FileNotFound.new("Cannot symlink current release to production: #{e.message}")
227
+ end
228
+ Chef::Log.info "#{@new_resource} linked release #{release_path} into production at #{@new_resource.current_path}"
227
229
  enforce_ownership
228
230
  end
229
231
 
230
232
  def run_symlinks_before_migrate
231
233
  links_info = @new_resource.symlink_before_migrate.map { |src, dst| "#{src} => #{dst}" }.join(", ")
232
- Chef::Log.info "Making pre-migration symlinks: #{links_info}"
233
234
  @new_resource.symlink_before_migrate.each do |src, dest|
234
- FileUtils.ln_sf(@new_resource.shared_path + "/#{src}", release_path + "/#{dest}")
235
+ begin
236
+ FileUtils.ln_sf(@new_resource.shared_path + "/#{src}", release_path + "/#{dest}")
237
+ rescue => e
238
+ raise Chef::Exceptions::FileNotFound.new("Cannot symlink #{@new_resource.shared_path}/#{src} to #{release_path}/#{dest} before migrate: #{e.message}")
239
+ end
235
240
  end
241
+ Chef::Log.info "#{@new_resource} made pre-migration symlinks"
236
242
  end
237
243
 
238
244
  def link_tempfiles_to_current_release
239
245
  dirs_info = @new_resource.create_dirs_before_symlink.join(",")
240
- Chef::Log.info("creating directories before symlink: #{dirs_info}")
241
- @new_resource.create_dirs_before_symlink.each { |dir| FileUtils.mkdir_p(release_path + "/#{dir}") }
246
+ @new_resource.create_dirs_before_symlink.each do |dir|
247
+ begin
248
+ FileUtils.mkdir_p(release_path + "/#{dir}")
249
+ rescue => e
250
+ raise Chef::Exceptions::FileNotFound.new("Cannot create directory #{dir}: #{e.message}")
251
+ end
252
+ end
253
+ Chef::Log.info("#{@new_resource} created directories before symlinking #{dirs_info}")
242
254
 
243
255
  links_info = @new_resource.symlinks.map { |src, dst| "#{src} => #{dst}" }.join(", ")
244
- Chef::Log.info("Linking shared paths into current release: #{links_info}")
245
256
  @new_resource.symlinks.each do |src, dest|
246
- FileUtils.ln_sf(@new_resource.shared_path + "/#{src}", release_path + "/#{dest}")
257
+ begin
258
+ FileUtils.ln_sf(@new_resource.shared_path + "/#{src}", release_path + "/#{dest}")
259
+ rescue => e
260
+ raise Chef::Exceptions::FileNotFound.new("Cannot symlink shared data #{@new_resource.shared_path}/#{src} to #{release_path}/#{dest}: #{e.message}")
261
+ end
247
262
  end
263
+ Chef::Log.info("#{@new_resource} linked shared paths into current release: #{links_info}")
248
264
  run_symlinks_before_migrate
249
265
  enforce_ownership
250
266
  end
@@ -254,8 +270,8 @@ class Chef
254
270
 
255
271
  def purge_tempfiles_from_current_release
256
272
  log_info = @new_resource.purge_before_symlink.join(", ")
257
- Chef::Log.info("Purging directories in checkout #{log_info}")
258
273
  @new_resource.purge_before_symlink.each { |dir| FileUtils.rm_rf(release_path + "/#{dir}") }
274
+ Chef::Log.info("#{@new_resource} purged directories in checkout #{log_info}")
259
275
  end
260
276
 
261
277
  protected
@@ -303,13 +319,20 @@ class Chef
303
319
  run_opts[:user] = @new_resource.user if @new_resource.user
304
320
  run_opts[:group] = @new_resource.group if @new_resource.group
305
321
  run_opts[:environment] = @new_resource.environment if @new_resource.environment
322
+ run_opts[:command_log_prepend] = @new_resource.to_s
323
+ run_opts[:command_log_level] ||= :debug
324
+ if run_opts[:command_log_level] == :info
325
+ if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.info?
326
+ run_opts[:live_stream] = STDOUT
327
+ end
328
+ end
306
329
  run_opts
307
330
  end
308
331
 
309
332
  def run_callback_from_file(callback_file)
310
333
  if ::File.exist?(callback_file)
311
334
  Dir.chdir(release_path) do
312
- Chef::Log.info "running deploy hook: #{callback_file}"
335
+ Chef::Log.info "#{@new_resource} running deploy hook #{callback_file}"
313
336
  recipe_eval { from_file(callback_file) }
314
337
  end
315
338
  end