osaf/libs/common/amf/include/amf_defs.h         |    7 +-
 osaf/services/saf/amf/amfd/comptype.cc          |   40 ++
 osaf/services/saf/amf/amfnd/compdb.cc           |  375 ++++++++++++++++++++++-
 osaf/services/saf/amf/amfnd/include/avnd_cb.h   |    1 +
 osaf/services/saf/amf/amfnd/include/avnd_comp.h |    7 +
 osaf/services/saf/amf/amfnd/main.cc             |    4 +
 6 files changed, 406 insertions(+), 28 deletions(-)


Added support for saAmfCtDefInstantiateCmdArgv,  saAmfCtDefTerminateCmdArgv,  
saAmfCtDefCleanupCmdArgv,  saAmfCtDefAmStartCmdArgv,  saAmfCtDefAmStopCmdArgv

diff --git a/osaf/libs/common/amf/include/amf_defs.h 
b/osaf/libs/common/amf/include/amf_defs.h
--- a/osaf/libs/common/amf/include/amf_defs.h
+++ b/osaf/libs/common/amf/include/amf_defs.h
@@ -255,7 +255,12 @@ typedef enum
    saAmfCtDefRecoveryOnError_ID = 3,
    saAmfCtDefDisableRestart_ID = 4,
    saAmfCtDefQuiescingCompleteTimeout_ID = 5,
-   saAmfCtDefInstantiationLevel_ID = 6           
+   saAmfCtDefInstantiationLevel_ID = 6,
+   saAmfCtDefInstantiateCmdArgv_ID = 7,
+   saAmfCtDefTerminateCmdArgv_ID = 8,
+   saAmfCtDefCleanupCmdArgv_ID = 9,
+   saAmfCtDefAmStartCmdArgv_ID = 10,
+   saAmfCtDefAmStopCmdArgv_ID = 11           
 } AVSV_AMF_COMPTYPE_ATTR_ID; 
 
 /* Attribute ID enum for the SaAmfHealthcheck class */
diff --git a/osaf/services/saf/amf/amfd/comptype.cc 
b/osaf/services/saf/amf/amfd/comptype.cc
--- a/osaf/services/saf/amf/amfd/comptype.cc
+++ b/osaf/services/saf/amf/amfd/comptype.cc
@@ -486,6 +486,46 @@ static void ccb_apply_modify_hdlr(const 
                                memcpy(param.value, param_val, param.value_len);
                                param.attr_id = saAmfCtDefDisableRestart_ID;
                                avd_snd_op_req_msg(avd_cb, *it, &param);
+                       } else if (!strcmp(attribute->attrName, 
"saAmfCtDefInstantiateCmdArgv")) {
+                               SaStringT *param_val = 
(SaStringT*)attribute->attrValues[0];
+                               TRACE("saAmfCtDefInstantiateCmdArgv to '%s' for 
compType '%s' on node '%s'", *param_val, 
+                                       opdata->objectName.value, 
(*it)->name.value);
+                               param.value_len = strlen(*param_val);
+                               memcpy(param.value, *param_val, 
param.value_len);
+                               param.attr_id = saAmfCtDefInstantiateCmdArgv_ID;
+                               avd_snd_op_req_msg(avd_cb, *it, &param);
+                       } else if (!strcmp(attribute->attrName, 
"saAmfCtDefTerminateCmdArgv")) {
+                               SaStringT *param_val = 
(SaStringT*)attribute->attrValues[0];
+                               TRACE("saAmfCtDefTerminateCmdArgv to '%s' for 
compType '%s' on node '%s'", *param_val, 
+                                       opdata->objectName.value, 
(*it)->name.value);
+                               param.value_len = strlen(*param_val);
+                               memcpy(param.value, *param_val, 
param.value_len);
+                               param.attr_id = saAmfCtDefTerminateCmdArgv_ID;
+                               avd_snd_op_req_msg(avd_cb, *it, &param);
+                       } else if (!strcmp(attribute->attrName, 
"saAmfCtDefCleanupCmdArgv")) {
+                               SaStringT *param_val = 
(SaStringT*)attribute->attrValues[0];
+                               TRACE("saAmfCtDefCleanupCmdArgv to '%s' for 
compType '%s' on node '%s'", *param_val, 
+                                       opdata->objectName.value, 
(*it)->name.value);
+                               param.value_len = strlen(*param_val);
+                               memcpy(param.value, *param_val, 
param.value_len);
+                               param.attr_id = saAmfCtDefCleanupCmdArgv_ID;
+                               avd_snd_op_req_msg(avd_cb, *it, &param);
+                       } else if (!strcmp(attribute->attrName, 
"saAmfCtDefAmStartCmdArgv")) {
+                               SaStringT *param_val = 
(SaStringT*)attribute->attrValues[0];
+                               TRACE("saAmfCtDefAmStartCmdArgv to '%s' for 
compType '%s' on node '%s'", *param_val, 
+                                       opdata->objectName.value, 
(*it)->name.value);
+                               param.value_len = strlen(*param_val);
+                               memcpy(param.value, *param_val, 
param.value_len);
+                               param.attr_id = saAmfCtDefAmStartCmdArgv_ID;
+                               avd_snd_op_req_msg(avd_cb, *it, &param);
+                       } else if (!strcmp(attribute->attrName, 
"saAmfCtDefAmStopCmdArgv")) {
+                               SaStringT *param_val = 
(SaStringT*)attribute->attrValues[0];
+                               TRACE("saAmfCtDefAmStopCmdArgv to '%s' for 
compType '%s' on node '%s'", *param_val, 
+                                       opdata->objectName.value, 
(*it)->name.value);
+                               param.value_len = strlen(*param_val);
+                               memcpy(param.value, *param_val, 
param.value_len);
+                               param.attr_id = saAmfCtDefAmStopCmdArgv_ID;
+                               avd_snd_op_req_msg(avd_cb, *it, &param);
                        } else
                                LOG_WA("Unexpected attribute name: %s", 
attribute->attrName);
                }
