summaryrefslogtreecommitdiff
path: root/lib/chef/formatters/minimal.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chef/formatters/minimal.rb')
-rw-r--r--lib/chef/formatters/minimal.rb235
1 files changed, 235 insertions, 0 deletions
diff --git a/lib/chef/formatters/minimal.rb b/lib/chef/formatters/minimal.rb
new file mode 100644
index 0000000000..a189cc67eb
--- /dev/null
+++ b/lib/chef/formatters/minimal.rb
@@ -0,0 +1,235 @@
+require 'chef/formatters/base'
+
+class Chef
+
+ module Formatters
+
+
+ # == Formatters::Minimal
+ # Shows the progress of the chef run by printing single characters, and
+ # displays a summary of updates at the conclusion of the run. For events
+ # that don't have meaningful status information (loading a file, syncing a
+ # cookbook) a dot is printed. For resources, a dot, 'S' or 'U' is printed
+ # if the resource is up to date, skipped by not_if/only_if, or updated,
+ # respectively.
+ class Minimal < Formatters::Base
+
+ cli_name(:minimal)
+ cli_name(:min)
+
+ attr_reader :updated_resources
+ attr_reader :updates_by_resource
+
+
+ def initialize(out, err)
+ super
+ @updated_resources = []
+ @updates_by_resource = Hash.new {|h, k| h[k] = []}
+ end
+
+ # Called at the very start of a Chef Run
+ def run_start(version)
+ puts "Starting Chef Client, version #{version}"
+ end
+
+ # Called at the end of the Chef run.
+ def run_completed(node)
+ puts "chef client finished, #{@updated_resources.size} resources updated"
+ end
+
+ # called at the end of a failed run
+ def run_failed(exception)
+ puts "chef client failed. #{@updated_resources.size} resources updated"
+ end
+
+ # Called right after ohai runs.
+ def ohai_completed(node)
+ end
+
+ # Already have a client key, assuming this node has registered.
+ def skipping_registration(node_name, config)
+ end
+
+ # About to attempt to register as +node_name+
+ def registration_start(node_name, config)
+ end
+
+ def registration_completed
+ end
+
+ # Failed to register this client with the server.
+ def registration_failed(node_name, exception, config)
+ super
+ end
+
+ def node_load_start(node_name, config)
+ end
+
+ # Failed to load node data from the server
+ def node_load_failed(node_name, exception, config)
+ end
+
+ # Default and override attrs from roles have been computed, but not yet applied.
+ # Normal attrs from JSON have been added to the node.
+ def node_load_completed(node, expanded_run_list, config)
+ end
+
+ # Called before the cookbook collection is fetched from the server.
+ def cookbook_resolution_start(expanded_run_list)
+ puts "resolving cookbooks for run list: #{expanded_run_list.inspect}"
+ end
+
+ # Called when there is an error getting the cookbook collection from the
+ # server.
+ def cookbook_resolution_failed(expanded_run_list, exception)
+ end
+
+ # Called when the cookbook collection is returned from the server.
+ def cookbook_resolution_complete(cookbook_collection)
+ end
+
+ # Called before unneeded cookbooks are removed
+ #--
+ # TODO: Should be called in CookbookVersion.sync_cookbooks
+ def cookbook_clean_start
+ end
+
+ # Called after the file at +path+ is removed. It may be removed if the
+ # cookbook containing it was removed from the run list, or if the file was
+ # removed from the cookbook.
+ def removed_cookbook_file(path)
+ end
+
+ # Called when cookbook cleaning is finished.
+ def cookbook_clean_complete
+ end
+
+ # Called before cookbook sync starts
+ def cookbook_sync_start(cookbook_count)
+ puts "Synchronizing cookbooks"
+ end
+
+ # Called when cookbook +cookbook_name+ has been sync'd
+ def synchronized_cookbook(cookbook_name)
+ print "."
+ end
+
+ # Called when an individual file in a cookbook has been updated
+ def updated_cookbook_file(cookbook_name, path)
+ end
+
+ # Called after all cookbooks have been sync'd.
+ def cookbook_sync_complete
+ puts "done."
+ end
+
+ # Called when cookbook loading starts.
+ def library_load_start(file_count)
+ puts "Compiling cookbooks"
+ end
+
+ # Called after a file in a cookbook is loaded.
+ def file_loaded(path)
+ print '.'
+ end
+
+ def file_load_failed(path, exception)
+ super
+ end
+
+ # Called when recipes have been loaded.
+ def recipe_load_complete
+ puts "done."
+ end
+
+ # Called before convergence starts
+ def converge_start(run_context)
+ puts "Converging #{run_context.resource_collection.all_resources.size} resources"
+ end
+
+ # Called when the converge phase is finished.
+ def converge_complete
+ puts "\n"
+ puts "System converged."
+ if updated_resources.empty?
+ puts "no resources updated"
+ else
+ puts "\n"
+ puts "resources updated this run:"
+ updated_resources.each do |resource|
+ puts "* #{resource.to_s}"
+ updates_by_resource[resource.name].flatten.each do |update|
+ puts " - #{update}"
+ end
+ puts "\n"
+ end
+ end
+ end
+
+ # Called before action is executed on a resource.
+ def resource_action_start(resource, action, notification_type=nil, notifier=nil)
+ end
+
+ # Called when a resource fails, but will retry.
+ def resource_failed_retriable(resource, action, retry_count, exception)
+ end
+
+ # Called when a resource fails and will not be retried.
+ def resource_failed(resource, action, exception)
+ end
+
+ # Called when a resource action has been skipped b/c of a conditional
+ def resource_skipped(resource, action, conditional)
+ print "S"
+ end
+
+ # Called after #load_current_resource has run.
+ def resource_current_state_loaded(resource, action, current_resource)
+ end
+
+ # Called when a resource has no converge actions, e.g., it was already correct.
+ def resource_up_to_date(resource, action)
+ print "."
+ end
+
+ ## TODO: callback for assertion failures
+
+ ## TODO: callback for assertion fallback in why run
+
+ # Called when a change has been made to a resource. May be called multiple
+ # times per resource, e.g., a file may have its content updated, and then
+ # its permissions updated.
+ def resource_update_applied(resource, action, update)
+ @updates_by_resource[resource.name] << Array(update)[0]
+ end
+
+ # Called after a resource has been completely converged.
+ def resource_updated(resource, action)
+ updated_resources << resource
+ print "U"
+ end
+
+ # Called before handlers run
+ def handlers_start(handler_count)
+ end
+
+ # Called after an individual handler has run
+ def handler_executed(handler)
+ end
+
+ # Called after all handlers have executed
+ def handlers_completed
+ end
+
+ # An uncategorized message. This supports the case that a user needs to
+ # pass output that doesn't fit into one of the callbacks above. Note that
+ # there's no semantic information about the content or importance of the
+ # message. That means that if you're using this too often, you should add a
+ # callback for it.
+ def msg(message)
+ end
+
+ end
+ end
+end
+