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