diff --git a/osaf/services/saf/amf/amfnd/compdb.cc 
b/osaf/services/saf/amf/amfnd/compdb.cc
--- a/osaf/services/saf/amf/amfnd/compdb.cc
+++ b/osaf/services/saf/amf/amfnd/compdb.cc
@@ -39,6 +39,8 @@
 #include <avnd.h>
 
 //
+static void init_clc_cli_command(AVND_COMP_CLC_CMD_PARAM *cmd, const char 
*clc_cmd, char **clc_cmd_argv, const char *path_prefix, char 
**comp_inst_cmd_argv);
+
 // TODO(HANO) Temporary use this function instead of strdup which uses malloc.
 // Later on remove this function and use std::string instead
 #include <cstring>
@@ -86,6 +88,7 @@ typedef struct amf_comp_type {
        SaTimeT    saAmfCompQuiescingCompleteTimeout;
        SaAmfRecommendedRecoveryT saAmfCtDefRecoveryOnError;
        bool saAmfCtDefDisableRestart;
+       SaStringT saAmfNodeSwBundlePathPrefix;
 } amf_comp_type_t;
 
 /*****************************************************************************
@@ -210,6 +213,35 @@ done:
 }
 
 /****************************************************************************
+  Name          : avnd_compdtypeb_init
+ 
+  Description   : This routine initializes the component type database.
+ 
+  Arguments     : cb  - ptr to the AvND control block
+ 
+  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+ 
+  Notes         : None.
+******************************************************************************/
+uint32_t avnd_comptypedb_init(AVND_CB *cb)
+{
+       NCS_PATRICIA_PARAMS params = {0};
+       uint32_t rc;
+
+       TRACE_ENTER();
+
+       params.key_size = sizeof(SaNameT);
+       rc = ncs_patricia_tree_init(&cb->comptypedb, &params);
+       if (NCSCC_RC_SUCCESS == rc)
+               TRACE("Component type DB init succes");
+       else
+               LOG_CR("Component type DB init failed");
+
+       TRACE_LEAVE();
+       return rc;
+}
+
+/****************************************************************************
   Name          : avnd_compdb_rec_add
  
   Description   : This routine adds a component record to the component 
@@ -894,7 +926,7 @@ uint32_t avnd_comptype_oper_req(AVND_CB 
        uint32_t rc = NCSCC_RC_FAILURE;
 
        AVND_COMP * comp;
-       const char* comp_type_name;
+       SaNameT comp_type_name;
 
        TRACE_ENTER2("Op %u, %s", param->act, param->name.value);
 
@@ -903,14 +935,13 @@ uint32_t avnd_comptype_oper_req(AVND_CB 
        {
                // 1. find component from componentType, 
                // input example, param->name.value = 
safVersion=1,safCompType=AmfDemo1 
-               comp_type_name = (char *) param->name.value;
-               TRACE("comp_type_name: %s", comp_type_name);
-               osafassert(comp_type_name);
+               comp_type_name = param->name;
+               TRACE("comp_type_name: %s", comp_type_name.value);
                // 2. search each component for a matching compType
 
                comp = (AVND_COMP *) ncs_patricia_tree_getnext(&cb->compdb, 
(uint8_t *) 0);
                while (comp != 0) {
-                       if (strncmp((const char*) comp->saAmfCompType.value, 
comp_type_name, comp->saAmfCompType.length) == 0) {
+                       if (strncmp((const char*) comp->saAmfCompType.value, 
(const char*) comp_type_name.value, comp->saAmfCompType.length) == 0) {
                                // 3. comptype found, check if component uses 
this comptype attribute value or if 
                                // component has specialized this attribute 
value.
                                
@@ -1028,6 +1059,194 @@ uint32_t avnd_comptype_oper_req(AVND_CB 
                                        }
                                        break;
                                }
+                               case saAmfCtDefInstantiateCmdArgv_ID: {
+                                       int i;
+                                       AVND_COMP_CLC_CMD_PARAM *cmd;
+                                       SaStringT saAmfCtDefInstantiateCmdArgv 
= param->value;
+                                       amf_comp_type_t *comptype = 
(amf_comp_type_t *) ncs_patricia_tree_get(&cb->comptypedb, (uint8_t *) 
&comp_type_name);
+                                       
+                                       if 
(comptype->saAmfCtRelPathInstantiateCmd == NULL) {
+                                               
LOG_WA("saAmfCtRelPathInstantiateCmd not configured, ignoring change request");
+                                               goto done;
+                                       }
+                                       
+                                       cmd = 
&comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_INSTANTIATE - 1];
+
+                                       if 
(comptype->saAmfCtDefInstantiateCmdArgv != NULL) {
+                                               for (i = 0; 
comptype->saAmfCtDefInstantiateCmdArgv[i]; i++) {
+                                                       TRACE("deleting 
comptype->saAmfCtDefInstantiateCmdArgv[%u] = %s", 
+                                                               i, 
comptype->saAmfCtDefInstantiateCmdArgv[i]);
+                                                       delete [] 
comptype->saAmfCtDefInstantiateCmdArgv[i];
+                                               }
+                                               delete [] 
comptype->saAmfCtDefInstantiateCmdArgv;
+                                               
comptype->saAmfCtDefInstantiateCmdArgv = NULL;
+                                       }
+
+                                       comptype->saAmfCtDefInstantiateCmdArgv 
= new SaStringT[2]();
+                                       
comptype->saAmfCtDefInstantiateCmdArgv[0] = 
StrDup(saAmfCtDefInstantiateCmdArgv);
+                                       
TRACE("comptype->saAmfCtDefInstantiateCmdArgv[0] modified to %s", 
comptype->saAmfCtDefInstantiateCmdArgv[0]);
+                                       
+                                       // clear cmd
+                                       memset(cmd->cmd, 0, cmd->len);
+                                       init_clc_cli_command(cmd, 
comptype->saAmfCtRelPathInstantiateCmd, 
+                                               
comptype->saAmfCtDefInstantiateCmdArgv, comptype->saAmfNodeSwBundlePathPrefix, 
+                                               
comp->saAmfCompInstantiateCmdArgv);
+                                       
+                                       TRACE("cmd->cmd modified to '%s, 
cmd->len to %u", cmd->cmd, cmd->len);
+
+                                       break;
+                               }
+                               case saAmfCtDefTerminateCmdArgv_ID: {
+                                       int i;
+                                       AVND_COMP_CLC_CMD_PARAM *cmd;
+                                       SaStringT saAmfCtDefTerminateCmdArgv = 
param->value;
+                                       amf_comp_type_t *comptype = 
(amf_comp_type_t *) ncs_patricia_tree_get(&cb->comptypedb, (uint8_t *) 
&comp_type_name);
+                                       
+                                       if 
(comptype->saAmfCtRelPathTerminateCmd == NULL) {
+                                               
LOG_WA("saAmfCtRelPathTerminateCmd not configured, ignoring change request");
+                                               goto done;
+                                       }
+                                       
+                                       cmd = 
&comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_TERMINATE - 1];
+
+                                       if 
(comptype->saAmfCtDefTerminateCmdArgv != NULL) {
+                                               for (i = 0; 
comptype->saAmfCtDefTerminateCmdArgv[i]; i++) {
+                                                       TRACE("deleting 
comptype->saAmfCtDefTerminateCmdArgv[%u] = %s", 
+                                                               i, 
comptype->saAmfCtDefTerminateCmdArgv[i]);
+                                                       delete [] 
comptype->saAmfCtDefTerminateCmdArgv[i];
+                                               }
+                                               delete [] 
comptype->saAmfCtDefTerminateCmdArgv;
+                                               
comptype->saAmfCtDefTerminateCmdArgv = NULL;
+                                       }
+                                       
+                                       comptype->saAmfCtDefTerminateCmdArgv = 
new SaStringT[2]();
+                                       comptype->saAmfCtDefTerminateCmdArgv[0] 
= StrDup(saAmfCtDefTerminateCmdArgv);
+                                       
TRACE("comptype->saAmfCtDefTerminateCmdArgv[0] modified to %s", 
comptype->saAmfCtDefTerminateCmdArgv[0]);
+                                       
+                                       // clear cmd
+                                       memset(cmd->cmd, 0, cmd->len);
+                                       init_clc_cli_command(cmd, 
comptype->saAmfCtRelPathTerminateCmd, 
+                                               
comptype->saAmfCtDefTerminateCmdArgv, comptype->saAmfNodeSwBundlePathPrefix, 
+                                               
comp->saAmfCompTerminateCmdArgv);
+                                       
+                                       TRACE("cmd->cmd modified to '%s, 
cmd->len to %u", cmd->cmd, cmd->len);
+
+                                       break;
+                               }
+                               case saAmfCtDefCleanupCmdArgv_ID: {
+                                       int i;
+                                       AVND_COMP_CLC_CMD_PARAM *cmd;
+                                       SaStringT saAmfCtDefCleanupCmdArgv = 
param->value;
+                                       amf_comp_type_t *comptype = 
(amf_comp_type_t *) ncs_patricia_tree_get(&cb->comptypedb, (uint8_t *) 
&comp_type_name);
+
+                                       if (comptype->saAmfCtRelPathCleanupCmd 
== NULL) {
+                                               
LOG_WA("saAmfCtRelPathCleanupCmd not configured, ignoring change request");
+                                               goto done;
+                                       }
+                                       
+                                       cmd = 
&comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_TERMINATE - 1];
+                                       
+                                       if (comptype->saAmfCtDefCleanupCmdArgv 
!= NULL) {
+                                               for (i = 0; 
comptype->saAmfCtDefCleanupCmdArgv[i]; i++) {
+                                                       TRACE("deleting 
comptype->saAmfCtDefCleanupCmdArgv[%u] = %s", 
+                                                               i, 
comptype->saAmfCtDefCleanupCmdArgv[i]);
+                                                       delete [] 
comptype->saAmfCtDefCleanupCmdArgv[i];
+                                               }
+                                               delete [] 
comptype->saAmfCtDefCleanupCmdArgv;
+                                               
comptype->saAmfCtDefCleanupCmdArgv = NULL;
+                                       }
+                                       
+                                       comptype->saAmfCtDefCleanupCmdArgv = 
new SaStringT[2]();
+                                       comptype->saAmfCtDefCleanupCmdArgv[0] = 
StrDup(saAmfCtDefCleanupCmdArgv);
+                                       
TRACE("comptype->saAmfCtDefCleanupCmdArgv[0] modified to %s", 
comptype->saAmfCtDefCleanupCmdArgv[0]);
+                                       
+                                       // clear cmd
+                                       memset(cmd->cmd, 0, cmd->len);
+                                       init_clc_cli_command(cmd, 
comptype->saAmfCtRelPathCleanupCmd, 
+                                               
comptype->saAmfCtDefCleanupCmdArgv, comptype->saAmfNodeSwBundlePathPrefix, 
+                                               comp->saAmfCompCleanupCmdArgv);
+                                       
+                                       TRACE("cmd->cmd modified to '%s, 
cmd->len to %u", cmd->cmd, cmd->len);
+
+                                       break;
+                               }
+                               case saAmfCtDefAmStartCmdArgv_ID: {
+                                       int i;
+                                       AVND_COMP_CLC_CMD_PARAM *cmd;
+                                       SaStringT saAmfCtDefAmStartCmdArgv = 
param->value;
+                                       amf_comp_type_t *comptype = 
(amf_comp_type_t *) ncs_patricia_tree_get(&cb->comptypedb, (uint8_t *) 
&comp_type_name);
+                                       
+                                       if (comptype->saAmfCtRelPathAmStartCmd 
== NULL) {
+                                               
LOG_WA("saAmfCtRelPathAmStartCmd not configured, ignoring change request");
+                                               goto done;
+                                       }
+
+                                       cmd = 
&comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_TERMINATE - 1];
+
+                                       if (comptype->saAmfCtDefAmStartCmdArgv 
!= NULL) {
+                                               for (i = 0; 
comptype->saAmfCtDefAmStartCmdArgv[i]; i++) {
+                                                       TRACE("deleting 
comptype->saAmfCtDefAmStartCmdArgv[%u] = %s", 
+                                                               i, 
comptype->saAmfCtDefAmStartCmdArgv[i]);
+                                                       delete [] 
comptype->saAmfCtDefAmStartCmdArgv[i];
+                                               }
+                                               delete [] 
comptype->saAmfCtDefAmStartCmdArgv;
+                                               
comptype->saAmfCtDefAmStartCmdArgv = NULL;
+                                       }
+                                       
+                                       comptype->saAmfCtDefAmStartCmdArgv = 
new SaStringT[2]();
+                                       comptype->saAmfCtDefAmStartCmdArgv[0] = 
StrDup(saAmfCtDefAmStartCmdArgv);
+                                       
TRACE("comptype->saAmfCtDefAmStartCmdArgv[0] modified to %s", 
comptype->saAmfCtDefAmStartCmdArgv[0]);
+                                       
+                                       // clear cmd
+                                       memset(cmd->cmd, 0, cmd->len);
+                                       init_clc_cli_command(cmd, 
comptype->saAmfCtRelPathAmStartCmd, 
+                                               
comptype->saAmfCtDefAmStartCmdArgv, comptype->saAmfNodeSwBundlePathPrefix, 
+                                               comp->saAmfCompAmStartCmdArgv);
+                                       
+                                       TRACE("cmd->cmd modified to '%s, 
cmd->len to %u", cmd->cmd, cmd->len);
+
+                                       break;
+                               }
+                               case saAmfCtDefAmStopCmdArgv_ID: {
+                                       int i;
+                                       AVND_COMP_CLC_CMD_PARAM *cmd;
+                                       SaStringT saAmfCtDefAmStopCmdArgv = 
param->value;
+                                       amf_comp_type_t *comptype = 
(amf_comp_type_t *) ncs_patricia_tree_get(&cb->comptypedb, (uint8_t *) 
&comp_type_name);
+                                       
+                                       if (comptype->saAmfCtRelPathAmStopCmd 
== NULL) {
+                                               LOG_WA("saAmfCtRelPathAmStopCmd 
not configured, ignoring change request");
+                                               goto done;
+                                       }
+
+                                       cmd = 
&comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_TERMINATE - 1];
+
+                                       if (comptype->saAmfCtDefAmStopCmdArgv 
!= NULL) {
+                                               for (i = 0; 
comptype->saAmfCtDefAmStopCmdArgv[i]; i++) {
+                                                       TRACE("deleting 
comptype->saAmfCtDefAmStopCmdArgv[%u] = %s", 
+                                                               i, 
comptype->saAmfCtDefAmStopCmdArgv[i]);
+                                                       delete [] 
comptype->saAmfCtDefAmStopCmdArgv[i];
+                                               }
+                                               delete [] 
comptype->saAmfCtDefAmStopCmdArgv;
+                                               
comptype->saAmfCtDefAmStopCmdArgv = NULL;
+                                       }
+                                       
+                                       comptype->saAmfCtDefAmStopCmdArgv = new 
SaStringT[2]();
+                                       comptype->saAmfCtDefAmStopCmdArgv[0] = 
StrDup(saAmfCtDefAmStopCmdArgv);
+                                       
TRACE("comptype->saAmfCtDefAmStopCmdArgv[0] modified to %s", 
comptype->saAmfCtDefAmStopCmdArgv[0]);
+                                       
+                                       
TRACE("comptype->saAmfCtRelPathInstantiateCmd = %s, saAmfNodeSwBundlePathPrefix 
= %s", comptype->saAmfCtRelPathInstantiateCmd,
+                                               
comptype->saAmfNodeSwBundlePathPrefix);
+                                       
+                                       // clear cmd
+                                       memset(cmd->cmd, 0, cmd->len);
+                                       init_clc_cli_command(cmd, 
comptype->saAmfCtRelPathAmStopCmd, 
+                                               
comptype->saAmfCtDefAmStopCmdArgv, comptype->saAmfNodeSwBundlePathPrefix, 
+                                               comp->saAmfCompAmStopCmdArgv);
+                                       
+                                       TRACE("cmd->cmd modified to '%s, 
cmd->len to %u", cmd->cmd, cmd->len);
+
+                                       break;
+                               }
                                default:
                                        LOG_WA("Unexpected attribute id: %d", 
param->attr_id);
                                }
@@ -1117,6 +1336,8 @@ static void avnd_comptype_delete(amf_com
                delete [] argv;
        delete [] compt->osafAmfCtDefHcCmdArgv;
 
+       delete [] compt->saAmfNodeSwBundlePathPrefix;
+       
        delete compt;
 
        TRACE_LEAVE();
@@ -1145,8 +1366,14 @@ static amf_comp_type_t *avnd_comptype_cr
 
        memcpy(compt->name.value, dn->value, dn->length);
        compt->name.length = dn->length;
-       compt->tree_node.key_info = (uint8_t *)&(compt->name);
 
+       /* Add to the patricia tree. */
+       compt->tree_node.key_info = (uint8_t *)&compt->name;
+       if(ncs_patricia_tree_add(&avnd_cb->comptypedb, &compt->tree_node) != 
NCSCC_RC_SUCCESS) {
+               LOG_ER("ncs_patricia_tree_add FAILED for '%s'", 
compt->name.value);
+               goto done;
+       }
+       
        if (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCtCompCategory"), 
attributes, 0, &compt->saAmfCtCompCategory) != SA_AIS_OK)
                osafassert(0);
 
