osaf/services/saf/avsv/avd/avd_comp.cc      |   9 ++-
 osaf/services/saf/avsv/avd/avd_sg.cc        |   9 ++
 osaf/services/saf/avsv/avd/avd_su.cc        |  87 ++++++++++++++++++++++++--
 osaf/services/saf/avsv/avd/avd_sutype.cc    |  92 ++++++++++++++++++++++++++++-
 osaf/services/saf/avsv/avd/include/avd_su.h |   4 +-
 5 files changed, 188 insertions(+), 13 deletions(-)


Refloating the patch after incorporating comments.

diff --git a/osaf/services/saf/avsv/avd/avd_comp.cc 
b/osaf/services/saf/avsv/avd/avd_comp.cc
--- a/osaf/services/saf/avsv/avd/avd_comp.cc
+++ b/osaf/services/saf/avsv/avd/avd_comp.cc
@@ -1449,8 +1449,13 @@ static void comp_ccb_apply_delete_hdlr(s
        /* if SU is not being deleted and the PreInstantiable state has changed
         * then update the IMM with the new value for saAmfSUPreInstantiable */
        if (su_delete == SA_FALSE && old_val != 
comp->su->saAmfSUPreInstantiable) {
-               avd_saImmOiRtObjectUpdate(&comp->su->name, 
const_cast<SaImmAttrNameT>("saAmfSUPreInstantiable"), SA_IMM_ATTR_SAUINT32T,
-                               &comp->su->saAmfSUPreInstantiable);
+               avd_saImmOiRtObjectUpdate(&comp->su->name, 
const_cast<SaImmAttrNameT>("saAmfSUPreInstantiable"), 
+                               SA_IMM_ATTR_SAUINT32T, 
&comp->su->saAmfSUPreInstantiable);
+               /* If SU becomes NPI then enable saAmfSUFailover flag Sec 
3.11.1.3.2 AMF-B.04.01 spec */
+               if (!comp->su->saAmfSUPreInstantiable) {
+                       comp->su->saAmfSUFailover = true;
+                       su_nd_attribute_update(comp->su, saAmfSUFailOver_ID);
+               }
        }
 
        /* send a message to the AVND deleting the
diff --git a/osaf/services/saf/avsv/avd/avd_sg.cc 
b/osaf/services/saf/avsv/avd/avd_sg.cc
--- a/osaf/services/saf/avsv/avd/avd_sg.cc
+++ b/osaf/services/saf/avsv/avd/avd_sg.cc
@@ -1400,6 +1400,15 @@ void avd_sg_adjust_config(AVD_SG *sg)
                                        sg->saAmfSGMaxStandbySIsperSU, 
sg->name.value);
                }
                sg->saAmfSGMaxStandbySIsperSU = 1;
+               AVD_SU *su;
+               /* saAmfSUFailover must be true for a NPI SU sec 3.11.1.3.2 
AMF-B.04.01 spec */
+               for (su = sg->list_of_su; su != NULL; su = su->sg_list_su_next) 
{
+                       if (!su->saAmfSUFailover) {
+                               su->saAmfSUFailover = true;
+                               su_nd_attribute_update(su, saAmfSUFailOver_ID);
+                       }
+               }
+
        }
 
        /* adjust saAmfSGNumPrefInserviceSUs if not configured */
diff --git a/osaf/services/saf/avsv/avd/avd_su.cc 
b/osaf/services/saf/avsv/avd/avd_su.cc
--- a/osaf/services/saf/avsv/avd/avd_su.cc
+++ b/osaf/services/saf/avsv/avd/avd_su.cc
@@ -58,7 +58,7 @@ AVD_SU *avd_su_new(const SaNameT *dn)
        su->name.length = dn->length;
        su->tree_node.key_info = (uint8_t *)&(su->name);
        avsv_sanamet_init(dn, &sg_name, "safSg");
-       su->saAmfSUFailover = static_cast<SaBoolT>(false);
+       su->saAmfSUFailover = false;
        su->term_state = static_cast<SaBoolT>(false);
        su->su_switch = AVSV_SI_TOGGLE_STABLE;
        su->saAmfSUPreInstantiable = static_cast<SaBoolT>(false);
