[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, experimental, updated. debian/2.6.8-1-844-g7ec39d5
Nick Lewis
nick at puppetlabs.com
Tue May 10 08:06:33 UTC 2011
The following commit has been merged in the experimental branch:
commit 63f33d078429a9f589474f9c0778b21d82f38682
Author: Nick Lewis <nick at puppetlabs.com>
Date: Mon Mar 21 14:21:53 2011 -0700
(#6805) Add a "configurer" application
This application is similar in basic functionality to the "agent" application,
but implemented in terms of interfaces. It currently will retrieve facts,
retrieve a catalog, apply the catalog, and submit a report. Options such
as noop and daemonize are still to come.
Reviewed-By: Pieter van de Bruggen
diff --git a/lib/puppet/application/configurer.rb b/lib/puppet/application/configurer.rb
new file mode 100644
index 0000000..70d2481
--- /dev/null
+++ b/lib/puppet/application/configurer.rb
@@ -0,0 +1,23 @@
+require 'puppet/application'
+require 'puppet/interface'
+
+class Puppet::Application::Configurer < Puppet::Application
+ should_parse_config
+ run_mode :agent
+
+ option("--debug","-d")
+ option("--verbose","-v")
+
+ def setup
+ if options[:debug] or options[:verbose]
+ Puppet::Util::Log.level = options[:debug] ? :debug : :info
+ end
+
+ Puppet::Util::Log.newdestination(:console)
+ end
+
+ def run_command
+ report = Puppet::Interface::Configurer.synchronize(Puppet[:certname])
+ Puppet::Interface::Report.submit(report)
+ end
+end
diff --git a/lib/puppet/interface.rb b/lib/puppet/interface.rb
index d169067..13b1a81 100644
--- a/lib/puppet/interface.rb
+++ b/lib/puppet/interface.rb
@@ -7,6 +7,8 @@ class Puppet::Interface
include Puppet::Interface::ActionManager
extend Puppet::Interface::ActionManager
+ include Puppet::Util
+
# This is just so we can search for actions. We only use its
# list of directories to search.
# Can't we utilize an external autoloader, or simply use the $LOAD_PATH? -pvb
diff --git a/lib/puppet/interface/catalog.rb b/lib/puppet/interface/catalog.rb
index b2ed08f..f99d088 100644
--- a/lib/puppet/interface/catalog.rb
+++ b/lib/puppet/interface/catalog.rb
@@ -1,4 +1,36 @@
require 'puppet/interface/indirector'
Puppet::Interface::Indirector.new(:catalog) do
+ action(:apply) do |catalog|
+ report = Puppet::Transaction::Report.new("apply")
+ report.configuration_version = catalog.version
+
+ Puppet::Util::Log.newdestination(report)
+
+ begin
+ benchmark(:notice, "Finished catalog run") do
+ catalog.apply(:report => report)
+ end
+ rescue => detail
+ puts detail.backtrace if Puppet[:trace]
+ Puppet.err "Failed to apply catalog: #{detail}"
+ end
+
+ report.finalize_report
+ report
+ end
+
+ action(:download) do |certname,facts|
+ Puppet::Resource::Catalog.terminus_class = :rest
+ facts_to_upload = {:facts_format => :b64_zlib_yaml, :facts => CGI.escape(facts.render(:b64_zlib_yaml))}
+ catalog = nil
+ retrieval_duration = thinmark do
+ catalog = Puppet::Interface::Catalog.find(certname, facts_to_upload)
+ end
+ catalog = catalog.to_ral
+ catalog.finalize
+ catalog.retrieval_duration = retrieval_duration
+ catalog.write_class_file
+ catalog
+ end
end
diff --git a/lib/puppet/interface/configurer.rb b/lib/puppet/interface/configurer.rb
new file mode 100644
index 0000000..42e950f
--- /dev/null
+++ b/lib/puppet/interface/configurer.rb
@@ -0,0 +1,13 @@
+require 'puppet/interface'
+
+Puppet::Interface.new(:configurer) do
+ action(:synchronize) do |certname|
+ facts = Puppet::Interface::Facts.find(certname)
+
+ catalog = Puppet::Interface::Catalog.download(certname, facts)
+
+ report = Puppet::Interface::Catalog.apply(catalog)
+
+ report
+ end
+end
diff --git a/lib/puppet/interface/report.rb b/lib/puppet/interface/report.rb
index e7b9165..4923a4b 100644
--- a/lib/puppet/interface/report.rb
+++ b/lib/puppet/interface/report.rb
@@ -1,4 +1,13 @@
require 'puppet/interface/indirector'
Puppet::Interface::Indirector.new(:report) do
+ action(:submit) do |report|
+ begin
+ Puppet::Transaction::Report.terminus_class = :rest
+ report.save
+ rescue => detail
+ puts detail.backtrace if Puppet[:trace]
+ Puppet.err "Could not send report: #{detail}"
+ end
+ end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 242ef0a..db4eeee 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -8,6 +8,26 @@ require 'rspec'
RSpec.configure do |config|
config.mock_with :mocha
+
+ config.before :each do
+ # Set the confdir and vardir to gibberish so that tests
+ # have to be correctly mocked.
+ Puppet[:confdir] = "/dev/null"
+ Puppet[:vardir] = "/dev/null"
+
+ # Avoid opening ports to the outside world
+ Puppet.settings[:bindaddress] = "127.0.0.1"
+
+ @logs = []
+ Puppet::Util::Log.newdestination(@logs)
+ end
+
+ config.after :each do
+ Puppet.settings.clear
+
+ @logs.clear
+ Puppet::Util::Log.close_all
+ end
end
# We need this because the RAL uses 'should' as a method. This
diff --git a/spec/unit/application/configurer_spec.rb b/spec/unit/application/configurer_spec.rb
new file mode 100644
index 0000000..621039b
--- /dev/null
+++ b/spec/unit/application/configurer_spec.rb
@@ -0,0 +1,31 @@
+#!/usr/bin/env ruby
+
+require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
+require 'puppet/application/configurer'
+require 'puppet/indirector/catalog/rest'
+require 'puppet/indirector/report/rest'
+require 'tempfile'
+
+describe "Puppet::Application::Configurer" do
+ it "should retrieve and apply a catalog and submit a report" do
+ dirname = Dir.mktmpdir("puppetdir")
+ Puppet[:vardir] = dirname
+ Puppet[:confdir] = dirname
+ Puppet[:certname] = "foo"
+ @catalog = Puppet::Resource::Catalog.new
+ @file = Puppet::Resource.new(:file, File.join(dirname, "tmp_dir_resource"), :parameters => {:ensure => :present})
+ @catalog.add_resource(@file)
+
+ @report = Puppet::Transaction::Report.new("apply")
+ Puppet::Transaction::Report.stubs(:new).returns(@report)
+
+ Puppet::Resource::Catalog::Rest.any_instance.stubs(:find).returns(@catalog)
+ @report.expects(:save)
+
+ Puppet::Util::Log.stubs(:newdestination)
+
+ Puppet::Application::Configurer.new.run
+
+ @report.status.should == "changed"
+ end
+end
diff --git a/spec/unit/interface/configurer_spec.rb b/spec/unit/interface/configurer_spec.rb
new file mode 100644
index 0000000..99f5f7a
--- /dev/null
+++ b/spec/unit/interface/configurer_spec.rb
@@ -0,0 +1,25 @@
+#!/usr/bin/env ruby
+
+require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb')
+require 'puppet/interface/configurer'
+require 'puppet/indirector/catalog/rest'
+require 'tempfile'
+
+describe Puppet::Interface::Configurer do
+ describe "#synchronize" do
+ it "should retrieve and apply a catalog and return a report" do
+ dirname = Dir.mktmpdir("puppetdir")
+ Puppet[:vardir] = dirname
+ Puppet[:confdir] = dirname
+ @catalog = Puppet::Resource::Catalog.new
+ @file = Puppet::Resource.new(:file, File.join(dirname, "tmp_dir_resource"), :parameters => {:ensure => :present})
+ @catalog.add_resource(@file)
+ Puppet::Resource::Catalog::Rest.any_instance.stubs(:find).returns(@catalog)
+
+ report = Puppet::Interface::Configurer.synchronize("foo")
+
+ report.kind.should == "apply"
+ report.status.should == "changed"
+ end
+ end
+end
--
Puppet packaging for Debian
More information about the Pkg-puppet-devel
mailing list