Hi Praveen

Also, most of the code changes is just replacing 
‘!su->saAmfSUMaintenanceCampaign.empty()’ with ‘restrict_auto_repair() == 
true’, which arguably is clearer to read.
Apart from that, there is a small change to not to send the campaign in the 
notification to SMF if the restrict auto repair option is disabled.

So AMF code isn’t really impacted that much. I agree with you and Alex that it 
is more logical to do this in SMF, but for keeping backwards compatibility I 
think this is a good compromise.

I will change the naming of the attribute to osafAmf if we agree with this 
approach.

Thanks
Gary

-----Original Message-----
From: gary <gary....@dektech.com.au>
Date: Wednesday, 26 April 2017 at 7:55 pm
To: praveen malviya <praveen.malv...@oracle.com>
Cc: <opensaf-devel@lists.sourceforge.net>
Subject: Re: [devel] [PATCH 1/1] amfd: make auto repair restriction 
configurable [#2435]

    Hi Praveen
    
    >From talking with some SMF maintainers, some applications could be using 
saAmfSUMaintenanceCampaign even though AMF does not.
    So in terms of backwards compatibility, it is better to put this 
configuration in AMF instead.
    
    Thanks
    Gary
    
    -----Original Message-----
    From: praveen malviya <praveen.malv...@oracle.com>
    Organization: Oracle Corporation
    Date: Wednesday, 26 April 2017 at 7:47 pm
    To: gary <gary....@dektech.com.au>
    Cc: <opensaf-devel@lists.sourceforge.net>
    Subject: Re: [PATCH 1/1] amfd: make auto repair restriction configurable 
[#2435]
    
        Hi Gary,
        
        If I understand, before 5.2, while running campaign SMF used to set 
        saAmfSUMaintenanceCampaign attribute in affected SUs using CCB 
        operations. Since AMF feature "Restrictions to auto repair" was not 
        implemented (implemented in #2144, 5.2), AMF was still taking actions 
if 
        components faults while campaign is running and also su maintenance 
        related notifications were not generated. With 2144 in 5.2 release, SMF 
        is still setting the saAmfSUMaintenanceCampaign. But if some faults 
        happens now, AMF will be taking action and also it sends su maintenance 
        related notification.
        
        I guess before 5.2 release SMF was just setting and unsetting 
        saAmfSUMaintenanceCampaign without any other use as #2144 was not 
        implemented before 5.2?  If it is so, it means no application and even 
        SMF itself does not track this attribute value before 5.2 other than 
        setting and unsetting? Based on this one solution could be:  if SMF 
        skips the step/command of setting saAmfSUMaintenanceCampaign based on a 
        new attribute in class SaSmfCampaign. One object of this class is 
        created for each campaign before starting the campaign.
        
        Note:All Non-spec configuration attributes are named as "osafAmf*" in 
AMF.
        
        
        Thanks
        Praveen
        
        On 21-Apr-17 3:21 PM, Gary Lee wrote:
        > 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 not to support auto 
repair
        > restriction.
        > 
        > To enable restriction:
        > immcfg -a amfRestrictAutoRepairEnable=1 
amfConfig=1,safApp=safAmfService
        > 
        > To disable restriction:
        > immcfg -a amfRestrictAutoRepairEnable=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 8c175c2..1d6ca60 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 d4b51a6..3e0dc5d 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 0000000..bdb07d2
        > --- /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, 
"amfRestrictAutoRepairEnable")) {
        > +      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("amfRestrictAutoRepairEnable 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("amfRestrictAutoRepairEnable", attributes, 
0, &value)
        > +      == SA_AIS_OK) {
        > +      configuration->restrict_auto_repair(static_cast<bool>(value));
        > +    }
        > +  }
        > +
        > +  error = SA_AIS_OK;
        > +  TRACE("amfRestrictAutoRepairEnable 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 0000000..6a110db
        > --- /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 d59c2c4..dd842d9 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 148e929..e80a0b3 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 1e364de..f537596 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 3698017..cd95fe8 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 84c05b7..fac1188 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(&param.value[0], saAmfSUMaintenanceCampaign.data(),
        > -               param.value_len);
        > +        if (restrict_auto_repair() == true) {
        > +          param.value_len = saAmfSUMaintenanceCampaign.length();
        > +          memcpy(&param.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 351365b..600b8f5 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 8433214..24549b3 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 ee0f185..19a6232 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>amfRestrictAutoRepairEnable</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 502fc2f..31fc3e5 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>amfRestrictAutoRepairEnable</name>
        > +                     <value>0</value>
        > +             </attr>
        > +     </object>
        >       <object class="SaAmfAppBaseType">
        >               <dn>safAppType=OpenSafApplicationType</dn>
        >       </object>
        > 
        
    
    
    
    
------------------------------------------------------------------------------
    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
    Opensaf-devel@lists.sourceforge.net
    https://lists.sourceforge.net/lists/listinfo/opensaf-devel
    



------------------------------------------------------------------------------
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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to