diff options
Diffstat (limited to 'lib/chef/run_status.rb')
-rw-r--r-- | lib/chef/run_status.rb | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/lib/chef/run_status.rb b/lib/chef/run_status.rb new file mode 100644 index 0000000000..9354f7872a --- /dev/null +++ b/lib/chef/run_status.rb @@ -0,0 +1,124 @@ +# +# Author:: Daniel DeLeo (<dan@opscode.com>) +# Copyright:: Copyright (c) 2010 Opscode, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# == Chef::RunStatus +# Tracks various aspects of a Chef run, including the Node and RunContext, +# start and end time, and any Exception that stops the run. RunStatus objects +# are passed to any notification or exception handlers at the completion of a +# Chef run. +class Chef::RunStatus + + attr_reader :events + + attr_reader :run_context + + attr_writer :run_context + + attr_reader :start_time + + attr_reader :end_time + + attr_reader :exception + + attr_writer :exception + + def initialize(node, events) + @node = node + @events = events + end + + def node + @node + end + + # sets +start_time+ to the current time. + def start_clock + @start_time = Time.now + end + + # sets +end_time+ to the current time + def stop_clock + @end_time = Time.now + end + + # The elapsed time between +start_time+ and +end_time+. Returns +nil+ if + # either value is not set. + def elapsed_time + if @start_time && @end_time + @end_time - @start_time + else + nil + end + end + + # The list of all resources in the current run context's +resource_collection+ + def all_resources + @run_context && @run_context.resource_collection.all_resources + end + + # The list of all resources in the current run context's +resource_collection+ + # that are marked as updated + def updated_resources + @run_context && @run_context.resource_collection.select { |r| r.updated } + end + + # The backtrace from +exception+, if any + def backtrace + @exception && @exception.backtrace + end + + # Did the Chef run fail? + def failed? + !success? + end + + # Did the chef run succeed? returns +true+ if no exception has been set. + def success? + @exception.nil? + end + + # A Hash representation of the RunStatus, with the following (Symbol) keys: + # * :node + # * :success + # * :start_time + # * :end_time + # * :elapsed_time + # * :all_resources + # * :updated_resources + # * :exception + # * :backtrace + def to_hash + # use a flat hash here so we can't errors from intermediate values being nil + { :node => node, + :success => success?, + :start_time => start_time, + :end_time => end_time, + :elapsed_time => elapsed_time, + :all_resources => all_resources, + :updated_resources => updated_resources, + :exception => formatted_exception, + :backtrace => backtrace} + end + + # Returns a string of the format "ExceptionClass: message" or +nil+ if no + # +exception+ is set. + def formatted_exception + @exception && "#{@exception.class.name}: #{@exception.message}" + end + +end |