Due to long execution of immadm in a separated thread and possible timeout in
poll, the executing immadm command for locking, unlocking and shutting down
nodes is replaced with calling IMM admin operation function.
---
src/clm/apitest/clmtest.c | 92 +++++++++++++++++++++++++++++++++
src/clm/apitest/clmtest.h | 4 ++
src/clm/apitest/tet_ClmLongRdn.c | 35 +++----------
src/clm/apitest/tet_saClmClusterTrack.c | 38 ++------------
4 files changed, 106 insertions(+), 63 deletions(-)
diff --git a/src/clm/apitest/clmtest.c b/src/clm/apitest/clmtest.c
index 683bfe4..5b4366f 100644
--- a/src/clm/apitest/clmtest.c
+++ b/src/clm/apitest/clmtest.c
@@ -18,6 +18,9 @@
#include <sys/time.h>
#include <unistd.h>
+#include <saImm.h>
+#include <saImmOm.h>
+
#include "clmtest.h"
/* Highest supported version*/
#define CLM_HIGHEST_SUPPORTED_VERSION
\
@@ -32,9 +35,98 @@
{ \
'B', 0x02, 0x03 \
}
+#define IMM_VERSION \
+ { \
+ 'A', 0x02, 0x0f \
+ }
SaNameT node_name;
+static SaAisErrorT immadm(SaImmAdminOperationIdT op,
+ SaConstStringT object,
+ SaTimeT timeout) {
+ /* timeout is in seconds. If timeout is set to 0,
+ * the default timeout of 60 seconds will be used */
+
+ SaVersionT immVersion = IMM_VERSION;
+ SaImmHandleT immHandle = 0;
+ SaImmAdminOwnerHandleT ownerHandle = 0;
+ const SaImmAdminOperationParamsT_2 *params[] = { NULL };
+ SaConstStringT objects[] = { object, NULL };
+ SaAisErrorT err;
+ SaAisErrorT retErr;
+
+ err = saImmOmInitialize(&immHandle, NULL, &immVersion);
+ if(err != SA_AIS_OK) {
+ goto done;
+ }
+
+ err = saImmOmAdminOwnerInitialize(immHandle,
+ (SaImmAdminOwnerNameT)__FUNCTION__,
+ SA_TRUE, &ownerHandle);
+ if(err != SA_AIS_OK) {
+ goto done;
+ }
+
+ err = saImmOmAdminOwnerSet_o3(ownerHandle, objects, SA_IMM_ONE);
+ if(err != SA_AIS_OK) {
+ goto done;
+ }
+
+ timeout = (timeout) ? (timeout * SA_TIME_ONE_SECOND)
+ : SA_TIME_ONE_MINUTE;
+
+ err = saImmOmAdminOperationInvoke_o3(ownerHandle, object, 1, op,
+ params, &retErr, timeout, NULL);
+ if(err != SA_AIS_OK) {
+ goto done;
+ }
+
+ err = retErr;
+
+done:
+ if(ownerHandle) {
+ saImmOmAdminOwnerFinalize(ownerHandle);
+ }
+ if(immHandle) {
+ saImmOmFinalize(immHandle);
+ }
+ return err;
+}
+
+SaAisErrorT clm_node_unlock(const char *nodeName, int ignoreOutput) {
+ SaAisErrorT err;
+
+ err = immadm(1, nodeName, 0);
+ if(err != SA_AIS_OK && !ignoreOutput) {
+ fprintf(stderr, "immadm: node unlock failed with error: %d",
err);
+ }
+
+ return err;
+}
+
+SaAisErrorT clm_node_lock(const char *nodeName, int ignoreOutput) {
+ SaAisErrorT err;
+
+ err = immadm(2, nodeName, 0);
+ if(err != SA_AIS_OK && !ignoreOutput) {
+ fprintf(stderr, "immadm: node lock failed with error: %d", err);
+ }
+
+ return err;
+}
+
+SaAisErrorT clm_node_shutdown(const char *nodeName, int ignoreOutput) {
+ SaAisErrorT err;
+
+ err = immadm(3, nodeName, 0);
+ if(err != SA_AIS_OK && !ignoreOutput) {
+ fprintf(stderr, "immadm: node shutdown failed with error: %d",
err);
+ }
+
+ return err;
+}
+
void clm_init(void)
{
FILE *fp;
diff --git a/src/clm/apitest/clmtest.h b/src/clm/apitest/clmtest.h
index 02449a0..66590ea 100644
--- a/src/clm/apitest/clmtest.h
+++ b/src/clm/apitest/clmtest.h
@@ -39,4 +39,8 @@ extern SaClmCallbacksT clmCallbacks_1;
extern SaSelectionObjectT selectionObject;
extern SaNameT node_name;
+SaAisErrorT clm_node_unlock(const char *nodeName, int ignoreOutput);
+SaAisErrorT clm_node_lock(const char *nodeName, int ignoreOutput);
+SaAisErrorT clm_node_shutdown(const char *nodeName, int ignoreOutput);
+
#endif // CLM_APITEST_CLMTEST_H_
diff --git a/src/clm/apitest/tet_ClmLongRdn.c b/src/clm/apitest/tet_ClmLongRdn.c
index 53e6c1d..fdf7f0b 100644
--- a/src/clm/apitest/tet_ClmLongRdn.c
+++ b/src/clm/apitest/tet_ClmLongRdn.c
@@ -209,36 +209,15 @@ static void clmTrackCallback4(
static SaClmCallbacksT_4 clmCallback4 = {nodeGetCallBack4, clmTrackCallback4};
static SaClmCallbacksT clmCallback = {nodeGetCallBack, clmTrackCallback};
-static void unlock_node(char *nodename)
-{
- int rc;
- char command[1024];
-
- // Unlock the node
- snprintf(command, sizeof(command), "immadm -o 1 %s", nodename);
- rc = system(command);
- assert(rc != -1);
-}
-
-static void lock_node(char *nodename)
-{
- int rc;
- char command[1024];
- // Lock the node
- snprintf(command, sizeof(command), "immadm -o 2 %s", nodename);
- rc = system(command);
- assert(rc != -1);
-}
-
static void remove_node(char *nodename)
{
int rc;
char command[1024];
+ SaAisErrorT err;
// Lock the node
- snprintf(command, sizeof(command), "immadm -o 2 %s", nodename);
- rc = system(command);
- assert(rc != -1);
+ err = clm_node_lock(nodename, 0);
+ assert(err == SA_AIS_OK);
// Remove the node
snprintf(command, sizeof(command), "immcfg -d %s", nodename);
@@ -327,7 +306,7 @@ void saClmLongRdn_02(void)
// Set node name that will be compared in CLM callback
s_clmTrackCallback_node = nodeName;
- lock_node(nodeName);
+ clm_node_lock(nodeName, 0);
while (1) {
rc = poll(fds, 1, 2000);
@@ -341,7 +320,7 @@ void saClmLongRdn_02(void)
safassert(saClmFinalize(clmHandle), SA_AIS_OK);
test_validate(s_clmTrackCallback_err, SA_AIS_OK);
- unlock_node(nodeName);
+ clm_node_unlock(nodeName, 0);
}
void saClmLongRdn_03(void)
@@ -382,7 +361,7 @@ void saClmLongRdn_03(void)
// Set node name that will be compared in CLM callback
s_clmTrackCallback_node = nodeName;
- lock_node(nodeName);
+ clm_node_lock(nodeName, 0);
while (1) {
rc = poll(fds, 1, 2000);
@@ -396,7 +375,7 @@ void saClmLongRdn_03(void)
safassert(saClmFinalize(clmHandle), SA_AIS_OK);
test_validate(s_clmTrackCallback_err, SA_AIS_OK);
- unlock_node(nodeName);
+ clm_node_unlock(nodeName, 0);
}
void saClmLongRdn_04(void)
diff --git a/src/clm/apitest/tet_saClmClusterTrack.c
b/src/clm/apitest/tet_saClmClusterTrack.c
index 8a8ca89..66e8ed0 100644
--- a/src/clm/apitest/tet_saClmClusterTrack.c
+++ b/src/clm/apitest/tet_saClmClusterTrack.c
@@ -27,56 +27,24 @@ SaInvocationT invocation;
SaInvocationT lock_inv;
static const char *s_node_name = "safNode=PL-3,safCluster=myClmCluster";
-static int clm_node_lock(const char *nodeName, int ignoreOutput) {
- char command[256];
-
- if (ignoreOutput) {
- sprintf(command, "immadm -o 2 %s 2> /dev/null", nodeName);
- } else {
- sprintf(command, "immadm -o 2 %s", nodeName);
- }
- return system(command);
-}
-
-static int clm_node_unlock(const char *nodeName, int ignoreOutput) {
- char command[256];
-
- if (ignoreOutput) {
- sprintf(command, "immadm -o 1 %s 2> /dev/null", nodeName);
- } else {
- sprintf(command, "immadm -o 1 %s", nodeName);
- }
- return system(command);
-}
-
-static int clm_node_shutdown(const char *nodeName, int ignoreOutput) {
- char command[256];
-
- if (ignoreOutput) {
- sprintf(command, "immadm -o 3 %s 2> /dev/null", nodeName);
- } else {
- sprintf(command, "immadm -o 3 %s", nodeName);
- }
- return system(command);
-}
static void *admin_lock(void *dummy)
{
- assert(clm_node_lock(s_node_name, 0) != -1);
+ assert(clm_node_lock(s_node_name, 0) == SA_AIS_OK);
/*test_validate(WEXITSTATUS(rc), 0);*/
return NULL;
}
static void *admin_unlock(void *dummy)
{
- assert(clm_node_unlock(s_node_name, 0) != -1);
+ assert(clm_node_unlock(s_node_name, 0) == SA_AIS_OK);
/*test_validate(WEXITSTATUS(rc), 0);*/
return NULL;
}
static void *admin_shutdown(void *dummy)
{
- assert(clm_node_shutdown(s_node_name, 0) != -1);
+ assert(clm_node_shutdown(s_node_name, 0) == SA_AIS_OK);
/*test_validate(WEXITSTATUS(rc), 0);*/
return NULL;
}