Sometimes getting 'undef' in template

73 views
Skip to first unread message

Brian Lalor

unread,
Jan 6, 2013, 8:54:23 AM1/6/13
to puppet...@googlegroups.com
Morning, all. I've got a problem with a custom class and template that has me stumped. I've created the following class:

class graphite::carbon(
$cache_port = 2003,
$cache_enable_udp = false,
$cache_udp_port = $cache_port,
) {
package {'carbon': }

file {'/etc/carbon/carbon.conf':
content => template("graphite/carbon.conf.erb"),

require => Package['carbon'],
notify => Service['carbon-cache'],
}

service {'carbon-cache':
enable => true,
ensure => running,

require => Package['carbon'],
}
}

carbon.conf.erb contains this:

UDP_RECEIVER_PORT = <%= cache_udp_port %>

And I use the class like this:

class {'graphite::carbon': }

The problem I'm having is that, without making any changes *AT ALL* UDP_RECEIVER_PORT will sometimes have the default port of "2003" and other times "undef". This is with Puppet 2.7.17 in standalone mode.

Am I doing something wrong with the definition of cache_udp_port? I want it to default to the value provided for cache_port, which defaults to 2003.

Thanks,
Brian

Stefan Schulte

unread,
Jan 6, 2013, 12:32:04 PM1/6/13
to puppet...@googlegroups.com
No you are doing nothing wrong except that variable interpolation is
random so you get random results if the default value of parameterA
depends on the value of parameterB.

This has been accepted as a bug so you may want to watch
http://projects.puppetlabs.com/issues/9848

-Stefan

Brian Lalor

unread,
Jan 6, 2013, 12:32:09 PM1/6/13
to puppet...@googlegroups.com
On Jan 6, 2013, at 12:32 PM, Stefan Schulte <stefan....@taunusstein.net> wrote:

> No you are doing nothing wrong except that variable interpolation is
> random so you get random results if the default value of parameterA
> depends on the value of parameterB.
>
> This has been accepted as a bug so you may want to watch
> http://projects.puppetlabs.com/issues/9848

Damn. Thanks for confirming it's not just me. :-)

jcbollinger

unread,
Jan 7, 2013, 9:38:31 AM1/7/13
to puppet...@googlegroups.com


On Sunday, January 6, 2013 7:54:23 AM UTC-6, blalor wrote:
Morning, all.  I've got a problem with a custom class and template that has me stumped.  I've created the following class:

    class graphite::carbon(
        $cache_port = 2003,
        $cache_enable_udp = false,
        $cache_udp_port = $cache_port,


Class parameter defaults must not be other parameters of the same class because the order of binding values to parameters is not defined and not necessarily consistent.  Instead, assign a dummy default value to $cache_udp_port, and use the $cache_port value instead when you find $cache_udp_port with that dummy value.

For example,

carbon.pp:

    class graphite::carbon(
        $cache_port = 2003,
        $cache_enable_udp = false,
        $cache_udp_port = 'NOTSET',
    ) {
        file {'/etc/carbon/carbon.conf':
            content => template('graphite/carbon.conf.erb'),
        }
    }

carbon.conf.erb:
    UDP_RECEIVER_PORT = <%= ((@cache_udp_port == 'NOTSET') && @cache_port) || @cache_udp_port %>


Naturally, if you need the resolved cache_udp_port in more than one place then do the test once and record the result in a (separate) variable.


John

Reply all
Reply to author
Forward
0 new messages