G'day Gary,

       I see you were adding the XML file dynamically with "immcfg -f". I
   hadn't tried that. I hadn't tried killing the sample app, either.

       Here is a patch that should fix both issues. Apply it on top of the
   latest big one I sent.

   Alex

   On 08/13/2018 10:37 PM, Gary Lee wrote:
     __________________________________________________________________

   NOTICE: This email was received from an EXTERNAL sender
     __________________________________________________________________

   Hi Alex

   I modified AppConfig-container.xml and changed saAmfSgtRedundancyModel
   from 4 (NwayAct) to 1 (2N).

   The xml still loads and I could unlock, resulting in:
   root@SC-1:/var/log# immlist safVersion=1,safSgType=Container
   Name                                               Type
   Value(s)
   =======================================================================
   =
   safVersion                                         SA_STRING_T
   safVersion=1
   saAmfSgtValidSuTypes                               SA_NAME_T
   safVersion=1,safSuType=Container (32)
   saAmfSgtRedundancyModel                            SA_UINT32_T  1 (0x1)
   safSISU=safSu=SU2\,safSg=Container\,safApp=Container,safSi=Container,sa
   fApp=Container
       saAmfSISUHAState=STANDBY(2)
       saAmfSISUHAReadinessState=READY_FOR_ASSIGNMENT(1)
   safSISU=safSu=SU1\,safSg=Container\,safApp=Container,safSi=Container,sa
   fApp=Container
       saAmfSISUHAState=ACTIVE(1)
       saAmfSISUHAReadinessState=READY_FOR_ASSIGNMENT(1)
   Also, have you tried killing the amf_container_demo binary?
   Thanks
   Gary

   On 14/08/18 05:00, Alex Jones wrote:

     Hi Gary,

         I just resubmitted a new patch which breaks out the different
     components, and addresses the other comments here. But, #2
     (rejecting all but NWay-active for container) should already be in
     there. Is there a specific test you ran that didn't work?

     Alex

   On 08/13/2018 02:43 AM, Gary Lee wrote:
       _______________________________________________________________

     NOTICE: This email was received from an EXTERNAL sender
       _______________________________________________________________

     Hi Alex
     Some initial comments:
     0. Is it possible to split up the patch into amfd / amfnd / common /
     samples. Just makes it easier to reply inline.
     1. Please compile the container demo by default, and make
     amf_container_script world executable.
     Eg.
     diff --git a/samples/amf/Makefile.am b/samples/amf/Makefile.am
     index 447dedd..7ebf9c3 100644
     --- a/samples/amf/Makefile.am
     +++ b/samples/amf/Makefile.am
     @@ -19,5 +19,5 @@ include $(top_srcdir)/Makefile.common
     MAINTAINERCLEANFILES = Makefile.in
     -SUBDIRS = sa_aware non_sa_aware wrapper proxy api_demo
     +SUBDIRS = sa_aware non_sa_aware wrapper proxy api_demo container
     diff --git a/samples/amf/container/amf_container_script
     b/samples/amf/container/amf_container_script
     old mode 100644
     new mode 100755
     diff --git a/samples/configure.ac b/samples/configure.ac
     index 7cf803e..9765d54 100644
     --- a/samples/configure.ac
     +++ b/samples/configure.ac
     @@ -67,6 +67,7 @@ AC_CONFIG_FILES([ \
     amf/wrapper/Makefile \
     amf/proxy/Makefile \
     amf/api_demo/Makefile \
     + amf/container/Makefile \
     cpsv/Makefile \
     cpsv/ckpt_demo/Makefile \
     cpsv/ckpt_track_demo/Makefile \
     2. We should probably reject CCBs that set saAmfSgtRedundancyModel
     to anything other than NWayActive, for Containers.
     3. Do we need to bump the msg format version to
     AVSV_AVD_AVND_MSG_FMT_VER_8? An old amfnd will assert if it gets an
     AVSV_D2N_CONTAINED_SU_MSG_INFO msg.
     Thanks
     Gary
diff --git a/src/amf/amfd/comp.cc b/src/amf/amfd/comp.cc
index 571ac34fb..d8cbcf2ae 100644
--- a/src/amf/amfd/comp.cc
+++ b/src/amf/amfd/comp.cc
@@ -328,6 +328,31 @@ done:
   TRACE_LEAVE();
 }
 
+static bool get_container_redundancy_model_from_ccb(
+  CcbUtilOperationData_t *opdata,
+  const std::string& sg_name,
+  SaAmfRedundancyModelT& model) {
+  SaNameT aname, sgtypeName;
+  bool status(false);
+
+  osaf_extended_name_alloc(sg_name.c_str(), &aname);
+  CcbUtilOperationData_t *ccbSgOpData(ccbutil_getCcbOpDataByDN(opdata->ccbId, &aname)),
+    *ccbSgTypeOpData(nullptr);
+
+  if (ccbSgOpData && ccbSgOpData->operationType == CCBUTIL_CREATE &&
+      immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSGType"),
+                      ccbSgOpData->param.create.attrValues,
+                      0, &sgtypeName) == SA_AIS_OK &&
+      (ccbSgTypeOpData = ccbutil_getCcbOpDataByDN(opdata->ccbId, &sgtypeName)) &&
+      immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSgtRedundancyModel"),
+                      ccbSgTypeOpData->param.create.attrValues,
+                      0, &model) == SA_AIS_OK) {
+    status = true;
+  }
+
+  return status;
+}
+
 /**
  * Validate configuration attributes for an AMF Comp object
  * @param comp
@@ -420,6 +445,38 @@ static int is_config_valid(const std::string &dn,
     }
   }
 
+  // container comp can only be in SG which is NWay-Active
+  if ((comptype && IS_COMP_CONTAINER(comptype->saAmfCtCompCategory)) ||
+      (ccbCompTypeOpData &&
+      ccbCompTypeOpData->operationType == CCBUTIL_CREATE &&
+      immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCtCompCategory"),
+                      ccbCompTypeOpData->param.create.attrValues,
+                      0, &value) == SA_AIS_OK &&
+      value & SA_AMF_COMP_CONTAINER)) {
+    std::string sg_name;
+
+    avsv_sanamet_init(dn, sg_name, "safSg");
+    AVD_SG *sg(sg_db->find(sg_name));
+
+    SaAmfRedundancyModelT saAmfSgtRedundancyModel(SA_AMF_NO_REDUNDANCY_MODEL);
+
+    if (sg && sg->sg_type)
+      saAmfSgtRedundancyModel = sg->sg_type->saAmfSgtRedundancyModel;
+    else if (!get_container_redundancy_model_from_ccb(
+      opdata, sg_name, saAmfSgtRedundancyModel)) {
+      report_ccb_validation_error(
+          opdata, "'%s' does not exist in existing model or in CCB",
+          sg_name.c_str());
+      return 0;
+    }
+
+    if (saAmfSgtRedundancyModel != SA_AMF_N_WAY_ACTIVE_REDUNDANCY_MODEL) {
+      report_ccb_validation_error(
+        opdata, "Container component '%s' must be in SG which has "
+	"NWay-Active redundancy model", dn.c_str());
+      return 0;
+    }
+  }
 
 #if 0
         if ((comp->comp_info.category == AVSV_COMP_TYPE_SA_AWARE) && (comp->comp_info.init_len == 0)) {
diff --git a/src/amf/amfd/ndproc.cc b/src/amf/amfd/ndproc.cc
index eb5d2b3d8..9d6f0e1e4 100644
--- a/src/amf/amfd/ndproc.cc
+++ b/src/amf/amfd/ndproc.cc
@@ -1077,6 +1077,8 @@ void avd_data_update_req_evh(AVD_CL_CB *cb, AVD_EVT *evt) {
                   su, static_cast<SaAmfPresenceStateT>(l_val));
             }
 
+            SaAmfPresenceStateT oldState(su->saAmfSUPresenceState);
+
             su->set_pres_state(static_cast<SaAmfPresenceStateT>(l_val));
 
             /* In the Quiesced node, ncs 2N SU is the spare SU so it's not
@@ -1126,6 +1128,11 @@ void avd_data_update_req_evh(AVD_CL_CB *cb, AVD_EVT *evt) {
                 avd_sg_su_si_mod_snd(cb, container_su, SA_AMF_HA_QUIESCED);
                 container_su->wait_for_contained_to_quiesce = false;
               }
+            } else if (su->container() &&
+                       l_val == SA_AMF_PRESENCE_INSTANTIATED &&
+                       oldState == SA_AMF_PRESENCE_RESTARTING) {
+              // container restarted, need to restart contained components
+              su->instantiate_associated_contained_sus();
             }
           } else {
             /* log error that a the  value len is invalid */
