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;
+ }
+ } 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