Class Puppet::Parameter
In: lib/puppet/parameter.rb
Parent: Object

Methods

Included Modules

Puppet::Util Puppet::Util::Errors Puppet::Util::LogPaths Puppet::Util::Logging Puppet::Util::MethodHelper Puppet::Util Puppet::Util::Docs

Attributes

default  [R] 
metaparam  [RW] 
munger  [R] 
name  [R] 
parent  [RW]  LAK 2007-05-09: Keep the @parent around for backward compatibility.
required_features  [R] 
resource  [RW] 
shadow  [R] 
validater  [R] 
value  [R] 

Public Class methods

[Source]

     # File lib/puppet/parameter.rb, line 214
214:         def alias(name)
215:             @aliasvalues[name]
216:         end

[Source]

     # File lib/puppet/parameter.rb, line 204
204:         def aliasvalue(name, other)
205:             other = symbolize(other)
206:             unless @parametervalues.include?(other)
207:                 raise Puppet::DevError,
208:                     "Cannot alias nonexistent value %s" % other
209:             end
210: 
211:             @aliasvalues[name] = other
212:         end

Define the default value for a given parameter or parameter. This means that ‘nil’ is an invalid default value. This defines the ‘default’ instance method.

[Source]

    # File lib/puppet/parameter.rb, line 21
21:         def defaultto(value = nil, &block)
22:             if block
23:                 define_method(:default, &block)
24:             else
25:                 if value.nil?
26:                     raise Puppet::DevError,
27:                         "Either a default value or block must be provided"
28:                 end
29:                 define_method(:default) do value end
30:             end
31:         end

Store documentation for this parameter.

[Source]

    # File lib/puppet/parameter.rb, line 86
86:         def desc(str)
87:             @doc = str
88:         end

Return a documentation string. If there are valid values, then tack them onto the string.

[Source]

    # File lib/puppet/parameter.rb, line 35
35:         def doc
36:             @doc ||= ""
37: 
38:             unless defined? @addeddocvals
39:                 unless values.empty?
40:                     if @aliasvalues.empty?
41:                         @doc += "  Valid values are ``" +
42:                             values.join("``, ``") + "``."
43:                     else
44:                         @doc += "  Valid values are "
45: 
46:                         @doc += values.collect do |value|
47:                             ary = @aliasvalues.find do |name, val|
48:                                 val == value
49:                             end
50:                             if ary
51:                                 "``%s`` (also called ``%s``)" % [value, ary[0]]
52:                             else
53:                                 "``#{value}``"
54:                             end
55:                         end.join(", ") + "."
56:                     end
57:                 end
58: 
59:                 if defined? @parameterregexes and ! @parameterregexes.empty?
60:                     regs = @parameterregexes
61:                     if @parameterregexes.is_a? Hash
62:                         regs = @parameterregexes.keys
63:                     end
64:                     unless regs.empty?
65:                         @doc += "  Values can also match ``" +
66:                             regs.collect { |r| r.inspect }.join("``, ``") + "``."
67:                     end
68:                 end
69: 
70:                 if f = self.required_features
71:                     @doc += "  Requires features %s." % f.flatten.collect { |f| f.to_s }.join(" ")
72:                 end
73:                 @addeddocvals = true
74:             end
75: 
76:             @doc
77:         end

[Source]

    # File lib/puppet/parameter.rb, line 90
90:         def initvars
91:             @parametervalues = []
92:             @aliasvalues = {}
93:             @parameterregexes = []
94:         end

Mark whether we‘re the namevar.

[Source]

     # File lib/puppet/parameter.rb, line 124
124:         def isnamevar
125:             @isnamevar = true
126:             @required = true
127:         end

Is this parameter the namevar? Defaults to false.

[Source]

     # File lib/puppet/parameter.rb, line 130
130:         def isnamevar?
131:             if defined? @isnamevar
132:                 return @isnamevar
133:             else
134:                 return false
135:             end
136:         end

This parameter is required.

[Source]

     # File lib/puppet/parameter.rb, line 139
139:         def isrequired
140:             @required = true
141:         end

Does the value match any of our regexes?

[Source]

     # File lib/puppet/parameter.rb, line 171
171:         def match?(value)
172:             value = value.to_s unless value.is_a? String
173:             @parameterregexes.find { |r|
174:                 r = r[0] if r.is_a? Array # Properties use a hash here
175:                 r =~ value
176:             }
177:         end

This is how we munge the value. Basically, this is our opportunity to convert the value from one form into another.

[Source]

     # File lib/puppet/parameter.rb, line 98
 98:         def munge(&block)
 99:             # I need to wrap the unsafe version in begin/rescue parameterments,
100:             # but if I directly call the block then it gets bound to the
101:             # class's context, not the instance's, thus the two methods,
102:             # instead of just one.
103:             define_method(:unsafe_munge, &block)
104: 
105:             define_method(:munge) do |*args|
106:                 begin
107:                     ret = unsafe_munge(*args)
108:                 rescue Puppet::Error => detail
109:                     Puppet.debug "Reraising %s" % detail
110:                     raise
111:                 rescue => detail
112:                     raise Puppet::DevError, "Munging failed for value %s in class %s: %s" %
113:                         [args.inspect, self.name, detail], detail.backtrace
114:                 end
115: 
116:                 if self.shadow
117:                     self.shadow.munge(*args)
118:                 end
119:                 ret
120:             end
121:         end

Basic parameter initialization.

[Source]

     # File lib/puppet/parameter.rb, line 283
283:     def initialize(options = {})
284:         options = symbolize_options(options)
285:         if resource = options[:resource]
286:             self.resource = resource
287:             options.delete(:resource)
288:         else
289:             raise Puppet::DevError, "No resource set for %s" % self.class.name
290:         end
291: 
292:         if ! self.metaparam? and klass = Puppet::Type.metaparamclass(self.class.name)
293:             setup_shadow(klass)
294:         end
295: 
296:         set_options(options)
297:     end

Define a new value for our parameter.

[Source]

     # File lib/puppet/parameter.rb, line 180
180:         def newvalues(*names)
181:             names.each { |name|
182:                 name = name.intern if name.is_a? String
183: 
184:                 case name
185:                 when Symbol
186:                     if @parametervalues.include?(name)
187:                         Puppet.warning "%s already has a value for %s" %
188:                             [name, name]
189:                     end
190:                     @parametervalues << name
191:                 when Regexp
192:                     if @parameterregexes.include?(name)
193:                         Puppet.warning "%s already has a value for %s" %
194:                             [name, name]
195:                     end
196:                     @parameterregexes << name
197:                 else
198:                     raise ArgumentError, "Invalid value %s of type %s" %
199:                         [name, name.class]
200:                 end
201:             }
202:         end

[Source]

    # File lib/puppet/parameter.rb, line 79
79:         def nodefault
80:             if public_method_defined? :default
81:                 undef_method :default
82:             end
83:         end

Just a simple method to proxy instance methods to class methods

[Source]

     # File lib/puppet/parameter.rb, line 240
240:     def self.proxymethods(*values)
241:         values.each { |val|
242:             define_method(val) do
243:                 self.class.send(val)
244:             end
245:         }
246:     end

[Source]

     # File lib/puppet/parameter.rb, line 218
218:         def regexes
219:             return @parameterregexes.dup
220:         end

Is this parameter required? Defaults to false.

[Source]

     # File lib/puppet/parameter.rb, line 144
144:         def required?
145:             if defined? @required
146:                 return @required
147:             else
148:                 return false
149:             end
150:         end

[Source]

     # File lib/puppet/parameter.rb, line 222
222:         def required_features=(*args)
223:             @required_features = args.flatten.collect { |a| a.to_s.downcase.intern }
224:         end

Verify that we got a good value

[Source]

     # File lib/puppet/parameter.rb, line 153
153:         def validate(&block)
154:             #@validater = block
155:             define_method(:unsafe_validate, &block)
156: 
157:             define_method(:validate) do |*args|
158:                 begin
159:                     unsafe_validate(*args)
160:                 rescue ArgumentError, Puppet::Error, TypeError
161:                     raise
162:                 rescue => detail
163:                     raise Puppet::DevError,
164:                         "Validate method failed for class %s: %s" %
165:                         [self.name, detail], detail.backtrace
166:                 end
167:             end
168:         end

Return the list of valid values.

[Source]

     # File lib/puppet/parameter.rb, line 227
227:         def values
228:             #[@aliasvalues.keys, @parametervalues.keys].flatten
229:             if @parametervalues.is_a? Array
230:                 return @parametervalues.dup
231:             elsif @parametervalues.is_a? Hash
232:                 return @parametervalues.keys
233:             else
234:                 return []
235:             end
236:         end

