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
20 def abstract_terminus?
21   abstract_terminus
22 end
const2name(const) click to toggle source

Convert a constant to a short name.

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

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

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

Mark that this instance is abstract.

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

Convert a short name to a constant.

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

Register a class, probably autoloaded.

    # File lib/puppet/indirector/terminus.rb
105 def register_terminus_class(klass)
106   setup_instance_loading klass.indirection_name
107   instance_hash(klass.indirection_name)[klass.name] = klass
108 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
111 def terminus_class(indirection_name, terminus_type)
112   setup_instance_loading indirection_name
113   loaded_instance(indirection_name, terminus_type)
114 end
terminus_classes(indirection_name) click to toggle source

Return all terminus classes for a given indirection.

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

Private Class Methods

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

Public Instance Methods

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