src/log/agent/lga_api.c                       |  55 ++++++++++++++++++++------
 src/log/apitest/tet_saLogFilterSetCallbackT.c |  53 ++++++++++++++++++++++++++
 src/log/apitest/tet_saLogInitialize.c         |  23 +++++++++++
 3 files changed, 117 insertions(+), 14 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
@@ -73,6 +73,36 @@ 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 log_version_is_valid(SaVersionT *ver, SaVersionT *client_ver) {
+       bool rc = true;
+       if ((ver->releaseCode == LOG_RELEASE_CODE) &&
+           (ver->majorVersion <= LOG_MAJOR_VERSION) &&
+           (ver->majorVersion > 0) &&
+           (ver->minorVersion <= LOG_MINOR_VERSION)) {
+               *client_ver = *ver;
+               if (ver->minorVersion < LOG_MINOR_VERSION_0)
+                       client_ver->minorVersion = LOG_MINOR_VERSION_0;
+               ver->majorVersion = LOG_MAJOR_VERSION;
+               ver->minorVersion = LOG_MINOR_VERSION;
+       } else {
+               TRACE("version FAILED, required: %c.%u.%u, supported: 
%c.%u.%u\n",
+                     ver->releaseCode, ver->majorVersion, ver->minorVersion,
+                     LOG_RELEASE_CODE, LOG_MAJOR_VERSION, LOG_MINOR_VERSION);
+               ver->releaseCode = LOG_RELEASE_CODE;
+               ver->majorVersion = LOG_MAJOR_VERSION;
+               ver->minorVersion = LOG_MINOR_VERSION;
+               rc = false;
+       }
+       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 +181,7 @@ SaAisErrorT saLogInitialize(SaLogHandleT
        int rc;
        uint32_t client_id = 0;
        bool is_locked = false;
+       SaVersionT client_ver;
 
        TRACE_ENTER();
 
@@ -162,17 +193,7 @@ SaAisErrorT saLogInitialize(SaLogHandleT
        }
 
        /* validate the version */
-       if ((version->releaseCode == LOG_RELEASE_CODE) && 
(version->majorVersion <= LOG_MAJOR_VERSION)) {
-               version->majorVersion = LOG_MAJOR_VERSION;
-               if (version->minorVersion != LOG_MINOR_VERSION_0)
-                       version->minorVersion = LOG_MINOR_VERSION;
-       } else {
-               TRACE("version FAILED, required: %c.%u.%u, supported: 
%c.%u.%u\n",
-                     version->releaseCode, version->majorVersion, 
version->minorVersion,
-                     LOG_RELEASE_CODE, LOG_MAJOR_VERSION, LOG_MINOR_VERSION);
-               version->releaseCode = LOG_RELEASE_CODE;
-               version->majorVersion = LOG_MAJOR_VERSION;
-               version->minorVersion = LOG_MINOR_VERSION;
+       if (!log_version_is_valid(version, &client_ver)) {
                ais_rc = SA_AIS_ERR_VERSION;
                goto done;
        }
@@ -230,7 +251,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.
@@ -245,7 +266,13 @@ SaAisErrorT saLogInitialize(SaLogHandleT
     /** Make sure the LGS return status was SA_AIS_OK 
      **/
        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; /* TODO: update 
when log server reply with version */
+               goto err;
+       } else if (SA_AIS_OK != ais_rc) {
                TRACE("%s LGS error response %s", __FUNCTION__, 
saf_error(ais_rc));
                goto err;
        }
@@ -265,7 +292,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
@@ -375,6 +375,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)
 {
@@ -383,4 +435,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
@@ -82,6 +82,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 +121,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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to