chef 0.9.8.rc.0 → 0.9.8

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.
@@ -23,8 +23,9 @@ require 'chef/role'
23
23
  require 'chef/log'
24
24
  require 'chef/mixin/language_include_recipe'
25
25
 
26
- # Value object that loads and tracks the context of a Chef run
27
26
  class Chef
27
+ # == Chef::RunContext
28
+ # Value object that loads and tracks the context of a Chef run
28
29
  class RunContext
29
30
 
30
31
  # Used to load the node's recipes after expanding its run list
@@ -16,6 +16,11 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
+ # == Chef::RunStatus
20
+ # Tracks various aspects of a Chef run, including the Node and RunContext,
21
+ # start and end time, and any Exception that stops the run. RunStatus objects
22
+ # are passed to any notification or exception handlers at the completion of a
23
+ # Chef run.
19
24
  class Chef::RunStatus
20
25
 
21
26
  attr_reader :run_context
@@ -38,14 +43,18 @@ class Chef::RunStatus
38
43
  @node
39
44
  end
40
45
 
46
+ # sets +start_time+ to the current time.
41
47
  def start_clock
42
48
  @start_time = Time.now
43
49
  end
44
50
 
51
+ # sets +end_time+ to the current time
45
52
  def stop_clock
46
53
  @end_time = Time.now
47
54
  end
48
55
 
56
+ # The elapsed time between +start_time+ and +end_time+. Returns +nil+ if
57
+ # either value is not set.
49
58
  def elapsed_time
50
59
  if @start_time && @end_time
51
60
  @end_time - @start_time
@@ -54,26 +63,42 @@ class Chef::RunStatus
54
63
  end
55
64
  end
56
65
 
66
+ # The list of all resources in the current run context's +resource_collection+
57
67
  def all_resources
58
68
  @run_context && @run_context.resource_collection.all_resources
59
69
  end
60
70
 
71
+ # The list of all resources in the current run context's +resource_collection+
72
+ # that are marked as updated
61
73
  def updated_resources
62
74
  @run_context && @run_context.resource_collection.select { |r| r.updated }
63
75
  end
64
76
 
77
+ # The backtrace from +exception+, if any
65
78
  def backtrace
66
79
  @exception && @exception.backtrace
67
80
  end
68
81
 
82
+ # Did the Chef run fail?
69
83
  def failed?
70
84
  !success?
71
85
  end
72
86
 
87
+ # Did the chef run succeed? returns +true+ if no exception has been set.
73
88
  def success?
74
89
  @exception.nil?
75
90
  end
76
91
 
92
+ # A Hash representation of the RunStatus, with the following (Symbol) keys:
93
+ # * :node
94
+ # * :success
95
+ # * :start_time
96
+ # * :end_time
97
+ # * :elapsed_time
98
+ # * :all_resources
99
+ # * :updated_resources
100
+ # * :exception
101
+ # * :backtrace
77
102
  def to_hash
78
103
  # use a flat hash here so we can't errors from intermediate values being nil
79
104
  { :node => node,
@@ -87,6 +112,8 @@ class Chef::RunStatus
87
112
  :backtrace => backtrace}
88
113
  end
89
114
 
115
+ # Returns a string of the format "ExceptionClass: message" or +nil+ if no
116
+ # +exception+ is set.
90
117
  def formatted_exception
91
118
  @exception && "#{@exception.class.name}: #{@exception.message}"
92
119
  end
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Author:: Adam Jacob (<adam@opscode.com>)
3
3
  # Author:: Christopher Walters (<cw@opscode.com>)
4
4
  # Author:: Tim Hinderliter (<tim@opscode.com>)
@@ -23,8 +23,9 @@ require 'chef/node'
23
23
  require 'chef/resource_collection'
24
24
  require 'chef/platform'
25
25
 
26
- # This class is responsible for executing the steps in a Chef run.
27
26
  class Chef
27
+ # == Chef::Runner
28
+ # This class is responsible for executing the steps in a Chef run.
28
29
  class Runner
29
30
 
30
31
  attr_reader :run_context
@@ -72,7 +73,8 @@ class Chef
72
73
  end
73
74
  end
74
75
 
75
- # Executes a Chef run.
76
+ # Iterates over the +resource_collection+ in the +run_context+ calling
77
+ # +run_action+ for each resource in turn.
76
78
  def converge
77
79
  delayed_actions = Array.new
78
80
 
@@ -27,7 +27,9 @@ require "chef/config"
27
27
  require "chef/shef/shef_session"
28
28
  require "chef/shef/ext"
29
29
 
