class Puppet::Indirector::Terminus

A simple class that can function as the base class for indirected types.

Attributes

abstract_terminus[R]
indirection[R]
name[RW]
terminus_type[RW]

Public Class Methods

abstract_terminus?() click to toggle source

Are we an abstract terminus type, rather than an instance with an associated indirection?

   # File lib/puppet/indirector/terminus.rb
19 def abstract_terminus?
20   abstract_terminus
21 end
const2name(const) click to toggle source

Convert a constant to a short name.

   # File lib/puppet/indirector/terminus.rb
24 def const2name(const)
25   const.sub(/^[A-Z]/) { |i| i.downcase }.gsub(/[A-Z]/) { |i| "_#{i.downcase}" }.intern
26 end
indirection=(name) click to toggle source

Look up the indirection if we were only provided a name.

   # File lib/puppet/indirector/terminus.rb
29 def indirection=(name)
30   if name.is_a?(Puppet::Indirector::Indirection)
31     @indirection = name
32   else
33     ind = Puppet::Indirector::Indirection.instance(name)
34     if ind
35       @indirection = ind
36     else
37       raise ArgumentError, _("Could not find indirection instance %{name} for %{terminus}") % { name: name, terminus: self.name }
38     end
39   end
40 end
indirection_name() click to toggle source
   # File lib/puppet/indirector/terminus.rb
42 def indirection_name
43   @indirection.name
44 end
inherited(subclass) click to toggle source

Register our subclass with the appropriate indirection. This follows the convention that our terminus is named after the indirection.

   # File lib/puppet/indirector/terminus.rb
49 def inherited(subclass)
50   longname = subclass.to_s
51   if longname =~ /#<Class/
52     raise Puppet::DevError, _("Terminus subclasses must have associated constants")
53   end
54   names = longname.split("::")
55 
56   # Convert everything to a lower-case symbol, converting camelcase to underscore word separation.
57   name = names.pop.sub(/^[A-Z]/) { |i| i.downcase }.gsub(/[A-Z]/) { |i| "_#{i.downcase}" }.intern
58 
59   subclass.name = name
60 
61   # Short-circuit the abstract types, which are those that directly subclass
62   # the Terminus class.
63   if self == Puppet::Indirector::Terminus
64     subclass.mark_as_abstract_terminus
65     return
66   end
67 
68   # Set the terminus type to be the name of the abstract terminus type.
69   # Yay, class/instance confusion.
70   subclass.terminus_type = self.name
71 
72   # This subclass is specifically associated with an indirection.
73   raise("Invalid name #{longname}") unless names.length > 0
74   processed_name = names.pop.sub(/^[A-Z]/) { |i| i.downcase }.gsub(/[A-Z]/) { |i| "_#{i.downcase}" }
75 
76   if processed_name.empty?
77     raise Puppet::DevError, _("Could not discern indirection model from class constant")
78   end
79 
80   # This will throw an exception if the indirection instance cannot be found.
81   # Do this last, because it also registers the terminus type with the indirection,
82   # which needs the above information.
83   subclass.indirection = processed_name.intern
84 
85   # And add this instance to the instance hash.
86   Puppet::Indirector::Terminus.register_terminus_class(subclass)
87 end
mark_as_abstract_terminus() click to toggle source

Mark that this instance is abstract.

   # File lib/puppet/indirector/terminus.rb
90 def mark_as_abstract_terminus
91   @abstract_terminus = true
92 end
model() click to toggle source
   # File lib/puppet/indirector/terminus.rb
94 def model
95   indirection.model
96 end
name2const(name) click to toggle source

Convert a short name to a constant.

    # File lib/puppet/indirector/terminus.rb
 99 def name2const(name)
100   name.to_s.capitalize.sub(/_(.)/) { |i| $1.upcase }
101 end
new() click to toggle source
    # File lib/puppet/indirector/terminus.rb
134 def initialize
135   raise Puppet::DevError, _("Cannot create instances of abstract terminus types") if self.class.abstract_terminus?
136 end
register_terminus_class(klass) click to toggle source

Register a class, probably autoloaded.

    # File lib/puppet/indirector/terminus.rb
104 def register_terminus_class(klass)
105   setup_instance_loading klass.indirection_name
106   instance_hash(klass.indirection_name)[klass.name] = klass
107 end
terminus_class(indirection_name, terminus_type) click to toggle source

Return a terminus by name, using the autoloader.

    # File lib/puppet/indirector/terminus.rb
110 def terminus_class(indirection_name, terminus_type)
111   setup_instance_loading indirection_name
112   loaded_instance(indirection_name, terminus_type)
113 end
terminus_classes(indirection_name) click to toggle source

Return all terminus classes for a given indirection.

    # File lib/puppet/indirector/terminus.rb
116 def terminus_classes(indirection_name)
117   setup_instance_loading indirection_name
118   instance_loader(indirection_name).files_to_load(Puppet.lookup(:current_environment)).map do |file|
119     File.basename(file).chomp(".rb").intern
120   end
121 end

Private Class Methods

setup_instance_loading(type) click to toggle source
    # File lib/puppet/indirector/terminus.rb
125 def setup_instance_loading(type)
126   instance_load type, "puppet/indirector/#{type}" unless instance_loading?(type)
127 end

Public Instance Methods

allow_remote_requests?() click to toggle source
    # File lib/puppet/indirector/terminus.rb
150 def allow_remote_requests?
151   true
152 end
indirection() click to toggle source
    # File lib/puppet/indirector/terminus.rb
130 def indirection
131   self.class.indirection
132 end
model() click to toggle source
    # File lib/puppet/indirector/terminus.rb
138 def model
139   self.class.model
140 end
name() click to toggle source
    # File lib/puppet/indirector/terminus.rb
142 def name
143   self.class.name
144 end
require_environment?() click to toggle source
    # File lib/puppet/indirector/terminus.rb
146 def require_environment?
147   true
148 end
terminus_type() click to toggle source
    # File lib/puppet/indirector/terminus.rb
154 def terminus_type
155   self.class.terminus_type
156 end
validate(request) click to toggle source
    # File lib/puppet/indirector/terminus.rb
158 def validate(request)
159   if request.instance
160     validate_model(request)
161     validate_key(request)
162   end
163 end
validate_key(request) click to toggle source
    # File lib/puppet/indirector/terminus.rb
165 def validate_key(request)
166   unless request.key == request.instance.name
167     raise Puppet::Indirector::ValidationError, _("Instance name %{name} does not match requested key %{key}") % { name: request.instance.name.inspect, key: request.key.inspect }
168   end
169 end
validate_model(request) click to toggle source
    # File lib/puppet/indirector/terminus.rb
171 def validate_model(request)
172   unless model === request.instance
173     raise Puppet::Indirector::ValidationError, _("Invalid instance type %{klass}, expected %{model_type}") % { klass: request.instance.class.inspect, model_type: model.inspect }
174   end
175 end