Add support for container/contained for amf agent.
---
 src/amf/agent/amf_agent.cc | 73 +++++++++++++++++++++++++++-------------------
 src/amf/agent/ava_cb.h     |  1 +
 src/amf/agent/ava_hdl.cc   | 31 ++++++++++++++++++++
 src/amf/agent/ava_mds.cc   | 34 ++++++++++++++++++++-
 src/amf/agent/ava_mds.h    |  3 +-
 src/amf/agent/ava_op.cc    |  6 ++++
 6 files changed, 116 insertions(+), 32 deletions(-)

diff --git a/src/amf/agent/amf_agent.cc b/src/amf/agent/amf_agent.cc
index 6dbdf9987..1ab1da96c 100644
--- a/src/amf/agent/amf_agent.cc
+++ b/src/amf/agent/amf_agent.cc
@@ -120,6 +120,8 @@ SaAisErrorT AmfAgent::Initialize(SaAmfHandleT *o_hdl,
   cb->version.majorVersion = io_ver->majorVersion;
   cb->version.minorVersion = io_ver->minorVersion;
 
+  cb->container = false;
+
   /* get the ptr to the hdl db */
   hdl_db = &cb->hdl_db;
   memset(&osaf_cbks, 0, sizeof(OsafAmfCallbacksT));
@@ -497,8 +499,9 @@ SaAisErrorT AmfAgent::ComponentRegister(SaAmfHandleT hdl,
   if (cb) ncshm_give_hdl(gl_ava_hdl);
 
   /* non-proxied, component Length part of component name should be OK */
-  if (!proxy_comp_name && (osaf_extended_name_length(comp_name) !=
-                           osaf_extended_name_length(&cb->comp_name))) {
+  if (!proxy_comp_name && !cb->container &&
+      (osaf_extended_name_length(comp_name) !=
+      osaf_extended_name_length(&cb->comp_name))) {
     rc = SA_AIS_ERR_INVALID_PARAM;
     goto done;
   }
@@ -511,9 +514,10 @@ SaAisErrorT AmfAgent::ComponentRegister(SaAmfHandleT hdl,
   }
 
   /* non-proxied component should not forge its name while registering */
-  if (!proxy_comp_name && strncmp(osaf_extended_name_borrow(comp_name),
-                                  osaf_extended_name_borrow(&cb->comp_name),
-                                  osaf_extended_name_length(comp_name))) {
+  if (!proxy_comp_name && !cb->container &&
+      strncmp(osaf_extended_name_borrow(comp_name),
+              osaf_extended_name_borrow(&cb->comp_name),
+              osaf_extended_name_length(comp_name))) {
     rc = SA_AIS_ERR_BAD_OPERATION;
     goto done;
   }
@@ -553,7 +557,7 @@ SaAisErrorT AmfAgent::ComponentRegister(SaAmfHandleT hdl,
   else
     memset(&pcomp_name, 0, sizeof(SaNameT));
   ava_fill_comp_reg_msg(&msg, cb->ava_dest, hdl, *comp_name, pcomp_name,
-                        &cb->version);
+                        &cb->version, &hdl_rec->reg_cbk);
 
   rc = static_cast<SaAisErrorT>(ava_mds_send(cb, &msg, &msg_rsp));
   if (NCSCC_RC_SUCCESS == rc) {
@@ -565,12 +569,6 @@ SaAisErrorT AmfAgent::ComponentRegister(SaAmfHandleT hdl,
   else if (NCSCC_RC_REQ_TIMOUT == rc)
     rc = SA_AIS_ERR_TIMEOUT;
 
-/* TODO: msg_resp should include info regarding comp category.
- * Then check supplied callbacks (different req depending on comp cat, check
- * spec) during init and send SA_AIS_ERR_UNAIVALABLE if not the correct
- * callbacks are supplied.
- */
-
 done:
   /* release cb read lock and return handles */
   if (cb) {
@@ -2024,10 +2022,11 @@ SaAisErrorT AmfAgent::Response(SaAmfHandleT hdl, 
SaInvocationT inv,
   AVA_PEND_CBK_REC *rec = 0;
   SaAisErrorT rc = SA_AIS_OK;
   AVSV_NDA_AVA_MSG *msg_rsp = NULL;
+  SaNameT *comp(0);
 
   TRACE_ENTER2("SaAmfHandleT passed is %llx", hdl);
 
-  if ((!m_AVA_AMF_RESP_ERR_CODE_IS_VALID(error)) || (!inv)) {
+  if (!inv) {
     TRACE_LEAVE2("Incorrect argument specified for SaAisErrorT");
     return SA_AIS_ERR_INVALID_PARAM;
   }
@@ -2071,8 +2070,38 @@ SaAisErrorT AmfAgent::Response(SaAmfHandleT hdl, 
SaInvocationT inv,
     goto done;
   }
 
+  // B.04.01 accepts any error code
+  if (ava_B4_ver_used(cb)) {
+    if (rec->cbk_info->type == AVSV_AMF_PXIED_COMP_INST ||
+        rec->cbk_info->type == AVSV_AMF_CONTAINED_COMP_INST) {
+      if (!m_AVA_AMF_RESP_ERR_CODE_IS_VALID(error) &&
+         error != SA_AIS_ERR_TRY_AGAIN) {
+        error = SA_AIS_ERR_FAILED_OPERATION;
+      }
+    } else if (!m_AVA_AMF_RESP_ERR_CODE_IS_VALID(error))
+      error = SA_AIS_ERR_FAILED_OPERATION;
+  } else {
+    if (!m_AVA_AMF_RESP_ERR_CODE_IS_VALID(error)) {
+      rc = SA_AIS_ERR_INVALID_PARAM;
+      goto done;
+    }
+  }
+
+  comp = &cb->comp_name;
+
+  if (rec->cbk_info->type == AVSV_AMF_CONTAINED_COMP_INST)
+    comp = &rec->cbk_info->param.contained_inst.comp_name;
+  else if (rec->cbk_info->type == AVSV_AMF_CONTAINED_COMP_CLEAN)
+    comp = &rec->cbk_info->param.contained_clean.comp_name;
+  else if (rec->cbk_info->type == AVSV_AMF_CSI_SET && cb->container)
+    comp = &rec->cbk_info->param.csi_set.comp_name;
+  else if (rec->cbk_info->type == AVSV_AMF_CSI_REM && cb->container)
+    comp = &rec->cbk_info->param.csi_rem.comp_name;
+  else if (rec->cbk_info->type == AVSV_AMF_COMP_TERM && cb->container)
+    comp = &rec->cbk_info->param.comp_term.comp_name;
+
   /* populate & send the 'AMF response' message */
-  ava_fill_response_msg(&msg, cb->ava_dest, hdl, inv, error, cb->comp_name);
+  ava_fill_response_msg(&msg, cb->ava_dest, hdl, inv, error, *comp);
 
   if (rec->cbk_info->type == AVSV_AMF_COMP_TERM)
     rc = static_cast<SaAisErrorT>(ava_mds_send(cb, &msg, &msg_rsp));
@@ -2229,22 +2258,6 @@ SaAisErrorT AmfAgent::Initialize_4(SaAmfHandleT *o_hdl,
   /* get the ptr to the hdl db */
   hdl_db = &cb->hdl_db;
 
-  /* create the hdl record & store the callbacks */
-
-  /* TODO: This cast will remove possibilities for container comp 
callbacks(last
-   * two in SaAmfCallbacksT_4 struct). But on the other hand they are not
-   * supported in ava_hdl_cbk_rec_prc, message from avnd.SaAmfCallbacksT should
-   * be replaced with SaAmfCallbacksT_4 everywhere in ava when 
SaAmfCallbacksT_4
-   * messages are supported from avnd.
-   */
-  if ((reg_cbks != NULL) &&
-      ((reg_cbks->saAmfContainedComponentCleanupCallback != 0) ||
-       (reg_cbks->saAmfContainedComponentInstantiateCallback != 0))) {
-    TRACE_4("SA_AIS_ERR_NOT_SUPPORTED: unsupported callbacks");
-    rc = SA_AIS_ERR_NOT_SUPPORTED;
-    goto done;
-  }
-
   memset(&osaf_cbks, 0, sizeof(OsafAmfCallbacksT));
   if (reg_cbks != NULL)
     amf_copy_from_SaAmfCallbacksT_4_to_OsafAmfCallbacksT(&osaf_cbks, reg_cbks);
diff --git a/src/amf/agent/ava_cb.h b/src/amf/agent/ava_cb.h
index af036d9a8..d1297e759 100644
--- a/src/amf/agent/ava_cb.h
+++ b/src/amf/agent/ava_cb.h
@@ -43,6 +43,7 @@ typedef struct ava_cb_tag {
   NCS_LOCK lock;     /* CB lock */
   uint32_t pend_dis; /* Number of pending dispaches */
   uint32_t pend_fin; /* Number of pending agent destroy */
+  bool container;    /* is this comp a container? */
 
   SaNameT comp_name;  /* comp-name */
   uint32_t flag;      /* flags */
diff --git a/src/amf/agent/ava_hdl.cc b/src/amf/agent/ava_hdl.cc
index 08208e73f..ea14aaec6 100644
--- a/src/amf/agent/ava_hdl.cc
+++ b/src/amf/agent/ava_hdl.cc
@@ -848,6 +848,37 @@ uint32_t ava_hdl_cbk_rec_prc(AVSV_AMF_CBK_INFO *info,
       }
     } break;
 
+    case AVSV_AMF_CONTAINED_COMP_INST: {
+      AVSV_AMF_CONTAINED_COMP_INST_PARAM *comp_inst =
+        &info->param.contained_inst;
+      if (!ava_sanamet_is_valid(&comp_inst->comp_name))
+        rc = SA_AIS_ERR_NAME_TOO_LONG;
+      if (rc == SA_AIS_OK &&
+          reg_cbk->saAmfContainedComponentInstantiateCallback) {
+        TRACE("Invoking saAmfContainedComponentInstantiateCallback: contained "
+                "comp = %s",
+              osaf_extended_name_borrow(&comp_inst->comp_name));
+        reg_cbk->saAmfContainedComponentInstantiateCallback(
+          info->inv, &comp_inst->comp_name);
+      }
+      break;
+    }
+    case AVSV_AMF_CONTAINED_COMP_CLEAN: {
+      AVSV_AMF_CONTAINED_COMP_CLEAN_PARAM *comp_clean =
+        &info->param.contained_clean;
+      if (!ava_sanamet_is_valid(&comp_clean->comp_name))
+        rc = SA_AIS_ERR_NAME_TOO_LONG;
+      if (rc == SA_AIS_OK &&
+          reg_cbk->saAmfContainedComponentCleanupCallback) {
+        TRACE("Invoking saAmfContainedComponentCleanupCallback: contained comp 
"
+                "= %s",
+              osaf_extended_name_borrow(&comp_clean->comp_name));
+        reg_cbk->saAmfContainedComponentCleanupCallback(
+          info->inv, &comp_clean->comp_name);
+      }
+      break;
+    }
+
     default:
       osafassert(0);
       break;
diff --git a/src/amf/agent/ava_mds.cc b/src/amf/agent/ava_mds.cc
index cd139365d..7c9107c2a 100644
--- a/src/amf/agent/ava_mds.cc
+++ b/src/amf/agent/ava_mds.cc
@@ -932,6 +932,22 @@ uint32_t ava_mds_flat_dec(AVA_CB *cb, 
MDS_CALLBACK_DEC_FLAT_INFO *dec_info) {
         case AVSV_AMF_SC_STATUS_CHANGE: {
         } break;
 
+        case AVSV_AMF_CONTAINED_COMP_INST: {
+          AVSV_AMF_CONTAINED_COMP_INST_PARAM *info =
+              &msg->info.cbk_info->param.contained_inst;
+
+          if (osaf_is_an_extended_name(&info->comp_name))
+            osaf_decode_sanamet(dec_info->io_uba, &info->comp_name);
+        } break;
+
+        case AVSV_AMF_CONTAINED_COMP_CLEAN: {
+          AVSV_AMF_CONTAINED_COMP_CLEAN_PARAM *info =
+              &msg->info.cbk_info->param.contained_clean;
+
+          if (osaf_is_an_extended_name(&info->comp_name))
+            osaf_decode_sanamet(dec_info->io_uba, &info->comp_name);
+        } break;
+
         default:
           osafassert(0);
       } /* switch */
@@ -1267,7 +1283,8 @@ void ava_fill_finalize_msg(AVSV_NDA_AVA_MSG *msg, 
MDS_DEST dst,
 
 void ava_fill_comp_reg_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst,
                            SaAmfHandleT hdl, SaNameT comp_name,
-                           SaNameT proxy_comp_name, SaVersionT *version) {
+                           SaNameT proxy_comp_name, SaVersionT *version,
+                           const OsafAmfCallbacksT *callbacks) {
   msg->type = AVSV_AVA_API_MSG;
   msg->info.api_info.type = AVSV_AMF_COMP_REG;
   msg->info.api_info.dest = dst;
@@ -1277,6 +1294,21 @@ void ava_fill_comp_reg_msg(AVSV_NDA_AVA_MSG *msg, 
MDS_DEST dst,
   osaf_extended_name_alloc(osaf_extended_name_borrow(&proxy_comp_name),
                            &msg->info.api_info.param.reg.proxy_comp_name);
   msg->info.api_info.param.reg.version = *version;
+
+  if (callbacks->saAmfComponentTerminateCallback)
+    msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_TERMINATE;
+  if (callbacks->saAmfCSISetCallback)
+    msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_CSI_SET;
+  if (callbacks->saAmfCSIRemoveCallback)
+    msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_CSI_REMOVE;
+  if (callbacks->saAmfContainedComponentInstantiateCallback)
+    msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_CONTAINED_INST;
+  if (callbacks->saAmfContainedComponentCleanupCallback)
+    msg->info.api_info.param.reg.callbacks |= 
AVSV_AMF_CALLBACK_CONTAINED_CLEAN;
+  if (callbacks->saAmfProxiedComponentInstantiateCallback)
+    msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_PROXIED_INST;
+  if (callbacks->saAmfProxiedComponentCleanupCallback)
+    msg->info.api_info.param.reg.callbacks |= AVSV_AMF_CALLBACK_PROXIED_CLEAN;
 }
 
 void ava_fill_comp_unreg_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst,
diff --git a/src/amf/agent/ava_mds.h b/src/amf/agent/ava_mds.h
index 8f35f759a..602b3342e 100644
--- a/src/amf/agent/ava_mds.h
+++ b/src/amf/agent/ava_mds.h
@@ -48,7 +48,8 @@ void ava_fill_finalize_msg(AVSV_NDA_AVA_MSG* msg, MDS_DEST 
dst,
                            SaAmfHandleT hdl, SaNameT comp_name);
 void ava_fill_comp_reg_msg(AVSV_NDA_AVA_MSG* msg, MDS_DEST dst,
                            SaAmfHandleT hdl, SaNameT comp_name,
-                           SaNameT proxy_comp_name, SaVersionT* version);
+                           SaNameT proxy_comp_name, SaVersionT* version,
+                           const OsafAmfCallbacksT *);
 void ava_fill_comp_unreg_msg(AVSV_NDA_AVA_MSG* msg, MDS_DEST dst,
                              SaAmfHandleT hdl, SaNameT comp_name,
                              SaNameT proxy_comp_name);
diff --git a/src/amf/agent/ava_op.cc b/src/amf/agent/ava_op.cc
index 4e27ae76c..77298f403 100644
--- a/src/amf/agent/ava_op.cc
+++ b/src/amf/agent/ava_op.cc
@@ -83,6 +83,12 @@ uint32_t ava_avnd_msg_prc(AVA_CB *cb, AVSV_NDA_AVA_MSG *msg) 
{
     }
   }
 
+  if (cbk_info->type == AVSV_AMF_CONTAINED_COMP_INST) {
+    TRACE("contained comp inst callback for %s",
+          
osaf_extended_name_borrow(&cbk_info->param.contained_inst.comp_name));
+    cb->container = true;
+  }
+
   /* retrieve the handle record */
   hdl = cbk_info->hdl;
 
-- 
2.14.4


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