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.
