src/log/agent/lga_api.c                       |  58 ++++++++++++++++++++++----
 src/log/apitest/tet_saLogFilterSetCallbackT.c |  53 ++++++++++++++++++++++++
 src/log/apitest/tet_saLogInitialize.c         |  24 +++++++++++
 3 files changed, 126 insertions(+), 9 deletions(-)


Fix checking version in log agent

The agent report highest supported version except getting ERR_VERSION from
server. if agent get ERR_VERSION, it will set supported version to A.02.03

diff --git a/src/log/agent/lga_api.c b/src/log/agent/lga_api.c
--- a/src/log/agent/lga_api.c
+++ b/src/log/agent/lga_api.c
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright Ericsson AB 2008, 2017 - All Rights Reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -73,6 +74,24 @@ static bool is_lgs_state(lgs_state_t sta
        return rc;
 }
 
+/**
+ * Check if the log version is valid
+ * @param version
+ * @param client_ver
+ *
+ * @return true if log version is valid
+ */
+static bool is_log_version_valid(const SaVersionT *ver) {
+       bool rc = false;
+       if ((ver->releaseCode == LOG_RELEASE_CODE) &&
+           (ver->majorVersion <= LOG_MAJOR_VERSION) &&
+           (ver->majorVersion > 0) &&
+           (ver->minorVersion <= LOG_MINOR_VERSION)) {
+               rc = true;
+       }
+       return rc;
+}
+
 static void populate_open_params(lgsv_stream_open_req_t *open_param,
                                 const char *logStreamName,
                                 lga_client_hdl_rec_t *hdl_rec,
@@ -151,6 +170,7 @@ SaAisErrorT saLogInitialize(SaLogHandleT
        int rc;
        uint32_t client_id = 0;
        bool is_locked = false;
+       SaVersionT client_ver;
 
        TRACE_ENTER();
 
@@ -161,11 +181,18 @@ SaAisErrorT saLogInitialize(SaLogHandleT
                goto done;
        }
 
-       /* validate the version */
-       if ((version->releaseCode == LOG_RELEASE_CODE) && 
(version->majorVersion <= LOG_MAJOR_VERSION)) {
+       /***
+        * Validate the version
+        * Store client version that will be sent to log server. In case minor
+        * version has not set, it is set to 1
+        * Update the [out] version to highest supported version in log agent
+        */
+       if (is_log_version_valid(version)) {
+               client_ver = *version;
+               if (version->minorVersion < LOG_MINOR_VERSION_0)
+                       client_ver.minorVersion = LOG_MINOR_VERSION_0;
                version->majorVersion = LOG_MAJOR_VERSION;
-               if (version->minorVersion != LOG_MINOR_VERSION_0)
-                       version->minorVersion = LOG_MINOR_VERSION;
+               version->minorVersion = LOG_MINOR_VERSION;
        } else {
                TRACE("version FAILED, required: %c.%u.%u, supported: 
%c.%u.%u\n",
                      version->releaseCode, version->majorVersion, 
version->minorVersion,
@@ -230,7 +257,7 @@ SaAisErrorT saLogInitialize(SaLogHandleT
        memset(&i_msg, 0, sizeof(lgsv_msg_t));
        i_msg.type = LGSV_LGA_API_MSG;
        i_msg.info.api_info.type = LGSV_INITIALIZE_REQ;
-       i_msg.info.api_info.param.init.version = *version;
+       i_msg.info.api_info.param.init.version = client_ver;
 
        /* Send a message to LGS to obtain a client_id/server ref id which is 
cluster
         * wide unique.
@@ -242,10 +269,23 @@ SaAisErrorT saLogInitialize(SaLogHandleT
                goto done;
        }
 
-    /** Make sure the LGS return status was SA_AIS_OK 
-     **/
+       /*
+        * Make sure the LGS return status was SA_AIS_OK
+        * If the returned status was SA_AIS_ERR_VERSION, the [out] version is
+        * updated to highest supported version in log server. But now the log
+        * server has not returned the highest version in the response. Here is
+        * temporary updating [out] version to A.02.03.
+        * TODO: This may be fixed to update the highest version when log server
+        * return the response with version.
+        */
        ais_rc = o_msg->info.api_resp_info.rc;
-       if (SA_AIS_OK != ais_rc) {
+       if (ais_rc == SA_AIS_ERR_VERSION) {
+               TRACE("%s LGS error response %s", __FUNCTION__, 
saf_error(ais_rc));
+               version->releaseCode = LOG_RELEASE_CODE_1;
+               version->majorVersion = LOG_RELEASE_CODE_1;
+               version->minorVersion = LOG_RELEASE_CODE_1;
+               goto err;
+       } else if (SA_AIS_OK != ais_rc) {
                TRACE("%s LGS error response %s", __FUNCTION__, 
saf_error(ais_rc));
                goto err;
        }
@@ -265,7 +305,7 @@ SaAisErrorT saLogInitialize(SaLogHandleT
 
        /* pass the handle value to the appl */
        *logHandle = lga_hdl_rec->local_hdl;
-       lga_hdl_rec->version = *version;
+       lga_hdl_rec->version = client_ver;
 
  err:
        /* free up the response message */
diff --git a/src/log/apitest/tet_saLogFilterSetCallbackT.c 
b/src/log/apitest/tet_saLogFilterSetCallbackT.c
--- a/src/log/apitest/tet_saLogFilterSetCallbackT.c
+++ b/src/log/apitest/tet_saLogFilterSetCallbackT.c
@@ -376,6 +376,58 @@ done:
        systemCall(command);
 }
 
+void saLogFilterSetCallbackT_05(void)
+{
+       int ret;
+       SaAisErrorT rc;
+       struct pollfd fds[1];
+       char command[MAX_DATA];
+       const unsigned int serverity_filter = 7;
+
+       SaVersionT old_version = { 'A', 0x02, 0x02 };
+       logCallbacks.saLogFilterSetCallback = logFilterSetCallbackT;
+       rc = saLogInitialize(&logHandle, &logCallbacks, &old_version);
+       if (rc != SA_AIS_OK) {
+               test_validate(rc, SA_AIS_OK);
+               return;
+       }
+
+       rc = saLogSelectionObjectGet(logHandle, &selectionObject);
+       if (rc != SA_AIS_OK) {
+               test_validate(rc, SA_AIS_OK);
+               goto done;
+       }
+
+       rc = logAppStreamOpen(&app1StreamName, 
&appStreamLogFileCreateAttributes);
+       if (rc != SA_AIS_OK) {
+               test_validate(rc, SA_AIS_OK);
+               goto done;
+       }
+
+       cb_index = 0;
+       sprintf(command, "immadm -o 1 -p 
saLogStreamSeverityFilter:SA_UINT32_T:%u %s 2> /dev/null",
+               serverity_filter, SA_LOG_STREAM_APPLICATION1);
+       ret = systemCall(command);
+       if (ret != 0) {
+               rc_validate(ret, 0);
+               goto done;
+       }
+
+       fds[0].fd = (int) selectionObject;
+       fds[0].events = POLLIN;
+       ret = poll(fds, 1, 1000);
+       if (ret == 1) {
+               fprintf(stderr, " poll log callback failed: %d \n", ret);
+               rc_validate(ret, 0);
+               goto done;
+       } else {
+               rc_validate(0, 0);;
+       }
+
+done:
+       logCallbacks.saLogFilterSetCallback = NULL;
+       logFinalize();
+}
 
 __attribute__ ((constructor)) static void saLibraryLifeCycle_constructor(void)
 {
@@ -384,4 +436,5 @@ done:
     test_case_add(17, saLogFilterSetCallbackT_02, "saLogFilterSetCallbackT, 
severity filter is changed for runtime stream");
     test_case_add(17, saLogFilterSetCallbackT_03, "saLogFilterSetCallbackT, 
severity filter is changed for runtime & cfg streams");
     test_case_add(17, saLogFilterSetCallbackT_04, "saLogFilterSetCallbackT, 
after closing stream");
+    test_case_add(17, saLogFilterSetCallbackT_05, "saLogFilterSetCallbackT, if 
client initialize with version < A.02.03, ER");
 }
diff --git a/src/log/apitest/tet_saLogInitialize.c 
b/src/log/apitest/tet_saLogInitialize.c
--- a/src/log/apitest/tet_saLogInitialize.c
+++ b/src/log/apitest/tet_saLogInitialize.c
@@ -1,6 +1,7 @@
 /*      -*- OpenSAF  -*-
  *
  * (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright Ericsson AB 2008, 2017 - All Rights Reserved.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -82,6 +83,27 @@ void saLogInitialize_09(void)
     test_validate(rc, SA_AIS_ERR_VERSION);
 }
 
+void saLogInitialize_10(void)
+{
+    SaVersionT version = logVersion;
+
+    version.minorVersion = logVersion.minorVersion + 1;
+    rc = saLogInitialize(&logHandle, &logCallbacks, &version);
+    logFinalize();
+
+    test_validate(rc, SA_AIS_ERR_VERSION);
+}
+
+void saLogInitialize_11(void)
+{
+    SaVersionT version = {'A', 2};
+
+    rc = saLogInitialize(&logHandle, &logCallbacks, &version);
+    logFinalize();
+
+    test_validate(rc, SA_AIS_OK);
+}
+
 extern void saLogSelectionObjectGet_01(void);
 extern void saLogSelectionObjectGet_02(void);
 extern void saLogFinalize_01(void);
@@ -100,6 +122,8 @@ extern void saLogDispatch_01(void);
     test_case_add(1, saLogInitialize_07, "saLogInitialize() with too high 
release level");
     test_case_add(1, saLogInitialize_08, "saLogInitialize() with minor version 
set to 1");
     test_case_add(1, saLogInitialize_09, "saLogInitialize() with major version 
set to 3");
+    test_case_add(1, saLogInitialize_10, "saLogInitialize() with minor version 
is set bigger than supported version");
+    test_case_add(1, saLogInitialize_11, "saLogInitialize() with minor version 
is not set");
     test_case_add(1, saLogSelectionObjectGet_01, "saLogSelectionObjectGet() 
OK");
     test_case_add(1, saLogSelectionObjectGet_02, "saLogSelectionObjectGet() 
with NULL log handle");
     test_case_add(1, saLogDispatch_01, "saLogDispatch() OK");

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