Forum: CFEngine Help
Subject: Clarification on parameter passing with bundles / classes
Author: frans
Link to topic: https://cfengine.com/forum/read.php?3,24247,24247#msg-24247

Hi -

I'm seeing some unexpected behavior when invoking a method bundle with a class 
as an argument.  I am sure I am misunderstanding some aspect of cfengine 
behavior so I'm hoping for clarification.

I have four zip files defined in a slist that I copy in from a remote host and 
activate classes of the same name if a new file was ready for copy.  A method 
is then invoked with the zip file name as the lone argument if and only if a 
class of the same name was defined.  The method bundle then defines a local 
class of the argument and manipulates the zip file differently depending on 
which file / class it is.

Here is the code:

Parent bundle:


classes:

 "demo"      expression => fileexists("/root/demo");

vars:

        "zipfiles"  slist =>  {
                                        "blue",
                                        "green",
                                        "gold",
                                        "black",
                        };

files:

        "/somewhere/$(zipfiles).war"
                create => "true",
                copy_from => 
remote_dcp("$(def.source_dir)/zipfiles.war.$(sys.uqhost)","$(sys.policy_hub)"),
                classes => if_repaired("$(zipfiles)"),
                action => "background";

methods:

 centos_6_0.demo::
 
                "any"  usebundle => warunzip("$(zipfiles)"),
                        ifvarclass => "$(zipfiles)";




The "warunzip" bundle is as follows:



bundle agent warunzip(name)
{

 classes:

# Declare this class again as classes don't traverse bundles
   "demo"      expression => fileexists("/root/.tmdemo");

   "$(name)"    or => { "$(name)" };


 files:

        demo::
               # Need to clean up prior directory
                "/somewhere/$(name)/."
                        delete => tidy,
                        depth_search => recurse("inf"),
                        ifvarclass => canonify("$(name)");

 commands:
        
        demo.blue::

                "/usr/bin/unzip -uo /somewhere/$(name).war  -d /this/path/",
                ifvarclass => "black",
                contain => in_shell;

        demo.green::
                "/usr/bin/unzip -uo /somewhere/$(name).war  -d 
/this/OTHER/PATH/  ",
                ifvarclass => "green",
                contain => in_shell;

}

   

The first problem is that I only see the warunzip method getting invoked twice 
even though output confirms that all members of the slist needed copying and 
were activated as classes.


cf3>       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
cf3>       BUNDLE warunzip( {'blue'} )
cf3>       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

cf3>       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
cf3>       BUNDLE warunzip( {'green'} )
cf3>       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

The second problem is that the commands: classes are being ignored.  The 
green.war file is not destined for this extraction path but that's how it gets 
unzip'd:


cf3>  -> Executing '/usr/bin/unzip -uo /somewhere/green.war  -d /this/path/' 
...(timeout=-678,owner=-1,group=-1)

Where am I going wrong?

Thanks,
F

_______________________________________________
Help-cfengine mailing list
Help-cfengine@cfengine.org
https://cfengine.org/mailman/listinfo/help-cfengine

Reply via email to