@@ -479,8 +479,10 @@ static AVD_SU *su_create(const SaNameT *
        }
 
        if (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSUFailover"), 
attributes, 0, &su->saAmfSUFailover) != SA_AIS_OK) {
-               su->saAmfSUFailover = 
static_cast<SaBoolT>(sut->saAmfSutDefSUFailover);
+               su->saAmfSUFailover = 
static_cast<bool>(sut->saAmfSutDefSUFailover);
        }
+       else 
+               su->saAmfSUFailover_configured = true;
 
        
(void)immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSUMaintenanceCampaign"), 
attributes, 0, &su->saAmfSUMaintenanceCampaign);
 
@@ -1228,9 +1230,17 @@ static SaAisErrorT su_ccb_completed_modi
                        continue;
 
                if (!strcmp(attr_mod->modAttr.attrName, "saAmfSUFailover")) {
-                       bool su_failover = *((SaTimeT 
*)attr_mod->modAttr.attrValues[0]);
+                       AVD_SU *su = avd_su_get(&opdata->objectName);
+                       uint32_t su_failover = *((SaUint32T 
*)attr_mod->modAttr.attrValues[0]);
+
+                       if (su->sg_of_su->sg_fsm_state != AVD_SG_FSM_STABLE) {
+                               rc = SA_AIS_ERR_TRY_AGAIN;
+                               TRACE("'%s' is not 
stable",su->sg_of_su->name.value); 
+                               goto done;
+                       }
+
                        if (su_failover > SA_TRUE) {
-                               LOG_ER("Invalid saAmfSUFailover %u", 
su_failover);
+                               LOG_ER("Invalid saAmfSUFailover SU:'%s'", 
su->name.value);
                                rc = SA_AIS_ERR_BAD_OPERATION;
                                goto done;
                        }
@@ -1410,10 +1420,15 @@ static void su_ccb_apply_modify_hdlr(str
                        value_is_deleted = false;
 
                if (!strcmp(attr_mod->modAttr.attrName, "saAmfSUFailover")) {
-                       if (value_is_deleted)
-                               su->saAmfSUFailover = 
static_cast<SaBoolT>(su->su_type->saAmfSutDefSUFailover);
-                       else
-                               su->saAmfSUFailover = 
static_cast<SaBoolT>(*((SaUint32T *)attr_mod->modAttr.attrValues[0]));
+                       if (value_is_deleted) {
+                               su->saAmfSUFailover = 
static_cast<bool>(su->su_type->saAmfSutDefSUFailover);
+                               su->saAmfSUFailover_configured = false;
+                       }
+                       else {
+                               su->saAmfSUFailover = 
static_cast<bool>(*((SaUint32T *)attr_mod->modAttr.attrValues[0]));
+                               su->saAmfSUFailover_configured = true;
+                       }
+                       su_nd_attribute_update(su, saAmfSUFailOver_ID);
                } else if (!strcmp(attr_mod->modAttr.attrName, 
"saAmfSUMaintenanceCampaign")) {
                        if (value_is_deleted) {
                                su->saAmfSUMaintenanceCampaign.length = 0;
@@ -1432,7 +1447,14 @@ static void su_ccb_apply_modify_hdlr(str
                        su->saAmfSUType = sutype_name;
                        su->su_type = sut;
                        avd_sutype_add_su(su);
-                       su->saAmfSUFailover = 
static_cast<SaBoolT>(sut->saAmfSutDefSUFailover);
+                       if (su->saAmfSUPreInstantiable) {
+                               su->saAmfSUFailover = 
static_cast<bool>(sut->saAmfSutDefSUFailover);
+                               su->saAmfSUFailover_configured = false;
+                       } else {
+                               su->saAmfSUFailover = true;
+                               su->saAmfSUFailover_configured = true;
+                       }
+                       su_nd_attribute_update(su, saAmfSUFailOver_ID);
                        su->su_is_external = sut->saAmfSutIsExternal;
                } else
                        osafassert(0);
@@ -1565,3 +1587,50 @@ void avd_su_constructor(void)
        avd_class_impl_set(const_cast<SaImmClassNameT>("SaAmfSU"), 
su_rt_attr_cb, su_admin_op_cb, su_ccb_completed_cb, su_ccb_apply_cb);
 }
 
+/**
+ * send update of SU attribute to node director 
+ * @param su
+ * @param attrib_id
+ */
+void su_nd_attribute_update(const AVD_SU *su, AVSV_AMF_SU_ATTR_ID attrib_id)
+{
+       AVD_AVND *su_node_ptr = NULL;
+       AVSV_PARAM_INFO param;
+       memset(((uint8_t *)&param), '\0', sizeof(AVSV_PARAM_INFO));
+
+       TRACE_ENTER();
+
+       if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) {
+               TRACE_LEAVE2("avd is not in active state");
+               return;
+       }
+       m_AVD_GET_SU_NODE_PTR(avd_cb, su, su_node_ptr);
+       param.class_id = AVSV_SA_AMF_SU;
+       param.act = AVSV_OBJ_OPR_MOD;
+       param.name = su->name;
+
+       switch (attrib_id) {
+       case saAmfSUFailOver_ID:
+       {
+               uint32_t sufailover; 
+               param.attr_id = saAmfSUFailOver_ID;
+               param.value_len = sizeof(uint32_t);
+               sufailover = htonl(su->saAmfSUFailover);
+               memcpy(&param.value[0], &sufailover, param.value_len);
+               break;
+       }
+       default:
+               osafassert(0);
+       }
+
+       /*Update this value on the node hosting this SU*/
+       if ((su_node_ptr) && ((su_node_ptr->node_state == 
AVD_AVND_STATE_PRESENT) ||
+                       (su_node_ptr->node_state == AVD_AVND_STATE_NO_CONFIG) ||
+                       (su_node_ptr->node_state == AVD_AVND_STATE_NCS_INIT))) {
+               if (avd_snd_op_req_msg(avd_cb, su_node_ptr, &param) != 
NCSCC_RC_SUCCESS) {
+                       LOG_ER("%s:failed for %s",__FUNCTION__, 
su_node_ptr->name.value);
+               }
+       }
+
+       TRACE_LEAVE();
+}
diff --git a/osaf/services/saf/avsv/avd/avd_sutype.cc 
b/osaf/services/saf/avsv/avd/avd_sutype.cc
--- a/osaf/services/saf/avsv/avd/avd_sutype.cc
+++ b/osaf/services/saf/avsv/avd/avd_sutype.cc
@@ -237,6 +237,40 @@ done1:
        return error;
 }
 
+/**
+ * This function handles modify operations on SaAmfSUType objects. 
+ * @param ptr to opdata 
+ */
+static void sutype_ccb_apply_modify_hdlr(struct CcbUtilOperationData *opdata)
+{
+       const SaImmAttrModificationT_2 *attr_mod;
+       int i = 0;
+
+       TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, 
opdata->objectName.value);
+       avd_sutype *sut = avd_sutype_get(&opdata->objectName);
+
+       while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) {
+               if (!strcmp(attr_mod->modAttr.attrName, 
"saAmfSutDefSUFailover")) {
+                       uint32_t old_value = sut->saAmfSutDefSUFailover;
+                       sut->saAmfSutDefSUFailover = *((SaUint32T 
*)attr_mod->modAttr.attrValues[0]);
+                       /* Modify saAmfSUFailover for SUs which had inherited 
saAmfSutDefSUFailover.
+                               Modification will not be done for the NPI SU */
+                       if (old_value != sut->saAmfSutDefSUFailover) {
+                               AVD_SU *su;
+                               for (su = sut->list_of_su; su; su = 
su->su_list_su_type_next) { 
+                                       if ((!su->saAmfSUFailover_configured) 
&& (su->saAmfSUPreInstantiable)) {
+                                               su->saAmfSUFailover = 
static_cast<bool>(sut->saAmfSutDefSUFailover);
+                                               su_nd_attribute_update(su, 
saAmfSUFailOver_ID);
+                                       }
+                               }
+                       }
+               } else
+                       osafassert(0);
+       }
+
+       TRACE_LEAVE();
+}
+
 static void sutype_ccb_apply_cb(CcbUtilOperationData_t *opdata)
 {
        struct avd_sutype *sut;
@@ -249,6 +283,9 @@ static void sutype_ccb_apply_cb(CcbUtilO
                osafassert(sut);
                sutype_db_add(sut);
                break;
+       case CCBUTIL_MODIFY:
+               sutype_ccb_apply_modify_hdlr(opdata);
+               break;
        case CCBUTIL_DELETE:
                sut = avd_sutype_get(&opdata->objectName);
                sutype_db_delete(sut);
@@ -262,6 +299,59 @@ static void sutype_ccb_apply_cb(CcbUtilO
        TRACE_LEAVE();
 }
 
+/**
+ * This routine validates modify CCB operations on SaAmfSUType objects.
+ * @param   Ccb Util Oper Data
+ */
+
+static SaAisErrorT sutype_ccb_completed_modify_hdlr(CcbUtilOperationData_t 
*opdata)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       const SaImmAttrModificationT_2 *attr_mod;
+       int i = 0;
+       avd_sutype *sut = avd_sutype_get(&opdata->objectName);
+
+       TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, 
opdata->objectName.value);
+       while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) {
+               
+               if ((attr_mod->modType == SA_IMM_ATTR_VALUES_DELETE) || 
(attr_mod->modAttr.attrValues == NULL)) {
+                       LOG_ER("Attributes cannot be deleted in SaAmfSUType");
+                       rc = SA_AIS_ERR_BAD_OPERATION;
+                       goto done;
+               }
+
+               if (!strcmp(attr_mod->modAttr.attrName, 
"saAmfSutDefSUFailover")) {
+                       AVD_SU *su; 
+                       uint32_t sut_failover = *((SaUint32T 
*)attr_mod->modAttr.attrValues[0]);
+
+                       if (sut_failover > SA_TRUE) {
+                               LOG_ER("invalid saAmfSutDefSUFailover in:'%s'", 
sut->name.value);
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                                       goto done;
+                       }       
+       
+                       for (su = sut->list_of_su; su; su = 
su->su_list_su_type_next) {  
+                               if (su->saAmfSUFailover_configured)
+                                       continue;
+
+                               if (su->sg_of_su->sg_fsm_state != 
AVD_SG_FSM_STABLE) {
+                                       rc = SA_AIS_ERR_TRY_AGAIN;
+                                       LOG_WA("SG state is not stable"); 
+                                       goto done;
+                               }
+                       }
+               } else {
+                       LOG_ER("attribute is non writable:'%s' ", 
attr_mod->modAttr.attrName);
+                       rc = SA_AIS_ERR_BAD_OPERATION;
+                       goto done;
+               }
+       }
+
+done:
+       TRACE_LEAVE();
+       return rc;
+}
+
 static SaAisErrorT sutype_ccb_completed_cb(CcbUtilOperationData_t *opdata)
 {
        SaAisErrorT rc = SA_AIS_ERR_BAD_OPERATION;
@@ -278,7 +368,7 @@ static SaAisErrorT sutype_ccb_completed_
                    rc = SA_AIS_OK;
                break;
        case CCBUTIL_MODIFY:
-               LOG_ER("Modification of SaAmfSUType not supported");
+               rc = sutype_ccb_completed_modify_hdlr(opdata);
                break;
        case CCBUTIL_DELETE:
                sut = avd_sutype_get(&opdata->objectName);
diff --git a/osaf/services/saf/avsv/avd/include/avd_su.h 
b/osaf/services/saf/avsv/avd/include/avd_su.h
--- a/osaf/services/saf/avsv/avd/include/avd_su.h
+++ b/osaf/services/saf/avsv/avd/include/avd_su.h
@@ -63,7 +63,8 @@ typedef struct avd_su_tag {
        SaNameT saAmfSUType;
        uint32_t saAmfSURank;
        SaNameT saAmfSUHostNodeOrNodeGroup;
-       SaBoolT saAmfSUFailover;
+       bool saAmfSUFailover;
+       bool saAmfSUFailover_configured; /* True when user configures 
saAmfSUFailover else false */
        SaNameT saAmfSUMaintenanceCampaign;
 
        /* runtime attributes */
@@ -239,5 +240,6 @@ extern void avd_su_inc_curr_stdby_si(AVD
 extern void avd_su_dec_curr_stdby_si(AVD_SU *su);
 extern uint32_t avd_su_get_current_no_of_assignments(AVD_SU *su, SaAmfHAStateT 
ha_state);
 extern AVD_SU *avd_su_get_or_create(const SaNameT *dn);
+extern void su_nd_attribute_update(const AVD_SU *su, AVSV_AMF_SU_ATTR_ID 
attrib_id);
 
 #endif

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to