@@ -1379,8 +1606,7 @@ done:
 static void init_clc_cli_command(AVND_COMP_CLC_CMD_PARAM *cmd,
                                  const char *clc_cmd,
                                  char **clc_cmd_argv, const char *path_prefix,
-                                 const SaImmAttrValuesT_2 **attributes,
-                                 const char *attr_name)
+                                 char **comp_inst_cmd_argv)
 {
        char *buf = cmd->cmd;
        int i, j;
@@ -1399,7 +1625,7 @@ static void init_clc_cli_command(AVND_CO
 
        // append argv from comp instance
        j = 0;
-       while ((argv = immutil_getStringAttr(attributes, attr_name, j++)) != 
NULL)
+       while ((argv = comp_inst_cmd_argv[j++]) != NULL)
                i += snprintf(&buf[i], sizeof(cmd->cmd) - i, " %s", argv);
 
        cmd->len = i;
@@ -1422,15 +1648,26 @@ static void init_clc_cli_attributes(AVND
                                     const char *path_prefix,
                                     const SaImmAttrValuesT_2 **attributes)
 {
+       SaUint32T i, j;
+       const char *str;
        AVND_COMP_CLC_CMD_PARAM *cmd;
 
        TRACE_ENTER();
 
+       
immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfCompInstantiateCmdArgv"),
 attributes, &j);
+       comp->saAmfCompInstantiateCmdArgv = new SaStringT[j + 1]();
+       osafassert(comp->saAmfCompInstantiateCmdArgv);
+       for (i = 0; i < j; i++) {
+               str = immutil_getStringAttr(attributes, 
"saAmfCompInstantiateCmdArgv", i);
+               osafassert(str);
+               comp->saAmfCompInstantiateCmdArgv[i] = StrDup(str);
+               osafassert(comp->saAmfCompInstantiateCmdArgv[i]);
+       }
+       
        cmd = &comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_INSTANTIATE - 1];
        if (comptype->saAmfCtRelPathInstantiateCmd != NULL) {
                init_clc_cli_command(cmd, 
comptype->saAmfCtRelPathInstantiateCmd,
-                       comptype->saAmfCtDefInstantiateCmdArgv, path_prefix,
-                       attributes, "saAmfCompInstantiateCmdArgv");
+                       comptype->saAmfCtDefInstantiateCmdArgv, path_prefix, 
comp->saAmfCompInstantiateCmdArgv);
        }
 
        if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompInstantiateTimeout"),
