From: <dr_...@us...> - 2015-01-20 23:11:52
|
Revision: 7616 http://sourceforge.net/p/openhpi/code/7616 Author: dr_mohan Date: 2015-01-20 23:11:49 +0000 (Tue, 20 Jan 2015) Log Message: ----------- Fix for #1861 Openhpi reports ?\226?\128?\152Server in slot # is removed/ added?\226?\128?\153 during OA switchover Modified Paths: -------------- openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.c openhpi/trunk/plugins/oa_soap/oa_soap_utils.c openhpi/trunk/plugins/oa_soap/oa_soap_utils.h Modified: openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.c =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.c 2015-01-12 18:25:17 UTC (rev 7615) +++ openhpi/trunk/plugins/oa_soap/oa_soap_re_discover.c 2015-01-20 23:11:49 UTC (rev 7616) @@ -767,9 +767,9 @@ parse_bladeStatus(sts_response.bladeStsArray,&sts_result); parse_bladePortMap(pm_response.portMapArray,&pm_result); i = result.bayNumber; - state = RES_ABSENT; - replace_resource = SAHPI_FALSE; - + state = RES_ABSENT; // Assume blade not present in enclosure + replace_resource = SAHPI_FALSE; // Assume don't replace in RPT + if (result.presence != PRESENT ) { /* The blade is absent. Is the blade absent in * the presence matrix? @@ -777,62 +777,70 @@ if (oa_handler->oa_soap_resources.server.presence[i - 1] == RES_ABSENT){ info_response.bladeInfoArray = - soap_next_node( info_response.bladeInfoArray); + soap_next_node( info_response.bladeInfoArray); sts_response.bladeStsArray = - soap_next_node( sts_response.bladeStsArray); + soap_next_node( sts_response.bladeStsArray); pm_response.portMapArray = - soap_next_node( pm_response.portMapArray); + soap_next_node( pm_response.portMapArray); continue; } else state = RES_ABSENT; } /* The server blade is present. Is the server present in - * the presence matrix? + * the presence matrix? */ else if (oa_handler->oa_soap_resources.server.presence[i - 1] == RES_PRESENT) { - /* NULL pointer Check for the serial Number to avoid the segfault*/ - if (result.serialNumber != 0){ - /* If Serial number is different, remove and - * add the blade - */ - if (strcmp(oa_handler->oa_soap_resources.server. + /* Perform an error check on Serial Number */ + oa_soap_check_serial_number(i, result.serialNumber); + + /* NULL pointer Check to avoid the segfault*/ + if (result.serialNumber != 0) { + /* If Serial number is different, remove and + * add the blade + */ + if (strcmp(oa_handler->oa_soap_resources.server. serial_number[i - 1], result.serialNumber) != 0) { - replace_resource = SAHPI_TRUE; - } else { - /* Check and update the hotswap state - * of the server blade - */ - if(result.bladeType == BLADE_TYPE_SERVER) { - rv = update_server_hotswap_state( - oh_handler, con, i); - if (rv != SA_OK) { - err("Update server hot swap" - " state failed"); - xmlFreeDoc( bl_info_doc); - xmlFreeDoc(bl_pm_doc); - xmlFreeDoc(bl_sts_doc); - return rv; - } - } - /* Check the server sensors state */ - oa_soap_proc_server_status(oh_handler, con, - &sts_result); - info_response.bladeInfoArray = + replace_resource = SAHPI_TRUE; + } else { + /* Check and update the hotswap state + * of the server blade + */ + if(result.bladeType == BLADE_TYPE_SERVER){ + rv = update_server_hotswap_state( + oh_handler, con, i); + if (rv != SA_OK) { + err("Update server hot swap" + " state failed"); + xmlFreeDoc( bl_info_doc); + xmlFreeDoc(bl_pm_doc); + xmlFreeDoc(bl_sts_doc); + return rv; + } + } + /* Check the server sensors state */ + oa_soap_proc_server_status(oh_handler, + con, &sts_result); + info_response.bladeInfoArray = soap_next_node(info_response.bladeInfoArray); - sts_response.bladeStsArray = - soap_next_node( sts_response.bladeStsArray); - pm_response.portMapArray = - soap_next_node( pm_response.portMapArray); - continue; - } - } else - replace_resource = SAHPI_TRUE; - } else + sts_response.bladeStsArray = + soap_next_node( sts_response.bladeStsArray); + pm_response.portMapArray = + soap_next_node( pm_response.portMapArray); + continue; + } + } else { + replace_resource = SAHPI_TRUE; + } + } else { + oa_soap_check_serial_number(i, result.serialNumber); state = RES_PRESENT; + } - if (state == RES_ABSENT || replace_resource == SAHPI_TRUE) { + if ((state == RES_ABSENT || replace_resource == SAHPI_TRUE) && + (oa_handler->oa_soap_resources.server.presence[i - 1] + == RES_PRESENT)) { /* The server blade is present according OA presence * matrix, but server is removed. Remove the server * resource from RPTable. Modified: openhpi/trunk/plugins/oa_soap/oa_soap_utils.c =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_utils.c 2015-01-12 18:25:17 UTC (rev 7615) +++ openhpi/trunk/plugins/oa_soap/oa_soap_utils.c 2015-01-20 23:11:49 UTC (rev 7616) @@ -105,6 +105,9 @@ * update_oa_fw_version() - Updates the RPT entry and IDR entry * with OA firmware version * + * oa_soap_check_serial_number() - Check the serial_number and + * give a proper message + * **/ #include "oa_soap_utils.h" @@ -1810,3 +1813,46 @@ } return SA_OK; } + +/** + * oa_soap_check_serial_number() + * @slot: slot number of the blade + * @serial_number: Pointer to serial_number string + * + * Purpose: + * Just prints out a message. OA sends out information from iLO as it + * becomes available. So empty, "[Unknown]" serial numbers are common + * During a re-discovery after a switchover a blade with a good serial + * number could be replaced with a blade with a bad serial number. So + * only thing we could do is give a warning message. Nothing more. It + * is users responsility to correct it using RBSU/boot utility + * + * Detailed Description: NA + * + * Return values: + * Void + **/ +void oa_soap_check_serial_number(int slot, char *serial_number) +{ + int j=0, len=0; + + if (serial_number == 0 ) { + WARN("Blade(%d) serialNumber is NULL",slot); + } else if ((len = strlen(serial_number)) == 0) { + WARN("Blade(%d) serialNumber is empty",slot); + } else if (strcmp(serial_number,"[Unknown]")) { + if (len >= 9) + len = 9; + for (j =0; j < len; j++){ + if (isalnum(serial_number[j])) + continue; + else { + CRIT("Blade(%d) serialNumber %s is " + "invalid",slot,serial_number); + break; + } + } + } else { + dbg("Blade(%d) serialNumber is [Unknown]",slot); + } +} Modified: openhpi/trunk/plugins/oa_soap/oa_soap_utils.h =================================================================== --- openhpi/trunk/plugins/oa_soap/oa_soap_utils.h 2015-01-12 18:25:17 UTC (rev 7615) +++ openhpi/trunk/plugins/oa_soap/oa_soap_utils.h 2015-01-20 23:11:49 UTC (rev 7616) @@ -122,4 +122,8 @@ SaErrorT oa_soap_get_oa_ip(char *server, struct oaNetworkInfo network_info_response, char *oa_ip); + +void oa_soap_check_serial_number(int slot, + char *serial_number); + #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |