Issue #3537 has been updated by Kjetil Torgrim Homme.

eric sorenson wrote:
> Let me rephrase Alan's [note 11](#note-11) because it is a useful point of 
> discussion but has an error in the code
> 
> the current behaviour is:

<pre>  run A.onlyif;
  if A.onlyif was sucessful {
    run A.command
    run B.command
  }
</pre>

is that so?  I don't have a 3.x Puppet to test on, so...  prior to 3.0, 
B.command is not run.


> I believe that Kjetil wants a way to express the following behaviour:
> 
> [...]

true, that seems more intuitive given the require'd ordering.

> But to do that means we'd have to pause evaluating resource A, go to B, then 
> come back to A.

good point.  I naively thought we could do the onlyif evaluation during the 
dependency graph, but that would be wrong, the require in the exec may be a 
prerequisite for the onlyif to run.  which points to why the "require" becomes 
ambigious wrt. ordering of A and B.

> A much simpler way to model this would be not to use the `onlyif` at all but 
> instead make its command a top-level exec resource too. It will be run every 
> time either way so there's no performance hit, and the savings in complexity 
> seems quite worthwhile. So you'd have
> [...]

unfortunately this gives error messages in the log when Exec['prereq'] fails.


----------------------------------------
Feature #3537: It should be possible to trigger (exec) resources with require
https://projects.puppetlabs.com/issues/3537#change-91531

* Author: Kjetil Torgrim Homme
* Status: Needs Decision
* Priority: Normal
* Assignee: eric sorenson
* Category: metaparameters
* Target version: 
* Affected Puppet version: 0.25.4
* Keywords: 
* Branch: 
----------------------------------------
When an Exec has conditions associated with it (unless, creates, onlyif), it 
can be useful to be state prerequisites which are only run when the exec itself 
is run.

Consider this simple example::
<pre>
  exec { "prereq":
      command => "/bin/echo prereq",
      refreshonly => true
 }
  
  exec { "main":
      command => "/bin/echo main",
      onlyif  => "/bin/grep foobar /etc/issue",
      require => Exec["prereq"]
 }
</pre>
Here, the refreshonly will cause "prereq" to never run, since a require isn't 
enough to trigger it.  Without refreshonly, it will run every time, but the 
desired behaviour is that "prereq" is run iff the onlyif command succeeds.

Obviously the behaviour of "refreshonly => true" can't change, and I can't 
think of a good name for a tri-state alternative -- "refreshonly => 
'requires-too'" ?  "allevents" may be more workable.

My prefered solution would be a new parameter "requireonly".  Perhaps slightly 
misleading name, since "before" should trigger execution, too, but I think most 
people will understand that require/before are inherently intertwined.  This 
could later be generalised into a metaparameter to work for more types, e.g. 
you could have a parent File which is only checked/updated/created when some 
other File requires it.



-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://projects.puppetlabs.com/my/account

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Bugs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-bugs?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to