@@ -1443,11 +1680,19 @@ static void init_clc_cli_attributes(AVND
                comp->pxied_inst_cbk_timeout = cmd->timeout;
        }
 
+       
immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfCompTerminateCmdArgv"),
 attributes, &j);
+       comp->saAmfCompTerminateCmdArgv = new SaStringT[j + 1]();
+       osafassert(comp->saAmfCompTerminateCmdArgv);
+       for (i = 0; i < j; i++) {
+               str = immutil_getStringAttr(attributes, 
"saAmfCompTerminateCmdArgv", i);
+               osafassert(str);
+               comp->saAmfCompTerminateCmdArgv[i] = StrDup(str);
+               osafassert(comp->saAmfCompTerminateCmdArgv[i]);
+       }
        cmd = &comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_TERMINATE - 1];
        if (comptype->saAmfCtRelPathTerminateCmd != NULL) {
                init_clc_cli_command(cmd, comptype->saAmfCtRelPathTerminateCmd,
-                       comptype->saAmfCtDefTerminateCmdArgv, path_prefix,
-                       attributes, "saAmfCompTerminateCmdArgv");
+                       comptype->saAmfCtDefTerminateCmdArgv, path_prefix, 
comp->saAmfCompInstantiateCmdArgv);
        }
 
        if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompTerminateTimeout"),
@@ -1462,11 +1707,20 @@ static void init_clc_cli_attributes(AVND
                        cmd->timeout = comptype->saAmfCtDefClcCliTimeout;
        }
 
+       
immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfCompCleanupCmdArgv"),
 attributes, &j);
+       comp->saAmfCompCleanupCmdArgv = new SaStringT[j + 1]();
+       osafassert(comp->saAmfCompCleanupCmdArgv);
+       for (i = 0; i < j; i++) {
+               str = immutil_getStringAttr(attributes, 
"saAmfCompCleanupCmdArgv", i);
+               osafassert(str);
+               comp->saAmfCompCleanupCmdArgv[i] = StrDup(str);
+               osafassert(comp->saAmfCompCleanupCmdArgv[i]);
+       }
+       
        cmd = &comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_CLEANUP - 1];
        if (comptype->saAmfCtRelPathCleanupCmd != NULL) {
                init_clc_cli_command(cmd, comptype->saAmfCtRelPathCleanupCmd,
-                       comptype->saAmfCtDefCleanupCmdArgv, path_prefix,
-                       attributes, "saAmfCompCleanupCmdArgv");
+                       comptype->saAmfCtDefCleanupCmdArgv, path_prefix, 
comp->saAmfCompCleanupCmdArgv);
        }
 
        if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompCleanupTimeout"),
