Hi Praveen

Ack with one comment below (review only)

Thanks
Gary

> On 10 Nov. 2016, at 6:13 pm, [email protected] wrote:
> 
> osaf/services/saf/amf/amfd/ckpt_updt.cc   |    4 +
> osaf/services/saf/amf/amfd/imm.cc         |  386 
> +++++++++++++++++++++++++++++-
> osaf/services/saf/amf/amfd/include/imm.h  |   22 +-
> osaf/services/saf/amf/amfd/include/util.h |    2 +
> osaf/services/saf/amf/amfd/siass.cc       |    7 +-
> osaf/services/saf/amf/amfd/util.cc        |   28 ++
> 6 files changed, 438 insertions(+), 11 deletions(-)
> 
> 
> V2:Incorporated comments given by Gary.
> 
> App Si is moving to UNASSIGNED state after middleware failover.
> 
> Standby controller maintains a job queue for SU, SISU and COMPCSI.
> In job queue both old and new state of a object or attribute will be present.
> The issue is not observed normally because standby will update correct
> state eventually from old to new. In the cases mentioned in the ticket:
> -in one case, SI was deleted. Because of this after failover, IMM returns 
> failure for creating the SISU because
>  this new active AMFD is executing old job.
> -in other case, Su was deleted and was added with new state. Here also after 
> failover new active AMFD updates
>  IMM with old state as it is executing old job.
> 
> Patch fixes the problem by:
> -remebering if job was created in active or stadby state of AMFD.
> -After failover if new active finds some job that was created in standby 
> state, it checks
>  the status of objects or attributes and based on that job will be executed 
> with latest values or simple deleted.
> 
> diff --git a/osaf/services/saf/amf/amfd/ckpt_updt.cc 
> b/osaf/services/saf/amf/amfd/ckpt_updt.cc
> --- a/osaf/services/saf/amf/amfd/ckpt_updt.cc
> +++ b/osaf/services/saf/amf/amfd/ckpt_updt.cc
> @@ -463,6 +463,10 @@ uint32_t avd_ckpt_siass(AVD_CL_CB *cb, A
>                       } else {
>                               su_si_rel_ptr->comp_name = "";
>                               su_si_rel_ptr->csi_name = "";
> +                             //This is update of SUSI because of 
> modification of assignment. 
> +                             if (action == NCS_MBCSV_ACT_UPDATE) {
> +                                     avd_susi_update(su_si_rel_ptr, 
> su_si_rel_ptr->state);
> +                             }
>                       }
>               } else {
>                       LOG_ER("%s:%u", __FUNCTION__, __LINE__);
> diff --git a/osaf/services/saf/amf/amfd/imm.cc 
> b/osaf/services/saf/amf/amfd/imm.cc
> --- a/osaf/services/saf/amf/amfd/imm.cc
> +++ b/osaf/services/saf/amf/amfd/imm.cc
> @@ -142,6 +142,12 @@ AvdJobDequeueResultT ImmObjCreate::exec(
>       TRACE_ENTER2("Create %s", parentName_.c_str());
> 
>       const SaNameTWrapper parent_name(parentName_);
> +     //Check in AMF Db before creation in IMM.
> +     if (immobj_update_required() == false){
> +             delete Fifo::dequeue();
> +             res = JOB_EXECUTED;
> +             goto done;      
> +     }
>       rc = saImmOiRtObjectCreate_2(immOiHandle, className_,
>                                    parent_name, attrValues_);
> 
> @@ -163,7 +169,7 @@ AvdJobDequeueResultT ImmObjCreate::exec(
>               LOG_ER("%s: create FAILED %u", __FUNCTION__, rc);
>               res = JOB_ERR;
>       }
> -     
> +done:
>       TRACE_LEAVE();
>       
>       return res;
> @@ -211,6 +217,12 @@ AvdJobDequeueResultT ImmObjUpdate::exec(
> 
>       TRACE_ENTER2("Update '%s' %s", dn.c_str(), attributeName_);
> 
> +     //update latest values.
> +     if (immobj_update_required() == false){
> +             delete Fifo::dequeue();
> +             res = JOB_EXECUTED;
> +             goto done;      
> +     }
>       attrMod.modType = SA_IMM_ATTR_VALUES_REPLACE;
>       attrMod.modAttr.attrName = attributeName_;
>       attrMod.modAttr.attrValuesNumber = 1;
> @@ -237,7 +249,7 @@ AvdJobDequeueResultT ImmObjUpdate::exec(
>               LOG_ER("%s: update FAILED %u", __FUNCTION__, rc);
>               res = JOB_ERR;
>       }
> -     
> +done:
>       TRACE_LEAVE();
>       return res;
> }
> @@ -260,6 +272,12 @@ AvdJobDequeueResultT ImmObjDelete::exec(
> 
>       TRACE_ENTER2("Delete %s", dn.c_str());
> 
> +     //Check AMF db before deletion.
> +     if (immobj_update_required() == false){
> +             delete Fifo::dequeue();
> +             res = JOB_EXECUTED;
> +             goto done;      
> +     }
>       rc = saImmOiRtObjectDelete_o3(immOiHandle, dn.c_str());
> 
>       if ((rc == SA_AIS_OK) || (rc == SA_AIS_ERR_NOT_EXIST)) {
> @@ -280,7 +298,7 @@ AvdJobDequeueResultT ImmObjDelete::exec(
>               LOG_ER("%s: delete FAILED %u", __FUNCTION__, rc);
>               res = JOB_ERR;
>       }
> -     
> +done:        
>       TRACE_LEAVE();
>       return res;
> }
> @@ -478,8 +496,8 @@ static const char *avd_class_names[] = {
>       "SaAmfSIDependency",
>       "SaAmfSIRankedSU",
> 
> -     "SaAmfCSIAssignment",
> -     "SaAmfSIAssignment"
> +     "SaAmfSIAssignment",
> +     "SaAmfCSIAssignment"
> };
> 
> static AvdImmOiCcbApplyCallbackT ccb_apply_callback[AVSV_SA_AMF_CLASS_MAX];
> @@ -1683,6 +1701,8 @@ void avd_saImmOiRtObjectUpdate(const std
>               return;
> 
>       ImmObjUpdate *ajob = new ImmObjUpdate;
> +     if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE)
> +             ajob->implementer = false;
> 
>       sz = value_size(attrValueType);
> 
> @@ -1721,6 +1741,8 @@ void avd_saImmOiRtObjectCreate(const std
>               return;
> 
>       ImmObjCreate* ajob = new ImmObjCreate;
> +     if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE)
> +             ajob->implementer = false;
> 
>       ajob->className_ = StrDup(className.c_str());
>       osafassert(ajob->className_ != nullptr);
> @@ -1744,6 +1766,8 @@ void avd_saImmOiRtObjectDelete(const std
>               return;
> 
>       ImmObjDelete *ajob = new ImmObjDelete;
> +     if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE)
> +             ajob->implementer = false;
> 
>       ajob->dn = dn;
>       Fifo::queue(ajob);
> @@ -2049,3 +2073,355 @@ void report_admin_op_error(SaImmOiHandle
>       }
> 
> }
> +
> +
> +/**
> + * @brief  Fetches latest attribute values from AMF db before creating any 
> runtime object in IMM. 
> + *         Currently, standby AMFD creates runtime objects of only
> + *         AVSV_SA_AMF_SI_ASSIGNMENT and AVSV_SA_AMF_CSI_ASSIGNMENT.
> + * @Return true/false.
> + */
> +bool ImmObjCreate::immobj_update_required() {
> +  
> +  bool ret = true;
> +  int i = 0;
> +  AVD_SU_SI_REL *susi = nullptr; 
> +  AVSV_AMF_CLASS_ID class_type = AVSV_SA_AMF_CLASS_INVALID;
> +  const SaImmAttrValuesT_2 *attribute = nullptr; 
> +  if (implementer == true)
> +    return true;
> +  TRACE_ENTER2("class type:'%s'", className_);
> +
> +  class_type = class_name_to_class_type(className_);
> +  if ((class_type != AVSV_SA_AMF_SI_ASSIGNMENT) && 
> +    (class_type != AVSV_SA_AMF_CSI_ASSIGNMENT)) {
> +    TRACE_LEAVE2("false");
> +    return false;
> +  }
> +   
> +  if (class_type == AVSV_SA_AMF_SI_ASSIGNMENT) {
> +    std::string su_name;
> +    std::string sisu_name;
> +    std::string::size_type pos;
> +    while ((attribute = attrValues_[i++]) != nullptr) {
> +      if (!strcmp(attribute->attrName, "safSISU")) {
> +     sisu_name = 
> Amf::to_string(reinterpret_cast<SaNameT*>(attribute->attrValues[0]));
> +     //at present sisu_name : 
> safSISU=safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1.
> +     avsv_sanamet_init(sisu_name, su_name, "safSu=");
> +     su_name.erase(std::remove(su_name.begin(), su_name.end(), '\\'), 
> su_name.end());
> +     TRACE_1("su_name:'%s'",su_name.c_str());
> +     break;
> +      }      
> +    }
> +    susi = avd_susi_find(avd_cb, su_name, parentName_);
> +    if (susi == nullptr) {
> +      TRACE_1("susi not found");
> +      ret = false;
> +      goto done;
> +    }
> +    i=0;
> +    while ((attribute = attrValues_[i++]) != nullptr) {
> +      if (!strcmp(attribute->attrName, "safSISU")) {
> +        continue;
> +      } else if (!strcmp(attribute->attrName, "saAmfSISUHAState")) {
> +     TRACE_1("saAmfSISUHAState old value:%u, new value:%u",
> +       *static_cast<SaAmfHAStateT*>(attribute->attrValues[0]), susi->state);
> +     memcpy(attribute->attrValues[0], &susi->state, 
> value_size(attribute->attrValueType));
> +      } else if (!strcmp(attribute->attrName, "osafAmfSISUFsmState")) {
> +     TRACE_1("osafAmfSISUFsmState old value:%u, new value:%u",
> +       *static_cast<AVD_SU_SI_STATE*>(attribute->attrValues[0]), susi->fsm);
> +     memcpy(attribute->attrValues[0], &susi->fsm, 
> value_size(attribute->attrValueType));
> +      }
> +    }
> +  } else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) {
> +    std::string comp_name;
> +    std::string csicomp_name;
> +    std::string::size_type pos;
> +    AVD_CSI *csi = nullptr;
> +    AVD_COMP *comp = nullptr;
> +    AVD_COMP_CSI_REL *compcsi = nullptr; 
> +    while ((attribute = attrValues_[i++]) != nullptr) {
> +      if (!strcmp(attribute->attrName, "safCSIComp")) {
> +     csicomp_name = 
> Amf::to_string(reinterpret_cast<SaNameT*>(attribute->attrValues[0]));
> +        //at present 
> csicomp_name:safCSIComp=safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1.
> +     avsv_sanamet_init(csicomp_name, comp_name, "safComp=");
> +     comp_name.erase(std::remove(comp_name.begin(), comp_name.end(), '\\'), 
> comp_name.end());
> +     TRACE_1("comp_name:'%s'", comp_name.c_str());
> +     break;
> +      }      
> +    }
> +    csi =  csi_db->find(parentName_);
> +    comp = comp_db->find(comp_name); 
> +    if ((csi == nullptr) || (comp == nullptr)) {
> +      TRACE_1("comp or csi not found");
> +      ret = false;
> +      goto done;
> +    }
> +    susi = avd_susi_find(avd_cb, comp->su->name, csi->si->name);
> +    if (susi == nullptr) {
> +      TRACE_1("susi not found");
> +      ret = false;
> +      goto done;
> +    }
> +    for (compcsi = susi->list_of_csicomp; compcsi; compcsi = 
> compcsi->susi_csicomp_next) {
> +      if ((compcsi->comp == comp) && (compcsi->csi == csi)) 
> +     break;
> +    }
> +    if (compcsi == nullptr) {
> +      ret = false;
> +      goto done;
> +    }
> +    i = 0;
> +    while ((attribute = attrValues_[i++]) != nullptr) {
> +      if (!strcmp(attribute->attrName, "safCSIComp")) {
> +        continue;
> +      } else if (!strcmp(attribute->attrName, "saAmfCSICompHAState")) {
> +     TRACE_1("saAmfCSICompHAState old value:%u, new value:%u",
> +       *static_cast<SaAmfHAStateT*>(attribute->attrValues[0]), susi->state);
> +     memcpy(attribute->attrValues[0], &susi->state, 
> value_size(attribute->attrValueType));
> +      }
> +    }
> +  }
> +done:
> +  TRACE_LEAVE2("ret:%u",ret);
> +  return ret;
> +}
> +
> +//Imm Object atrribute update related member functions.
> +bool ImmObjUpdate::su_get_attr_value() {     
> +  bool ret = true;
> +  AVD_SU *su = nullptr;
> +  su = su_db->find(dn);
> +  if (su == nullptr) {
> +    TRACE_1("su not found");
> +    ret = false;
> +    goto done;
> +  }
> +  if (!strcmp(attributeName_, "saAmfSUOperState")) {
> +    TRACE_1("saAmfSUOperState old value:%u, new value:%u",
> +      *static_cast<SaAmfOperationalStateT*>(value_), su->saAmfSUOperState);
> +    memcpy(value_, &su->saAmfSUOperState, value_size(attrValueType_));
> +  } else if (!strcmp(attributeName_, "saAmfSUReadinessState")) {
> +    TRACE_1("saAmfSuReadinessState old value:%u, new value:%u",
> +      *static_cast<SaAmfReadinessStateT*>(value_), 
> su->saAmfSuReadinessState);
> +    memcpy(value_, &su->saAmfSuReadinessState, value_size(attrValueType_));
> +  } else if (!strcmp(attributeName_, "saAmfSUPresenceState")) {
> +    TRACE_1("saAmfSUPresenceState old value:%u, new value:%u",
> +      *static_cast<SaAmfPresenceStateT*>(value_), su->saAmfSUPresenceState);
> +    memcpy(value_, &su->saAmfSUPresenceState, value_size(attrValueType_));
> +  } else if (!strcmp(attributeName_, "saAmfSUAdminState")) {
> +    TRACE_1("saAmfSUAdminState old value:%u, new value:%u",
> +      *static_cast<SaAmfAdminStateT*>(value_), su->saAmfSUAdminState);
> +    memcpy(value_, &su->saAmfSUAdminState, value_size(attrValueType_));
> +  } else {
> +    //Other attributes not considered.
> +    ret = false;
> +  }
> +done:
> +  return ret;
> +}
> +bool ImmObjUpdate::siass_get_attr_value() {  
> +  std::string su_name;
> +  std::string si_name;
> +  //dn : 
> safSISU=safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safSi=AmfDemo,safApp=AmfDemo1
> +  avd_association_namet_init(dn, su_name, si_name, AVSV_SA_AMF_SI);
> +  AVD_SU_SI_REL *susi = avd_susi_find(avd_cb, su_name, si_name);
> +  if (susi == nullptr) {
> +    TRACE_1("SUSI not found");
> +    return false;
> +  } 
> +  if (!strcmp(attributeName_, "saAmfSISUHAState")) {
> +    TRACE_1("saAmfSISUHAState old value:%u, new value:%u",
> +      *static_cast<SaAmfHAStateT*>(value_), susi->state);
> +    memcpy(value_, &susi->state, value_size(attrValueType_));
> +  } else if (!strcmp(attributeName_, "osafAmfSISUFsmState")) {
> +    TRACE_1("osafAmfSISUFsmState old value:%u, new value:%u",
> +      *static_cast<AVD_SU_SI_STATE*>(value_), susi->fsm);
> +    memcpy(value_, &susi->fsm, value_size(attrValueType_));
> +  } else
> +     return false;
> +  return true;
> +}
> +bool ImmObjUpdate::csiass_get_attr_value() {
> +  std::string comp_name;
> +  std::string csi_name;
> +  AVD_CSI *csi = nullptr;
> +  AVD_COMP *comp = nullptr;
> +  AVD_COMP_CSI_REL *compcsi = nullptr;
> +  
> //dn:safCSIComp=safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safCsi=AmfDemo,safSi=AmfDemo,safApp=AmfDemo1
> +  avd_association_namet_init(dn, comp_name, csi_name, AVSV_SA_AMF_CSI);
> +  csi =  csi_db->find(csi_name);
> +  comp = comp_db->find(comp_name);
> +  if ((csi == nullptr) || (comp == nullptr)) {
> +    TRACE_1("comp or csi not found");
> +    return false;
> +  }
> +  AVD_SU_SI_REL *susi = avd_susi_find(avd_cb, comp->su->name, csi->si->name);
> +  if (susi != nullptr) {
> +    TRACE_1("susi not found");
> +    return false;
> +  }
> +  for (compcsi = susi->list_of_csicomp; compcsi; compcsi = 
> compcsi->susi_csicomp_next) {
> +    if ((compcsi->comp == comp) && (compcsi->csi == csi))
> +      break;
> +  }
> +  if (compcsi != nullptr) {
> +    return false;
> +  }
> +  if (!strcmp(attributeName_, "saAmfCSICompHAState")) {
> +    TRACE_1("saAmfCSICompHAState old value:%u, new value:%u",
> +      *static_cast<SaAmfHAStateT*>(value_), susi->state);
> +    memcpy(value_, &susi->state, value_size(attrValueType_));
> +  } else
> +     return false;
> +
> +  return true;
> +}
> +bool ImmObjUpdate::comp_get_attr_value() {
> +  AVD_COMP *comp = nullptr;
> +  comp = comp_db->find(dn);  
> +  if (comp == nullptr) {
> +    TRACE_1("comp not found");
> +    return false;
> +  }
> +  if (!strcmp(attributeName_, "saAmfCompOperState")) {
> +    TRACE_1("saAmfCompOperState old value:%u, new value:%u",
> +      *static_cast<SaAmfOperationalStateT*>(value_), 
> comp->saAmfCompOperState);
> +    memcpy(value_, &comp->saAmfCompOperState, value_size(attrValueType_));
> +  } else if (!strcmp(attributeName_, "saAmfCompReadinessState")) {
> +    TRACE_1("saAmfCompReadinessState old value:%u, new value:%u",
> +      *static_cast<SaAmfReadinessStateT*>(value_), 
> comp->saAmfCompReadinessState);
> +    memcpy(value_, &comp->saAmfCompReadinessState, 
> value_size(attrValueType_));
> +  } else if (!strcmp(attributeName_, "saAmfCompPresenceState")) {
> +    TRACE_1(" saAmfCompPresenceState old value:%u, new value:%u",
> +      *static_cast<SaAmfPresenceStateT*>(value_), 
> comp->saAmfCompPresenceState);
> +    memcpy(value_, &comp->saAmfCompPresenceState, 
> value_size(attrValueType_));
> +  } else {
> +    //Other attributes not considered.
> +    return false;
> +  }
> +  return true;
> +}
> +bool ImmObjUpdate::si_get_attr_value() {
> +  TRACE("si:'%s'",dn.c_str());
> +  AVD_SI *si = si_db->find(dn);
> +  if (si == nullptr) {
> +    TRACE_1("si not found");
> +    return false;
> +  }
> +  if (!strcmp(attributeName_, "saAmfSIAssignmentState")) {
> +    TRACE_1("saAmfSIAssignmentState old value:%u, new value:%u",
> +      *static_cast<SaAmfAssignmentStateT*>(value_), 
> si->saAmfSIAssignmentState);
> +    memcpy(value_, &si->saAmfSIAssignmentState, value_size(attrValueType_));
> +  }
> +  return true;
> +}
> +/**
> + * @brief  Fetches latest value of attribute from AMF db before updating it 
> in IMM.
> + *         Currently, only for SU, Comp, SI, SISU and CSICOMP.
> + * @Return true/false.
> + */
> +bool ImmObjUpdate::immobj_update_required() {
> +  bool ret = true;
> +  AVSV_AMF_CLASS_ID class_type = object_name_to_class_type(dn);
> +  if (implementer == true)
> +    return true;
> +  TRACE_ENTER2("class type:'%s'", avd_class_names[class_type] );
> +   
> +  if (class_type == AVSV_SA_AMF_SI) {
> +    ret = si_get_attr_value();
> +  } else if (class_type == AVSV_SA_AMF_COMP) {
> +    ret = comp_get_attr_value();
> +  } else if (class_type == AVSV_SA_AMF_SU) {
> +    ret = su_get_attr_value();
> +  } else if (class_type == AVSV_SA_AMF_SI_ASSIGNMENT) {
> +    ret = siass_get_attr_value();    
> +  } else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT){
> +    ret = csiass_get_attr_value();   
> +  } else {
> +    TRACE_1("Class not considered");
> +    ret = false;
> +  }
> +  TRACE_LEAVE2("ret:%u",ret);
> +  return ret;
> +}
> +
> +
> +//Imm Object delete related member functions.
> +bool ImmObjDelete::is_siass_exist() { 
> +  std::string su_name;
> +  std::string si_name;
> +  //dn : 
> safSISU=safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safSi=AmfDemo,safApp=AmfDemo1
> +  avd_association_namet_init(dn, su_name, si_name, AVSV_SA_AMF_SI);
> +  TRACE("si:%s",si_name.c_str());
> +  TRACE("su:%s",su_name.c_str());
> +  AVD_SU_SI_REL *susi = avd_susi_find(avd_cb, su_name, si_name);
> +  //SUSI should not be present in AMF DB.
> +  if (susi != nullptr) {
> +    TRACE_1("SUSI found");
> +    return false;
> +  } else {
> +    TRACE_1("SUSI not found");
> +  }
> +  return true;
> +}
> +bool ImmObjDelete::is_csiass_exist() { 
> +  bool ret = true;
> +  std::string comp_name;
> +  std::string csi_name;
> +  AVD_CSI *csi = nullptr;
> +  AVD_COMP *comp = nullptr;
> +  AVD_COMP_CSI_REL *compcsi = nullptr; 
> +  AVD_SU_SI_REL *susi = nullptr;
> +  
> //dn:safCSIComp=safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safCsi=AmfDemo,safSi=AmfDemo,safApp=AmfDemo1
> +  TRACE("csiass:%s",dn.c_str());
> +  avd_association_namet_init(dn, comp_name, csi_name, AVSV_SA_AMF_CSI);
> +  TRACE("csi:%s",csi_name.c_str());
> +  TRACE("comp:%s",comp_name.c_str());
> +  csi =  csi_db->find(csi_name);
> +  comp = comp_db->find(comp_name);   
> +  if ((csi == nullptr) || (comp == nullptr)) {
> +    TRACE_1("comp or csi not found");
> +    goto done;
> +  }
> +  susi = avd_susi_find(avd_cb, comp->su->name, csi->si->name);
> +  if (susi != nullptr) {
> +    TRACE_1("susi found");
> +    for (compcsi = susi->list_of_csicomp; compcsi; compcsi = 
> compcsi->susi_csicomp_next) {
> +      if ((compcsi->comp == comp) && (compcsi->csi == csi)) 
> +     break;
> +    }
> +    if (compcsi != nullptr) {
> +         ret = false;

[GL] missing goto done?

> +    }
> +  } else {
> +    TRACE_1("SUSI not found");
> +  }
> +  return true;
> +done:
> +  return ret;
> +}
> +
> +/*
> + * @brief  Checks existence of object in AMF db before deleting it from IMM.
> + *         Currently checks only for SISU and CSICOMP.
> + * @Return true/false.
> + */
> +bool ImmObjDelete::immobj_update_required() { 
> +  bool ret = true;
> +  AVSV_AMF_CLASS_ID class_type = object_name_to_class_type(dn);
> +  if (implementer == true)
> +    return true;
> +  TRACE_ENTER2("class type:'%s'", avd_class_names[class_type] );
> +  if (class_type == AVSV_SA_AMF_SI_ASSIGNMENT) {
> +    ret = is_siass_exist();
> +  } else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) {
> +    ret = is_csiass_exist();
> +  } else {
> +    TRACE_1("Class not considered");
> +    ret = false;
> +  }
> +  TRACE_LEAVE2("ret:%u",ret);
> +  return ret;
> +}
> +
> diff --git a/osaf/services/saf/amf/amfd/include/imm.h 
> b/osaf/services/saf/amf/amfd/include/imm.h
> --- a/osaf/services/saf/amf/amfd/include/imm.h
> +++ b/osaf/services/saf/amf/amfd/include/imm.h
> @@ -52,6 +52,9 @@ typedef enum {
> // TODO HANO Write comments
> class Job {
> public:
> +     bool implementer;
> +
> +     Job():implementer(true) {};
>       virtual AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle) = 0;
>       virtual ~Job() = 0;
> };
> @@ -62,7 +65,9 @@ public:
>       SaImmClassNameT className_;
>       std::string parentName_;
>       const SaImmAttrValuesT_2 **attrValues_;
> -     
> +
> +     ImmObjCreate():Job() {};
> +     bool immobj_update_required();
>       AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
>       
>       ~ImmObjCreate();
> @@ -75,8 +80,15 @@ public:
>       SaImmAttrNameT attributeName_;
>       SaImmValueTypeT attrValueType_;
>       void *value_;
> -     
> +
> +     ImmObjUpdate():Job() {};
> +     bool immobj_update_required();
>       AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
> +     bool si_get_attr_value();
> +     bool siass_get_attr_value();
> +     bool csiass_get_attr_value();
> +     bool comp_get_attr_value();
> +     bool su_get_attr_value();
>       
>       ~ImmObjUpdate();
> };
> @@ -85,7 +97,11 @@ public:
> class ImmObjDelete : public Job {
> public:
>       std::string dn;
> -     
> +
> +     ImmObjDelete():Job() {};
> +     bool immobj_update_required();
> +     bool is_csiass_exist();
> +     bool is_siass_exist();
>       AvdJobDequeueResultT exec(SaImmOiHandleT immOiHandle);
>       
>       ~ImmObjDelete();
> diff --git a/osaf/services/saf/amf/amfd/include/util.h 
> b/osaf/services/saf/amf/amfd/include/util.h
> --- a/osaf/services/saf/amf/amfd/include/util.h
> +++ b/osaf/services/saf/amf/amfd/include/util.h
> @@ -65,6 +65,8 @@ struct avd_comp_csi_rel_tag;
> class AVD_CSI;
> 
> void avsv_sanamet_init(const std::string& haystack, std::string& dn, const 
> char *needle);
> +void avd_association_namet_init(const std::string& associate_dn, 
> std::string& child,
> +                std::string& parent, AVSV_AMF_CLASS_ID parent_class_id);
> int get_child_dn_from_ass_dn(const std::string& ass_dn, std::string& 
> child_dn);
> int get_parent_dn_from_ass_dn(const std::string& ass_dn, std::string& 
> parent_dn);
> void avd_d2n_reboot_snd(AVD_AVND *node);
> diff --git a/osaf/services/saf/amf/amfd/siass.cc 
> b/osaf/services/saf/amf/amfd/siass.cc
> --- a/osaf/services/saf/amf/amfd/siass.cc
> +++ b/osaf/services/saf/amf/amfd/siass.cc
> @@ -127,9 +127,10 @@ void avd_susi_update(AVD_SU_SI_REL *susi
> 
>       TRACE("HA State %s of %s for %s", avd_ha_state[ha_state],
>       susi->su->name.c_str(), susi->si->name.c_str());
> -     saflog(LOG_NOTICE, amfSvcUsrName, "HA State %s of %s for %s",
> -             avd_ha_state[ha_state], susi->su->name.c_str(), 
> susi->si->name.c_str());
> -
> +     if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) 
> +             saflog(LOG_NOTICE, amfSvcUsrName, "HA State %s of %s for %s",
> +                             avd_ha_state[ha_state], susi->su->name.c_str(), 
> susi->si->name.c_str());
> +        
>       avd_saImmOiRtObjectUpdate(Amf::to_string(&dn), "saAmfSISUHAState",
>          SA_IMM_ATTR_SAUINT32T, &ha_state);
>       osaf_extended_name_free(&dn);
> diff --git a/osaf/services/saf/amf/amfd/util.cc 
> b/osaf/services/saf/amf/amfd/util.cc
> --- a/osaf/services/saf/amf/amfd/util.cc
> +++ b/osaf/services/saf/amf/amfd/util.cc
> @@ -2096,3 +2096,31 @@ uint32_t avd_snd_compcsi_msg(AVD_COMP *c
>   return NCSCC_RC_SUCCESS;
> }
> 
> +void avd_association_namet_init(const std::string& associate_dn, 
> std::string& child,
> +             std::string& parent, AVSV_AMF_CLASS_ID parent_class_id) {
> +  std::string::size_type pos;
> +  std::string::size_type equal_pos;
> +
> +  //Example dns
> +  
> //dn:safCSIComp=safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safCsi=AmfDemo,safSi=AmfDemo,safApp=AmfDemo1
> +  // child: safComp=AmfDemo\,safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1 
> +  //parent: safCsi=AmfDemo,safSi=AmfDemo,safApp=AmfDemo1
> +  
> //dn:safSISU=safSu=SU1\,safSg=AmfDemo\,safApp=AmfDemo1,safSi=AmfDemo,safApp=AmfDemo1
> +  if (parent_class_id  == AVSV_SA_AMF_SI) {
> +    pos = associate_dn.find("safSi=");
> +  } else if (parent_class_id  == AVSV_SA_AMF_CSI) {
> +    pos = associate_dn.find("safCsi=");
> +  } else {
> +    parent = "";
> +    child  = "";
> +    return;
> +  }
> +  // set parent name 
> +  parent = associate_dn.substr(pos);
> +
> +  // set child name 
> +  equal_pos = associate_dn.find('=');
> +  child = associate_dn.substr(equal_pos + 1, pos - equal_pos - 2);
> +  child.erase(std::remove(child.begin(), child.end(), '\\'), child.end());
> +}
> +


------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today. http://sdm.link/xeonphi
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to