Hi Hans N,
                The approach looks good.

Thanks
-Nagu

> -----Original Message-----
> From: Hans Nordeback [mailto:[email protected]]
> Sent: 27 June 2014 16:27
> To: [email protected]; Nagendra Kumar; Praveen Malviya
> Cc: [email protected]
> Subject: [PATCH 1 of 1] AMF: support immediate effect when changing comp-
> type attributes V1 [#819]
> 
>  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(&param, 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, &param);
> +             }
> +     }
> +}
> +
>  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

Reply via email to