@@ -1479,11 +1733,20 @@ static void init_clc_cli_attributes(AVND
                comp->pxied_clean_cbk_timeout = cmd->timeout;
        }
 
+       
immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfCompAmStartCmdArgv"),
 attributes, &j);
+       comp->saAmfCompAmStartCmdArgv = new SaStringT[j + 1]();
+       osafassert(comp->saAmfCompAmStartCmdArgv);
+       for (i = 0; i < j; i++) {
+               str = immutil_getStringAttr(attributes, 
"saAmfCompAmStartCmdArgv", i);
+               osafassert(str);
+               comp->saAmfCompAmStartCmdArgv[i] = StrDup(str);
+               osafassert(comp->saAmfCompAmStartCmdArgv[i]);
+       }
+       
        cmd = &comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_AMSTART - 1];
        if (comptype->saAmfCtRelPathAmStartCmd != NULL) {
                init_clc_cli_command(cmd, comptype->saAmfCtRelPathAmStartCmd,
-                       comptype->saAmfCtDefAmStartCmdArgv, path_prefix,
-                       attributes, "saAmfCompAmStartCmdArgv");
+                       comptype->saAmfCtDefAmStartCmdArgv, path_prefix, 
comp->saAmfCompAmStartCmdArgv);
                comp->is_am_en = true;
        }
 