Public Instance methods

[Source]

     # File lib/puppet/parameter.rb, line 257
257:     def devfail(msg)
258:         self.fail(Puppet::DevError, msg)
259:     end

[Source]

     # File lib/puppet/parameter.rb, line 261
261:     def fail(*args)
262:         type = nil
263:         if args[0].is_a?(Class)
264:             type = args.shift
265:         else
266:             type = Puppet::Error
267:         end
268: 
269:         error = type.new(args.join(" "))
270: 
271:         if defined? @resource and @resource and @resource.line
272:             error.line = @resource.line
273:         end
274: 
275:         if defined? @resource and @resource and @resource.file
276:             error.file = @resource.file
277:         end
278: 
279:         raise error
280:     end

[Source]

     # File lib/puppet/parameter.rb, line 432
432:     def inspect
433:         s = "Parameter(%s = %s" % [self.name, self.value || "nil"]
434:         if defined? @resource
435:             s += ", @resource = %s)" % @resource
436:         else
437:             s += ")"
438:         end
439:     end

Log a message using the resource‘s log level.

[Source]

     # File lib/puppet/parameter.rb, line 300
300:     def log(msg)
301:         unless @resource[:loglevel]
302:             p @resource
303:             self.devfail "Parent %s has no loglevel" %
304:                 @resource.name
305:         end
306:         Puppet::Util::Log.create(
307:             :level => @resource[:loglevel],
308:             :message => msg,
309:             :source => self
310:         )
311:     end

Is this parameter a metaparam?

[Source]

     # File lib/puppet/parameter.rb, line 314
314:     def metaparam?
315:         self.class.metaparam
316:     end

each parameter class must define the name() method, and parameter instances do not change that name this implicitly means that a given object can only have one parameter instance of a given parameter class

[Source]

     # File lib/puppet/parameter.rb, line 322
322:     def name
323:         return self.class.name
324:     end

for testing whether we should actually do anything

[Source]

     # File lib/puppet/parameter.rb, line 327
327:     def noop
328:         unless defined? @noop
329:             @noop = false
330:         end
331:         tmp = @noop || self.resource.noop || Puppet[:noop] || false
332:         #debug "noop is %s" % tmp
333:         return tmp
334:     end

return the full path to us, for logging and rollback; not currently used

[Source]

     # File lib/puppet/parameter.rb, line 338
338:     def pathbuilder
339:         if defined? @resource and @resource
340:             return [@resource.pathbuilder, self.name]
341:         else
342:             return [self.name]
343:         end
344:     end

Retrieve the resource‘s provider. Some types don‘t have providers, in which case we return the resource object itself.

[Source]

     # File lib/puppet/parameter.rb, line 443
443:     def provider
444:         @resource.provider || @resource
445:     end

[Source]

     # File lib/puppet/parameter.rb, line 411
411:     def remove
412:         @resource = nil
413:         @shadow = nil
414:     end

If there‘s a shadowing metaparam, instantiate it now. This allows us to create a property or parameter with the same name as a metaparameter, and the metaparam will only be stored as a shadow.

[Source]

     # File lib/puppet/parameter.rb, line 451
451:     def setup_shadow(klass)
452:         @shadow = klass.new(:resource => self.resource)
453:     end

[Source]

     # File lib/puppet/parameter.rb, line 455
455:     def to_s
456:         s = "Parameter(%s)" % self.name
457:     end

Make sure that we‘ve got all of the required features for a given value.

[Source]

     # File lib/puppet/parameter.rb, line 460
460:     def validate_features_per_value(value)
461:         if features = self.class.value_option(value, :required_features)
462:             raise ArgumentError, "Provider must have features '%s' to set '%s' to '%s'" % [features, self.class.name, value] unless provider.satisfies?(features)
463:         end
464:     end

Store the value provided. All of the checking should possibly be late-binding (e.g., users might not exist when the value is assigned but might when it is asked for).

[Source]

     # File lib/puppet/parameter.rb, line 421
421:     def value=(value)
422:         if respond_to?(:validate)
423:             validate(value)
424:         end
425: 
426:         if respond_to?(:munge)
427:             value = munge(value)
428:         end
429:         @value = value
430:     end

[Validate]