On Mon, Feb 14, 2011 at 8:56 AM, Dan Bode <d...@puppetlabs.com> wrote:

>
>
> On Mon, Feb 14, 2011 at 6:49 AM, Nigel Kersten <ni...@puppetlabs.com>wrote:
>
>> On Sun, Feb 13, 2011 at 9:59 PM, Dan Bode <d...@puppetlabs.com> wrote:
>>
>>>
>>> We have only been teaching <| |> in the puppetmaster training as a way to
>>> realize virtual resources. We do not teach that it is possible to override
>>> attributes with this syntax as well: <| |> {} (at least in part b/c the
>>> implications/non-determinism terrify me) , and do not teach that it actually
>>> effects all resources.
>>>
>>
>> Why is using collections to override attributes non-deterministic compared
>> to class inheritance doing the same thing?
>>
>
> With the below example, the evaluation order of the overrides determines
> the final value.
>
> notify { 'foo':
>   message => 'bar',
> }
>
> Notify<| |> {
>   message => 'bazz'
> }
> Notify<| |> {
>   message => 'baz'
> }
>
> # try this example and swap the overrides
>
> With class inheritance, any attempt to override the same attribute twice
> fails:
>
> class a {
>   notify { 'foo':
>     message => 'a',
>   }
> }
> class c inherits a {
>   Notify['foo'] {message => 'c'}
> }
> class b inherits a {
>   Notify['foo'] {message => 'b'}
> }
> include a,c,b
>
> :!puppet apply /tmp/foo2.pp
> Parameter 'message' is already set on Notify[foo] by
> #<Puppet::Resource::Type:0xb7a430c8> at /tmp/foo2.pp:9; cannot redefine at
> /tmp/foo2.pp:12 on node mypuppetmaster.localdomain
>

Hmm. So it's order-dependent because you can do it more than once, unlike
class inheritance. Overriding the same attribute more than once via
collection feels like a code smell to me.


The common example from class is something like:
>>>
>>> class db::users {
>>>   user { ['alice', 'bob']:
>>>     ensure => present,
>>>     gid => 'dbadmin',
>>>   }
>>> }
>>>
>>> class app::users {
>>>   user { ['charlie', 'bob']:
>>>     ensure => present,
>>>     gid => 'webadmin',
>>>   }
>>> }
>>>
>>>
>>> class app {
>>>   User<| gid == 'webadmin' |>
>>>   ...
>>> }
>>>
>>> class db {
>>>   User<| gid == 'dbadmin' |>
>>>   ...
>>> }
>>>
>>> so that a machine can safely be a webserver and db server without
>>> conflict.
>>>
>>
>>
>> Why is this preferred over the realize() function? I consider the realize
>> function much simpler to teach and understand for this class of problem.
>>
>
> The realize function requires that we have to know all of the names of the
> resources that we are realizing. Consider the example where each group of
> users has 10 members, the above syntax is way easier to manage than:
>
> realize(User[1], User[2], .... User[10])
>
>
ah, but your collection syntax requires that you have to know the gid of the
resources you are realizing :)

There are certainly cases where the collection syntax is easier, but I feel
that the vast majority of virtual resource realizations I see in the wild
are for one or two resources where the name is known.

-- 
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