@@ -1493,11 +1756,20 @@ static void init_clc_cli_attributes(AVND
                comp->use_comptype_attr->set(CompAmStartTimeout);
        }
 
+       
immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfCompAmStopCmdArgv"),
 attributes, &j);
+       comp->saAmfCompAmStopCmdArgv = new SaStringT[j + 1]();
+       osafassert(comp->saAmfCompAmStopCmdArgv);
+       for (i = 0; i < j; i++) {
+               str = immutil_getStringAttr(attributes, 
"saAmfCompAmStopCmdArgv", i);
+               osafassert(str);
+               comp->saAmfCompAmStopCmdArgv[i] = StrDup(str);
+               osafassert(comp->saAmfCompAmStopCmdArgv[i]);
+       }
+       
        cmd = &comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_AMSTOP - 1];
        if (comptype->saAmfCtRelPathAmStopCmd != NULL) {
                init_clc_cli_command(cmd, comptype->saAmfCtRelPathAmStopCmd,
-                       comptype->saAmfCtDefAmStopCmdArgv, path_prefix,
-                       attributes, "saAmfCompAmStopCmdArgv");
+                       comptype->saAmfCtDefAmStopCmdArgv, path_prefix, 
comp->saAmfCompAmStopCmdArgv);
        }
 
        if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompAmStopTimeout"),
@@ -1506,11 +1778,20 @@ static void init_clc_cli_attributes(AVND
                comp->use_comptype_attr->set(CompAmStopTimeout);
        }
 
+       
immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("osafAmfCompHcCmdArgv"), 
attributes, &j);
+       comp->osafAmfCompHcCmdArgv = new SaStringT[j + 1]();
+       osafassert(comp->osafAmfCompHcCmdArgv);
+       for (i = 0; i < j; i++) {
+               str = immutil_getStringAttr(attributes, "osafAmfCompHcCmdArgv", 
i);
+               osafassert(str);
+               comp->osafAmfCompHcCmdArgv[i] = StrDup(str);
+               osafassert(comp->osafAmfCompHcCmdArgv[i]);
+       }
+       
        cmd = &comp->clc_info.cmds[AVND_COMP_CLC_CMD_TYPE_HC - 1];
        if (comptype->osafAmfCtRelPathHcCmd != NULL) {
                init_clc_cli_command(cmd, comptype->osafAmfCtRelPathHcCmd,
-                       comptype->osafAmfCtDefHcCmdArgv, path_prefix,
-                       attributes, "osafAmfCompHcCmdArgv");
+                       comptype->osafAmfCtDefHcCmdArgv, path_prefix, 
comp->osafAmfCompHcCmdArgv);
                comp->is_hc_cmd_configured = true;
        }
 
@@ -1558,6 +1839,8 @@ static int comp_init(AVND_COMP *comp, co
                const_cast<SaImmAttrNameT>("saAmfNodeSwBundlePathPrefix"),
                &nodeswbundle_name, &path_prefix);
 
+       comptype->saAmfNodeSwBundlePathPrefix = StrDup(path_prefix);
+       
        if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCompInstantiationLevel"), 
