Ack from me.
Reviewed and tested.

Find minor comments below in the code started with [Zoran]

Best regards,
Zoran

-----Original Message-----
From: Anders Björnerstedt 
Sent: den 4 april 2014 14:53
To: reddy.neelaka...@oracle.com; Zoran Milinkovic
Cc: opensaf-devel@lists.sourceforge.net
Subject: [PATCH 1 of 3] IMM: Support for saImmOmCcbAbort API [#798]

 osaf/libs/agents/saf/imma/imma_cb.h                |   1 +
 osaf/libs/agents/saf/imma/imma_def.h               |   2 +-
 osaf/libs/agents/saf/imma/imma_oi_api.c            |   9 +-
 osaf/libs/agents/saf/imma/imma_om_api.c            |  82 +++++++++++++++++-
 osaf/libs/saf/include/saImmOm_A_2_13.h             |   2 +
 osaf/libs/saf/include/saImmOm_A_2_14.h             |  46 ++++++++++
 tests/immsv/common/immtest.c                       |   4 +-
 tests/immsv/management/test_saImmOmCcbApply.c      |  95 ++++++++++++++++++++++
 tests/immsv/management/test_saImmOmCcbInitialize.c |   4 +
 9 files changed, 231 insertions(+), 14 deletions(-)


See ticket or osaf/services/saf/immsv/README for details.

diff --git a/osaf/libs/agents/saf/imma/imma_cb.h 
b/osaf/libs/agents/saf/imma/imma_cb.h
--- a/osaf/libs/agents/saf/imma/imma_cb.h
+++ b/osaf/libs/agents/saf/imma/imma_cb.h
@@ -60,6 +60,7 @@ typedef struct imma_client_node {
        bool isImmA2b;       /* Version A.02.11 */
        bool isImmA2bCbk;    /* Version A.02.11 callback*/
        bool isImmA2d;       /* Version A.02.13 */
+       bool isImmA2e;       /* Version A.02.14 */
        bool isApplier; /* True => This is an Applier-OI */
        bool isAug;     /* True => handle internal to OI augmented CCB */
        bool isBusy;    /* True => handle is locked by a thread until a 
function execution is done */
diff --git a/osaf/libs/agents/saf/imma/imma_def.h 
b/osaf/libs/agents/saf/imma/imma_def.h
--- a/osaf/libs/agents/saf/imma/imma_def.h
+++ b/osaf/libs/agents/saf/imma/imma_def.h
@@ -22,7 +22,7 @@
 /* Macros for Validating Version */
 #define IMMA_RELEASE_CODE 'A'
 #define IMMA_MAJOR_VERSION 0x02
-#define IMMA_MINOR_VERSION 0x0d
+#define IMMA_MINOR_VERSION 0x0e
 
 #define IMMSV_WAIT_TIME  1000 /* Default MDS wait time in 10ms units =>10 sec*/
 
diff --git a/osaf/libs/agents/saf/imma/imma_oi_api.c 
b/osaf/libs/agents/saf/imma/imma_oi_api.c
--- a/osaf/libs/agents/saf/imma/imma_oi_api.c
+++ b/osaf/libs/agents/saf/imma/imma_oi_api.c
@@ -121,9 +121,12 @@ SaAisErrorT saImmOiInitialize_2(SaImmOiH
                TRACE_2("OI client version A.2.%u", 
requested_version.minorVersion);
                if(requested_version.minorVersion >= 0x0b) {
                        cl_node->isImmA2b = 0x1;
-               }
-               if(requested_version.minorVersion >= 0x0d) {
-                       cl_node->isImmA2d = 0x1;
+                       if(requested_version.minorVersion >= 0x0d) {
+                               cl_node->isImmA2d = true;
+                               if(requested_version.minorVersion >= 0x0e) {
+                                       cl_node->isImmA2e = true;
+                               }
+                       }
                }
        }
 
diff --git a/osaf/libs/agents/saf/imma/imma_om_api.c 
b/osaf/libs/agents/saf/imma/imma_om_api.c
--- a/osaf/libs/agents/saf/imma/imma_om_api.c
+++ b/osaf/libs/agents/saf/imma/imma_om_api.c
@@ -53,7 +53,7 @@ static const char *sysaAdmName = SA_IMM_
 static const char *sysaImplName = SA_IMM_ATTR_IMPLEMENTER_NAME;
 
 static int imma_om_resurrect(IMMA_CB *cb, IMMA_CLIENT_NODE *cl_node, bool 
*locked);
-
+static SaAisErrorT imma_finalizeCcb(SaImmCcbHandleT ccbHandle, bool 
keepCcbHandleOpen);
 
 /****************************************************************************
   Name          :  SaImmOmInitialize
@@ -124,6 +124,9 @@ SaAisErrorT saImmOmInitialize_o2(SaImmHa
 
        if(requested_version.minorVersion >= 0x0d) {
                cl_node->isImmA2d = true;
+               if(requested_version.minorVersion >= 0x0e) {
+                       cl_node->isImmA2e = true;
+               }
        }
 
        /* Store the callback functions, if set */
@@ -170,9 +173,12 @@ SaAisErrorT saImmOmInitialize(SaImmHandl
                TRACE("OM client version A.2.%u", 
requested_version.minorVersion);
                if(requested_version.minorVersion >= 0x0b) {
                        cl_node->isImmA2b = true;
-               }
-               if(requested_version.minorVersion >= 0x0d) {
-                       cl_node->isImmA2d = true;
+                       if(requested_version.minorVersion >= 0x0d) {
+                               cl_node->isImmA2d = true;
+                               if(requested_version.minorVersion >= 0x0e) {
+                                       cl_node->isImmA2e = true;
+                               }
+                       }
                }
        }
 
@@ -3259,6 +3265,40 @@ SaAisErrorT saImmOmCcbApply(SaImmCcbHand
 }
 
 /****************************************************************************
+  Name          :  saImmOmCcbAbort
+ 
+  Description   :  Aborts a CCB(id) without finalizing the ccb-handle.
+                   Discards any ccb operations currently associated with the 
ccb-handle.
+                   If SA_AIS_OK is returned then ccb-handle can continue to be 
used and
+                   is in the same empty state as if it had just been 
initialized.
+
+                   Previously it was only possible to explicitly abort an 
active ccb
+                   by invoking saImOmCcbFinalize() which also closes the 
ccb-handle.
+
+                   This a blocking syncronous call.
+
+                   
+  Arguments     :  ccbHandle - Ccb Handle
+
+  Return Values :  SA_AIS_OK; - Means the ccb contents has been discarded.
+                                and involved Ois receive abort callback.
+                                Ccb handle is still valid.
+
+                   SA_AIS_ERR_VERSION - Not allowed for IMM API version below 
A.2.14.
+                   SA_AIS_ERR_BAD_OPERATION - saImmOmCcbAbort not allowed on 
augmented ccb.
+
+                   Remaining returncodes identical to saImmOmFinalize.
+
+ 
+******************************************************************************/
+SaAisErrorT saImmOmCcbAbort(SaImmCcbHandleT ccbHandle)
+{
+       return imma_finalizeCcb(ccbHandle, true);
+}
+
+
+
+/****************************************************************************
   Name          :  saImmOmAdminOperationInvoke_2/_o2
  
   Description   :  Invoke an Administrative Operation on an object in the IMM.
@@ -7615,7 +7655,7 @@ SaAisErrorT saImmOmAdminOwnerFinalize(Sa
        return rc;
 }
 
-SaAisErrorT saImmOmCcbFinalize(SaImmCcbHandleT ccbHandle)
+static SaAisErrorT imma_finalizeCcb(SaImmCcbHandleT ccbHandle, bool 
keepCcbHandleOpen)
 {
        SaAisErrorT rc = SA_AIS_OK;
        IMMA_CB *cb = &imma_cb;
@@ -7661,6 +7701,12 @@ SaAisErrorT saImmOmCcbFinalize(SaImmCcbH
        }
 
        if (ccb_node->mAugCcb) {
+               if(keepCcbHandleOpen) {
+                       LOG_IN("ERR_BAD_OPERATION: saImmOmCcbAbort() not 
allowed on augmented ccbs");
+                       rc = SA_AIS_ERR_BAD_OPERATION;
+                       goto done;
+               }
+
                if(!(ccb_node->mApplied || ccb_node->mAborted)) {
                        if(ccb_node->mAugIsTainted) {
                                ccb_node->mAborted = true;
@@ -7711,6 +7757,12 @@ SaAisErrorT saImmOmCcbFinalize(SaImmCcbH
                        goto done;
                }
 
+               if(keepCcbHandleOpen && !(cl_node->isImmA2e)) {
+                       LOG_IN("ERR_VERSION: saImmOmCcbAbort() only supported 
in version A.02.14 or higher");
+                       rc = SA_AIS_ERR_VERSION;
+                       goto done;
+               }
+
                timeout = cl_node->syncr_timeout;
 
                /* Populate the CcbFinalize event */
@@ -7759,13 +7811,20 @@ SaAisErrorT saImmOmCcbFinalize(SaImmCcbH
 
        imma_ccb_node_get(&cb->ccb_tree, &ccbHandle, &ccb_node);
        if(ccb_node) {
-               if(rc == SA_AIS_OK) {/* i.e. not TRY_AGAIN or TIMEOUT */
-                       imma_ccb_node_delete(cb, ccb_node);
-                       ccb_node = NULL;
+               if(rc == SA_AIS_OK) {/* Not TRY_AGAIN or TIMEOUT */
+                       if(!keepCcbHandleOpen) {
+                               imma_ccb_node_delete(cb, ccb_node);
+                               ccb_node = NULL;
+                       }
                } else {
                        /* TRY_AGAIN or TIMEOUT => allow user to try finalize 
again. */
                        ccb_node->mExclusive = false;
                }
+               if(keepCcbHandleOpen) { /* saImmOmCcbAbort */
+                       osafassert(ccb_node);
[Zoran] osafassert is not needed. ccb_node cannot be NULL here.

+                       ccb_node->mApplied = true;
+                       ccb_node->mExclusive = false;
+               }
        }
 
  done:
@@ -7779,6 +7838,13 @@ SaAisErrorT saImmOmCcbFinalize(SaImmCcbH
 }
 
 
+SaAisErrorT saImmOmCcbFinalize(SaImmCcbHandleT ccbHandle)
+{
+       return imma_finalizeCcb(ccbHandle, false);
+}
+
+
+
 /* 
    Internal helper function that determines if there are
    AdminOwner handles associated with a newly resurrected client.
diff --git a/osaf/libs/saf/include/saImmOm_A_2_13.h 
b/osaf/libs/saf/include/saImmOm_A_2_13.h
--- a/osaf/libs/saf/include/saImmOm_A_2_13.h
+++ b/osaf/libs/saf/include/saImmOm_A_2_13.h
@@ -71,4 +71,6 @@ extern "C" {
 }
 #endif
 
+#include <saImmOm_A_2_14.h>
+
 #endif   /* _SA_IMM_OM_A_2_13_H */
diff --git a/osaf/libs/saf/include/saImmOm_A_2_14.h 
b/osaf/libs/saf/include/saImmOm_A_2_14.h
new file mode 100644
--- /dev/null
+++ b/osaf/libs/saf/include/saImmOm_A_2_14.h
@@ -0,0 +1,46 @@
+/*      -*- OpenSAF  -*-
+ *
+ * (C) Copyright 2014 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ */
+
+/*
+ * DESCRIPTION:
+ *   This file provides the suggested additions to the C language binding for 
+ *   the Service Availability(TM) Forum Information Model Management Service 
(IMM).
+ *   It contains only the prototypes and type definitions that are part of this
+ *   proposed addition. 
+ *   These additions are currently NON STANDARD. But the intention is to get 
these
+ *   additions approved formally by SAF in the future.
+ *
+ *   For detailed explanation of the new API, see 
osaf/services/saf/immsv/README.
+ */
+
+
+#ifndef _SA_IMM_OM_A_2_14_H
+#define _SA_IMM_OM_A_2_14_H
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+/* 4.8.x saImmOmCcb */
+
+       extern SaAisErrorT
+        saImmOmCcbAbort(SaImmCcbHandleT ccbHandle);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif   /* _SA_IMM_OM_A_2_14_H */
diff --git a/tests/immsv/common/immtest.c b/tests/immsv/common/immtest.c
--- a/tests/immsv/common/immtest.c
+++ b/tests/immsv/common/immtest.c
@@ -21,8 +21,8 @@
 #include <pthread.h>
 #include "immtest.h"
 
-const SaVersionT constImmVersion = {'A', 0x02, 0x0d};
-SaVersionT immVersion = {'A', 0x02, 0x0d};
+const SaVersionT constImmVersion = {'A', 0x02, 0x0e};
+SaVersionT immVersion = {'A', 0x02, 0x0e};
 SaAisErrorT rc;
 SaImmHandleT immOmHandle;
 SaImmHandleT immOiHandle;
diff --git a/tests/immsv/management/test_saImmOmCcbApply.c 
b/tests/immsv/management/test_saImmOmCcbApply.c
--- a/tests/immsv/management/test_saImmOmCcbApply.c
+++ b/tests/immsv/management/test_saImmOmCcbApply.c
@@ -94,3 +94,98 @@ done:
     safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
 }
 
+void saImmOmCcbAbort_01(void)
+{
+    TRACE_ENTER();
+    const SaImmAdminOwnerNameT adminOwnerName = (SaImmAdminOwnerNameT) 
__FUNCTION__;
+    SaImmAdminOwnerHandleT ownerHandle;
+    SaImmCcbHandleT ccbHandle;
+    SaNameT rdn = {strlen("Obj1"), "Obj1"};
+    SaNameT* nameValues[] = {&rdn};
+    SaImmAttrValuesT_2 v2 = {"rdn",  SA_IMM_ATTR_SANAMET, 1, 
(void**)nameValues};
+    SaUint32T  int1Value1 = 7;
+    SaUint32T* int1Values[] = {&int1Value1};
+    SaImmAttrValuesT_2 v1 = {"attr1", SA_IMM_ATTR_SAUINT32T, 1, 
(void**)int1Values};
+    const SaImmAttrValuesT_2 * attrValues[] = {&v1, &v2, NULL};
+    const SaNameT *objectNames[] = {&rootObj, NULL};
+
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
SA_AIS_OK);
+    safassert(saImmOmAdminOwnerInitialize(immOmHandle, adminOwnerName,
+        SA_TRUE, &ownerHandle), SA_AIS_OK);
+    safassert(saImmOmAdminOwnerSet(ownerHandle, objectNames, SA_IMM_ONE), 
SA_AIS_OK);
+    safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbAbort(ccbHandle), SA_AIS_OK); /* Abort on pristine ccb 
handle should be ok. */
+    safassert(saImmOmCcbObjectCreate_2(ccbHandle, configClassName,
+        &rootObj, attrValues), SA_AIS_OK);
+
+    /* abort the ccb */
+    if ((rc = saImmOmCcbAbort(ccbHandle)) != SA_AIS_OK)
+        goto done;
+
+    safassert(saImmOmCcbAbort(ccbHandle), SA_AIS_OK); /* Redundant abort 
should be ok. */
+
+    safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
+
+done:
+    test_validate(rc, SA_AIS_OK);
+    safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
+    TRACE_LEAVE();
+}
+
+void saImmOmCcbAbort_02(void)
+{
+    TRACE_ENTER();
+    const SaImmAdminOwnerNameT adminOwnerName = (SaImmAdminOwnerNameT) 
__FUNCTION__;
+    SaImmAdminOwnerHandleT ownerHandle;
+    SaImmCcbHandleT ccbHandle;
+    SaNameT rdn = {strlen("Obj1"), "Obj1"};
+    SaNameT* nameValues[] = {&rdn};
+    SaImmAttrValuesT_2 v2 = {"rdn",  SA_IMM_ATTR_SANAMET, 1, 
(void**)nameValues};
+    SaUint32T  int1Value1 = 7;
+    SaUint32T* int1Values[] = {&int1Value1};
+    SaImmAttrValuesT_2 v1 = {"attr1", SA_IMM_ATTR_SAUINT32T, 1, 
(void**)int1Values};
+    const SaImmAttrValuesT_2 * attrValues[] = {&v1, &v2, NULL};
+    const SaNameT *objectNames[] = {&rootObj, NULL};
+    const SaNameT objectName =
+        {strlen("Obj1,rdn=root"), "Obj1,rdn=root"};
+
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
SA_AIS_OK);
+    safassert(saImmOmAdminOwnerInitialize(immOmHandle, adminOwnerName,
+        SA_TRUE, &ownerHandle), SA_AIS_OK);
+    safassert(saImmOmAdminOwnerSet(ownerHandle, objectNames, SA_IMM_ONE), 
SA_AIS_OK);
+    safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbObjectCreate_2(ccbHandle, configClassName,
+        &rootObj, attrValues), SA_AIS_OK);
+
+    /* abort the ccb with the object-create. */
+    if ((rc = saImmOmCcbAbort(ccbHandle)) != SA_AIS_OK)
+        goto done;
+
+    /* continue with ccb handle after abort. New attempt to create same object
+       should work. */
+    if ((rc = saImmOmCcbObjectCreate_2(ccbHandle, configClassName, &rootObj,
+        attrValues) != SA_AIS_OK)) {
+        goto done;
+    }
+
+    /* apply should work. */
+    if((rc = saImmOmCcbApply(ccbHandle)) != SA_AIS_OK)
+        goto done;
+
+    /* Set up delete and abort it. */
+    safassert(saImmOmCcbObjectDelete(ccbHandle, &objectName), SA_AIS_OK);
+    safassert(saImmOmCcbAbort(ccbHandle), SA_AIS_OK);
+
+    /* Finaly use ccb-handle to delete object. */
+    safassert(saImmOmCcbObjectDelete(ccbHandle, &objectName), SA_AIS_OK);
+    safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
+
+done:
+    test_validate(rc, SA_AIS_OK);
+    safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
+    TRACE_LEAVE();
+}
+
diff --git a/tests/immsv/management/test_saImmOmCcbInitialize.c 
b/tests/immsv/management/test_saImmOmCcbInitialize.c
--- a/tests/immsv/management/test_saImmOmCcbInitialize.c
+++ b/tests/immsv/management/test_saImmOmCcbInitialize.c
@@ -164,6 +164,8 @@ extern void saImmOmCcbApply_01(void);
 extern void saImmOmCcbApply_02(void);
 extern void saImmOmCcbFinalize_01(void);
 extern void saImmOmCcbFinalize_02(void);
+extern void saImmOmCcbAbort_01(void);
+extern void saImmOmCcbAbort_02(void);
 
 __attribute__ ((constructor)) static void saImmOmInitialize_constructor(void)
 {
@@ -235,5 +237,7 @@ extern void saImmOmCcbFinalize_02(void);
 
     test_case_add(6, saImmOmCcbObjectModify_2_08, "saImmOmCcbObjectModify_2 
SA_IMM_ATTR_DELETE multi/single - SA_AIS_OK");
     test_case_add(6, saImmOmCcbObjectModify_2_07, "saImmOmCcbObjectModify_2 
SA_IMM_ATTR_DELETE multi/multi - SA_AIS_OK");
+    test_case_add(6, saImmOmCcbAbort_01, "saImmOmCcbAbort - SA_AIS_OK");
+    test_case_add(6, saImmOmCcbAbort_02, "saImmOmCcbAbort - SA_AIS_OK on 
continued ccb handle usage.");
 }
 

------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment 
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to