Hi Gary,
        Have you tested downgrade scenarios ? I assume you have tested upgrade 
scenario.

Thanks
-Nagu

> -----Original Message-----
> From: praveen malviya <[email protected]>
> Organization: Oracle Corporation
> Date: Wednesday, 26 April 2017 at 8:19 pm
> To: gary <[email protected]>
> Cc: <[email protected]>
> Subject: Re: [PATCH 1/1] amfd: make auto repair restriction configurable
> [#2435]
> 
> 
> 
>     On 26-Apr-17 3:25 PM, Gary Lee wrote:
>     > Hi Praveen
>     >
>     >  From talking with some SMF maintainers, some applications could be
> using saAmfSUMaintenanceCampaign even though AMF does not.
>     How it is exposed to the application?
>     I guess an SMF application can register for SMF callback
>     SaSmfCampaignCallbackT only which has nothing to do with setting and
>     unsetting in AMF. Also AMF does not send campaign name in notifications
>     before 5.2.
> 
>     Thanks,
>     Praveen
>     > So in terms of backwards compatibility, it is better to put this
> configuration in AMF instead.
>     >
>     > Thanks
>     > Gary
>     >
>     > -----Original Message-----
>     > From: praveen malviya <[email protected]>
>     > Organization: Oracle Corporation
>     > Date: Wednesday, 26 April 2017 at 7:47 pm
>     > To: gary <[email protected]>
>     > Cc: <[email protected]>
>     > 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to