Reid,

Thanks for this direction. I will try and see if I can come up with a good 
PR to solve this. 



On Monday, 17 July 2017 23:03:54 UTC+2, Reid Vandewiele wrote:
>
>
>
> On Sunday, July 16, 2017 at 6:04:04 AM UTC-7, bert hajee wrote:
>>
>> Trevor, Reid,
>>
>> Thanks for taking the time to look at this. 
>>
>> Exists should be checking the @property_hash object which is populated by 
>>> the instances method.
>>> Something like:
>>> def exists?
>>>   @property_hash[:ensure] == :present
>>> end
>>
>>
>>
>> The real type does implement the exists? method by looking at the 
>> property hash. But when using the transition type, the property hash is not 
>> yet filled correctly, because the instances and prefetched methods are not 
>> (yet) called.
>>
>>
>> On Friday, 14 July 2017 22:57:54 UTC+2, Reid Vandewiele wrote:
>>>
>>> I haven't dived into the code recently but depending on when prefetching 
>>> happens, it might be possible the Transition type is causing an "early" 
>>> invocation of #exists?. This is because Transition invokes a check of the 
>>> resource it is "prior to", thusly: 
>>> https://github.com/puppetlabs/puppetlabs-transition/blob/0.1.1/lib/puppet/provider/transition/ruby.rb#L68
>>>
>>> If it's the case that prefetch isn't called until the first instance of 
>>> a given type is evaluated, that might be something that's happening *after* 
>>> the Transition resource does its thing. Which could help explain why your 
>>> exists?() method, which uses prefetched data, isn't working.
>>>
>>>  
>>  This seems to b what is happening.
>>  
>> But what is the best way forward to solve this?
>>
>
> This could be seen as a problem with Transition, which would be best to 
> see fixed in the Transition module. The basic idea would be to make sure a 
> provider has done any prefetching it needs to before calling safe_insync?() 
> on a resource. That module is effectively opensource though so it depends 
> on someone being aware of the problem and having spare time to fix it.
>
> Since that may not happen quickly, a workaround might be to ensure that at 
> least one instance of the type in question is evaluated prior to the 
> transition resource being evaluated. E.g.
>
> file { 'prefetch':
>   path   => '/dev/null',
>   ensure => present,
> }
>
> transition { 'transition a file resource':
>   require    => File['prefetch'],
>   resource   => File['/path/to/real/file'],
>   attributes => { ensure => absent },
>   prior_to   => Service['example'],
> }
>
>
> This is just a mock example. The only thing it's really showing is that a 
> file "resource" called prefetch exists, doesn't really do anything, but is 
> guaranteed to be evaluated before a transition involving a different, real 
> file.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" 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-dev/8ed1c46d-d4c5-4bb6-980f-d9f656e6c995%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to