diff options
author | Daniel Pittman <daniel@puppetlabs.com> | 2011-04-13 00:38:53 -0700 |
---|---|---|
committer | Daniel Pittman <daniel@puppetlabs.com> | 2011-04-13 00:38:53 -0700 |
commit | b060ca7e1594a6ecfd6b1e32933e6a531b08bcf4 (patch) | |
tree | 95c35f65addba0d408cb7f5c9e2c5de53724a737 /lib/puppet/face/indirector.rb | |
parent | 941c56a283265cdf5a951ecaae63580b60486c52 (diff) | |
parent | db11770718c61f9ee3d5fcd703c5c0c7c05227ca (diff) | |
download | puppet-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.rb | 94 |
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 |