Ack, code review only. Thanks -Nagu
> -----Original Message----- > From: Gary Lee [mailto:[email protected]] > Sent: 01 May 2017 10:41 > To: [email protected]; [email protected]; > [email protected]; Praveen Malviya > Cc: [email protected]; Gary Lee > Subject: [PATCH 1/1] amfd: make auto repair restriction configurable > [#2435] > > This adds a configuration object for AMF at > amfConfig=1,safApp=safAmfService. > > A configuration attribute 'amfRestrictAutoRepairEnable' is added. > This determines if 'suMaintenanceCampaign' should be ignored to maintain > legacy AMF behaviour. The default behaviour is to support auto repair > restriction. > > To enable restriction: > immcfg -a osafAmfRestrictAutoRepairEnable=1 > amfConfig=1,safApp=safAmfService > > To disable restriction: > immcfg -a osafAmfRestrictAutoRepairEnable=0 > amfConfig=1,safApp=safAmfService > --- > src/amf/Makefile.am | 3 + > src/amf/amfd/comp.cc | 2 +- > src/amf/amfd/config.cc | 179 > +++++++++++++++++++++++++++++++++++++++++ > src/amf/amfd/config.h | 21 +++++ > src/amf/amfd/imm.cc | 35 ++++++-- > src/amf/amfd/ndproc.cc | 4 +- > src/amf/amfd/node.cc | 4 +- > src/amf/amfd/sgproc.cc | 14 ++-- > src/amf/amfd/su.cc | 37 +++++++-- > src/amf/amfd/su.h | 3 +- > src/amf/common/amf_defs.h | 3 + > src/amf/config/amf_classes.xml | 15 ++++ > src/amf/config/amf_objects.xml | 7 ++ > 13 files changed, 300 insertions(+), 27 deletions(-) create mode 100644 > src/amf/amfd/config.cc create mode 100644 src/amf/amfd/config.h > > diff --git a/src/amf/Makefile.am b/src/amf/Makefile.am index > 8c175c26f..1d6ca60ac 100644 > --- a/src/amf/Makefile.am > +++ b/src/amf/Makefile.am > @@ -103,6 +103,7 @@ noinst_HEADERS += \ > src/amf/amfd/clm.h \ > src/amf/amfd/cluster.h \ > src/amf/amfd/comp.h \ > + src/amf/amfd/config.h \ > src/amf/amfd/csi.h \ > src/amf/amfd/def.h \ > src/amf/amfd/evt.h \ > @@ -213,6 +214,7 @@ bin_testamfd_LDFLAGS = \ > src/amf/amfd/bin_osafamfd-ckpt_updt.o \ > src/amf/amfd/bin_osafamfd-clm.o \ > src/amf/amfd/bin_osafamfd-cluster.o \ > + src/amf/amfd/bin_osafamfd-config.o \ > src/amf/amfd/bin_osafamfd-comp.o \ > src/amf/amfd/bin_osafamfd-compcstype.o \ > src/amf/amfd/bin_osafamfd-comptype.o \ @@ -300,6 +302,7 @@ > bin_osafamfd_SOURCES = \ > src/amf/amfd/comp.cc \ > src/amf/amfd/compcstype.cc \ > src/amf/amfd/comptype.cc \ > + src/amf/amfd/config.cc \ > src/amf/amfd/csi.cc \ > src/amf/amfd/csiattr.cc \ > src/amf/amfd/cstype.cc \ > diff --git a/src/amf/amfd/comp.cc b/src/amf/amfd/comp.cc index > d4b51a62d..3e0dc5de1 100644 > --- a/src/amf/amfd/comp.cc > +++ b/src/amf/amfd/comp.cc > @@ -152,7 +152,7 @@ void > AVD_COMP::avd_comp_pres_state_set(SaAmfPresenceStateT pres_state) { > (saAmfCompPresenceState == > SA_AMF_PRESENCE_TERMINATION_FAILED)) || > ((node->saAmfNodeFailfastOnInstantiationFailure == true) && > (saAmfCompPresenceState == > SA_AMF_PRESENCE_INSTANTIATION_FAILED))) && > - (su->saAmfSUMaintenanceCampaign.empty())) { > + (su->restrict_auto_repair() == false)) { > saflog(LOG_NOTICE, amfSvcUsrName, "%s PresenceState %s => %s", > osaf_extended_name_borrow(&comp_info.name), > avd_pres_state_name[old_state], avd_pres_state_name[pres_state]); > diff --git a/src/amf/amfd/config.cc b/src/amf/amfd/config.cc new file mode > 100644 index 000000000..dc7750c0b > --- /dev/null > +++ b/src/amf/amfd/config.cc > @@ -0,0 +1,179 @@ > +#include "amf/amfd/util.h" > +#include "amf/common/amf_util.h" > +#include "amf/amfd/imm.h" > +#include "amf/amfd/node.h" > +#include "amf/amfd/config.h" > + > +static Configuration _configuration; > +Configuration *configuration = &_configuration; > + > +static void ccb_apply_modify_hdlr(struct CcbUtilOperationData *opdata) > +{ > + TRACE_ENTER(); > + const SaImmAttrModificationT_2 *attr_mod; > + int i = 0; > + > + while ((attr_mod = opdata->param.modify.attrMods[i++]) != nullptr) { > + if (!strcmp(attr_mod->modAttr.attrName, > "osafAmfRestrictAutoRepairEnable")) { > + bool enabled = false; // default to disabled > + if (attr_mod->modType != SA_IMM_ATTR_VALUES_DELETE && > + attr_mod->modAttr.attrValues != nullptr) { > + enabled = > + static_cast<bool>(*((SaUint32T *)attr_mod->modAttr.attrValues[0])); > + } > + TRACE("osafAmfRestrictAutoRepairEnable changed to '%d'", enabled); > + configuration->restrict_auto_repair(enabled); > + } > + } > + TRACE_LEAVE(); > +} > + > +static SaAisErrorT ccb_completed_modify_hdlr(CcbUtilOperationData_t > +*opdata) { > + TRACE_ENTER(); > + SaAisErrorT rc = SA_AIS_OK; > + TRACE_LEAVE(); > + return rc; > +} > + > +static SaAisErrorT configuration_ccb_completed_cb( > + CcbUtilOperationData_t *opdata) { > + SaAisErrorT rc = SA_AIS_ERR_BAD_OPERATION; > + > + TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, > + osaf_extended_name_borrow(&opdata->objectName)); > + > + switch (opdata->operationType) { > + case CCBUTIL_CREATE: > + report_ccb_validation_error(opdata, > + "OpenSafAmfConfig objects cannot be > created"); > + goto done; > + break; > + case CCBUTIL_MODIFY: > + rc = ccb_completed_modify_hdlr(opdata); > + break; > + case CCBUTIL_DELETE: > + report_ccb_validation_error(opdata, > + "OpenSafAmfConfig objects cannot be > deleted"); > + goto done; > + break; > + default: > + osafassert(0); > + break; > + } > + > +done: > + TRACE_LEAVE(); > + return rc; > +} > + > +static void configuration_ccb_apply_cb(CcbUtilOperationData_t *opdata) > +{ > + TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, > + osaf_extended_name_borrow(&opdata->objectName)); > + > + switch (opdata->operationType) { > + case CCBUTIL_MODIFY: > + ccb_apply_modify_hdlr(opdata); > + break; > + case CCBUTIL_CREATE: > + case CCBUTIL_DELETE: > + /* fall through */ > + default: > + osafassert(0); > + break; > + } > + TRACE_LEAVE(); > +} > + > +static void configuration_admin_op_cb(SaImmOiHandleT immOiHandle, > + SaInvocationT invocation, > + const SaNameT *object_name, > + SaImmAdminOperationIdT op_id, > + const SaImmAdminOperationParamsT_2 **params) { > + TRACE_ENTER(); > + switch (op_id) { > + default: > + report_admin_op_error(immOiHandle, invocation, > SA_AIS_ERR_NOT_SUPPORTED, > + nullptr, "Not supported"); > + break; > + } > + TRACE_LEAVE(); > +} > + > +/** > + * Get configuration for the AMF configuration object from IMM */ > +SaAisErrorT Configuration::get_config(void) { > + SaAisErrorT error = SA_AIS_ERR_FAILED_OPERATION; > + SaImmSearchHandleT searchHandle; > + SaImmSearchParametersT_2 searchParam; > + SaNameT dn; > + const SaImmAttrValuesT_2 **attributes; > + const char *className = "OpenSafAmfConfig"; > + > + TRACE_ENTER(); > + > + searchParam.searchOneAttr.attrName = > + const_cast<SaImmAttrNameT>("SaImmAttrClassName"); > + searchParam.searchOneAttr.attrValueType = SA_IMM_ATTR_SASTRINGT; > + searchParam.searchOneAttr.attrValue = &className; > + > + if (immutil_saImmOmSearchInitialize_2( > + avd_cb->immOmHandle, nullptr, SA_IMM_SUBTREE, > + SA_IMM_SEARCH_ONE_ATTR | SA_IMM_SEARCH_GET_ALL_ATTR, > &searchParam, > + nullptr, &searchHandle) != SA_AIS_OK) { > + LOG_WA("saImmOmSearchInitialize_2 failed: %u", error); > + goto done1; > + } > + > + while (immutil_saImmOmSearchNext_2(searchHandle, &dn, > + (SaImmAttrValuesT_2 ***)&attributes) == SA_AIS_OK) { > + uint32_t value; > + TRACE("reading configuration '%s'", osaf_extended_name_borrow(&dn)); > + if (immutil_getAttr("osafAmfRestrictAutoRepairEnable", attributes, 0, > &value) > + == SA_AIS_OK) { > + configuration->restrict_auto_repair(static_cast<bool>(value)); > + } > + } > + > + error = SA_AIS_OK; > + TRACE("osafAmfRestrictAutoRepairEnable set to '%d'", > + restrict_auto_repair_enabled()); > + > + (void)immutil_saImmOmSearchFinalize(searchHandle); > +done1: > + TRACE_LEAVE(); > + return error; > +} > + > +Configuration::Configuration() : restrict_auto_repair_(false) // > +default { > + avd_class_impl_set("OpenSafAmfConfig", nullptr, > configuration_admin_op_cb, > + configuration_ccb_completed_cb, configuration_ccb_apply_cb); } > + > +Configuration::~Configuration() > +{ > +} > + > +void Configuration::restrict_auto_repair(bool enable) { > + TRACE_ENTER(); > + restrict_auto_repair_ = enable; > + > + // notify AMFNDs of this ... > + for (const auto &value : *node_name_db) { > + AVD_AVND *avnd = value.second; > + osafassert(avnd != nullptr); > + for (const auto &su : avnd->list_of_ncs_su) { > + su->set_su_maintenance_campaign(); > + } > + for (const auto &su : avnd->list_of_su) { > + su->set_su_maintenance_campaign(); > + } > + } > + TRACE_LEAVE(); > +} > + > +bool Configuration::restrict_auto_repair_enabled() > +{ > + return restrict_auto_repair_; > +} > diff --git a/src/amf/amfd/config.h b/src/amf/amfd/config.h new file mode > 100644 index 000000000..6a110db0c > --- /dev/null > +++ b/src/amf/amfd/config.h > @@ -0,0 +1,21 @@ > +#ifndef AMFD_CONFIG_H_ > +#define AMFD_CONFIG_H_ > + > +#include "osaf/saf/saAis.h" > + > +class Configuration { > + public: > + Configuration(); > + ~Configuration(); > + SaAisErrorT get_config(void); > + bool restrict_auto_repair_enabled(); > + void restrict_auto_repair(bool enable); > + private: > + bool restrict_auto_repair_; > + Configuration(const Configuration&) = delete; > + Configuration& operator=(const Configuration&) = delete; }; > + > +extern Configuration *configuration; > + > +#endif > diff --git a/src/amf/amfd/imm.cc b/src/amf/amfd/imm.cc index > d59c2c4c9..dd842d9e1 100644 > --- a/src/amf/amfd/imm.cc > +++ b/src/amf/amfd/imm.cc > @@ -49,6 +49,7 @@ > #include "amf/amfd/si.h" > #include "amf/amfd/csi.h" > #include "amf/amfd/si_dep.h" > +#include "amf/amfd/config.h" > #include "base/osaf_utility.h" > > #include "base/osaf_time.h" > @@ -107,7 +108,8 @@ type_map amf_type_map = { > {"safRdn", AVSV_SA_AMF_COMP_GLOBAL_ATTR}, > {"safHealthcheckKey", AVSV_SA_AMF_CLASS_INVALID}, > /* Common Version Related */ > - {"safVersion", AVSV_SA_AMF_CLASS_INVALID}}; > + {"safVersion", AVSV_SA_AMF_CLASS_INVALID}, > + {"amfConfig", AVSV_SA_AMF_CONFIGURATION}}; > > type_map versioned_types = {{"safAppType", AVSV_SA_AMF_APP_TYPE}, > {"safSgType", AVSV_SA_AMF_SG_TYPE}, @@ -554,7 > +556,9 > @@ static const char *avd_class_names[] = {"Invalid", > "SaAmfSIRankedSU", > > "SaAmfSIAssignment", > - "SaAmfCSIAssignment"}; > + "SaAmfCSIAssignment", > + > + "OpenSafAmfConfig"}; > > static AvdImmOiCcbApplyCallbackT > ccb_apply_callback[AVSV_SA_AMF_CLASS_MAX]; > static AvdImmOiCcbCompletedCallbackT > @@ -1482,13 +1486,20 @@ SaAisErrorT avd_imm_impl_set(void) { > if ((nullptr != ccb_completed_callback[i]) && > (rc = immutil_saImmOiClassImplementerSet( > avd_cb->immOiHandle, avd_class_names[i])) != SA_AIS_OK) { > - LOG_ER("Impl Set Failed for %s, returned %d", avd_class_names[i], rc); > - break; > + > + if (rc == SA_AIS_ERR_NOT_EXIST) { > + LOG_WA( > + "Impl Set Failed for %s, returned %d. Please check IMM schema is > up- > to-date.", > + avd_class_names[i], rc); > + rc = SA_AIS_OK; > + } else { > + LOG_ER("Impl Set Failed for %s, returned %d", avd_class_names[i], > rc); > + break; > + } > } > } > > avd_cb->is_implementer = true; > - > TRACE_LEAVE2("%u", rc); > return rc; > } > @@ -1521,8 +1532,16 @@ SaAisErrorT avd_imm_applier_set(void) { > if ((nullptr != ccb_completed_callback[i]) && > (rc = immutil_saImmOiClassImplementerSet( > avd_cb->immOiHandle, avd_class_names[i])) != SA_AIS_OK) { > - LOG_ER("Impl Set Failed for %s, returned %d", avd_class_names[i], rc); > - break; > + > + if (rc == SA_AIS_ERR_NOT_EXIST) { > + LOG_WA( > + "Impl Set Failed for %s, returned %d. Please check IMM schema is > up- > to-date.", > + avd_class_names[i], rc); > + rc = SA_AIS_OK; > + } else { > + LOG_ER("Impl Set Failed for %s, returned %d", avd_class_names[i], > rc); > + break; > + } > } > } > > @@ -1651,6 +1670,8 @@ unsigned int avd_imm_config_get(void) { > /* retrieve hydra configuration from IMM */ > if (hydra_config_get() != SA_AIS_OK) goto done; > > + if (configuration->get_config() != SA_AIS_OK) goto done; > + > // SGs needs to adjust configuration once all instances have been added > { > for (const auto &value : *sg_db) { > diff --git a/src/amf/amfd/ndproc.cc b/src/amf/amfd/ndproc.cc index > 148e92921..e80a0b3b8 100644 > --- a/src/amf/amfd/ndproc.cc > +++ b/src/amf/amfd/ndproc.cc > @@ -159,13 +159,13 @@ void avd_reg_su_evh(AVD_CL_CB *cb, AVD_EVT > *evt) { > > // Before any SU gets instantiated, send Maintenance campaign update. > for (const auto &su : node->list_of_ncs_su) { > - if (su->saAmfSUMaintenanceCampaign.empty() == false) { > + if (su->restrict_auto_repair() == true) { > TRACE("Sending Maintenance campaign info for '%s'", su- > >name.c_str()); > su->set_su_maintenance_campaign(); > } > } > for (const auto &su : node->list_of_su) { > - if (su->saAmfSUMaintenanceCampaign.empty() == false) { > + if (su->restrict_auto_repair() == true) { > TRACE("Sending Maintenance campaign info for '%s'", su- > >name.c_str()); > su->set_su_maintenance_campaign(); > } > diff --git a/src/amf/amfd/node.cc b/src/amf/amfd/node.cc index > 1e364de65..f5375963b 100644 > --- a/src/amf/amfd/node.cc > +++ b/src/amf/amfd/node.cc > @@ -1652,11 +1652,11 @@ void avd_node_constructor(void) { bool > AVD_AVND::is_campaign_set_for_all_sus() const { > if (std::all_of(list_of_ncs_su.begin(), list_of_ncs_su.end(), > [&](AVD_SU *su) -> bool { > - return su->saAmfSUMaintenanceCampaign.empty() == false; > + return su->restrict_auto_repair() == true; > })) { > if (std::all_of(list_of_su.begin(), list_of_su.end(), > [&](AVD_SU *su) -> bool { > - return su->saAmfSUMaintenanceCampaign.empty() == false; > + return su->restrict_auto_repair() == true; > })) { > return true; > } else { > diff --git a/src/amf/amfd/sgproc.cc b/src/amf/amfd/sgproc.cc index > 3698017e9..cd95fe82c 100644 > --- a/src/amf/amfd/sgproc.cc > +++ b/src/amf/amfd/sgproc.cc > @@ -309,7 +309,7 @@ void su_try_repair(const AVD_SU *su) { > (su->saAmfSUOperState == SA_AMF_OPERATIONAL_DISABLED) && > (su->saAmfSUPresenceState != > SA_AMF_PRESENCE_INSTANTIATION_FAILED) && > (su->saAmfSUPresenceState != > SA_AMF_PRESENCE_TERMINATION_FAILED) && > - (su->saAmfSUMaintenanceCampaign.empty())) { > + (su->restrict_auto_repair() == false)) { > saflog(LOG_NOTICE, amfSvcUsrName, > "Ordering Auto repair of '%s' as sufailover repair action", > su->name.c_str()); > @@ -639,7 +639,7 @@ static void > perform_nodeswitchover_recovery(AVD_AVND *node) { > for (const auto &su : node->list_of_su) { > if (su->list_of_susi == nullptr) continue; > > - if (!su->saAmfSUMaintenanceCampaign.empty()) node_reboot = false; > + if (su->restrict_auto_repair() == true) node_reboot = false; > > if (su_recover_from_fault(su) == NCSCC_RC_FAILURE) { > LOG_ER("%s:%d %s", __FUNCTION__, __LINE__, su->name.c_str()); @@ > -787,7 +787,7 @@ void avd_su_oper_state_evh(AVD_CL_CB *cb, AVD_EVT > *evt) { > TRACE("Component in %s requested FAILFAST", su->name.c_str()); > } > > - if (!su->saAmfSUMaintenanceCampaign.empty()) { > + if (su->restrict_auto_repair() == true) { > saflog( > LOG_NOTICE, amfSvcUsrName, > "Node Fail-Fast disabled because maintenance campaign %s is set for > su: %s", @@ -839,7 +839,7 @@ void avd_su_oper_state_evh(AVD_CL_CB > *cb, AVD_EVT *evt) { > if (su->sg_of_su->sg_ncs_spec == true) { > su->set_oper_state(SA_AMF_OPERATIONAL_DISABLED); > > - if (!su->saAmfSUMaintenanceCampaign.empty()) { > + if (su->restrict_auto_repair() == true) { > saflog( > LOG_NOTICE, amfSvcUsrName, > "Node Fail-Fast disabled because maintenance campaign %s is set > for > su: %s", @@ -890,13 +890,13 @@ void avd_su_oper_state_evh(AVD_CL_CB > *cb, AVD_EVT *evt) { > node->recvr_fail_sw = true; > > // if maintenance campaign is ongoing, disable node reboot > - if (!su->saAmfSUMaintenanceCampaign.empty()) node_reboot_req = > false; > + if (su->restrict_auto_repair() == true) node_reboot_req = > + false; > > switch (n2d_msg->msg_info.n2d_opr_state.rec_rcvr.raw) { > case SA_AMF_NODE_FAILOVER: > if ((node->node_info.nodeId == cb->node_id_avd) && > (node->saAmfNodeAutoRepair) && > - (su->saAmfSUMaintenanceCampaign.empty())) { > + (su->restrict_auto_repair() == false)) { > /* This is a case when Act ctlr is rebooting. Don't do appl > failover as of now because during appl failover if Act > controller reboots, then there may be packet losses. > Anyway, @@ > -1731,7 +1731,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb, AVD_EVT > *evt) { > are in no_red model. We are doing the same thing for controller also. > */ > bool maintenanceCampaignSet(false); > > - if (su && !su->saAmfSUMaintenanceCampaign.empty()) > + if (su && su->restrict_auto_repair() == true) > maintenanceCampaignSet = true; > > for (const auto &temp_su : node->list_of_su) { diff --git > a/src/amf/amfd/su.cc b/src/amf/amfd/su.cc index 84c05b79e..fac1188b5 > 100644 > --- a/src/amf/amfd/su.cc > +++ b/src/amf/amfd/su.cc > @@ -30,6 +30,7 @@ > #include "amf/amfd/proc.h" > #include "amf/amfd/csi.h" > #include "amf/amfd/cluster.h" > +#include "config.h" > #include <algorithm> > > AmfDb<std::string, AVD_SU> *su_db = nullptr; @@ -766,7 +767,7 @@ void > AVD_SU::set_pres_state(SaAmfPresenceStateT pres_state) { > (su_on_node->saAmfNodeFailfastOnTerminationFailure == true) && > (sg_of_su->saAmfSGAutoRepair == true) && > (su_on_node->saAmfNodeAutoRepair == true) && > - (saAmfSUMaintenanceCampaign.empty())) > + (restrict_auto_repair() == false)) > /* According to AMF B.04.01 Section 4.8 Page 214 if user configures > saAmfNodeFailfastOnTerminationFailure = true, AMF has to perform > node failfast recovery action. So mark SU to @@ -777,7 +778,7 @@ > void AVD_SU::set_pres_state(SaAmfPresenceStateT pres_state) { > (su_on_node->saAmfNodeFailfastOnInstantiationFailure == true) && > (sg_of_su->saAmfSGAutoRepair == true) && > (su_on_node->saAmfNodeAutoRepair == true) && > - (saAmfSUMaintenanceCampaign.empty())) > + (restrict_auto_repair() == false)) > /* According to AMF B.04.01 Section 4.6 Page 212 if user configures > saAmfNodeFailfastOnInstantiationFailure = true, AMF has to perform > node failfast recovery action. So mark SU to @@ -839,8 +840,15 @@ > void AVD_SU::set_oper_state(SaAmfOperationalStateT oper_state) { > > saAmfSUOperState = oper_state; > > - avd_send_oper_chg_ntf(name, SA_AMF_NTFID_SU_OP_STATE, old_state, > - saAmfSUOperState, &saAmfSUMaintenanceCampaign); > + if (restrict_auto_repair() == true) { > + avd_send_oper_chg_ntf(name, SA_AMF_NTFID_SU_OP_STATE, > old_state, > + saAmfSUOperState, > + &saAmfSUMaintenanceCampaign); } else { > + // if restrict auto repair is not enabled, *do not* send > + // campaign in notification to SMF, for backwards compatability > + avd_send_oper_chg_ntf(name, SA_AMF_NTFID_SU_OP_STATE, > old_state, > + saAmfSUOperState); } > > avd_saImmOiRtObjectUpdate(name, "saAmfSUOperState", > SA_IMM_ATTR_SAUINT32T, > &saAmfSUOperState); @@ -2194,9 +2202,14 @@ void > AVD_SU::send_attribute_update(AVSV_AMF_SU_ATTR_ID attrib_id) { > } > case saAmfSUMaintenanceCampaign_ID: { > param.attr_id = saAmfSUMaintenanceCampaign_ID; > - param.value_len = saAmfSUMaintenanceCampaign.length(); > - memcpy(¶m.value[0], saAmfSUMaintenanceCampaign.data(), > - param.value_len); > + if (restrict_auto_repair() == true) { > + param.value_len = saAmfSUMaintenanceCampaign.length(); > + memcpy(¶m.value[0], saAmfSUMaintenanceCampaign.data(), > + param.value_len); > + } else { > + param.value_len = 0; > + param.value[0] = '\0'; > + } > break; > } > default: > @@ -2710,3 +2723,13 @@ void > AVD_SU::update_susis_in_imm_and_ntf(SaAmfHAStateT ha_state) const { > avd_gen_su_ha_state_changed_ntf(avd_cb, susi); > } > } > + > +bool AVD_SU::restrict_auto_repair() const { > + if (saAmfSUMaintenanceCampaign.empty() == false && > + configuration->restrict_auto_repair_enabled()) { > + return true; > + } > + > + return false; > +} > \ No newline at end of file > diff --git a/src/amf/amfd/su.h b/src/amf/amfd/su.h index > 351365b70..600b8f5f3 100644 > --- a/src/amf/amfd/su.h > +++ b/src/amf/amfd/su.h > @@ -55,7 +55,7 @@ class AVD_SU { > bool saAmfSUFailover; > /* true when user has configured saAmfSUFailover */ > bool saAmfSUFailover_configured; > - std::string saAmfSUMaintenanceCampaign; > + bool restrict_auto_repair() const; > > /* runtime attributes */ > SaBoolT saAmfSUPreInstantiable; // TODO(hafe) change to bool @@ -96,6 > +96,7 @@ class AVD_SU { > > AVD_SUTYPE *su_type; > AVD_SU *su_list_su_type_next; > + std::string saAmfSUMaintenanceCampaign; > > void set_su_failover(bool value); > void set_su_maintenance_campaign(void); > diff --git a/src/amf/common/amf_defs.h b/src/amf/common/amf_defs.h > index 8433214de..24549b3af 100644 > --- a/src/amf/common/amf_defs.h > +++ b/src/amf/common/amf_defs.h > @@ -154,6 +154,9 @@ typedef enum { > AVSV_SA_AMF_SI_ASSIGNMENT = 33, > AVSV_SA_AMF_CSI_ASSIGNMENT = 34, > > + /* AMF configuration */ > + AVSV_SA_AMF_CONFIGURATION = 35, > + > AVSV_SA_AMF_CLASS_MAX > } AVSV_AMF_CLASS_ID; > > diff --git a/src/amf/config/amf_classes.xml > b/src/amf/config/amf_classes.xml index ee0f185ea..df5cbd92a 100644 > --- a/src/amf/config/amf_classes.xml > +++ b/src/amf/config/amf_classes.xml > @@ -1438,4 +1438,19 @@ > <flag>SA_WRITABLE</flag> > </attr> > </class> > + <class name="OpenSafAmfConfig"> > + <category>SA_CONFIG</category> > + <rdn> > + <name>amfConfig</name> > + <type>SA_STRING_T</type> > + <category>SA_CONFIG</category> > + <flag>SA_INITIALIZED</flag> > + </rdn> > + <attr> > + <name>osafAmfRestrictAutoRepairEnable</name> > + <type>SA_UINT32_T</type> > + <category>SA_CONFIG</category> > + <flag>SA_WRITABLE</flag> > + </attr> > + </class> > </imm:IMM-contents> > diff --git a/src/amf/config/amf_objects.xml > b/src/amf/config/amf_objects.xml index 502fc2f7f..6ed68d83d 100644 > --- a/src/amf/config/amf_objects.xml > +++ b/src/amf/config/amf_objects.xml > @@ -1,5 +1,12 @@ > <?xml version="1.0" encoding="utf-8"?> > <imm:IMM-contents xmlns:imm="http://www.saforum.org/IMMSchema" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:noNamespaceSchemaLocation="SAI-AIS-IMM-XSD-A.02.13.xsd"> > + <object class="OpenSafAmfConfig"> > + <dn>amfConfig=1,safApp=safAmfService</dn> > + <attr> > + <name>osafAmfRestrictAutoRepairEnable</name> > + <value>1</value> > + </attr> > + </object> > <object class="SaAmfAppBaseType"> > <dn>safAppType=OpenSafApplicationType</dn> > </object> > -- > 2.11.0 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
