Hi Alex

> On 22 Apr 2017, at 7:51 pm, Alex Jones <[email protected]> wrote:
> 
> Hi Gary,
> 
>   I guess I'm OK if you want to put this in regardless, but I have some 
> comments.
> 
> (1) The behavior should be ON by default because it is part of the spec.

We could do that. Let's see what other maintainers think?

> (2) Do we really want to allow this value to be changed while a campaign is 
> executing? That could cause some problems. This is another reason why I think 
> this should really be handled by SMF.
> (3) If this does end up being handled by SMF, what does having this 
> configuration in AMF buy us? What would be the point of using it?

My understanding is changing SMF not to set the campaign is 
non-backwards-compatible; some existing applications are using this attribute.

I had also wanted this configuration to be in SMF as it would mean no changes 
required in AMF.

Thanks
Gary

> 
> Alex
> From: Gary Lee [[email protected]]
> Sent: Friday, April 21, 2017 9:24 AM
> To: Alex Jones
> Cc: praveen malviya; [email protected]
> Subject: 
> 
> NOTICE: This email was received from an EXTERNAL sender
> 
> Hi
> 
> I'm neutral as to whether this should be done in SMF or AMF.
> But most of the code changes are related to introducing a configuration 
> object for AMF which is long overdue anyway. We have hard coded values and 
> environment variables which would be better placed in such an object.
> 
> Gary
> 
> > On 21 Apr 2017, at 11:07 pm, Alex Jones <[email protected]> wrote:
> > 
> > In my opinion this is not the right thing to do for a couple of reasons.
> > 
> > (1) If the behavior is defined in the spec it should be ON by default.
> > Anders and I have already discussed this.
> > 
> > (2) Implementing this in AMF is too complicated. It really should be
> > implemented in SMF. SMF shouldn't set the maintenance campaign if it
> > doesn't want the new behavior.
> > 
> > (3) It is also much simpler to implement in SMF.
> > 
> > Alex
> > 
> >> 
> >> Message: 3
> >> Date: Fri, 21 Apr 2017 19:51:33 +1000
> >> From: Gary Lee <[email protected]>
> >> Subject: [devel] [PATCH 0/1] Review Request for amfd: make auto repair
> >> restriction configurable [#2435]
> >> To: [email protected] <mailto:[email protected]>
> >> Cc: [email protected]
> >> <mailto:[email protected]>
> >> Message-ID:
> >> <[email protected]>
> >> Content-Type: text/plain; charset=UTF-8
> >> 
> >> Summary: amfd: make auto repair restriction configurable [#2435]
> >> Review request for Ticket(s): 2435
> >> Peer Reviewer(s): AMF devs
> >> Pull request to: *** LIST THE PERSON WITH PUSH ACCESS HERE ***
> >> Affected branch(es): develop
> >> Development branch: ticket-2435
> >> Base revision: 66970f59421f9d4338ee6d13134afca9082c1e91
> >> Personal repository: git://git.code.sf.net/u/userid-2226215/review
> >> 
> >> --------------------------------
> >> Impacted area Impact y/n
> >> --------------------------------
> >> Docs n
> >> Build system n
> >> RPM/packaging n
> >> Configuration files n
> >> Startup scripts n
> >> SAF services y
> >> OpenSAF services n
> >> Core libraries n
> >> Samples n
> >> Tests n
> >> Other n
> >> 
> >> 
> >> Comments (indicate scope for each "y" above):
> >> ---------------------------------------------
> >> *** EXPLAIN/COMMENT THE PATCH SERIES HERE ***
> >> 
> >> revision be7b51d723db24721c19b0b4953e794215f86d88
> >> Author: Gary Lee <[email protected]>
> >> Date: Fri, 21 Apr 2017 19:36:51 +1000
> >> 
> >> 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 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
> >> 
> >> 
> >> 
> >> Added Files:
> >> ------------
> >> src/amf/amfd/config.cc
> >> src/amf/amfd/config.h
> >> 
> >> 
> >> Complete diffstat:
> >> ------------------
> >> 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(-)
> >> 
> >> 
> >> Testing Commands:
> >> -----------------
> >> Test 1)
> >> Turn on tracing for AMFND
> >> 
> >> Ensure ?restrict auto repair? is disabled:?immcfg -a
> >> amfRestrictAutoRepairEnable=0 amfConfig=1,safApp=safAmfService
> >> 
> >> Set campaign on an SU:?immcfg -a saAmfSUMaintenanceCampaign="foo"
> >> safSu=PL-5,safSg=NoRed,safApp=OpenSAF
> >> 
> >> Enable ?restrict auto repair':?immcfg -a amfRestrictAutoRepairEnable=1
> >> amfConfig=1,safApp=safAmfService
> >> 
> >> Ensure the change is propagated to AMFND on PL-5 by looking for this in
> >> the trace:
> >> TRACE("suMaintenanceCampaign for '%s' changed to '%s'",?
> >> su->name.c_str(), su->suMaintenanceCampaign.c_str());
> >> 
> >> Test 2)
> >> 1. Enable 'restrict auto repair'
> >> 2. "amf-adm restart <comp>" should work when suMaintenence is set for
> >> enclosing SU
> >> 3. kill <comp> when suMaintenance is set, auto repair will not occur
> >> 
> >> 
> >> Testing, Expected Results:
> >> --------------------------
> >> *** PASTE COMMAND OUTPUTS / TEST RESULTS ***
> >> 
> >> 
> >> Conditions of Submission:
> >> -------------------------
> >> *** HOW MANY DAYS BEFORE PUSHING, CONSENSUS ETC ***
> >> 
> >> 
> >> Arch Built Started Linux distro
> >> -------------------------------------------
> >> mips n n
> >> mips64 n n
> >> x86 n n
> >> x86_64 y y
> >> powerpc n n
> >> powerpc64 n n
> >> 
> >> 
> >> Reviewer Checklist:
> >> -------------------
> >> [Submitters: make sure that your review doesn't trigger any checkmarks!]
> >> 
> >> 
> >> Your checkin has not passed review because (see checked entries):
> >> 
> >> ___ Your RR template is generally incomplete; it has too many blank entries
> >> that need proper data filled in.
> >> 
> >> ___ You have failed to nominate the proper persons for review and push.
> >> 
> >> ___ Your patches do not have proper short+long header
> >> 
> >> ___ You have grammar/spelling in your header that is unacceptable.
> >> 
> >> ___ You have exceeded a sensible line length in your headers/comments/text.
> >> 
> >> ___ You have failed to put in a proper Trac Ticket # into your commits.
> >> 
> >> ___ You have incorrectly put/left internal data in your comments/files
> >> (i.e. internal bug tracking tool IDs, product names etc)
> >> 
> >> ___ You have not given any evidence of testing beyond basic build tests.
> >> Demonstrate some level of runtime or other sanity testing.
> >> 
> >> ___ You have ^M present in some of your files. These have to be removed.
> >> 
> >> ___ You have needlessly changed whitespace or added whitespace crimes
> >> like trailing spaces, or spaces before tabs.
> >> 
> >> ___ You have mixed real technical changes with whitespace and other
> >> cosmetic code cleanup changes. These have to be separate commits.
> >> 
> >> ___ You need to refactor your submission into logical chunks; there is
> >> too much content into a single commit.
> >> 
> >> ___ You have extraneous garbage in your review (merge commits etc)
> >> 
> >> ___ You have giant attachments which should never have been sent;
> >> Instead you should place your content in a public tree to be pulled.
> >> 
> >> ___ You have too many commits attached to an e-mail; resend as threaded
> >> commits, or place in a public tree for a pull.
> >> 
> >> ___ You have resent this content multiple times without a clear indication
> >> of what has changed between each re-send.
> >> 
> >> ___ You have failed to adequately and individually address all of the
> >> comments and change requests that were proposed in the initial review.
> >> 
> >> ___ You have a misconfigured ~/.gitconfig file (i.e. user.name,
> >> user.email etc)
> >> 
> >> ___ Your computer have a badly configured date and time; confusing the
> >> the threaded patch review.
> >> 
> >> ___ Your changes affect IPC mechanism, and you don't present any results
> >> for in-service upgradability test.
> >> 
> >> ___ Your changes affect user manual and documentation, your patch series
> >> do not contain the patch that updates the Doxygen manual.
> >> 
> >> 
> >> 
> >> 
> >> ------------------------------
> >> 
> >> Message: 4
> >> Date: Fri, 21 Apr 2017 19:51:34 +1000
> >> From: Gary Lee <[email protected]>
> >> Subject: [devel] [PATCH 1/1] amfd: make auto repair restriction
> >> configurable [#2435]
> >> To: [email protected] <mailto:[email protected]>
> >> Cc: [email protected]
> >> <mailto:[email protected]>
> >> Message-ID:
> >> <[email protected]>
> >> 
> >> 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>
> >> -- 
> >> 1.9.1
> >> 
> > 
------------------------------------------------------------------------------
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