Forum: CFEngine Help
Subject: Re: Clarification on parameter passing with bundles / classes
Author: frans
Link to topic: https://cfengine.com/forum/read.php?3,24247,24259#msg-24259
Thanks Todd and lauwersw for the replies. The point about classes being global
when enacted if_repaired was the root of my woes.
To illustrate, take this bundle as an example:
bundle agent test {
vars:
"myslist" slist => { "red", "green", "blue" };
files:
"/tmp/foo/$(myslist)"
copy_from => local_cp("/root/$(myslist)"),
classes => if_repaired("$(myslist)");
methods:
"any" usebundle => reportfile("$(myslist)"),
ifvarclass => "$(myslist)";
}
bundle agent reportfile(target) {
reports:
red::
"This is red leader.";
green::
"This is green leader";
}
During execution the first call to the reportfile method results in both red
and green being true.
cf3> BUNDLE reportfile( {'red'} )
cf3> Report: This is red leader.
cf3> R: This is red leader.
cf3>
cf3> .........................................................
cf3> Promise handle:
cf3> Promise made by: This is green leader
cf3> .........................................................
cf3>
cf3> Report: This is green leader
cf3> R: This is green leader
Then, when reportfile gets called with "green" as the parameter, no reports are
made.
cf3> -> This promise has already been verified
cf3> -> This promise has already been verified
In order to get the one-off handling of certain parameters that I was looking
for it's necessary to pass the parameter to a private class that is going to be
local in scope and will only exist for a particular iteration of the method.
bundle agent reportfile(target) {
classes:
"$(target)_class" expression => "$(target)";
reports:
red::
"This is red leader.",
ifvarclass => "red_class";
green::
"This is green leader",
ifvarclass => "green_class";
}
cf3> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
cf3> BUNDLE reportfile( {'red'} )
cf3> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
cf3>
cf3>
cf3> Initiate variable convergence...
cf3>
cf3> + Private classes augmented:
cf3> + red_class
cf3>
cf3> Report: This is red leader.
cf3> R: This is red leader.
cf3>
cf3> . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cf3> Skipping whole next promise (This is green leader), as var-context
green_class is not relevant
cf3> . . . . . . . . . . . . . . . . . . . . . . . . . . . .
cf3>
cf3> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
cf3> BUNDLE reportfile( {'green'} )
cf3> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
cf3>
cf3> + Private classes augmented:
cf3> + green_class
cf3>
cf3> Report: This is green leader
cf3> R: This is green leader
cf3>
_______________________________________________
Help-cfengine mailing list
[email protected]
https://cfengine.org/mailman/listinfo/help-cfengine