diff options
author | Dan Bode <bodepd@gmail.com> | 2011-02-13 02:55:42 -0600 |
---|---|---|
committer | Luke Kanies <luke@puppetlabs.com> | 2011-02-20 15:17:27 -0800 |
commit | a54ee1e292238145bb0def2af6cf9ac22f2acd68 (patch) | |
tree | a578d867d2d7381bec94ba3fd3a8ea62a6619d1e | |
parent | 7e3a02339a660a76019bf20243a7068325f1af68 (diff) | |
download | puppet-a54ee1e292238145bb0def2af6cf9ac22f2acd68.tar.gz puppet-a54ee1e292238145bb0def2af6cf9ac22f2acd68.tar.xz puppet-a54ee1e292238145bb0def2af6cf9ac22f2acd68.zip |
(#2) Should not assume interfaces have indirectors
The initial work assumed that all interfaces were just
skins on an indirected data type, but some interfaces will
be more abstract than that.
This commit removes that assumption by extracting all of
the indirector work into a new Indirector subclass of
Interface and then makes all of the new interfaces a subclass
of that rather than of Interface itself.
-rw-r--r-- | lib/puppet/interface.rb | 67 | ||||
-rw-r--r-- | lib/puppet/interface/catalog.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/certificate.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/certificate_request.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/certificate_revocation_list.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/facts.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/file.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/indirector.rb | 82 | ||||
-rw-r--r-- | lib/puppet/interface/inventory.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/key.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/node.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/report.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/resource.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/resource_type.rb | 4 | ||||
-rw-r--r-- | lib/puppet/interface/status.rb | 4 |
15 files changed, 109 insertions, 92 deletions
diff --git a/lib/puppet/interface.rb b/lib/puppet/interface.rb index 08a26db90..999c38bad 100644 --- a/lib/puppet/interface.rb +++ b/lib/puppet/interface.rb @@ -38,21 +38,6 @@ class Puppet::Interface end).sort { |a,b| a.to_s <=> b.to_s } end - # Here's your opportunity to override the indirection name. By default - # it will be the same name as the interface. - def self.indirection_name - name.to_sym - end - - # Return an indirection associated with an interface, if one exists - # One usually does. - def self.indirection - unless @indirection - raise "Could not find data type '#{indirection_name}' for interface '#{name}'" unless @indirection = Puppet::Indirector::Indirection.instance(indirection_name) - end - @indirection - end - # Return an interface by name, loading from disk if necessary. def self.interface(name) require "puppet/interface/#{name.to_s.downcase}" @@ -83,7 +68,7 @@ class Puppet::Interface @name || self.to_s.sub(/.+::/, '').downcase end - attr_accessor :from, :type, :verb, :name, :arguments, :indirection + attr_accessor :type, :verb, :name, :arguments def action?(name) self.class.actions.include?(name.to_sym) @@ -98,26 +83,6 @@ class Puppet::Interface end end - action :destroy do |name, *args| - call_indirection_method(:destroy, name, *args) - end - - action :find do |name, *args| - call_indirection_method(:find, name, *args) - end - - action :save do |name, *args| - call_indirection_method(:save, name, *args) - end - - action :search do |name, *args| - call_indirection_method(:search, name, *args) - end - - def indirection - self.class.indirection - end - def initialize(options = {}) options.each { |opt, val| send(opt.to_s + "=", val) } @@ -126,34 +91,4 @@ class Puppet::Interface self.class.load_actions 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 #{terminus_classes(indirection.name).join(", ") }" - end - end - - def call_indirection_method(method, name, *args) - begin - result = indirection.send(method, name, *args) - rescue => detail - puts detail.backtrace if Puppet[:trace] - raise "Could not call #{method} on #{type}: #{detail}" - end - - unless result - raise "Could not #{method} #{indirection.name} for #{name}" - end - - result - end - - def indirections - Puppet::Indirector::Indirection.instances.collect { |t| t.to_s }.sort - end - - def terminus_classes(indirection) - Puppet::Indirector::Terminus.terminus_classes(indirection).collect { |t| t.to_s }.sort - end end diff --git a/lib/puppet/interface/catalog.rb b/lib/puppet/interface/catalog.rb index 23e2b9cf5..85aa2f37a 100644 --- a/lib/puppet/interface/catalog.rb +++ b/lib/puppet/interface/catalog.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Catalog < Puppet::Interface +class Puppet::Interface::Catalog < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/certificate.rb b/lib/puppet/interface/certificate.rb index 51e46c46b..48ca2c20f 100644 --- a/lib/puppet/interface/certificate.rb +++ b/lib/puppet/interface/certificate.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Certificate < Puppet::Interface +class Puppet::Interface::Certificate < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/certificate_request.rb b/lib/puppet/interface/certificate_request.rb index 30ba5583a..29dc73b9a 100644 --- a/lib/puppet/interface/certificate_request.rb +++ b/lib/puppet/interface/certificate_request.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Certificate_request < Puppet::Interface +class Puppet::Interface::Certificate_request < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/certificate_revocation_list.rb b/lib/puppet/interface/certificate_revocation_list.rb index 55a693918..144d5ef61 100644 --- a/lib/puppet/interface/certificate_revocation_list.rb +++ b/lib/puppet/interface/certificate_revocation_list.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Certificate_revocation_list < Puppet::Interface +class Puppet::Interface::Certificate_revocation_list < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/facts.rb b/lib/puppet/interface/facts.rb index e40bb56d0..42ba1fb81 100644 --- a/lib/puppet/interface/facts.rb +++ b/lib/puppet/interface/facts.rb @@ -1,6 +1,6 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Facts < Puppet::Interface +class Puppet::Interface::Facts < Puppet::Interface::Indirector set_default_format :yaml # Upload our facts to the server diff --git a/lib/puppet/interface/file.rb b/lib/puppet/interface/file.rb index 53c476d7c..98a869153 100644 --- a/lib/puppet/interface/file.rb +++ b/lib/puppet/interface/file.rb @@ -1,6 +1,6 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::File < Puppet::Interface +class Puppet::Interface::File < Puppet::Interface::Indirector def self.indirection_name :file_bucket_file end diff --git a/lib/puppet/interface/indirector.rb b/lib/puppet/interface/indirector.rb new file mode 100644 index 000000000..f0beb8a9c --- /dev/null +++ b/lib/puppet/interface/indirector.rb @@ -0,0 +1,82 @@ +require 'puppet' +require 'puppet/interface' + +class Puppet::Interface::Indirector < Puppet::Interface + + + # Here's your opportunity to override the indirection name. By default + # it will be the same name as the interface. + def self.indirection_name + name.to_sym + end + + # Return an indirection associated with an interface, if one exists + # One usually does. + def self.indirection + unless @indirection + Puppet.info("Could not find terminus for #{indirection_name}") unless @indirection = Puppet::Indirector::Indirection.instance(indirection_name) + end + @indirection + end + + attr_accessor :from, :indirection + + action :destroy do |name, *args| + call_indirection_method(:destroy, name, *args) + end + + action :find do |name, *args| + call_indirection_method(:find, name, *args) + end + + action :save do |name, *args| + call_indirection_method(:save, name, *args) + end + + action :search do |name, *args| + call_indirection_method(:search, name, *args) + end + + def indirection + self.class.indirection + end + + def initialize(options = {}) + options.each { |opt, val| send(opt.to_s + "=", val) } + + Puppet::Util::Log.newdestination :console + + self.class.load_actions + 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 #{terminus_classes(indirection.name).join(", ") }" + end + end + + def call_indirection_method(method, name, *args) + begin + result = indirection.send(method, name, *args) + rescue => detail + puts detail.backtrace if Puppet[:trace] + raise "Could not call #{method} on #{type}: #{detail}" + end + + unless result + raise "Could not #{method} #{indirection.name} for #{name}" + end + + result + end + + def indirections + Puppet::Indirector::Indirection.instances.collect { |t| t.to_s }.sort + end + + def terminus_classes(indirection) + Puppet::Indirector::Terminus.terminus_classes(indirection).collect { |t| t.to_s }.sort + end +end diff --git a/lib/puppet/interface/inventory.rb b/lib/puppet/interface/inventory.rb index 7521239d5..16b216b8b 100644 --- a/lib/puppet/interface/inventory.rb +++ b/lib/puppet/interface/inventory.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Inventory < Puppet::Interface +class Puppet::Interface::Inventory < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/key.rb b/lib/puppet/interface/key.rb index 38f92c66b..17b661da1 100644 --- a/lib/puppet/interface/key.rb +++ b/lib/puppet/interface/key.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Key < Puppet::Interface +class Puppet::Interface::Key < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/node.rb b/lib/puppet/interface/node.rb index 68e30698e..5d9efa932 100644 --- a/lib/puppet/interface/node.rb +++ b/lib/puppet/interface/node.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Node < Puppet::Interface +class Puppet::Interface::Node < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/report.rb b/lib/puppet/interface/report.rb index 72f1285ea..fd6f45f16 100644 --- a/lib/puppet/interface/report.rb +++ b/lib/puppet/interface/report.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Report < Puppet::Interface +class Puppet::Interface::Report < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/resource.rb b/lib/puppet/interface/resource.rb index b9b007d00..deed0a533 100644 --- a/lib/puppet/interface/resource.rb +++ b/lib/puppet/interface/resource.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Resource < Puppet::Interface +class Puppet::Interface::Resource < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/resource_type.rb b/lib/puppet/interface/resource_type.rb index 619a4914b..6892926f0 100644 --- a/lib/puppet/interface/resource_type.rb +++ b/lib/puppet/interface/resource_type.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Resource_type < Puppet::Interface +class Puppet::Interface::Resource_type < Puppet::Interface::Indirector end diff --git a/lib/puppet/interface/status.rb b/lib/puppet/interface/status.rb index cdb1623ac..86ccab6e1 100644 --- a/lib/puppet/interface/status.rb +++ b/lib/puppet/interface/status.rb @@ -1,4 +1,4 @@ -require 'puppet/interface' +require 'puppet/interface/indirector' -class Puppet::Interface::Status < Puppet::Interface +class Puppet::Interface::Status < Puppet::Interface::Indirector end |