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, ¶m);
+ } 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, ¶m);
+ } 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, ¶m);
+ } 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, ¶m);
+ } 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, ¶m);
+ } 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, ¶m);
} 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, ¶ms);
+ 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