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);
+ 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.");
}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel