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