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