30
-
30
+ # = Shef
31
+ # Shef is Chef in an IRB session. Shef can interact with a Chef server via the
32
+ # REST API, and run and debug recipes interactively.
31
33
  module Shef
32
34
  LEADERS = Hash.new("")
33
35
  LEADERS[Chef::Recipe] = ":recipe"
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Author:: Daniel DeLeo (<dan@kallistec.com>)
2
3
  # Copyright:: Copyright (c) 2009 Daniel DeLeo
3
4
  # License:: Apache License, Version 2.0
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Author:: Daniel DeLeo (<dan@opscode.com>)
3
3
  # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
4
  # License:: Apache License, Version 2.0
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Author:: Daniel DeLeo (<dan@opscode.com>)
3
3
  # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
4
  # License:: Apache License, Version 2.0
@@ -1,3 +1,4 @@
1
+ #--
1
2
  # Author:: Daniel DeLeo (<dan@kallistec.com>)
2
3
  # Copyright:: Copyright (c) 2009 Daniel DeLeo
3
4
  # License:: Apache License, Version 2.0
@@ -1,4 +1,4 @@
1
- #
1
+ #--
2
2
  # Author:: Daniel DeLeo (<dan@opscode.com>)
3
3
  # Copyright:: Copyright (c) 2010 Opscode, Inc.
4
4
  # License:: Apache License, Version 2.0
@@ -23,16 +23,17 @@ require 'fcntl'
23
23
  require 'chef/exceptions'
24
24
 
25
25
  class Chef
26
-
26
+
27
+ # == Chef::ShellOut
27
28
  # Provides a simplified interface to shelling out yet still collecting both
28
29
  # standard out and standard error and providing full control over environment,
29
30
  # working directory, uid, gid, etc.
30
31
  #
31
32
  # No means for passing input to the subprocess is provided, nor is there any
32
33
  # way to inspect the output of the command as it is being read. If you need
33
- # to do that, you have to use Chef::Mixin::Command.popen4
34
+ # to do that, you have to use popen4 (in Chef::Mixin::Command)
34
35
  #
35
- # == Platform Support
36
+ # === Platform Support
36
37
  # Chef::ShellOut uses Kernel.fork() and is therefore unsuitable for Windows
37
38
  # or jruby.
38
39
  class ShellOut
@@ -58,23 +59,41 @@ class Chef
58
59
  # === Options:
59
60
  # If the last argument is a Hash, it is removed from the list of args passed
60
61
  # to exec and used as an options hash. The following options are available:
61
- # * user: the user the commmand should run as. if an integer is given, it is
62
+ # * +user+: the user the commmand should run as. if an integer is given, it is
62
63
  # used as a uid. A string is treated as a username and resolved to a uid
63
64
  # with Etc.getpwnam
64
- # * group: the group the command should run as. works similarly to +user+
65
- # * cwd: the directory to chdir to before running the command
66
- # * umask: a umask to set before running the command. If given as an Integer,
65
+ # * +group+: the group the command should run as. works similarly to +user+
66
+ # * +cwd+: the directory to chdir to before running the command
67
+ # * +umask+: a umask to set before running the command. If given as an Integer,
67
68
  # be sure to use two leading zeros so it's parsed as Octal. A string will
68
69
  # be treated as an octal integer
69
- # * returns: one or more Integer values to use as valid exit codes for the
70
+ # * +returns+: one or more Integer values to use as valid exit codes for the
70
71
  # subprocess. This only has an effect if you call +error!+ after
71
72
  # +run_command+.
72
- # * environment: a Hash of environment variables to set before the command
73
+ # * +environment+: a Hash of environment variables to set before the command
73
74
  # is run. By default, the environment will *always* be set to 'LC_ALL' => 'C'
74
75
  # to prevent issues with multibyte characters in Ruby 1.8. To avoid this,
75
76
  # use :environment => nil for *no* extra environment settings, or
76
77
  # :environment => {'LC_ALL'=>nil, ...} to set other environment settings
77
78
  # without changing the locale.
79
+ # * +timeout+: a Numeric value for the number of seconds to wait on the
80
+ # child process before raising an Exception. This is calculated as the
81
+ # total amount of time that ShellOut waited on the child process without
82
+ # receiving any output (i.e., IO.select returned nil). Default is 60
83
+ # seconds. Note: the stdlib Timeout library is not used.
84
+ # === Examples:
85
+ # Invoke find(1) to search for .rb files:
86
+ # find = Chef::ShellOut.new("find . -name '*.rb'")
87
+ # find.run_command
88
+ # # If all went well, the results are on +stdout+
89
+ # puts find.stdout
90
+ # # find(1) prints diagnostic info to STDERR:
91
+ # puts "error messages" + find.stderr
92
+ # # Raise an exception if it didn't exit with 0
93
+ # find.error!
94
+ # Run a command as the +www+ user with no extra ENV settings from +/tmp+
95
+ # cmd = Chef::ShellOut.new("apachectl", "start", :user => 'www', :env => nil, :cwd => '/tmp')
96
+ # cmd.run_command # etc.
78
97
  def initialize(*command_args)
