osaf/services/saf/avsv/avd/avd_sg.cc        |   16 +++-
 osaf/services/saf/avsv/avd/avd_sgtype.cc    |  106 +++++++++++++++++++++++++++-
 osaf/services/saf/avsv/avd/include/avd_sg.h |    3 +-
 3 files changed, 119 insertions(+), 6 deletions(-)


Refloating the patch after incorporating comments.

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
@@ -293,7 +293,10 @@ static AVD_SG *sg_create(const SaNameT *
 
        if (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSGAutoRepair"), 
attributes, 0, &sg->saAmfSGAutoRepair) != SA_AIS_OK) {
                sg->saAmfSGAutoRepair = sgt->saAmfSgtDefAutoRepair;
+               sg->saAmfSGAutoRepair_configured = false;
        }
+       else 
+               sg->saAmfSGAutoRepair_configured = true; 
 
        if (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSGAutoAdjust"), 
attributes, 0, &sg->saAmfSGAutoAdjust) != SA_AIS_OK) {
                sg->saAmfSGAutoAdjust = sgt->saAmfSgtDefAutoAdjust;
@@ -527,6 +530,12 @@ static SaAisErrorT ccb_completed_modify_
                                rc = SA_AIS_ERR_BAD_OPERATION;
                                goto done;
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGAutoRepair")) {
+                               uint32_t sg_autorepair = *((SaUint32T 
*)attribute->attrValues[0]);
+                               if (sg_autorepair > SA_TRUE) {
+                                       LOG_ER("Invalid saAmfSGAutoRepair 
SG:'%s'", avd_sg->name.value);
+                                       rc = SA_AIS_ERR_BAD_OPERATION;
+                                       goto done;
+                               }
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGAutoAdjust")) {
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGNumPrefActiveSUs")) {
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGNumPrefStandbySUs")) {
@@ -744,10 +753,13 @@ static void ccb_apply_modify_hdlr(CcbUti
                                sg_nd_attribute_update(sg, 
saAmfSGCompRestartProb_ID);
                                sg_nd_attribute_update(sg, 
saAmfSGCompRestartMax_ID);
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGAutoRepair")) {
-                               if (value_is_deleted)
+                               if (value_is_deleted) {
                                        sg->saAmfSGAutoRepair = 
sg_type->saAmfSgtDefAutoRepair;
-                               else
+                                       sg->saAmfSGAutoRepair_configured = 
false;
+                               } else {
                                        sg->saAmfSGAutoRepair = 
static_cast<SaBoolT>(*((SaUint32T *)value));
+                                       sg->saAmfSGAutoRepair_configured = 
true; 
+                               }
                        } else if (!strcmp(attribute->attrName, 
"saAmfSGAutoAdjust")) {
                                if (value_is_deleted)
                                        sg->saAmfSGAutoAdjust = 
sg_type->saAmfSgtDefAutoAdjust;
diff --git a/osaf/services/saf/avsv/avd/avd_sgtype.cc 
b/osaf/services/saf/avsv/avd/avd_sgtype.cc
--- a/osaf/services/saf/avsv/avd/avd_sgtype.cc
+++ b/osaf/services/saf/avsv/avd/avd_sgtype.cc
@@ -221,7 +221,10 @@ static AVD_AMF_SG_TYPE *sgtype_create(Sa
 
        if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSgtDefAutoRepair"), 
attributes, 0, &sgt->saAmfSgtDefAutoRepair) != SA_AIS_OK) {
                sgt->saAmfSgtDefAutoRepair = SA_TRUE;
+               sgt->saAmfSgtDefAutoRepair_configured = false;
        }
+       else
+               sgt->saAmfSgtDefAutoRepair_configured = true;
 
        if 
(immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSgtDefAutoAdjust"), 
attributes, 0, &sgt->saAmfSgtDefAutoAdjust) != SA_AIS_OK) {
                sgt->saAmfSgtDefAutoAdjust = SA_FALSE;
@@ -314,6 +317,56 @@ SaAisErrorT avd_sgtype_config_get(void)
        return error;
 }
 
+
+/**
+ * This routine validates modify CCB operations on SaAmfSGType objects.
+ * @param   Ccb Util Oper Data
+ * @return 
+ */
+
+static SaAisErrorT sgtype_ccb_completed_modify_hdlr(CcbUtilOperationData_t 
*opdata)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       const SaImmAttrModificationT_2 *attr_mod;
+       int i = 0;
+       AVD_AMF_SG_TYPE *sgt = avd_sgtype_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))
+                       continue;
+
+               if (!strcmp(attr_mod->modAttr.attrName, 
"saAmfSgtDefAutoRepair")) {
+
+                       uint32_t sgt_autorepair = *((SaUint32T 
*)attr_mod->modAttr.attrValues[0]);
+                       if (sgt_autorepair > SA_TRUE) {
+                               LOG_ER("invalid saAmfSgtDefAutoRepair in:'%s'", 
sgt->name.value);
+                               rc = SA_AIS_ERR_BAD_OPERATION;
+                                       goto done;
+                       }       
+       
+                       AVD_SG *sg;
+                       for (sg = sgt->list_of_sg; sg; sg = 
sg->sg_list_sg_type_next) {  
+                               if (sg->saAmfSGAutoRepair_configured)
+                                       continue;
+                               if (sg->saAmfSGAdminState != 
SA_AMF_ADMIN_LOCKED_INSTANTIATION) {
+                                       rc = SA_AIS_ERR_BAD_OPERATION;
+                                       LOG_WA("SG state is not in Lock-in 
state:'%s'",sg->name.value); 
+                                       goto done;
+                               }
+                       }
+               } else {
+                       LOG_ER("Modification of attribute is Not Supported:'%s' 
", attr_mod->modAttr.attrName);
+                       rc = SA_AIS_ERR_BAD_OPERATION;
+                       goto done;
+               }
+       }
+
+done:
+       return rc;
+}
+
 /**
  * Validate SaAmfSGType CCB completed
  * @param opdata
@@ -336,8 +389,7 @@ static SaAisErrorT sgtype_ccb_completed_
                        rc = SA_AIS_OK;
                break;
        case CCBUTIL_MODIFY:
-               LOG_ER("Modification of SaAmfSGType not supported");
-               goto done;
+               rc = sgtype_ccb_completed_modify_hdlr(opdata);
                break;
        case CCBUTIL_DELETE:
                sgt = avd_sgtype_get(&opdata->objectName);
@@ -373,6 +425,52 @@ done:
 }
 
 /**
+ * This function handles modify operations on SaAmfSGType objects. 
+ * @param ptr to opdata 
+ */
+static void sgtype_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_AMF_SG_TYPE *sgt = avd_sgtype_get(&opdata->objectName);
+
+       while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) {
+               bool value_is_deleted; 
+               if ((attr_mod->modType == SA_IMM_ATTR_VALUES_DELETE) || 
(attr_mod->modAttr.attrValues == NULL))
+                       /* Attribute value is deleted, revert to default value 
*/
+                       value_is_deleted = true;
+               else 
+                       /* Attribute value is modified */
+                       value_is_deleted = false;
+               
+               if (!strcmp(attr_mod->modAttr.attrName, 
"saAmfSgtDefAutoRepair")) {
+                       SaBoolT old_value = sgt->saAmfSgtDefAutoRepair;
+                       if (value_is_deleted) {
+                               sgt->saAmfSgtDefAutoRepair = 
static_cast<SaBoolT>(true);
+                               sgt->saAmfSgtDefAutoRepair_configured = false;
+                       } else {
+                               sgt->saAmfSgtDefAutoRepair = 
static_cast<SaBoolT>(*((SaUint32T *)attr_mod->modAttr.attrValues[0]));
+                               sgt->saAmfSgtDefAutoRepair_configured = true; 
+                       }
+                       /* Modify saAmfSGAutoRepair for SGs which had inherited 
saAmfSgtDefAutoRepair.*/
+                       if (old_value != sgt->saAmfSgtDefAutoRepair) {
+                               AVD_SG *sg;
+                               for (sg = sgt->list_of_sg; sg; sg = 
sg->sg_list_sg_type_next) {  
+                                       if (!sg->saAmfSGAutoRepair_configured)
+                                               sg->saAmfSGAutoRepair = 
static_cast<SaBoolT>(sgt->saAmfSgtDefAutoRepair);
+                               }
+                       }
+               } 
+       }
+
+       TRACE_LEAVE();
+}
+
+
+/**
  * Apply SaAmfSGType CCB changes
  * @param opdata
  * 
@@ -390,6 +488,9 @@ static void sgtype_ccb_apply_cb(CcbUtilO
                osafassert(sgt);
                sgtype_add_to_model(sgt);
                break;
+       case CCBUTIL_MODIFY:
+               sgtype_ccb_apply_modify_hdlr(opdata);
+               break;
        case CCBUTIL_DELETE:
                sgtype_delete(static_cast<AVD_AMF_SG_TYPE*>(opdata->userData));
                break;
@@ -410,4 +511,3 @@ void avd_sgtype_constructor(void)
        avd_class_impl_set(const_cast<SaImmClassNameT>("SaAmfSGType"), NULL, 
NULL, sgtype_ccb_completed_cb, sgtype_ccb_apply_cb);
        avd_class_impl_set(const_cast<SaImmClassNameT>("SaAmfSGBaseType"), 
NULL, NULL, avd_imm_default_OK_completed_cb, NULL);
 }
-
diff --git a/osaf/services/saf/avsv/avd/include/avd_sg.h 
b/osaf/services/saf/avsv/avd/include/avd_sg.h
--- a/osaf/services/saf/avsv/avd/include/avd_sg.h
+++ b/osaf/services/saf/avsv/avd/include/avd_sg.h
@@ -69,6 +69,7 @@ typedef struct avd_sg_tag {
                                 * Checkpointing - Sent as a one time update.
                                 */
 
+       bool saAmfSGAutoRepair_configured; /* True when user configures 
saAmfSGAutoRepair else false */
    /******************** B.04 model 
*************************************************/
        SaNameT saAmfSGType;    /* Network order. */
        SaNameT saAmfSGSuHostNodeGroup; /* Network order. */
@@ -242,7 +243,7 @@ typedef struct avd_sg_tag {
 typedef struct avd_amf_sg_type_tag {
        NCS_PATRICIA_NODE tree_node;    /* key will be sg type name */
        SaNameT name;
-
+       bool saAmfSgtDefAutoRepair_configured; /* True when user configures 
saAmfSGDefAutoRepair else false */
    /******************** B.04 model 
*************************************************/
        SaNameT *saAmfSGtValidSuTypes;  /* array of DNs, size in number_su_type 
*/
        SaAmfRedundancyModelT saAmfSgtRedundancyModel;

------------------------------------------------------------------------------
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