diff options
| author | Ethan Rowe <ethan@endpoint.com> | 2009-07-30 01:17:01 -0400 |
|---|---|---|
| committer | test branch <puppet-dev@googlegroups.com> | 2010-02-17 06:50:53 -0800 |
| commit | 2cf647c34f5e71fc30fccb2de0c5acef5799b924 (patch) | |
| tree | 3d0cae1bebdd3f8c129771b8a5e2340620ab9447 | |
| parent | ce944a5d9ae7b18a2557eb282ac20e4ff49ce6f3 (diff) | |
| download | puppet-2cf647c34f5e71fc30fccb2de0c5acef5799b924.tar.gz puppet-2cf647c34f5e71fc30fccb2de0c5acef5799b924.tar.xz puppet-2cf647c34f5e71fc30fccb2de0c5acef5799b924.zip | |
Fix 2239 (step one): introduce global settings represeting application run state with methods for
setting the state and appropriately-named predicates for querying state, all in the Puppet::Application
class itself. To be used by Puppet::Daemon and Puppet::Agent and Puppet::Transaction for better response
to TERM, INT, HUP.
| -rw-r--r-- | lib/puppet/application.rb | 64 | ||||
| -rwxr-xr-x | spec/unit/application.rb | 99 |
2 files changed, 163 insertions, 0 deletions
diff --git a/lib/puppet/application.rb b/lib/puppet/application.rb index 8597bd652..83f90a18d 100644 --- a/lib/puppet/application.rb +++ b/lib/puppet/application.rb @@ -5,6 +5,7 @@ require 'optparse' # * setting up options # * setting up logs # * choosing what to run +# * representing execution status # # === Usage # The application is a Puppet::Application object that register itself in the list @@ -86,6 +87,31 @@ require 'optparse' # to be run. # If it doesn't exist, it defaults to execute the +main+ command if defined. # +# === Execution state +# The class attributes/methods of Puppet::Application serve as a global place to set and query the execution +# status of the application: stopping, restarting, etc. The setting of the application status does not directly +# aftect its running status; it's assumed that the various components within the application will consult these +# settings appropriately and affect their own processing accordingly. Control operations (signal handlers and +# the like) should set the status appropriately to indicate to the overall system that it's the process of +# stopping or restarting (or just running as usual). +# +# So, if something in your application needs to stop the process, for some reason, you might consider: +# +# def stop_me! +# # indicate that we're stopping +# Puppet::Application.stop! +# # ...do stuff... +# end +# +# And, if you have some component that involves a long-running process, you might want to consider: +# +# def my_long_process(giant_list_to_munge) +# giant_list_to_munge.collect do |member| +# # bail if we're stopping +# return if Puppet::Application.stop_requested? +# process_member(member) +# end +# end class Puppet::Application include Puppet::Util @@ -96,6 +122,44 @@ class Puppet::Application class << self include Puppet::Util + + attr_accessor :run_status + + def clear! + self.run_status = nil + end + + def stop! + self.run_status = :stop_requested + end + + def restart! + self.run_status = :restart_requested + end + + # Indicates that Puppet::Application.restart! has been invoked and components should + # do what is necessary to facilitate a restart. + def restart_requested? + :restart_requested == run_status + end + + # Indicates that Puppet::Application.stop! has been invoked and components should do what is necessary + # for a clean stop. + def stop_requested? + :stop_requested == run_status + end + + # Indicates that one of stop! or start! was invoked on Puppet::Application, and some kind of process + # shutdown/short-circuit may be necessary. + def interrupted? + [:restart_requested, :stop_requested].include? run_status + end + + # Indicates that Puppet::Application believes that it's in usual running mode (no stop/restart request + # currently active). + def clear? + run_status.nil? + end end attr_reader :options, :opt_parser diff --git a/spec/unit/application.rb b/spec/unit/application.rb index c087373ac..cc8f79174 100755 --- a/spec/unit/application.rb +++ b/spec/unit/application.rb @@ -36,6 +36,105 @@ describe Puppet::Application do @app.get_command.should == :main end + describe 'when invoking clear!' do + before :each do + Puppet::Application.run_status = :stop_requested + Puppet::Application.clear! + end + + it 'should have nil run_status' do + Puppet::Application.run_status.should be_nil + end + + it 'should return false for restart_requested?' do + Puppet::Application.restart_requested?.should be_false + end + + it 'should return false for stop_requested?' do + Puppet::Application.stop_requested?.should be_false + end + + it 'should return false for interrupted?' do + Puppet::Application.interrupted?.should be_false + end + + it 'should return true for clear?' do + Puppet::Application.clear?.should be_true + end + end + + describe 'after invoking stop!' do + before :each do + Puppet::Application.run_status = nil + Puppet::Application.stop! + end + + after :each do + Puppet::Application.run_status = nil + end + + it 'should have run_status of :stop_requested' do + Puppet::Application.run_status.should == :stop_requested + end + + it 'should return true for stop_requested?' do + Puppet::Application.stop_requested?.should be_true + end + + it 'should return false for restart_requested?' do + Puppet::Application.restart_requested?.should be_false + end + + it 'should return true for interrupted?' do + Puppet::Application.interrupted?.should be_true + end + + it 'should return false for clear?' do + Puppet::Application.clear?.should be_false + end + end + + describe 'when invoking restart!' do + before :each do + Puppet::Application.run_status = nil + Puppet::Application.restart! + end + + after :each do + Puppet::Application.run_status = nil + end + + it 'should have run_status of :restart_requested' do + Puppet::Application.run_status.should == :restart_requested + end + + it 'should return true for restart_requested?' do + Puppet::Application.restart_requested?.should be_true + end + + it 'should return false for stop_requested?' do + Puppet::Application.stop_requested?.should be_false + end + + it 'should return true for interrupted?' do + Puppet::Application.interrupted?.should be_true + end + + it 'should return false for clear?' do + Puppet::Application.clear?.should be_false + end + end + + describe 'when working with class-level run status properties' do + it 'should set run status and predicate appropriately on stop!' do + end + + it 'should set run status and predicate appropriately on restart!' do + end + + + end + describe "when parsing command-line options" do before :each do |
