summaryrefslogtreecommitdiffstats
path: root/lib/puppet/face/indirector.rb
diff options
context:
space:
mode:
authorDaniel Pittman <daniel@puppetlabs.com>2011-04-13 00:38:53 -0700
committerDaniel Pittman <daniel@puppetlabs.com>2011-04-13 00:38:53 -0700
commitb060ca7e1594a6ecfd6b1e32933e6a531b08bcf4 (patch)
tree95c35f65addba0d408cb7f5c9e2c5de53724a737 /lib/puppet/face/indirector.rb
parent941c56a283265cdf5a951ecaae63580b60486c52 (diff)
parentdb11770718c61f9ee3d5fcd703c5c0c7c05227ca (diff)
downloadpuppet-b060ca7e1594a6ecfd6b1e32933e6a531b08bcf4.tar.gz
puppet-b060ca7e1594a6ecfd6b1e32933e6a531b08bcf4.tar.xz
puppet-b060ca7e1594a6ecfd6b1e32933e6a531b08bcf4.zip
Merge branch 'bug/next/7056-use-face-rather-than-faces' into next
Diffstat (limited to 'lib/puppet/face/indirector.rb')
-rw-r--r--lib/puppet/face/indirector.rb94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/puppet/face/indirector.rb b/lib/puppet/face/indirector.rb
new file mode 100644
index 000000000..f48611e4b
--- /dev/null
+++ b/lib/puppet/face/indirector.rb
@@ -0,0 +1,94 @@
+require 'puppet'
+require 'puppet/face'
+
+class Puppet::Face::Indirector < Puppet::Face
+ option "--terminus TERMINUS" do
+ desc "REVISIT: You can select a terminus, which has some bigger effect
+that we should describe in this file somehow."
+ end
+
+ def self.indirections
+ Puppet::Indirector::Indirection.instances.collect { |t| t.to_s }.sort
+ end
+
+ def self.terminus_classes(indirection)
+ Puppet::Indirector::Terminus.terminus_classes(indirection.to_sym).collect { |t| t.to_s }.sort
+ end
+
+ def call_indirection_method(method, *args)
+ options = args.last
+ options.has_key?(:terminus) and set_terminus(options[:terminus])
+
+ begin
+ result = indirection.__send__(method, *args)
+ rescue => detail
+ puts detail.backtrace if Puppet[:trace]
+ raise "Could not call '#{method}' on '#{indirection_name}': #{detail}"
+ end
+
+ indirection.reset_terminus_class
+ return result
+ end
+
+ action :destroy do
+ when_invoked { |*args| call_indirection_method(:destroy, *args) }
+ end
+
+ action :find do
+ when_invoked { |*args| call_indirection_method(:find, *args) }
+ end
+
+ action :save do
+ when_invoked { |*args| call_indirection_method(:save, *args) }
+ end
+
+ action :search do
+ when_invoked { |*args| call_indirection_method(:search, *args) }
+ end
+
+ # Print the configuration for the current terminus class
+ action :info do
+ when_invoked do |*args|
+ options = args.pop
+ options.has_key?(:terminus) and set_terminus(options[:terminus])
+
+ if t = indirection.terminus_class
+ puts "Run mode '#{Puppet.run_mode.name}': #{t}"
+ else
+ $stderr.puts "No default terminus class for run mode '#{Puppet.run_mode.name}'"
+ end
+
+ indirection.reset_terminus_class
+ end
+ end
+
+ attr_accessor :from
+
+ def indirection_name
+ @indirection_name || name.to_sym
+ end
+
+ # Here's your opportunity to override the indirection name. By default it
+ # will be the same name as the face.
+ def set_indirection_name(name)
+ @indirection_name = name
+ end
+
+ # Return an indirection associated with a face, if one exists;
+ # One usually does.
+ def indirection
+ unless @indirection
+ @indirection = Puppet::Indirector::Indirection.instance(indirection_name)
+ @indirection or raise "Could not find terminus for #{indirection_name}"
+ end
+ @indirection
+ end
+
+ def set_terminus(from)
+ begin
+ indirection.terminus_class = from
+ rescue => detail
+ raise "Could not set '#{indirection.name}' terminus to '#{from}' (#{detail}); valid terminus types are #{self.class.terminus_classes(indirection.name).join(", ") }"
+ end
+ end
+end