diff options
| -rw-r--r-- | lib/puppet/application/run.rb | 24 | ||||
| -rw-r--r-- | lib/puppet/indirector/run/local.rb | 8 | ||||
| -rw-r--r-- | lib/puppet/run.rb | 23 | ||||
| -rwxr-xr-x | spec/unit/application/puppetrun.rb | 27 | ||||
| -rw-r--r-- | spec/unit/indirector/run/local.rb | 20 | ||||
| -rwxr-xr-x | spec/unit/indirector/run/rest.rb | 2 | ||||
| -rwxr-xr-x | spec/unit/run.rb | 22 |
7 files changed, 95 insertions, 31 deletions
diff --git a/lib/puppet/application/run.rb b/lib/puppet/application/run.rb index f08fade8d..26ca362ff 100644 --- a/lib/puppet/application/run.rb +++ b/lib/puppet/application/run.rb @@ -112,14 +112,22 @@ Puppet::Application.new(:run) do next end end - client = Puppet::Network::Client.runner.new( - :Server => host, - :Port => Puppet[:puppetport] - ) + + require 'puppet/run' + Puppet::Run.indirection.terminus_class = :rest + port = Puppet[:puppetport] + url = ["https://#{host}:#{port}", "production", "run", host].join('/') print "Triggering %s\n" % host begin - result = client.run(@tags, options[:ignoreschedules] || false, options[:foreground] || false) + request = Puppet::Indirector::Request.new(:run, :save, url) # Yuck. + run_options = { + :tags => @tags, + :background => ! options[:foreground], + :ignoreschedules => options[:ignoreschedules] + } + run = Puppet::Run.new( run_options ).save( request ) + result = run.status rescue => detail puts detail.backtrace if Puppet[:trace] $stderr.puts "Host %s failed: %s\n" % [host, detail] @@ -183,12 +191,6 @@ Puppet::Application.new(:run) do exit(24) end - if @tags.empty? - @tags = "" - else - @tags = @tags.join(",") - end - @children = {} # If we get a signal, then kill all of our children and get out. diff --git a/lib/puppet/indirector/run/local.rb b/lib/puppet/indirector/run/local.rb new file mode 100644 index 000000000..5e8f349ee --- /dev/null +++ b/lib/puppet/indirector/run/local.rb @@ -0,0 +1,8 @@ +require 'puppet/run' +require 'puppet/indirector/code' + +class Puppet::Run::Local < Puppet::Indirector::Code + def save( request ) + request.instance.run + end +end diff --git a/lib/puppet/run.rb b/lib/puppet/run.rb index 1503f5d7f..20e21dc57 100644 --- a/lib/puppet/run.rb +++ b/lib/puppet/run.rb @@ -6,7 +6,7 @@ require 'puppet/indirector' # puppetrun to kick off agents remotely. class Puppet::Run extend Puppet::Indirector - indirects :runner, :terminus_class => :rest + indirects :run, :terminus_class => :local attr_reader :status, :background, :options @@ -26,7 +26,7 @@ class Puppet::Run valid_options = [:tags, :ignoreschedules] options.each do |key, value| - raise ArgumentError, "Runner does not accept %s" % key unless valid_options.include?(key) + raise ArgumentError, "Run does not accept %s" % key unless valid_options.include?(key) end @options = options @@ -36,7 +36,7 @@ class Puppet::Run msg = "" msg += "triggered run" % if options[:tags] - msg += " with tags %s" % options[:tags] + msg += " with tags #{options[:tags].inspect}" end if options[:ignoreschedules] @@ -49,7 +49,7 @@ class Puppet::Run def run if agent.running? @status = "running" - return + return self end log_run() @@ -61,5 +61,20 @@ class Puppet::Run end @status = "success" + + self + end + + def self.from_pson( pson ) + options = {} + pson.each do |key, value| + options[key.to_sym] = value + end + + new(options) + end + + def to_pson + @options.merge(:background => @background).to_pson end end diff --git a/spec/unit/application/puppetrun.rb b/spec/unit/application/puppetrun.rb index 271fd6ca4..ce3af5a5b 100755 --- a/spec/unit/application/puppetrun.rb +++ b/spec/unit/application/puppetrun.rb @@ -213,9 +213,6 @@ describe "run" do describe "the main command" do before :each do - @client = stub_everything 'client' - @client.stubs(:run).returns("success") - Puppet::Network::Client.runner.stubs(:new).returns(@client) @run.options.stubs(:[]).with(:parallel).returns(1) @run.options.stubs(:[]).with(:ping).returns(false) @run.options.stubs(:[]).with(:ignoreschedules).returns(false) @@ -248,20 +245,26 @@ describe "run" do end describe "during call of run_for_host" do - it "should create a Runner Client per given host" do - Puppet::Network::Client.runner.expects(:new).returns(@client) - - @run.run_for_host('host') + before do + require 'puppet/run' + options = { + :background => true, :ignoreschedules => false, :tags => [] + } + @run = Puppet::Run.new( options.dup ) + @run.stubs(:status).returns("success") + + Puppet::Run.indirection.expects(:terminus_class=).with( :rest ) + Puppet::Run.expects(:new).with( options ).returns(@run) end - it "should call Client.run for the given host" do - @client.expects(:run) + it "should call run on a Puppet::Run for the given host" do + @run.expects(:save).with{|req| req.uri == 'https://host:8139/production/run/host'}.returns(@run) @run.run_for_host('host') end it "should exit the child with 0 on success" do - @client.stubs(:run).returns("success") + @run.stubs(:status).returns("success") @run.expects(:exit).with(0) @@ -269,7 +272,7 @@ describe "run" do end it "should exit the child with 3 on running" do - @client.stubs(:run).returns("running") + @run.stubs(:status).returns("running") @run.expects(:exit).with(3) @@ -277,7 +280,7 @@ describe "run" do end it "should exit the child with 12 on unknown answer" do - @client.stubs(:run).returns("whatever") + @run.stubs(:status).returns("whatever") @run.expects(:exit).with(12) diff --git a/spec/unit/indirector/run/local.rb b/spec/unit/indirector/run/local.rb new file mode 100644 index 000000000..face61d5c --- /dev/null +++ b/spec/unit/indirector/run/local.rb @@ -0,0 +1,20 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../../spec_helper' + +require 'puppet/indirector/run/local' + +describe Puppet::Run::Local do + it "should be a sublcass of Puppet::Indirector::Code" do + Puppet::Run::Local.superclass.should equal(Puppet::Indirector::Code) + end + + it "should call runner.run on save and return the runner" do + runner = Puppet::Run.new + runner.stubs(:run).returns(runner) + + request = Puppet::Indirector::Request.new(:indirection, :save, "anything") + request.instance = runner = Puppet::Run.new + Puppet::Run::Local.new.save(request).should == runner + end +end diff --git a/spec/unit/indirector/run/rest.rb b/spec/unit/indirector/run/rest.rb index e07fe7fc2..ee976ed9f 100755 --- a/spec/unit/indirector/run/rest.rb +++ b/spec/unit/indirector/run/rest.rb @@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../../../spec_helper' -require 'puppet/indirector/runner/rest' +require 'puppet/indirector/run/rest' describe Puppet::Run::Rest do it "should be a sublcass of Puppet::Indirector::REST" do diff --git a/spec/unit/run.rb b/spec/unit/run.rb index 57eff0f98..4c5f6b1af 100755 --- a/spec/unit/run.rb +++ b/spec/unit/run.rb @@ -1,6 +1,6 @@ #!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../spec_helper' +require File.dirname(__FILE__) + '/../spec_helper' require 'puppet/agent' require 'puppet/run' @@ -9,8 +9,8 @@ describe Puppet::Run do @runner = Puppet::Run.new end - it "should indirect :runner" do - Puppet::Run.indirection.name.should == :runner + it "should indirect :run" do + Puppet::Run.indirection.name.should == :run end it "should use a configurer agent as its agent" do @@ -115,4 +115,20 @@ describe Puppet::Run do @runner.run end end + + describe ".from_pson" do + it "should accept a hash of options, and pass them with symbolified keys to new" do + options = { + "tags" => "whatever", + "background" => true, + } + + Puppet::Run.expects(:new).with({ + :tags => "whatever", + :background => true, + }) + + Puppet::Run.from_pson(options) + end + end end |
