osaf/libs/common/amf/include/amf_defs.h | 8 ++
osaf/services/saf/amf/amfd/comptype.cc | 70 ++++++++++++++++++++-
osaf/services/saf/amf/amfnd/compdb.cc | 81 +++++++++++++++++++++++++
osaf/services/saf/amf/amfnd/di.cc | 3 +
osaf/services/saf/amf/amfnd/hcdb.cc | 4 +-
osaf/services/saf/amf/amfnd/include/avnd_comp.h | 13 ++++
6 files changed, 175 insertions(+), 4 deletions(-)
This V1 is not complete, more attributes is to be added
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
@@ -247,6 +247,14 @@ typedef enum
saAmfCompType_ID,
} AVSV_AMF_COMP_ATTR_ID;
+/* Attribute ID enum for the saAmfCompType class */
+typedef enum
+{
+ saAmfCtDefCallbackTimeout_ID = 1,
+ saAmfCtDefClcCliTimeout_ID = 2,
+ saAmfCtDefQuiescingCompleteTimeout_ID = 3
+} AVSV_AMF_COMPTYPE_ATTR_ID;
+
/* Attribute ID enum for the SaAmfHealthcheck class */
typedef enum
{
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
@@ -15,7 +15,9 @@
* Ericsson
*
*/
-
+#include <set>
+#include <string.h>
+#include "node.h"
#include <saImmOm.h>
#include <immutil.h>
#include <logtrace.h>
@@ -396,6 +398,70 @@ done1:
return rc;
}
+static void ccb_apply_modify_hdlr(const CcbUtilOperationData_t *opdata)
+{
+ const SaImmAttrModificationT_2 *attr_mod;
+ int i;
+ const AVD_COMP_TYPE *comp_type;
+ SaNameT comp_type_name;
+
+ TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId,
opdata->objectName.value);
+
+ // input example: opdata.objectName.value,
safVersion=1,safCompType=AmfDemo1
+ comp_type_name = opdata->objectName;
+
+ if ((comp_type = comptype_db->find(Amf::to_string(&comp_type_name))) ==
0) {
+ LOG_ER("Internal error: %s not found", comp_type_name.value);
+ return;
+ }
+
+ // Create a set of nodes where components "may" be using the given
comp_type attributes.
+ // A msg will be sent to the related node regarding this change. If a
component has an
+ // comp_type attribute that overrides this comp_type attribute it will
be handled by the amfnd.
+ std::set<AVD_AVND*, NodeNameCompare> node_set;
+
+ AVD_COMP *comp = comp_type->list_of_comp;
+ while (comp != NULL) {
+ node_set.insert(comp->su->su_on_node);
+ TRACE("comp name %s on node %s", comp->comp_info.name.value,
comp->su->su_on_node->name.value);
+ comp = comp->comp_type_list_comp_next;
+ }
+
+ std::set<AVD_AVND*>::iterator it;
+ for (it = node_set.begin(); it != node_set.end(); ++it) {
+ i = 0;
+ while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL)
{
+ AVSV_PARAM_INFO param;
+ const SaImmAttrValuesT_2 *attribute =
&attr_mod->modAttr;
+ SaTimeT *param_val = (SaTimeT
*)attribute->attrValues[0];
+
+ memset(¶m, 0, sizeof(param));
+ param.class_id = AVSV_SA_AMF_COMP_TYPE;
+ param.act = AVSV_OBJ_OPR_MOD;
+ param.name = opdata->objectName;
+ param.value_len = sizeof(*param_val);
+ memcpy(param.value, param_val, param.value_len);
+
+ if (!strcmp(attribute->attrName,
"saAmfCtDefCallbackTimeout")) {
+ TRACE("saAmfCtDefCallbackTimeout to '%llu' for
compType '%s' on node '%s'", *param_val,
+ opdata->objectName.value,
(*it)->name.value);
+ param.attr_id = saAmfCtDefCallbackTimeout_ID;
+ } else if (!strcmp(attribute->attrName,
"saAmfCtDefClcCliTimeout")) {
+ TRACE("saAmfCtDefClcCliTimeout modified to
'%llu' for compType '%s' on node '%s", *param_val,
+ opdata->objectName.value,
(*it)->name.value);
+ param.attr_id = saAmfCtDefClcCliTimeout_ID;
+ } else if (!strcmp(attribute->attrName,
"saAmfCtDefQuiescingCompleteTimeout")) {
+ TRACE("saAmfCtDefQuiescingCompleteTimeout
modified to '%llu' for compType '%s' on node '%s", *param_val,
+ opdata->objectName.value,
(*it)->name.value);
+ param.attr_id =
saAmfCtDefQuiescingCompleteTimeout_ID;
+ } else
+ LOG_WA("Unexpected attribute name: %s",
attribute->attrName);
+
+ avd_snd_op_req_msg(avd_cb, *it, ¶m);
+ }
+ }
+}
+
static void comptype_ccb_apply_cb(CcbUtilOperationData_t *opdata)
{
AVD_COMP_TYPE *comp_type;
@@ -413,7 +479,7 @@ static void comptype_ccb_apply_cb(CcbUti
comptype_delete(static_cast<AVD_COMP_TYPE*>(opdata->userData));
break;
case CCBUTIL_MODIFY:
- // values not used, no need to reinitialize type
+ ccb_apply_modify_hdlr(opdata);
break;
default:
osafassert(0);
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
@@ -888,6 +888,84 @@ done:
return rc;
}
+uint32_t avnd_comptype_oper_req(AVND_CB *cb, AVSV_PARAM_INFO *param)
+{
+ uint32_t rc = NCSCC_RC_FAILURE;
+
+ AVND_COMP * comp;
+ const char* comp_type_name;
+ SaTimeT saAmfCtDefCallbackTimeout = 0;
+ SaTimeT saAmfCtDefClcCliTimeout = 0;
+ SaTimeT saAmfCtDefQuiescingCompleteTimeout = 0;
+
+ TRACE_ENTER2("Op %u, %s", param->act, param->name.value);
+
+ switch (param->act) {
+ case AVSV_OBJ_OPR_MOD: {
+ switch (param->attr_id) {
+ case saAmfCtDefCallbackTimeout_ID:
+ osafassert(sizeof(SaTimeT) == param->value_len);
+ saAmfCtDefCallbackTimeout = *((SaTimeT *)param->value);
+ TRACE("name: %s value: %llu", param->name.value,
saAmfCtDefCallbackTimeout);
+
+ // 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);
+ // 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) {
+ TRACE("comp name: %s , comp_type: %s",
comp->name.value, comp->saAmfCompType.value);
+ // 3. comptype found, check if
component uses this comptype attribute value or if
+ // component has specialized this
attribute value.
+ if
(comp->use_comptype_attr.test(PxiedInstCallbackTimeout)) {
+ comp->pxied_inst_cbk_timeout =
saAmfCtDefCallbackTimeout;
+ }
+ if
(comp->use_comptype_attr.test(TerminateCallbackTimeout)) {
+ comp->term_cbk_timeout =
saAmfCtDefCallbackTimeout;
+ }
+ if
(comp->use_comptype_attr.test(PxiedCleanupCallbackTimeout)) {
+ comp->pxied_clean_cbk_timeout =
saAmfCtDefCallbackTimeout;
+ }
+ }
+ comp = (AVND_COMP *)
ncs_patricia_tree_getnext(&cb->compdb, (uint8_t *)&comp->name);
+ }
+ // End TODO(UABHANO)
+
+ break;
+ case saAmfCtDefClcCliTimeout_ID:
+ osafassert(sizeof(SaTimeT) == param->value_len);
+ saAmfCtDefClcCliTimeout = *((SaTimeT *)param->value);
+ TRACE("name: %s value: %llu", param->name.value,
saAmfCtDefClcCliTimeout);
+ break;
+ case saAmfCtDefQuiescingCompleteTimeout_ID:
+ saAmfCtDefQuiescingCompleteTimeout = *((SaTimeT
*)param->value);
+ TRACE("name: %s value: %llu", param->name.value,
saAmfCtDefQuiescingCompleteTimeout);
+ break;
+ }
+ }
+ case AVSV_OBJ_OPR_DEL: {
+ // Do nothing
+ break;
+ }
+ default:
+ LOG_NO("%s: Unsupported action %u", __FUNCTION__, param->act);
+ goto done;
+ }
+
+ rc = NCSCC_RC_SUCCESS;
+
+done:
+ rc = NCSCC_RC_SUCCESS;
+
+ TRACE_LEAVE();
+
+ return rc;
+}
+
static void avnd_comptype_delete(amf_comp_type_t *compt)
{
int arg_counter;
@@ -1270,6 +1348,7 @@ static void init_clc_cli_attributes(AVND
attributes, 0, &cmd->timeout) != SA_AIS_OK) {
cmd->timeout = comptype->saAmfCtDefClcCliTimeout;
comp->pxied_inst_cbk_timeout =
comptype->saAmfCtDefCallbackTimeout;
+ comp->use_comptype_attr.set(PxiedInstCallbackTimeout);
} else {
comp->pxied_inst_cbk_timeout = cmd->timeout;
}
@@ -1286,6 +1365,7 @@ static void init_clc_cli_attributes(AVND
if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) {
cmd->timeout = comptype->saAmfCtDefCallbackTimeout;
comp->term_cbk_timeout = cmd->timeout;
+ comp->use_comptype_attr.set(TerminateCallbackTimeout);
}
else
cmd->timeout = comptype->saAmfCtDefClcCliTimeout;
@@ -1302,6 +1382,7 @@ static void init_clc_cli_attributes(AVND
attributes, 0, &cmd->timeout) != SA_AIS_OK) {
cmd->timeout = comptype->saAmfCtDefClcCliTimeout;
comp->pxied_clean_cbk_timeout =
comptype->saAmfCtDefCallbackTimeout;
+ comp->use_comptype_attr.set(PxiedCleanupCallbackTimeout);
} else {
comp->pxied_clean_cbk_timeout = cmd->timeout;
}
diff --git a/osaf/services/saf/amf/amfnd/di.cc
b/osaf/services/saf/amf/amfnd/di.cc
--- a/osaf/services/saf/amf/amfnd/di.cc
+++ b/osaf/services/saf/amf/amfnd/di.cc
@@ -225,6 +225,9 @@ uint32_t avnd_evt_avd_operation_request_
case AVSV_SA_AMF_COMP:
rc = avnd_comp_oper_req(cb, param);
break;
+ case AVSV_SA_AMF_COMP_TYPE:
+ rc = avnd_comptype_oper_req(cb, param);
+ break;
case AVSV_SA_AMF_HEALTH_CHECK:
rc = avnd_hc_oper_req(cb, param);
break;
diff --git a/osaf/services/saf/amf/amfnd/hcdb.cc
b/osaf/services/saf/amf/amfnd/hcdb.cc
--- a/osaf/services/saf/amf/amfnd/hcdb.cc
+++ b/osaf/services/saf/amf/amfnd/hcdb.cc
@@ -368,7 +368,7 @@ static void comp_hctype_update_compdb(AV
{
AVND_COMP_HC_REC *comp_hc_rec;
AVND_COMP * comp;
- char *comp_type_name;
+ const char *comp_type_name;
AVSV_HLT_KEY hlt_chk;
AVND_COMP_HC_REC tmp_hc_rec;
@@ -385,7 +385,7 @@ static void comp_hctype_update_compdb(AV
// 3. matching compType found, check that component
does not have a SaAmfHealthcheck rec (specialization)
std::string hlt_chk_key = search_key((const char*)
param->name.value, "safHealthcheckKey=");
- if (hlt_chk_key.size() == 0) {
+ if (hlt_chk_key.empty()) {
LOG_ER("%s: failed to get healthcheckKey from
%s", __FUNCTION__, param->name.value);
return;
}
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
@@ -30,6 +30,8 @@
#ifndef AVND_COMP_H
#define AVND_COMP_H
+#include <bitset>
+
struct avnd_cb_tag;
struct avnd_su_si_rec;
struct avnd_su_tag;
@@ -279,6 +281,13 @@ typedef struct avnd_pxied_rec {
typedef AVSV_COMP_INFO AVND_COMP_PARAM;
+enum UsedComptypeAttrs {
+ PxiedInstCallbackTimeout,
+ PxiedCleanupCallbackTimeout,
+ TerminateCallbackTimeout,
+ NumAttrs
+};
+
typedef struct avnd_comp_tag {
NCS_PATRICIA_NODE tree_node; /* comp tree node (key is comp name) */
NCS_DB_LINK_LIST_NODE su_dll_node; /* su dll node (key is
inst-level) */
@@ -361,6 +370,9 @@ typedef struct avnd_comp_tag {
bool assigned_flag; /* Used in finding multiple csi for a single comp
while csi mod.*/
bool pending_delete; /* Used in deleting component when su is in
instantiated state.*/
+
+
+ std::bitset<NumAttrs> use_comptype_attr;
} AVND_COMP;
@@ -874,6 +886,7 @@ extern AVND_COMP_HC_REC *avnd_mbcsv_comp
extern void avnd_mbcsv_comp_hc_rec_del(struct avnd_cb_tag *cb, AVND_COMP
*comp, AVND_COMP_HC_REC *rec);
extern uint32_t avnd_comp_oper_req(struct avnd_cb_tag *cb, AVSV_PARAM_INFO
*param);
+extern uint32_t avnd_comptype_oper_req(struct avnd_cb_tag *cb, AVSV_PARAM_INFO
*param);
extern unsigned int avnd_comp_config_get_su(struct avnd_su_tag *su);
extern int avnd_comp_config_reinit(AVND_COMP *comp);
extern void avnd_comp_delete(AVND_COMP *comp);
------------------------------------------------------------------------------
Open source business process management suite built on Java and Eclipse
Turn processes into business applications with Bonita BPM Community Edition
Quickly connect people, data, and systems into organized workflows
Winner of BOSSIE, CODIE, OW2 and Gartner awards
http://p.sf.net/sfu/Bonitasoft
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel