Hi all,

Recently I've hit against this problem which is proving to be a
formidable foe. We have an in-house developed ENC and use
parameterised classes just about everywhere and as a result enjoy a
fairly flexible way of handing out configurations and very well-
defined interfaces between components. We also quite strictly version
our Puppet code but there isn't a fixed versioning between the ENC
YAML and the Puppet code that it drives.

Whenever we want to add additional parameters to certain classes,
unless we update that class and the YAML that drives it atomically
everywhere, we end up in a situation where the YAML does not match the
parameterised class and causes errors. Perhaps it is best shown as
code:

YAML:
classes:
  foo:
    var1: foo
    var2: bar

Puppet:
class foo (
  $var1,
  $var2
) { ... }

Now we want to add a new parameter to this class for a certain subset
of nodes that need new functionality:
class foo (
  $var1,
  $var2,
  $var3 = 'somedefault'
) { ... }

Since we have module versioning, we only need to worry about the new
nodes getting this version of the class. Unfortunately the YAML that
drives them is the same. The problem now is that adding the new
parameter to the YAML will break any machine that uses the old class -
additional parameters that don't exist in the class interface will
cause a failure.

We've thought of a few solutions:
  * pass all the parameters as a hash (breaks the interface
consistency and verification, requires additional hash parameter
handling)
  * hack Puppet to not complain about additional unexpected parameters
(breaks the concept of well-defined interfaces)
  * hack Puppet to take an arg* final parameter (an awful combination
of the above two)
  * version our YAML interfaces in lockstep with Puppet classes
(removes our ability to benefit from inheritance of common class
definitions in the ENC)
  * never add new parameters to anything unless we can atomically
change it everywhere at once
  * using class introspection, generate class interface YAML that is
read and used by our ENC instead of using a separate configuration
specification, store this with the versioned Puppet classes.

I guess this could constitute a fairly solid argument against the
parameterised class interface benefits I've been arguing for and a
theoretical vote for Hiera ;) Anyway any thoughts or abuse are welcome!

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en.

Reply via email to