| Class | Puppet::Parameter |
| In: |
lib/puppet/parameter.rb
|
| Parent: | Object |
| 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] |
# 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.
# 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.
# 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.
# 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.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
# File lib/puppet/parameter.rb, line 90
90: def initvars
91: @parametervalues = []
92: @aliasvalues = {}
93: @parameterregexes = []
94: end
Mark whether we‘re the namevar.
# 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.
# 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.
# File lib/puppet/parameter.rb, line 139
139: def isrequired
140: @required = true
141: end
Does the value match any of our regexes?
# 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.
# 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.
# 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.
# 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
# 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
# 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
# File lib/puppet/parameter.rb, line 218
218: def regexes
219: return @parameterregexes.dup
220: end
# 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
# 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.
# 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
# File lib/puppet/parameter.rb, line 257
257: def devfail(msg)
258: self.fail(Puppet::DevError, msg)
259: end
# 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
# 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.
# 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?
# File lib/puppet/parameter.rb, line 314
314: def metaparam?
315: self.class.metaparam
316: end
for testing whether we should actually do anything
# 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
# 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
# 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.
# File lib/puppet/parameter.rb, line 451
451: def setup_shadow(klass)
452: @shadow = klass.new(:resource => self.resource)
453: end
# 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.
# 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).
# 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