ack, one minor comment, the bool variable "is" in su.cc clearer if named "is_instantiated". /BR HansN
-----Original Message----- From: [email protected] [mailto:[email protected]] Sent: den 21 januari 2014 09:59 To: Hans Feldt; Hans Nordebäck; [email protected]; [email protected]; [email protected] Cc: [email protected] Subject: [PATCH 1 of 1] amf: support for automatic comp instantiation and deletion [#597] osaf/services/saf/amf/amfd/comp.cc | 20 ++++++++++++++++++ osaf/services/saf/amf/amfd/ndproc.cc | 5 +++- osaf/services/saf/amf/amfnd/clc.cc | 6 +++++ osaf/services/saf/amf/amfnd/compdb.cc | 27 +++++++++++++++++++++++- osaf/services/saf/amf/amfnd/include/avnd_comp.h | 1 + osaf/services/saf/amf/amfnd/su.cc | 16 ++++++++++++- 6 files changed, 70 insertions(+), 5 deletions(-) diff --git a/osaf/services/saf/amf/amfd/comp.cc b/osaf/services/saf/amf/amfd/comp.cc --- a/osaf/services/saf/amf/amfd/comp.cc +++ b/osaf/services/saf/amf/amfd/comp.cc @@ -173,6 +173,7 @@ void avd_comp_delete(AVD_COMP *comp) static void comp_add_to_model(AVD_COMP *comp) { SaNameT dn; + AVD_AVND *node; TRACE_ENTER2("%s", comp->comp_info.name.value); @@ -222,6 +223,25 @@ static void comp_add_to_model(AVD_COMP * comp->su->saAmfSUPreInstantiable = static_cast<SaBoolT>(true); } + /* This is a case of adding a component in SU which is instantiated state. This could be used + in upgrade scenarios. When components are added, it is sent to Amfnd for instantiation and + Amfnd instantiates it. Amfnd has capability for finding which component has been added newly. */ + if ((comp->su->saAmfSUAdminState != SA_AMF_ADMIN_LOCKED_INSTANTIATION) && + (comp->su->saAmfSUPresenceState == SA_AMF_PRESENCE_INSTANTIATED) && + (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE)) { + node = comp->su->su_on_node; + if ((node->node_state == AVD_AVND_STATE_PRESENT) || + (node->node_state == AVD_AVND_STATE_NO_CONFIG) || + (node->node_state == AVD_AVND_STATE_NCS_INIT)) { + + if (avd_snd_su_msg(avd_cb, comp->su) != NCSCC_RC_SUCCESS) { + LOG_ER("%s: avd_snd_su_msg failed %s", __FUNCTION__, comp->su->name.value); + goto done; + } + + } + } + /* Set runtime cached attributes. */ avd_saImmOiRtObjectUpdate(&comp->su->name, const_cast<SaImmAttrNameT>("saAmfSUPreInstantiable"), SA_IMM_ATTR_SAUINT32T, &comp->su->saAmfSUPreInstantiable); diff --git a/osaf/services/saf/amf/amfd/ndproc.cc b/osaf/services/saf/amf/amfd/ndproc.cc --- a/osaf/services/saf/amf/amfd/ndproc.cc +++ b/osaf/services/saf/amf/amfd/ndproc.cc @@ -608,7 +608,10 @@ void avd_data_update_req_evh(AVD_CL_CB * case AVSV_SA_AMF_COMP:{ /* Find the component record in the database, specified in the message. */ if ((comp = avd_comp_get(&n2d_msg->msg_info.n2d_data_req.param_info.name)) == NULL) { - LOG_ER("%s: Invalid Comp '%s' (%u)", __FUNCTION__, + /* In case of component delete, component gets deleted at Amfd first and then + it gets uninstantiated and then deleted at Amfnd. So, when update for presence + state comes from Amfnd, the component doesn't exists in Amfd. */ + LOG_IN("%s: Invalid Comp '%s' (%u)", __FUNCTION__, n2d_msg->msg_info.n2d_data_req.param_info.name.value, n2d_msg->msg_info.n2d_data_req.param_info.name.length); goto done; diff --git a/osaf/services/saf/amf/amfnd/clc.cc b/osaf/services/saf/amf/amfnd/clc.cc --- a/osaf/services/saf/amf/amfnd/clc.cc +++ b/osaf/services/saf/amf/amfnd/clc.cc @@ -1305,6 +1305,12 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ goto done; } } + /* This is a case of 'component delete' when su is in intantiated state. Component can go into uninstantiated + state or termination failed state, but the component information needs to be deleted from data base. */ + if (comp && (comp->pending_delete == true) && ((comp->pres == SA_AMF_PRESENCE_UNINSTANTIATED) || + (comp->pres == SA_AMF_PRESENCE_TERMINATION_FAILED)) && + (comp->su->pres == SA_AMF_PRESENCE_INSTANTIATED)) + rc = avnd_compdb_rec_del(cb, &comp->name); done: TRACE_LEAVE2("%u", rc); 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 @@ -837,15 +837,38 @@ uint32_t avnd_comp_oper_req(AVND_CB *cb, case AVSV_OBJ_OPR_DEL: { + /* This request can come when any component is being deleted. When this request comes from Amfd, + component can be in instantiated or uninstantiated state and in that case, Amfnd will + uninstantiate the component and delete the record from its data base. This is kind of + automatic termination of a component when comp is getting +deleted. */ AVND_COMP *comp = 0; /* get the record */ comp = m_AVND_COMPDB_REC_GET(cb->compdb, param->name); - if (comp) { - /* delete the record */ + if (comp && (comp->pres == SA_AMF_PRESENCE_UNINSTANTIATED) && + (comp->su->pres == SA_AMF_PRESENCE_UNINSTANTIATED)) { + /* delete the record in case su is in locked-in. */ m_AVND_SEND_CKPT_UPDT_ASYNC_RMV(cb, comp, AVND_CKPT_COMP_CONFIG); rc = avnd_compdb_rec_del(cb, ¶m->name); + goto done; } + + /* Terminate the pi comp. It will terminate the component and delete the comp record. */ + if (comp && m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) { + comp->pending_delete = true; + TRACE("Running the component clc FSM, terminate the component"); + rc = avnd_comp_clc_fsm_run(cb, comp, AVND_COMP_CLC_PRES_FSM_EV_TERM); + goto done; + } + /* Terminate the Npi comp. After deleting the csi, comp will be already terminated, so + we just want to delete the comp record.. */ + if (comp && !m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) { + /* delete the record */ + m_AVND_SEND_CKPT_UPDT_ASYNC_RMV(cb, comp, AVND_CKPT_COMP_CONFIG); + rc = avnd_compdb_rec_del(cb, ¶m->name); + goto done; + } + } break; 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 @@ -359,6 +359,7 @@ typedef struct avnd_comp_tag { SaBoolT admin_oper; /*set to true if undergoing admin operation */ int config_is_valid; /* Used to indicate that config has to be refreshed from IMM */ 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.*/ } AVND_COMP; diff --git a/osaf/services/saf/amf/amfnd/su.cc b/osaf/services/saf/amf/amfnd/su.cc --- a/osaf/services/saf/amf/amfnd/su.cc +++ b/osaf/services/saf/amf/amfnd/su.cc @@ -56,6 +56,7 @@ uint32_t avnd_evt_avd_reg_su_evh(AVND_CB AVSV_SU_INFO_MSG *su_info = 0; AVND_SU *su = 0; uint32_t rc = NCSCC_RC_SUCCESS; + bool is; TRACE_ENTER(); @@ -79,9 +80,9 @@ uint32_t avnd_evt_avd_reg_su_evh(AVND_CB /* scan the su list & add each su to su-db */ for (su_info = info->su_list; su_info; su = 0, su_info = su_info->next) { - su = avnd_sudb_rec_add(cb, su_info, &rc); + su = m_AVND_SUDB_REC_GET(cb->sudb, su_info->name); if (!su) - break; + su = avnd_sudb_rec_add(cb, su_info, &rc); m_AVND_SEND_CKPT_UPDT_ASYNC_ADD(cb, su, AVND_CKPT_SU_CONFIG); @@ -93,11 +94,22 @@ uint32_t avnd_evt_avd_reg_su_evh(AVND_CB rc = NCSCC_RC_FAILURE; break; } + + /* When NPI comp is added into PI SU, we don't have to run SU FSM as anyway, we are not + instantiating NPI component. In this case, anyway, SU will remain in instantiated state. + NPI comp will get instantiated when corresponding csi is added. */ + m_AVND_SU_IS_INSTANTIATED(su, is); + + if ((su->pres == SA_AMF_PRESENCE_INSTANTIATED) && (false == is)) { + avnd_su_pres_state_set(su, SA_AMF_PRESENCE_UNINSTANTIATED); + rc = avnd_su_pres_fsm_run(cb, su, 0, AVND_SU_PRES_FSM_EV_INST); + } } /*** send the response to AvD ***/ rc = avnd_di_reg_su_rsp_snd(cb, &info->su_list->name, rc); + done: TRACE_LEAVE(); return rc; ------------------------------------------------------------------------------ CenturyLink Cloud: The Leader in Enterprise Cloud Services. Learn Why More Businesses Are Choosing CenturyLink Cloud For Critical Workloads, Development Environments & Everything In Between. Get a Quote or Start a Free Trial Today. http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