diff --git a/src/amf/amfd/node.cc b/src/amf/amfd/node.cc
index b5ff0eab3..f6016c826 100644
--- a/src/amf/amfd/node.cc
+++ b/src/amf/amfd/node.cc
@@ -1693,8 +1693,6 @@ void AVD_AVND::instantiate_contained_sus(AVD_SU *container_su,
            (su->su_on_node->node_state == AVD_AVND_STATE_NCS_INIT)) &&
           ((su->su_on_node->saAmfNodeAdminState != SA_AMF_ADMIN_LOCKED_INSTANTIATION) &&
            (su->sg_of_su->saAmfSGAdminState != SA_AMF_ADMIN_LOCKED_INSTANTIATION)) &&
-          ((su->saAmfSUOperState == SA_AMF_OPERATIONAL_ENABLED) ||
-           (su->sg_of_su->sg_ncs_spec == true)) &&
           (su->sg_of_su->saAmfSGNumPrefInserviceSUs >
            sg_instantiated_su_count(su->sg_of_su))) {
         if (avd_instantiate_contained_su(avd_cb, container_su, su, false) == NCSCC_RC_SUCCESS) {
diff --git a/src/amf/amfd/sg.cc b/src/amf/amfd/sg.cc
index 83af5292b..5732834e4 100644
--- a/src/amf/amfd/sg.cc
+++ b/src/amf/amfd/sg.cc
@@ -497,14 +497,6 @@ SaAisErrorT avd_sg_config_get(const std::string &app_dn, AVD_APP *app) {
       error = SA_AIS_ERR_FAILED_OPERATION;
       goto done2;
     }
-
-    if ((sg->any_container_su() == true) &&
-        (sg->sg_redundancy_model != SA_AMF_N_WAY_ACTIVE_REDUNDANCY_MODEL)) {
-       LOG_ER("%s: red model for container sg must be N-Way Active: %u",
-              sg->name.c_str(),sg->sg_redundancy_model);
-       error = SA_AIS_ERR_FAILED_OPERATION;
-       goto done2;
-    }
   }
 
   if (rc == SA_AIS_ERR_NOT_EXIST) {
diff --git a/src/amf/amfnd/comp.cc b/src/amf/amfnd/comp.cc
index 21abb310c..c898870a0 100644
--- a/src/amf/amfnd/comp.cc
+++ b/src/amf/amfnd/comp.cc
@@ -411,10 +411,11 @@ uint32_t avnd_evt_mds_ava_dn_evh(AVND_CB *cb, AVND_EVT *evt) {
        comp = avnd_compdb_rec_get_next(cb->compdb, name)) {
     name = comp->name;
     if (0 == memcmp(&comp->reg_dest, &mds_evt->mds_dest, sizeof(MDS_DEST))) {
-      /* proxied component can't have mds down event */
-      if (m_AVND_COMP_TYPE_IS_PROXIED(comp))
+      /* proxied or contained component can't have mds down event */
+      if (m_AVND_COMP_TYPE_IS_PROXIED(comp) ||
+          m_AVND_COMP_TYPE_IS_CONTAINED(comp)) {
         continue;
-      else
+      } else
         break;
     } else {
       comp = nullptr;
@@ -2776,6 +2777,28 @@ uint32_t comp_restart_initiate(AVND_COMP *comp) {
   rc = avnd_comp_curr_info_del(cb, comp);
   if (NCSCC_RC_SUCCESS != rc) goto done;
 
+  if (comp->container()) {
+    // reset contained comps for this container
+    AVND_COMP_CSI_REC *curr_csi(m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(
+      m_NCS_DBLIST_FIND_FIRST(&comp->csi_list)));
+    const std::string& containerCsi(curr_csi->name);
+
+    for (auto &it : cb->compdb) {
+      if (it.second->contained() &&
+          it.second->saAmfCompContainerCsi == containerCsi) {
+        rc = avnd_comp_curr_info_del(cb, it.second);
+        if (NCSCC_RC_SUCCESS != rc) goto done;
+
+	// unregister the contained comp
+        rc = avnd_comp_unreg_prc(cb, it.second, nullptr);
+
+        avnd_comp_pres_state_set(cb, it.second, SA_AMF_PRESENCE_UNINSTANTIATED);
+
+        avnd_su_pres_state_set(cb, it.second->su, SA_AMF_PRESENCE_UNINSTANTIATED);
+      }
+    }
+  }
+
   if (!comp->su->suMaintenanceCampaign.empty() && !comp->admin_oper) {
     LOG_NO("not restarting comp because maintenance campaign is set: %s",
            comp->su->suMaintenanceCampaign.c_str());

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
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