79
98
  @stdout, @stderr = '', ''
80
99
  @environment = DEFAULT_ENVIRONMENT
@@ -106,6 +125,9 @@ class Chef
106
125
  @timeout || DEFAULT_READ_TIMEOUT
107
126
  end
108
127
 
128
+ # Creates a String showing the output of the command, including a banner
129
+ # showing the exact command executed. Used by +invalid!+ to show command
130
+ # results when the command exited with an unexpected status.
109
131
  def format_for_exception
110
132
  msg = ""
111
133
  msg << "---- Begin output of #{command} ----\n"
@@ -126,11 +148,11 @@ class Chef
126
148
  # returns +self+; +stdout+, +stderr+, +status+, and +exitstatus+ will be
127
149
  # populated with results of the command
128
150
  # === Raises
129
- # * Errno::EACCES when you are not privileged to execute the command
130
- # * Errno::ENOENT when the command is not available on the system (or not
151
+ # * Errno::EACCES when you are not privileged to execute the command
152
+ # * Errno::ENOENT when the command is not available on the system (or not
131
153
  # in the current $PATH)
132
- # * Chef::Exceptions::CommandTimeout when the command does not complete
133
- # within +timeout+ seconds (default: 60s)
154
+ # * Chef::Exceptions::CommandTimeout when the command does not complete
155
+ # within +timeout+ seconds (default: 60s)
134
156
  def run_command
135
157
  Chef::Log.debug("sh(#{@command})")
136
158
  @child_pid = fork_subprocess
@@ -184,6 +206,13 @@ class Chef
184
206
  close_all_pipes
185
207
  end
186
208
 
209
+ # Checks the +exitstatus+ against the set of +valid_exit_codes+. If
210
+ # +exitstatus+ is not in the list of +valid_exit_codes+, calls +invalid!+,
211
+ # which raises an Exception.
212
+ # === Returns
213
+ # nil::: always returns nil when it does not raise
214
+ # === Raises
215
+ # Chef::Exceptions::ShellCommandFailed::: via +invalid!+
187
216
  def error!
188
217
  unless Array(valid_exit_codes).include?(exitstatus)
189
218
  invalid!("Expected process to exit 0, but it exited with #{exitstatus}")
@@ -193,9 +222,9 @@ class Chef
193
222
  # Raises a Chef::Exceptions::ShellCommandFailed exception, appending the
194
223
  # command's stdout, stderr, and exitstatus to the exception message.
195
224
  # === Arguments
196
- # +msg+ A String to use as the basis of the exception message. The
197
- # default explanation is very generic, providing a more
198
- # informative message is highly encouraged.
225
+ # +msg+: A String to use as the basis of the exception message. The
226
+ # default explanation is very generic, providing a more informative message
227
+ # is highly encouraged.
199
228
  # === Raises
200
229
  # Chef::Exceptions::ShellCommandFailed always
201
230
  def invalid!(msg=nil)
@@ -280,12 +309,11 @@ class Chef
280
309
  child_stdout.close unless child_stdout.closed?
281
310
  child_stderr.close unless child_stderr.closed?
282
311
  child_process_status.close unless child_process_status.closed?
283
- #rescue NoMethodError # we blew up before IPC was setup
284
312
  end
285
313
 
286
314
  # replace stdout, and stderr with pipes to the parent, and close the
287
315
  # reader side of the error marshaling side channel. Close STDIN so when we
288
- # exec, the new program will no it's never getting input ever.
316
+ # exec, the new program will know it's never getting input ever.
289
317
  def configure_subprocess_file_descriptors
290
318
  process_status_pipe.first.close
291
319
 
@@ -17,5 +17,5 @@
17
17
 
18
18
  class Chef
19
19
  CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
20
- VERSION = '0.9.8.rc.0'
20
+ VERSION = '0.9.8'
21
21
  end
metadata CHANGED
@@ -1,15 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15424197
5
- prerelease: true
4
+ prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 9
9
8
  - 8
10
- - rc
11
- - 0
12
- version: 0.9.8.rc.0
9
+ version: 0.9.8
13
10
  platform: ruby
14
11
  authors:
