Okay, so if I understand you right, validate gets called twice:  once 
without the self hash initialized and once with it initialized.   Seems 
weird, but I can follow that.    So, I might want to do something like:

if(self[:servers])
   fail("Servers must be an array with at least one member") unless 
self[:servers].is_a?(Array) and self[:servers].size > 0
end

Here's a follow-up then:  how can you tell the difference between self just 
not being initialized and the user failing to specify the value for a 
particular property?  I guess I'm mitigating it somewhat by doing:

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

And properties that aren't required wouldn't need to differentiate between 
not being set and just not initialized yet.

On Tuesday, August 11, 2015 at 2:27:06 PM UTC-4, Hunter Haugen wrote:
>
>
>
> On Fri, Aug 7, 2015 at 1:48 PM <[email protected] <javascript:>> wrote:
>
>> 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
>>
>
> It's kind of awkward, but if your type uses self.instances, then in the 
> validate block is run after self.instances runs and has 
> resource.provider.servers but not self[:servers]. So I usually just do 
> something like `if self[:servers] and self[:servers].size == 0` to avoid 
> validating self.instances stuff.
>
> The validate block is then run again when each resource is evaluated, and 
> that is when self's hash is populated with values from the catalog.
>
>>
>>
>> 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.  
>>
>>
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Puppet Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/puppet-users/5d8ea6d1-1afd-4983-a059-832d238eb6fa%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/puppet-users/5d8ea6d1-1afd-4983-a059-832d238eb6fa%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/97038ee4-bc07-4908-9cad-93fa90adb0b7%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to