I dug a little more into this. The weird behavior Jeff and Aurélien seen 
was coming from the following conditional statement :
if ensure_prop = property(:ensure) or (self.class.needs_ensure_retrieved and 
self.class.validattr?(:ensure) and ensure_prop = newattr(:ensure))
  # Retrieve ensure
else                                                                       
                                                                            
  
  # Don't retrieve ensure
end
Aurélien's patch adds
if ... and ensure_prop.should


Jeff's patch adds 
if ... and (ignoreensure or ensure_prop.should)

And the problem was coming from this ensure_prop.should. During puppet runs 
ensure_prop always exists, but ensure_prop.should only exists if something 
if specified. But, when we are coming from Puppet::Type.to_resource, 
ensure_prop still exists (if the property is ensurable) but ensure_prop 
don't. 
Thus, we are seeing this behavior : 
-  In the puppet resource application, with ignore_ensure=false and an 
ensurable type (Jeff's patch == Aurélien's patch in this case), this 
conditional statement evaluates to false (true or true and false). Because 
*ensure_prop.should 
evaluates to false*.

And, seeing this behavior, Jeff (IMHO) wrongly concluded 

As an aside, I tested Aurelien's original patch with the mcollective and 
> datacat_collector modules and noticed the same breakage my patch 
> exhibited: 
> *if ensure is not present in the resources returned from Type.retrieve, 
> then modules using collected resources will break*. 


But it's works, by removing the ensure_prop.should out of the conditional 
statement. No need to check for ensure_prop.should

Please correct me if I'm wrong.

Cheers,
      




Le mercredi 22 juillet 2015 14:44:01 UTC+2, Felix Frank a écrit :
>
> Hi, 
>
> thanks for picking this up. 
>
> I think what really needs discussing is 
> https://github.com/puppetlabs/puppet/pull/4038#issuecomment-119290626 
>
> I'm not sure what kind of breakage specifically Jeff noticed in 
> https://groups.google.com/forum/#!msg/puppet-dev/P8ReCHvmd2o/tuhzAM86wbYJ 
>
> Perhaps this is about collections of exported resources using Service<<| 
> |>> ? Could you make sure that still works with and without ensure 
> attribute set in those? 
>
> Any other ideas what might have been the issue? For all we know, the 
> cause might have been resolved upstream in the meantime, but it would be 
> nice to be sure. 
>
> Thanks, 
> Felix 
>
> On 07/16/2015 09:06 AM, Romain F. wrote: 
> > Hello, 
> > 
> > Necrobumping again this thread. Felix's wishes have been granted in 
> > PR-4038 <https://github.com/puppetlabs/puppet/pull/4038> (PUP-4760 
> > <https://tickets.puppetlabs.com/browse/PUP-4760>) but this change is 
> bit 
> > tricky/risky apparently. 
> > 
> > The original goal was to not retrieve ensure property status when we 
> > don't ask to. This need a change in Puppet::Type's retrieve method. 
> > Before the change in PR-4038 
> > <https://github.com/puppetlabs/puppet/pull/4038>, it was 
> > programmatically creating a ensure property when nothing is specified 
> > and if the type is ensurable, so it was always retrieving the ensure 
> > status. 
> > 
> > The change in the beginning of this thread was adding another condition 
> > to this : if the type is ensurable and if the ensure property have a 
> > should attribute. 
> > 
> > The change in PR-4038 <https://github.com/puppetlabs/puppet/pull/4038> 
> > is just skipping the creation of the ensure property when nothing is 
> > specified and if the type can continue without a ensure property (it's 
> > the case for Services, not for Files for example). 
> > 
> > Like Felix's patch, it doesn't break any tests and it doesn't break 
> > puppet resource <...> (which uses collected resources) 
> > 
> > Can you confirm that this would work ? Do think it can be extended to 
> > some other types ? 
> > 
> > Cheers, 
> > 
> > Romain 
> > 
> > 
> > 
> > 
> > Le lundi 5 mai 2014 02:16:33 UTC+2, Felix Frank a écrit : 
> > 
> >     Hi, 
> > 
> >     necro-bumping yet another thread, I took another stab at that old 
> >     problem. 
> > 
> >     I molded Jeff's approach into a form that I hope to be more 
> palatable. 
> >     It does not break any tests that I have tried (which is not saying 
> it 
> >     won't break any whatsoever). 
> > 
> >     
> https://github.com/ffrank/puppet/tree/dont-always-retrieve-service-ensure 
> > 
> > 
> >     So, if you guys could give it a spin, that would be awesome. 
> > 
> >     Also, a ticket would be helpful, but if you can confirm that this 
> works 
> >     and helps, I can open one on your behalf so we can make a PR for 
> this. 
> > 
> >     Cheers, 
> >     Felix 
> > 
> >     On 12/19/2013 11:39 PM, Jeff Bachtel wrote: 
> >     >>> 
> >     >>> In the end, even just the behavior change to "puppet resource" 
> >     makes 
> >     >>> the patch a non-starter because it is a widely used feature. 
> >     >> 
> >     >> I understand this feature should be kept, but that a pity this 
> >     should 
> >     >> impact other even more useful feature like "apply" or "agent". 
> >     >> 
> >     >> Could it be possible that "puppet resource" and other like 
> >     "apply" or 
> >     >> "agent" retrieves only what they need? In apply/agent case, this 
> >     come 
> >     >> from a transaction being applied. For "puppet resource" I assume 
> >     this 
> >     >> is not the case. Could method parameter solve this case? And this 
> >     >> could even keep the compat if this param is not specified 
> >     >> 
> >     > 
> >     > I spent all day (because my Ruby is bad) doing a proof of concept 
> >     with 
> >     > this. It touches type.rb and indirector/resource/ral.rb to add a 
> >     > seemingly transparent method variable flagging whether ensure 
> should 
> >     > be ignored for the purpose of retrieving resources. It defaults to 
> >     > false (don't ignore ensure), which should cause the speedup 
> Aurelien 
> >     > is needing. The resource RAL indirector is aware of the method 
> >     > parameter and sets it to true (ignoreensure), thereby exhibiting 
> the 
> >     > old behavior when puppet resource is called from the command line. 
> >     > 
> >     > There is a nasty bit that I'm unsure of in the retrieve_resource 
> >     > method. I discovered that when running puppet agent -t --noop, if 
> I 
> >     > tried to use my newly defined method parameter that parsing would 
> >     > choke - apparently in that state the retrieve method is targeting 
> >     > another method. I worked around it by putting in a rescue 
> statement 
> >     > and falling back to the old way of calling retrieve which should, 
> >     > eventually, still hit the retrieve with Aurelien's improved 
> >     > conditional logic. 
> >     > 
> >     > Anyway, please find attached a diff containing the changes in 
> >     > question. Feel free to refine and submit it as a PR, my Ruby 
> really 
> >     > isn't up for my doing so myself. 
> >     > 
> >     > Jeff 
> >     > 
> >     > 
>
>

-- 
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/614f32ba-64a9-4572-879c-c5593196a420%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to