15
12
  - Adam Jacob
@@ -17,7 +14,7 @@ autorequire:
17
14
  bindir: bin
18
15
  cert_chain: []
19
16
 
20
- date: 2010-07-30 00:00:00 -07:00
17
+ date: 2010-08-05 00:00:00 -07:00
21
18
  default_executable:
22
19
  dependencies:
23
20
  - !ruby/object:Gem::Dependency
@@ -28,7 +25,6 @@ dependencies:
28
25
  requirements:
29
26
  - - ">="
30
27
  - !ruby/object:Gem::Version
31
- hash: 19
32
28
  segments:
33
29
  - 1
34
30
  - 1
@@ -44,7 +40,6 @@ dependencies:
44
40
  requirements:
45
41
  - - ">="
46
42
  - !ruby/object:Gem::Version
47
- hash: 19
48
43
  segments:
49
44
  - 1
50
45
  - 1
@@ -60,7 +55,6 @@ dependencies:
60
55
  requirements:
61
56
  - - ">="
62
57
  - !ruby/object:Gem::Version
63
- hash: 19
64
58
  segments:
65
59
  - 1
66
60
  - 1
@@ -76,7 +70,6 @@ dependencies:
76
70
  requirements:
77
71
  - - ">="
78
72
  - !ruby/object:Gem::Version
79
- hash: 19
80
73
  segments:
81
74
  - 1
82
75
  - 1
@@ -92,7 +85,6 @@ dependencies:
92
85
  requirements:
93
86
  - - ">="
94
87
  - !ruby/object:Gem::Version
95
- hash: 7
96
88
  segments:
97
89
  - 0
98
90
  - 5
@@ -108,7 +100,6 @@ dependencies:
108
100
  requirements:
109
101
  - - ">="
110
102
  - !ruby/object:Gem::Version
111
- hash: 31
112
103
  segments:
113
104
  - 1
114
105
  - 0
@@ -116,7 +107,6 @@ dependencies:
116
107
  version: 1.0.4
117
108
  - - <=
118
109
  - !ruby/object:Gem::Version
119
- hash: 1
120
110
  segments:
121
111
  - 1
122
112
  - 5
@@ -132,7 +122,6 @@ dependencies:
132
122
  requirements:
133
123
  - - ">="
134
124
  - !ruby/object:Gem::Version
135
- hash: 7
136
125
  segments:
137
126
  - 0
138
127
  - 6
@@ -148,7 +137,6 @@ dependencies:
148
137
  requirements:
149
138
  - - <=
150
139
  - !ruby/object:Gem::Version
151
- hash: 3
152
140
  segments:
153
141
  - 1
154
142
  - 4
@@ -164,7 +152,6 @@ dependencies:
164
152
  requirements:
165
153
  - - ">="
166
154
  - !ruby/object:Gem::Version
167
- hash: 3
168
155
  segments:
169
156
  - 0
170
157
  version: "0"
@@ -178,7 +165,6 @@ dependencies:
178
165
  requirements:
179
166
  - - ">="
180
167
  - !ruby/object:Gem::Version
181
- hash: 3
182
168
  segments:
183
169
  - 0
184
170
  version: "0"
@@ -192,7 +178,6 @@ dependencies:
192
178
  requirements:
193
179
  - - ">="
194
180
  - !ruby/object:Gem::Version
195
- hash: 3
196
181
  segments:
197
182
  - 0
198
183
  version: "0"
@@ -206,7 +191,6 @@ dependencies:
206
191
  requirements:
207
192
  - - ">="
208
193
  - !ruby/object:Gem::Version
209
- hash: 3
210
194
  segments:
211
195
  - 0
212
196
  version: "0"
@@ -220,7 +204,6 @@ dependencies:
220
204
  requirements:
221
205
  - - ">="
222
206
  - !ruby/object:Gem::Version
223
- hash: 3
224
207
  segments:
225
208
  - 0
226
209
  version: "0"
@@ -589,21 +572,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
589
572
  requirements:
590
573
  - - ">="
591
574
  - !ruby/object:Gem::Version
592
- hash: 3
593
575
  segments:
594
576
  - 0
595
577
  version: "0"
596
578
  required_rubygems_version: !ruby/object:Gem::Requirement
597
579
  none: false
598
580
  requirements:
599
- - - ">"
581
+ - - ">="
600
582
  - !ruby/object:Gem::Version
601
- hash: 25
602
583
  segments:
603
- - 1
604
- - 3
605
- - 1
606
- version: 1.3.1
584
+ - 0
585
+ version: "0"
607
586
  requirements: []
608
587
 
609
588
  rubyforge_project: