Hi all!
I'm having trouble with a custom type's type-wide validate call. I've done a lot of digging into the Puppet documentation and a lot of Googling and haven't found a lot of guidance. My Puppet version is 3.7.5.
Basically, I have a property defined like this in my type:
newproperty(:servers,:array_matching=>:all) do
desc "List of database servers; first server in the list will be considered the primary server"
isrequired
def insync?(is)
return false unless is == should
true
end
end
I want to check that the array is non-empty. I figured out if I specify a validate block inside of the newproperty block then I'll just get each individual array member, one at a time, which isn't what I want. So, instead, I implemented a type-wide validate call like this:
Puppet::Type.newtype(:my_type) do
validate do
fail("servers should have at least one member") if self[:servers].size == 0
done
When I try to run puppet resource my_type, I get:
Error: Could not run: undefined method `size' for nil:NilClass
When I do a pp on self, I get something that looks like (in part):
#<Puppet::Type::My_type:0x000000035f7528
@managed=false,
@name_var_cache=:name,
@original_parameters=
{:provider=>
#<Puppet::Type::My_type::ProviderMy_type:0x000000035d1350
@property_flush={},
@property_hash=
{
:servers=>["db1"],
},
@resource=#<Puppet::Type::My_type:0x000000035f7528 ...>>},
@parameters=
{
*snip*
},
@provider=
#<Puppet::Type::My_type::ProviderMy_type:0x000000035d1350
@property_flush={},
@property_hash=
{
:servers=>["db1"],
},
@resource=#<Puppet::Type::My_type:0x000000035f7528 ...>>,
@tags=
#<Puppet::Util::TagSet: {"my_type",
"mytitle"}>,
@title="mytitle">
I poked around the types provided by Puppet and it looks like I should be able to do
self[:servers]
to access the property, but in practice that doesn't seem to work. It looks like the data I want is buried in the object, but I'm not sure of the correct means to get at it.