Looks OK. One minor thing, remove "to add" from this TRACE entry:
+                                                TRACE("SW Bundle to add %s 
will be created by campaign", val.c_str());

/Bertil

-----Original Message-----
From: Ingvar Bergström 
Sent: den 19 december 2013 07:04
To: Bertil Engelholm
Cc: opensaf-devel@lists.sourceforge.net
Subject: [PATCH 1 of 1] smfd: Call configured smfBundleCheckCmd for all SW 
bundles expected to be found in IMM [#675]

 osaf/services/saf/smfsv/smfd/SmfCampState.cc |  340 +++++++-------------------
 1 files changed, 94 insertions(+), 246 deletions(-)


The ticket "SMF: Call configured smfBundleCheckCmd as part of prerequisites 
test [656]" does not work as expected.
Correct behavior is:
1) call configured smfBundleCheckCmd for all sw bundles expected to be found in 
IMM according to campaign xml.
2) check that all bundle objects exist in IMM.

diff --git a/osaf/services/saf/smfsv/smfd/SmfCampState.cc 
b/osaf/services/saf/smfsv/smfd/SmfCampState.cc
--- a/osaf/services/saf/smfsv/smfd/SmfCampState.cc
+++ b/osaf/services/saf/smfsv/smfd/SmfCampState.cc
@@ -395,12 +395,12 @@ SmfCampStateInitial::prerequsitescheck(S
        std::string s;
        std::stringstream out;
        std::vector < SmfUpgradeProcedure * >::iterator procIter;
-       std::list < std::string > bundleInstallDnCamp;   //DNs of bundles to be 
installed found in campaign.xml
-       std::list < std::string > foundInstallDn;        //DNs of bundles to be 
installed found in campaign.xml, found in IMM
-       std::list < std::string > notFoundInstallDn;     //DNs of bundles to be 
installed found in campaign.xml, NOT found in IMM
-       std::list < std::string > bundleRemoveDnCamp;    //DNs of bundles to be 
removed found in campaign.xml
-       std::list < std::string > notFoundRemoveDn;      //DNs of bundles to be 
removed found in campaign.xml, NOT found in IMM
+       std::list < std::string > bundleDnCamp;   //DNs of all bundles to be 
installed and removed found in campaign.xml
        std::list < std::string >::iterator dnIter;
+        std::list < std::string > addToImmBundleDn;
+        std::list < SmfImmOperation * > immOper;
+        std::list < SmfImmOperation * >::iterator operIter;
+
         bool bundleCheckErrorFound = false;
        SmfImmUtils immUtil;
        SaImmAttrValuesT_2 **attributes;
@@ -439,18 +439,14 @@ SmfCampStateInitial::prerequsitescheck(S
         //                       and all the dependencies of the required 
packages have been checked and are satisfied"
 
        //Below is the current implementation of prerequisite check 4 and 6. 
-       //For bundles included in any <swAdd> portion of the campaign:
-       //1) The IMM is searched for existing SW bundle objects
-       //2) If not found in IMM, the campaign xml <softwareBundle> portion is 
searched to see if the swBundle
-        //   objects are going to be created by the campaign.
+       //
+       //1) The campaign is searched for bundles to add and remove. They are 
all stored in the same list.
+       //2) If bundles are created in the <addToImm> portion of the campaign 
they are excluded from the bundle list
+        //3) The configured smfBundleCheck command is invoked for each bundle 
in the bundle list
+        //4) The existance of bundle IMM instances matching the bundle 
+list are checked
 
-       //For bundles included in any <swRemove> portion of the campaign:
-       //1) The IMM is searched for existing SW bundle objects
-       
-       //Check that bundles to install is available in the software repository
        LOG_NO("CAMP: Check bundles to install and remove.");
-       //Find out which SW Bundles to install
-       TRACE("Find out which SW Bundles to install");
+        //Find bundles in the campaign xml
        procIter = i_camp->m_procedure.begin();
        while (procIter != i_camp->m_procedure.end()) {
                //Fetch the list of SW to add from each procedure @@ -463,14 
+459,23 @@ SmfCampStateInitial::prerequsitescheck(S
                                error = "CAMP: Procedure upgrade scope not 
found";
                                goto exit_error;
                        }
-                       const std::list < SmfBundleRef * > b = 
byTemplate->getTargetNodeTemplate()->getSwInstallList();
+
+                       std::list < SmfBundleRef * > b = 
+byTemplate->getTargetNodeTemplate()->getSwInstallList();
 
                        std::list< SmfBundleRef* >::const_iterator bIter;
                        bIter = b.begin();
                        while (bIter != b.end()) {
-                               
bundleInstallDnCamp.push_back((*bIter)->getBundleDn());
+                               bundleDnCamp.push_back((*bIter)->getBundleDn());
                                bIter++;
                        }
+
+                        b = 
byTemplate->getTargetNodeTemplate()->getSwRemoveList();
+                       bIter = b.begin();
+                       while (bIter != b.end()) {
+                               bundleDnCamp.push_back((*bIter)->getBundleDn());
+                               bIter++;
+                       }
+
                } else if (upType == SA_SMF_SINGLE_STEP) {
                        TRACE("SA_SMF_SINGLE_STEP procedure detected");
                        const SmfUpgradeScope * scope = 
(*procIter)->getUpgradeMethod()->getUpgradeScope();
@@ -481,22 +486,37 @@ SmfCampStateInitial::prerequsitescheck(S
                        
                        if(modify != 0) { //Check if the upgradeScope is 
SmfForModify
                                TRACE("SA_SMF_SINGLE_STEP procedure with scope 
forModify detected");
-                               const std::list < SmfBundleRef > b = 
modify->getActivationUnit()->getSwAdd();
+                               std::list < SmfBundleRef > b = 
+modify->getActivationUnit()->getSwAdd();
                                std::list< SmfBundleRef >::const_iterator bIter;
                                bIter = b.begin();
                                while (bIter != b.end()) {
-                                       
bundleInstallDnCamp.push_back((*bIter).getBundleDn());
+                                       
bundleDnCamp.push_back((*bIter).getBundleDn());
                                        bIter++;
                                }
+                                b = modify->getActivationUnit()->getSwRemove();
+                               bIter = b.begin();
+                               while (bIter != b.end()) {
+                                       
bundleDnCamp.push_back((*bIter).getBundleDn());
+                                       bIter++;
+                               }
+
                        }else if(addRemove != 0) { //Check if the upgradeScope 
is SmfForAddRemove
                                TRACE("SA_SMF_SINGLE_STEP procedure with scope 
forAddRemove detected");
-                               const std::list < SmfBundleRef > b = 
addRemove->getActivationUnit()->getSwAdd();
+                               std::list < SmfBundleRef > b = 
+addRemove->getActivationUnit()->getSwAdd();
                                std::list< SmfBundleRef >::const_iterator bIter;
                                bIter = b.begin();
                                while (bIter != b.end()) {
-                                       
bundleInstallDnCamp.push_back((*bIter).getBundleDn());
+                                       
bundleDnCamp.push_back((*bIter).getBundleDn());
                                        bIter++;
                                }
+
+                                b = 
addRemove->getDeactivationUnit()->getSwRemove();
+                               bIter = b.begin();
+                               while (bIter != b.end()) {
+                                       
bundleDnCamp.push_back((*bIter).getBundleDn());
+                                       bIter++;
+                               }
+
                        } else {
                                TRACE("Unknown procedure scope");
                                error = "CAMP: Unknown procedure scope"; @@ 
-508,252 +528,80 @@ SmfCampStateInitial::prerequsitescheck(S
                        goto exit_error;
                }
 
-
                procIter++;
        }
 
-       bundleInstallDnCamp.sort();
-       bundleInstallDnCamp.unique();
+       bundleDnCamp.sort();
+       bundleDnCamp.unique();
 
-       //Find out which SW Bundles to remove
-       TRACE("Find out which SW Bundles to remove");
-       procIter = i_camp->m_procedure.begin();
-       while (procIter != i_camp->m_procedure.end()) {
-               //Fetch the list of SW to remove from each procedure
-               SaSmfUpgrMethodT upType = 
(*procIter)->getUpgradeMethod()->getUpgradeMethod();
-               if (upType == SA_SMF_ROLLING) {
-                       TRACE("SA_SMF_ROLLING procedure detected");
-                       const SmfByTemplate *byTemplate = 
(SmfByTemplate*)(*procIter)->getUpgradeMethod()->getUpgradeScope();
-                       if (byTemplate == NULL) {
-                               TRACE("No upgrade scope found");
-                               error = "CAMP: Procedure upgrade scope not 
found";
-                               goto exit_error;
-                       }
-                       const std::list < SmfBundleRef * > b = 
byTemplate->getTargetNodeTemplate()->getSwRemoveList();
+       TRACE("Total number of bundles in the campaign = %zd", 
+bundleDnCamp.size());
 
-                       std::list< SmfBundleRef* >::const_iterator bIter;
-                       bIter = b.begin();
-                       while (bIter != b.end()) {
-                               
bundleRemoveDnCamp.push_back((*bIter)->getBundleDn());
-                               bIter++;
-                       }
-               } else if (upType == SA_SMF_SINGLE_STEP) {
-                       TRACE("SA_SMF_SINGLE_STEP procedure detected");
-                       const SmfUpgradeScope * scope = 
(*procIter)->getUpgradeMethod()->getUpgradeScope();
+        //Find the bundles which will be created in the <addToImm> portion of 
the campaign.xml
+        TRACE("Find the bundles which will be created by the campaign.xml");
+        immOper = i_camp->m_campInit.getAddToImm();
+        operIter = immOper.begin();
+        while (operIter != immOper.end()) {
+                SmfImmCreateOperation* ico = 
dynamic_cast<SmfImmCreateOperation*>((*operIter));
+                if (ico != NULL) {
+                        if (ico->getClassName() == "SaSmfSwBundle") {          
      //This is sw bundle
+                                std::list <SmfImmAttribute> attr = 
ico->getValues(); //Get all instance attributes
+                                std::list <SmfImmAttribute>::iterator attrIter;
+                                attrIter = attr.begin();
+                                while (attrIter != attr.end()) {               
      //Search for safSmfBundle attribute
+                                        if( (*attrIter).getName() == 
"safSmfBundle") {
+                                                std::string  val = 
(*attrIter).getValues().front(); //Only one value
+                                                if (ico->getParentDn().size() 
> 0) {
+                                                        val += "," + 
ico->getParentDn();
+                                                }
+                                                TRACE("SW Bundle to add %s 
will be created by campaign", val.c_str());
+                                                
addToImmBundleDn.push_back(val);
+                                                break;
+                                        }
+                                        attrIter++;
+                                }
+                        }
+                }
+                operIter++;
+        }
+        addToImmBundleDn.sort();
+        addToImmBundleDn.unique();
 
-                       //Cast to valid upgradeScope
-                       const SmfForModify* modify = dynamic_cast<const 
SmfForModify*>(scope);
-                       const SmfForAddRemove* addRemove = dynamic_cast<const 
SmfForAddRemove*>(scope);
-                       
-                       if(modify != 0) { //Check if the upgradeScope is 
SmfForModify
-                               TRACE("SA_SMF_SINGLE_STEP procedure with scope 
forModify detected");
-                               const std::list < SmfBundleRef > b = 
modify->getActivationUnit()->getSwRemove();
-                               std::list< SmfBundleRef >::const_iterator bIter;
-                               bIter = b.begin();
-                               while (bIter != b.end()) {
-                                       
bundleRemoveDnCamp.push_back((*bIter).getBundleDn());
-                                       bIter++;
-                               }
-                       }else if(addRemove != 0) { //Check if the upgradeScope 
is SmfForAddRemove
-                               TRACE("SA_SMF_SINGLE_STEP procedure with scope 
forAddRemove detected");
-                               const std::list < SmfBundleRef > b = 
addRemove->getDeactivationUnit()->getSwRemove();
-                               std::list< SmfBundleRef >::const_iterator bIter;
-                               bIter = b.begin();
-                               while (bIter != b.end()) {
-                                       
bundleRemoveDnCamp.push_back((*bIter).getBundleDn());
-                                       bIter++;
-                               }
-                       } else {
-                               TRACE("Unknown procedure scope");
-                               error = "CAMP: Unknown procedure scope";
-                               goto exit_error;
-                       }
-               } else {
-                       error = "CAMP: Unknown procedure type";
-                       goto exit_error;
-               }
+        //Remove bundles to be created by campaign <addToImm> from the list of 
bundles
+        dnIter = addToImmBundleDn.begin();
+        while (dnIter != addToImmBundleDn.end()) {
+                TRACE("Remove addToImm bundle %s from list of bundles", 
(*dnIter).c_str());
+                bundleDnCamp.remove(*dnIter);
+                dnIter++;
+        }
 
-               procIter++;
-       }
-
-       bundleRemoveDnCamp.sort();
-       bundleRemoveDnCamp.unique();
-
-       TRACE("Total number of bundles to install in the campaign = %zd", 
bundleInstallDnCamp.size());
-       TRACE("Total number of bundles to remove in the campaign = %zd", 
bundleRemoveDnCamp.size());
-
-       //Check if SW Bundles to install can be found in IMM
-        //For bundles found in IMM, save the DN for each bundle, these bundles 
will later on be checked by configured command.
-        
-       TRACE("Check if SW Bundles to install can be found in IMM");
-       for (dnIter=bundleInstallDnCamp.begin(); dnIter != 
bundleInstallDnCamp.end(); ++dnIter) {
-               if (immUtil.getObject((*dnIter), &attributes) == true) { //found
-                       TRACE("SW Bundle to install %s found in IMM", 
(*dnIter).c_str());
-                        foundInstallDn.push_back(*dnIter);
-               } else {
-                       TRACE("SW Bundle to install %s NOT found in IMM", 
(*dnIter).c_str());
-                       notFoundInstallDn.push_back(*dnIter);
-               }
-       }
-
-       //If bundles are not found in IMM, check if the budles are specified to 
be installed in 
-       //the <addToImm> portion of the campaign
-       if (notFoundInstallDn.size() > 0) {
-               TRACE("All bundles was not found in IMM, check if they will be 
created by the campaign");
-               //Find all bundles to be created my the campaign
-               std::list < std::string > addToImmBundleDn;
-               std::list < SmfImmOperation * > immOper;
-               std::list < SmfImmOperation * >::iterator operIter;
-
-               immOper = i_camp->m_campInit.getAddToImm();
-               operIter = immOper.begin();
-               while (operIter != immOper.end()) {
-                       SmfImmCreateOperation* ico = 
dynamic_cast<SmfImmCreateOperation*>((*operIter));
-                       if (ico != NULL) {
-                               if (ico->getClassName() == "SaSmfSwBundle") {   
             //This is sw bundle
-                                       std::list <SmfImmAttribute> attr = 
ico->getValues(); //Get all instance attributes
-                                       std::list <SmfImmAttribute>::iterator 
attrIter;
-                                       attrIter = attr.begin();
-                                       while (attrIter != attr.end()) {        
             //Search for safSmfBundle attribute
-                                               if( (*attrIter).getName() == 
"safSmfBundle") {
-                                                       std::string  val = 
(*attrIter).getValues().front(); //Only one value
-                                                       if 
(ico->getParentDn().size() > 0) {
-                                                               val += "," + 
ico->getParentDn();
-                                                       }
-                                                       TRACE("SW Bundle to add 
%s will be created by campaign", val.c_str());
-                                                       
addToImmBundleDn.push_back(val);
-                                               }
-                                               attrIter++;
-                                       }
-                               }
-                       }
-                       operIter++;
-               }
-               addToImmBundleDn.sort();
-               addToImmBundleDn.unique();
-
-               //Match found bundles to be created with the remaining list of 
bundles to install
-               dnIter = addToImmBundleDn.begin();
-               while (dnIter != addToImmBundleDn.end()) {
-                       TRACE("Remove SW Bundle %s from list of missing SW 
Bundles", (*dnIter).c_str());
-                       notFoundInstallDn.remove(*dnIter);
-                       dnIter++;
-               }
-       }
-
-       TRACE("Check if SW Bundles to remove are found in IMM");
-       //Check if SW Bundles to remove are found in IMM
-       for (dnIter=bundleRemoveDnCamp.begin(); dnIter != 
bundleRemoveDnCamp.end(); ++dnIter) {
-               if (immUtil.getObject((*dnIter), &attributes) == true) { //found
-                       TRACE("SW Bundle to remove %s found in IMM", 
(*dnIter).c_str());
-               } else {
-                       TRACE("SW Bundle to remove %s NOT found in IMM", 
(*dnIter).c_str());
-                       notFoundRemoveDn.push_back(*dnIter);
-               }
-       }
-
-       //If bundles are not found in IMM, check if the budles to remove are 
specified to be added in 
-       //the <addToImm> portion of the campaign
-       if (notFoundRemoveDn.size() > 0) {
-               TRACE("All bundles was not found in IMM, check if they will be 
created by the campaign");
-               //Find all bundles to be created my the campaign
-               std::list < std::string > addToImmBundleDn;
-               std::list < SmfImmOperation * > immOper;
-               std::list < SmfImmOperation * >::iterator operIter;
-
-               immOper = i_camp->m_campInit.getAddToImm();
-               operIter = immOper.begin();
-               while (operIter != immOper.end()) {
-                       SmfImmCreateOperation* ico = 
dynamic_cast<SmfImmCreateOperation*>((*operIter));
-                       if (ico != NULL) {
-                               if (ico->getClassName() == "SaSmfSwBundle") {   
             //This is sw bundle
-                                       std::list <SmfImmAttribute> attr = 
ico->getValues(); //Get all instance attributes
-                                       std::list <SmfImmAttribute>::iterator 
attrIter;
-                                       attrIter = attr.begin();
-                                       while (attrIter != attr.end()) {        
             //Search for safSmfBundle attribute
-                                               if( (*attrIter).getName() == 
"safSmfBundle") {
-                                                       std::string  val = 
(*attrIter).getValues().front(); //Only one value
-                                                       if 
(ico->getParentDn().size() > 0) {
-                                                               val += "," + 
ico->getParentDn();
-                                                       }
-                                                       TRACE("SW Bundle to 
remove %s will be created by campaign", val.c_str());
-                                                       
addToImmBundleDn.push_back(val);
-                                               }
-                                               attrIter++;
-                                       }
-                               }
-                       }
-                       operIter++;
-               }
-               addToImmBundleDn.sort();
-               addToImmBundleDn.unique();
-
-               //Match found bundles to be created with the remaining list of 
bundles to install
-               dnIter = addToImmBundleDn.begin();
-               while (dnIter != addToImmBundleDn.end()) {
-                       TRACE("Remove SW Bundle %s from list of missing SW 
Bundles", (*dnIter).c_str());
-                       notFoundRemoveDn.remove(*dnIter);
-                       dnIter++;
-               }
-       }
-
-       //Here are the lists of bundles to install and remove. Shall be empty 
if all bundles was found 
-       //in Imm or was prepared to be created in <addToImm> portion of the 
campaigm
-       if ((notFoundInstallDn.size() > 0) || (notFoundRemoveDn.size() > 0)) {
-               if (notFoundInstallDn.size() > 0) {
-                       LOG_ER("CAMP: The following SW bundles to add was not 
found in system or campaign:");
-                       dnIter = notFoundInstallDn.begin();
-                       while (dnIter != notFoundInstallDn.end()) {
-                                LOG_ER("CAMP: %s", (*dnIter).c_str());
-                               dnIter++;
-                       }
-               }
-
-               if (notFoundRemoveDn.size() > 0) {
-                       LOG_ER("CAMP: The following SW bundles to remove was 
not found in system:");
-                       dnIter = notFoundRemoveDn.begin();
-                       while (dnIter != notFoundRemoveDn.end()) {
-                                LOG_ER("CAMP: %s", (*dnIter).c_str());
-                               dnIter++;
-                       }
-               }
-
-               error = "CAMP: Bundles to add/remove was not found in system or 
campaign";
-               goto exit_error;
-       }
-        
-        //Call the configured bundleCheckCmd for all bundles listed for add in 
the campaign.xml.
+        //Call the configured bundleCheckCmd for all bundles listed in <swAdd> 
and <swRemove> portion of the campaign.xml.
         //Bundles which does not yet exist in IMM, but will be created by the 
campaign are not checked.
-        LOG_NO("CAMP: Calling configured bundleCheckCmd for each bundle 
existing in IMM, to be installed by the campaign");
-        dnIter = foundInstallDn.begin();
-        while (dnIter != foundInstallDn.end()) {
+        LOG_NO("CAMP: Calling configured smfBundleCheckCmd for each bundle 
existing in IMM, to be installed or removed by the campaign");
+        dnIter = bundleDnCamp.begin();
+        while (dnIter != bundleDnCamp.end()) {
                 std::string cmd = smfd_cb->bundleCheckCmd;
                 cmd = cmd + " " + *dnIter;
                 int rc = smf_system(cmd);
                 if (rc != 0) {
                         bundleCheckErrorFound = true;
                         LOG_NO("CAMP: bundleCheckCmd fail [%s] [rc=%d]", 
cmd.c_str(), rc);
+                        dnIter++;
+                        continue;
                 }
-                dnIter++;
-        }
 
-        //Call the configured bundleCheckCmd for all bundles listed for remove 
in the campaign.xml.
-        LOG_NO("CAMP: Calling configured bundleCheckCmd for each bundle to be 
removed by the campaign");
-        dnIter = bundleRemoveDnCamp.begin();
-        while (dnIter != bundleRemoveDnCamp.end()) {
-                std::string cmd = smfd_cb->bundleCheckCmd;
-                cmd = cmd + " " + *dnIter;
-                int rc = smf_system(cmd);
-                if (rc != 0) {
+               if (immUtil.getObject((*dnIter), &attributes) == true) { //found
+                       TRACE("SW Bundle [%s] found in IMM", (*dnIter).c_str());
+               } else {
                         bundleCheckErrorFound = true;
-                        LOG_NO("CAMP: bundleCheckCmd fail [%s] [rc=%d]", 
cmd.c_str(), rc);
-               }
+                       LOG_NO("CAMP: SW bundle [%s] was not found in system or 
campaign", (*dnIter).c_str());
+               }
+
                 dnIter++;
         }
 
         if(bundleCheckErrorFound == true) {
-                LOG_NO("CAMP: Configured bundleCheckCmd fails for at least one 
sw bundle");
-                error = "Configured bundleCheckCmd fails for at least one sw 
bundle";
+                LOG_NO("CAMP: Bundle check error");
+                error = "Bundle check error";
                 goto exit_error;
         }
 

------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to