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 puppet-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-dev/4e6e2c67-dd82-4f6b-9d34-e5e8775df04a%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.