attributes, 0, &comp->inst_level) != SA_AIS_OK) {
                comp->inst_level = comptype->saAmfCtDefInstantiationLevel;
                comp->use_comptype_attr->set(CompInstantiationLevel);
@@ -1677,8 +1960,10 @@ static int comp_init(AVND_COMP *comp, co
        res = 0;
 
 done:
+       // TODO(uabhano) delete of comptype
+       //avnd_comptype_delete(comptype);
        delete [] path_prefix;
-       avnd_comptype_delete(comptype);
+       
        immutil_saImmOmFinalize(immOmHandle);
        TRACE_LEAVE();
        return res;
@@ -1692,18 +1977,54 @@ done:
  */
 void avnd_comp_delete(AVND_COMP *comp)
 {
-       int env_counter;
-       SaStringT env;
+       int counter;
+       SaStringT str;
 
         /* Free saAmfCompCmdEnv[i] before freeing saAmfCompCmdEnv */
         if (comp->saAmfCompCmdEnv != NULL) {
-               env_counter = 0;
-               while ((env = comp->saAmfCompCmdEnv[env_counter++]) != NULL)
-                       delete [] env;
+               counter = 0;
+               while ((str = comp->saAmfCompCmdEnv[counter++]) != NULL)
+                       delete [] str;
                delete [] comp->saAmfCompCmdEnv;
         }
 
        delete comp->use_comptype_attr;
+       
+       if (comp->saAmfCompInstantiateCmdArgv != 0) {
+               counter = 0;
+               while ((str = comp->saAmfCompInstantiateCmdArgv[counter++]) != 
NULL)
+                       delete [] str;
+               delete [] comp->saAmfCompInstantiateCmdArgv;
+       }
+       
+       if (comp->saAmfCompTerminateCmdArgv != 0) {
+               counter = 0;
+               while ((str = comp->saAmfCompTerminateCmdArgv[counter++]) != 
NULL)
+                       delete [] str;
+               delete [] comp->saAmfCompTerminateCmdArgv;
+       }
+       
+       if (comp->saAmfCompCleanupCmdArgv != 0) {
+               counter = 0;
+               while ((str = comp->saAmfCompCleanupCmdArgv[counter++]) != NULL)
+                       delete [] str;
+               delete [] comp->saAmfCompCleanupCmdArgv;
+       }
+       
+       if (comp->saAmfCompAmStartCmdArgv != 0) {
+               counter = 0;
+               while ((str = comp->saAmfCompAmStartCmdArgv[counter++]) != NULL)
+                       delete [] str;
+               delete [] comp->saAmfCompAmStartCmdArgv;
+       }
+
+       if (comp->saAmfCompAmStopCmdArgv != 0) {
+               counter = 0;
+               while ((str = comp->saAmfCompAmStopCmdArgv[counter++]) != NULL)
+                       delete [] str;
+               delete [] comp->saAmfCompAmStopCmdArgv;
+       }
+
         delete comp;
        return;
 }
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_cb.h 
b/osaf/services/saf/amf/amfnd/include/avnd_cb.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_cb.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_cb.h
@@ -85,6 +85,7 @@ typedef struct avnd_cb_tag {
        /* database declarations */
        NCS_PATRICIA_TREE sudb; /* su db */
        NCS_PATRICIA_TREE compdb;       /* comp db */
+        NCS_PATRICIA_TREE comptypedb; /* comptype db */
        NCS_PATRICIA_TREE hcdb; /* healthcheck db */
        NCS_PATRICIA_TREE pgdb; /* pg db */
        NCS_PATRICIA_TREE nodeid_mdsdest_db;    /* pg db */
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_comp.h 
b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
@@ -386,6 +386,12 @@ typedef struct avnd_comp_tag {
 
        std::bitset<NumAttrs> *use_comptype_attr;
 
+        SaStringT *saAmfCompInstantiateCmdArgv;
+        SaStringT *saAmfCompTerminateCmdArgv;
+        SaStringT *saAmfCompCleanupCmdArgv;
+        SaStringT *saAmfCompAmStartCmdArgv;
+        SaStringT *saAmfCompAmStopCmdArgv;
+        SaStringT *osafAmfCompHcCmdArgv;
 } AVND_COMP;
 
 #define AVND_COMP_NULL ((AVND_COMP *)0)
@@ -830,6 +836,7 @@ extern void avnd_comp_cbq_rec_del(struct
 extern uint32_t avnd_comp_cbq_rec_send(struct avnd_cb_tag *, AVND_COMP *, 
AVND_COMP_CBK *, bool);
 
 extern uint32_t avnd_compdb_init(struct avnd_cb_tag *);
+extern uint32_t avnd_comptypedb_init(struct avnd_cb_tag *);
 extern AVND_COMP *avnd_compdb_rec_add(struct avnd_cb_tag *, AVND_COMP_PARAM *, 
uint32_t *);
 extern uint32_t avnd_compdb_rec_del(struct avnd_cb_tag *, SaNameT *);
 extern AVND_COMP_CSI_REC *avnd_compdb_csi_rec_get(struct avnd_cb_tag *, 
SaNameT *, SaNameT *);
diff --git a/osaf/services/saf/amf/amfnd/main.cc 
b/osaf/services/saf/amf/amfnd/main.cc
--- a/osaf/services/saf/amf/amfnd/main.cc
+++ b/osaf/services/saf/amf/amfnd/main.cc
@@ -340,6 +340,10 @@ AVND_CB *avnd_cb_create()
        /* initialize comp db */
        if (NCSCC_RC_SUCCESS != avnd_compdb_init(cb))
                goto err;
+       
+       /* initialize comptype db */
+       if (NCSCC_RC_SUCCESS != avnd_comptypedb_init(cb))
+               goto err;
 
        /* initialize healthcheck db */
        avnd_hcdb_init(cb);

------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to