diff options
author | Adam Jacob <adam@opscode.com> | 2015-01-22 22:17:24 -0800 |
---|---|---|
committer | Thom May <thom@chef.io> | 2015-11-09 15:02:39 +0000 |
commit | c03d49c7cc3b5eb351abc9f6537a1a65692e93fc (patch) | |
tree | 83c528f4fb89b1c26a45396bf4f0542c180d24de /lib | |
parent | d70014cbcbb99558437587cf03f7b1ec3939df81 (diff) | |
download | chef-c03d49c7cc3b5eb351abc9f6537a1a65692e93fc.tar.gz |
Implement live streaming for execute resources
This brings live streaming of execute resource output to the
output formatters. It also adds a mechanism for checking to
see if an output formatter is in use through the event dispatch
system.
It adds a new configuration option, "always_stream_execute", which
does what it says on the tin.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/chef/event_dispatch/dispatcher.rb | 10 | ||||
-rw-r--r-- | lib/chef/event_dispatch/events_output_stream.rb | 8 | ||||
-rw-r--r-- | lib/chef/formatters/indentable_output_stream.rb | 5 | ||||
-rw-r--r-- | lib/chef/provider/execute.rb | 4 |
4 files changed, 26 insertions, 1 deletions
diff --git a/lib/chef/event_dispatch/dispatcher.rb b/lib/chef/event_dispatch/dispatcher.rb index f3e55539a9..affac8fb9d 100644 --- a/lib/chef/event_dispatch/dispatcher.rb +++ b/lib/chef/event_dispatch/dispatcher.rb @@ -20,6 +20,16 @@ class Chef @subscribers << subscriber end + # Check to see if we are dispatching to a formatter + def formatter? + @subscribers.each do |s| + if s.class <= Chef::Formatters::Base && s.class != Chef::Formatters::NullFormatter + return true + end + end + false + end + #### # All messages are unconditionally forwarded to all subscribers, so just # define the forwarding in one go: diff --git a/lib/chef/event_dispatch/events_output_stream.rb b/lib/chef/event_dispatch/events_output_stream.rb index 8de9b0fed1..d9c21642b7 100644 --- a/lib/chef/event_dispatch/events_output_stream.rb +++ b/lib/chef/event_dispatch/events_output_stream.rb @@ -21,6 +21,14 @@ class Chef events.stream_output(self, str, options) end + def <<(str) + events.stream_output(self, str, options) + end + + def write(str) + events.stream_output(self, str, options) + end + def close events.stream_closed(self, options) end diff --git a/lib/chef/formatters/indentable_output_stream.rb b/lib/chef/formatters/indentable_output_stream.rb index 1beb286e7f..f7f470b190 100644 --- a/lib/chef/formatters/indentable_output_stream.rb +++ b/lib/chef/formatters/indentable_output_stream.rb @@ -50,6 +50,11 @@ class Chef print(string, from_args(args, :start_line => true, :end_line => true)) end + # Print a raw chunk + def <<(obj) + print(obj) + end + # Print a string. # # == Arguments diff --git a/lib/chef/provider/execute.rb b/lib/chef/provider/execute.rb index 30de0d3b9e..1091b82932 100644 --- a/lib/chef/provider/execute.rb +++ b/lib/chef/provider/execute.rb @@ -89,7 +89,9 @@ class Chef opts[:umask] = umask if umask opts[:log_level] = :info opts[:log_tag] = new_resource.to_s - if STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.info? && !sensitive? + if (Chef::Config[:always_stream_execute] || run_context.events.formatter?) && !sensitive? + opts[:live_stream] = Chef::EventDispatch::EventsOutputStream.new(run_context.events, :name => :execute) + elsif STDOUT.tty? && !Chef::Config[:daemon] && Chef::Log.info? && !sensitive? opts[:live_stream] = STDOUT end opts |