class OpTestDropbearSafety(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() ## # @brief This function will tests Dropbear running functionality in skiroot # 1. Power Off the system # 2. Power on the system # 3. Exit to the petitboot shell # 4. Execute ps command # 5. test will fail incase dropbear is running and listed out by ps # 6. At the end of test reboot the system to OS. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_dropbear_running(self): self.cv_SYSTEM.sys_bmc_power_on_validate_host() print "Test Dropbear running in Petitboot" print "Performing IPMI Power Off Operation" self.console = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_SYSTEM.sys_ipmi_boot_system_to_petitboot(self.console) self.cv_IPMI.ipmi_host_set_unique_prompt(self.console) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") # we don't grep for 'dropbear' so that our naive line.count # below doesn't hit a false positive. res = self.cv_IPMI.run_host_cmd_on_ipmi_console("ps|grep drop") print res self.cv_IPMI.ipmi_set_boot_to_disk() for line in res: if line.count('dropbear'): raise OpTestError("drobear is running in the skiroot") return BMC_CONST.FW_SUCCESS
class OpTestIPMIReprovision(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostUser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostIP=None, i_hostUser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostIP, i_hostUser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostIP, i_hostUser, i_hostPasswd,i_bmcIP, i_ffdcDir) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostIP, i_hostUser, i_hostPasswd) self.util = OpTestUtil() self.opTestHMIHandling = OpTestHMIHandling(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostIP, i_hostUser, i_hostPasswd) ## # @brief This function will cover following test steps # Testcase: NVRAM Partition-IPMI Reprovision # 1. Update NVRAM config data with test config data # i.e "nvram --update-config test-name=test-value" # 2. Issue an IPMI PNOR Reprovision request command, to reset NVRAM partition to default. # 3. Wait for PNOR Reprovision progress to complete(00). # 4. Do a Hard reboot(Power OFF/ON) to avoid nvram cache data. # 5. Once system booted, check for NVRAM parition whether the test config data # got erased or not. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_nvram_ipmi_reprovision(self): self.cv_SYSTEM.sys_bmc_power_on_validate_host() self.cv_HOST.host_run_command("uname -a") self.cv_HOST.host_run_command(BMC_CONST.NVRAM_PRINT_CFG) print "IPMI_Reprovision: Updating the nvram partition with test cfg data" self.cv_HOST.host_run_command(BMC_CONST.NVRAM_UPDATE_CONFIG_TEST_DATA) self.cv_HOST.host_run_command(BMC_CONST.NVRAM_PRINT_CFG) print "IPMI_Reprovision: issuing ipmi pnor reprovision request" self.cv_SYSTEM.sys_issue_ipmi_pnor_reprovision_request() print "IPMI_Reprovision: wait for reprovision to complete" self.cv_SYSTEM.sys_wait_for_ipmi_pnor_reprovision_to_complete() print "IPMI_Reprovision: gathering the opal message logs" self.cv_HOST.host_gather_opal_msg_log() print "IPMI_Reprovision: Performing a IPMI Power OFF Operation" # Perform a IPMI Power OFF Operation(Immediate Shutdown) self.cv_IPMI.ipmi_power_off() if int(self.cv_SYSTEM.sys_wait_for_standby_state(BMC_CONST.SYSTEM_STANDBY_STATE_DELAY)) == BMC_CONST.FW_SUCCESS: print "IPMI_Reprovision: System is in standby/Soft-off state" else: l_msg = "IPMI_Reprovision: System failed to reach standby/Soft-off state after pnor reprovisioning" raise OpTestError(l_msg) print "IPMI_Reprovision: Performing a IPMI Power ON Operation" # Perform a IPMI Power ON Operation self.cv_IPMI.ipmi_power_on() self.cv_SYSTEM.sys_check_host_status() self.util.PingFunc(self.cv_HOST.ip, BMC_CONST.PING_RETRY_POWERCYCLE) l_res = self.cv_HOST.host_run_command(BMC_CONST.NVRAM_PRINT_CFG) if l_res.__contains__(BMC_CONST.NVRAM_TEST_DATA): l_msg = "NVRAM Partition - IPMI Reprovision not happening, nvram test config data still exists" raise OpTestError(l_msg) print "NVRAM Partition - IPMI Reprovision is done, cleared the nvram test config data" self.cv_HOST.host_gather_opal_msg_log() return BMC_CONST.FW_SUCCESS ## # @brief This function will cover following test steps # Testcase: GARD Partition-IPMI Reprovision # 1. Inject core checkstop using existed function from OpTestHMIHandling.py # 2. Do a Hard reboot(IPMI Power OFF/ON) # 2. Issue an IPMI PNOR Reprovision request command, to reset GUARD partition to default. # 3. Wait for IPMI PNOR Reprovision progress to complete(00). # 4. Check for GUARD parition whether the existing gard records erased or not. # 6. Reboot the system back to see system is booting fine or not. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_gard_ipmi_reprovision(self): self.cv_SYSTEM.sys_bmc_power_on_validate_host() print "IPMI_Reprovision: Injecting system core checkstop to guard the phyisical cpu" self.opTestHMIHandling.testHMIHandling(BMC_CONST.HMI_MALFUNCTION_ALERT) print "IPMI_Reprovision: Performing a IPMI Power OFF Operation" # Perform a IPMI Power OFF Operation(Immediate Shutdown) self.cv_IPMI.ipmi_power_off() if int(self.cv_SYSTEM.sys_wait_for_standby_state(BMC_CONST.SYSTEM_STANDBY_STATE_DELAY)) == BMC_CONST.FW_SUCCESS: print "IPMI_Reprovision: System is in standby/Soft-off state" else: l_msg = "IPMI_Reprovision: System failed to reach standby/Soft-off state" raise OpTestError(l_msg) print "IPMI_Reprovision: Performing a IPMI Power ON Operation" # Perform a IPMI Power ON Operation self.cv_IPMI.ipmi_power_on() self.cv_SYSTEM.sys_check_host_status() self.util.PingFunc(self.cv_HOST.ip, BMC_CONST.PING_RETRY_POWERCYCLE) print "IPMI_Reprovision: issuing ipmi pnor reprovision request" self.cv_SYSTEM.sys_issue_ipmi_pnor_reprovision_request() print "IPMI_Reprovision: wait for reprovision to complete" self.cv_SYSTEM.sys_wait_for_ipmi_pnor_reprovision_to_complete() print "IPMI_Reprovision: gathering the opal message logs" self.cv_HOST.host_gather_opal_msg_log() self.cv_HOST.host_get_OS_Level() self.cv_HOST.host_clone_skiboot_source(BMC_CONST.CLONE_SKIBOOT_DIR) # Compile the necessary tools xscom-utils and gard utility self.cv_HOST.host_compile_gard_utility(BMC_CONST.CLONE_SKIBOOT_DIR) l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_host_login(l_con) self.cv_IPMI.ipmi_host_set_unique_prompt(l_con) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") l_res = self.cv_SYSTEM.sys_list_gard_records(BMC_CONST.GARD_TOOL_DIR) print l_res if BMC_CONST.NO_GARD_RECORDS in l_res: print "GUARD Partition - IPMI Reprovision is done, cleared HW gard records" else: l_msg = "IPMI: Reprovision not happening, gard records are not erased" raise OpTestError(l_msg) print "IPMI_Reprovision: Performing a IPMI Power OFF Operation" # Perform a IPMI Power OFF Operation(Immediate Shutdown) self.cv_IPMI.ipmi_power_off() if int(self.cv_SYSTEM.sys_wait_for_standby_state(BMC_CONST.SYSTEM_STANDBY_STATE_DELAY)) == BMC_CONST.FW_SUCCESS: print "IPMI_Reprovision: System is in standby/Soft-off state" else: l_msg = "IPMI_Reprovision: System failed to reach standby/Soft-off state" raise OpTestError(l_msg) print "IPMI_Reprovision: Performing a IPMI Power ON Operation" # Perform a IPMI Power ON Operation self.cv_IPMI.ipmi_power_on() self.cv_SYSTEM.sys_check_host_status() self.util.PingFunc(self.cv_HOST.ip, BMC_CONST.PING_RETRY_POWERCYCLE) print "IPMI_Reprovision: gathering the opal message logs" self.cv_HOST.host_gather_opal_msg_log() return BMC_CONST.FW_SUCCESS
class OpTestHMIHandling(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the Host # @param i_hostuser The userid to log into the Host # @param i_hostPasswd The password of the userid to log into the Host with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP, i_ffdcDir) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() ## # @brief This is a common function for all the hmi test cases. This will be executed before # any test case starts. Basically this provides below requirements. # 1. Validates all required host commands # 2. It will clone skiboot source repository # 3. Compile the necessary tools xscom-utils and gard utility to test HMI. # 4. Get the list Of Chips and cores in the form of dictionary. # Ex: [['00000000', ['4', '5', '6', 'c', 'd', 'e']], ['00000001', ['4', '5', '6', 'c', 'd', 'e']], ['00000010', ['4', '5', '6', 'c', 'd', 'e']]] # 5. In-order to inject HMI errors on cpu's, cpu should be running, # so disabling the sleep states 1 and 2 of all CPU's. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_init(self): self.cv_SYSTEM.sys_bmc_power_on_validate_host() # Get OS level self.l_oslevel = self.cv_HOST.host_get_OS_Level() # Check whether git and gcc commands are available on the host self.cv_HOST.host_check_command("git") self.cv_HOST.host_check_command("gcc") # It will clone skiboot source repository l_dir = "/tmp/skiboot" self.cv_HOST.host_clone_skiboot_source(l_dir) # Compile the necessary tools xscom-utils and gard utility self.cv_HOST.host_compile_xscom_utilities(l_dir) self.cv_HOST.host_compile_gard_utility(l_dir) # Getting list of processor chip Id's(executing getscom -l to get chip id's) l_res = self.cv_HOST.host_run_command("cd %s/external/xscom-utils/; ./getscom -l" % l_dir) l_res = l_res.splitlines() l_chips = [] for line in l_res: matchObj = re.search("(\d{8}).*processor", line) if matchObj: l_chips.append(matchObj.group(1)) if not l_chips: l_msg = "Getscom failed to list processor chip id's" raise OpTestError(l_msg) l_chips.sort() print l_chips # ['00000000', '00000001', '00000010'] # Currently getting the list of active core id's with respect to each chip is by using opal msg log # TODO: Need to identify best way to get list of cores(If Opal msg log is empty) l_cmd = "cat /sys/firmware/opal/msglog | grep -i CHIP" l_res = self.cv_HOST.host_run_command(l_cmd) l_cores = {} self.l_dic = [] l_res = l_res.splitlines() for line in l_res: matchObj = re.search("Chip (\d{1,2}) Core ([a-z0-9])", line) if matchObj: if l_cores.has_key(int(matchObj.group(1))): (l_cores[int(matchObj.group(1))]).append(matchObj.group(2)) else: l_cores[int(matchObj.group(1))] = list(matchObj.group(2)) if not l_cores: l_msg = "Failed in getting core id's information from OPAL msg log" raise OpTestError(l_msg) print l_cores # {0: ['4', '5', '6', 'c', 'd', 'e'], 1: ['4', '5', '6', 'c', 'd', 'e'], 10: ['4', '5', '6', 'c', 'd', 'e']} l_cores = sorted(l_cores.iteritems()) print l_cores i=0 for tup in l_cores: new_list = [l_chips[i], tup[1]] self.l_dic.append(new_list) i+=1 print self.l_dic # self.l_dic is a list of chip id's, core id's . and is of below format # [['00000000', ['4', '5', '6', 'c', 'd', 'e']], ['00000001', ['4', '5', '6', 'c', 'd', 'e']], ['00000010', ['4', '5', '6', 'c', 'd', 'e']]] self.l_dir = l_dir # In-order to inject HMI errors on cpu's, cpu should be running, so disabling the sleep states 1 and 2 of all CPU's self.cv_HOST.host_run_command(BMC_CONST.GET_CPU_SLEEP_STATE2) self.cv_HOST.host_run_command(BMC_CONST.GET_CPU_SLEEP_STATE1) self.cv_HOST.host_run_command(BMC_CONST.GET_CPU_SLEEP_STATE0) self.cv_HOST.host_run_command(BMC_CONST.DISABLE_CPU_SLEEP_STATE1) self.cv_HOST.host_run_command(BMC_CONST.DISABLE_CPU_SLEEP_STATE2) self.cv_HOST.host_run_command(BMC_CONST.GET_CPU_SLEEP_STATE2) self.cv_HOST.host_run_command(BMC_CONST.GET_CPU_SLEEP_STATE1) self.cv_HOST.host_run_command(BMC_CONST.GET_CPU_SLEEP_STATE0) if "Ubuntu" in self.l_oslevel: self.cv_HOST.host_run_command("service kdump-tools stop") self.cv_HOST.host_run_command("service kdump-tools status") else: self.cv_HOST.host_run_command("service kdump stop") self.cv_HOST.host_run_command("service kdump status") ## # @brief This function is mainly used to clear hardware gard entries. # It will perform below steps # 1. Reboot the system(Power off/on) # 2. Clear any Hardware gard entries # 3. Again reboot the system, to make use of garded Hardware. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def clearGardEntries(self): self.cv_SYSTEM.sys_bmc_power_on_validate_host() # Power off and on the system. self.cv_IPMI.ipmi_power_off() self.cv_IPMI.ipmi_power_on() if int(self.cv_SYSTEM.sys_ipl_wait_for_working_state()): l_msg = "System failed to boot host OS" raise OpTestError(l_msg) time.sleep(BMC_CONST.HOST_BRINGUP_TIME) # Clearing gard entries after host comes up self.cv_HOST.host_get_OS_Level() # It will clone skiboot source repository l_dir = "/tmp/skiboot" self.cv_HOST.host_clone_skiboot_source(l_dir) # Compile the necessary tools xscom-utils and gard utility self.cv_HOST.host_compile_xscom_utilities(l_dir) self.cv_HOST.host_compile_gard_utility(l_dir) l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_host_login(l_con) self.cv_IPMI.ipmi_host_set_unique_prompt(l_con) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") l_dir = "/tmp/skiboot" self.cv_IPMI.run_host_cmd_on_ipmi_console("cd %s/external/gard/;" % l_dir) l_cmd = "./gard list; echo $?" self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) l_cmd = "./gard clear all; echo $?" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) if int(l_res[-1]): l_msg = "Clearing gard entries through gard tool is failed" raise OpTestError(l_msg) l_cmd = "./gard list; echo $?" self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) # Rebooting the system again to make use of garded hardware self.cv_IPMI.ipmi_power_off() self.cv_IPMI.ipmi_power_on() if int(self.cv_SYSTEM.sys_ipl_wait_for_working_state()): l_msg = "System failed to boot host OS" raise OpTestError(l_msg) time.sleep(BMC_CONST.HOST_BRINGUP_TIME) self.cv_HOST.host_get_OS_Level() self.cv_SYSTEM.sys_ipmi_close_console(l_con) ## # @brief This function executes HMI test case based on the i_test value, Before test starts # disabling kdump service to make sure system reboots, after injecting non-recoverable errors. # # @param i_test @type int: this is the type of test case want to execute # BMC_CONST.HMI_PROC_RECV_DONE: Processor recovery done # BMC_CONST.HMI_PROC_RECV_ERROR_MASKED: proc_recv_error_masked # BMC_CONST.HMI_MALFUNCTION_ALERT: malfunction_alert # BMC_CONST.HMI_HYPERVISOR_RESOURCE_ERROR: hypervisor resource error # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def testHMIHandling(self, i_test): l_test = i_test self.test_init() l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_host_login(l_con) self.cv_IPMI.ipmi_host_set_unique_prompt(l_con) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.cv_IPMI.run_host_cmd_on_ipmi_console("cat /etc/os-release") self.cv_IPMI.run_host_cmd_on_ipmi_console("cd %s/external/xscom-utils/;" % self.l_dir) self.cv_IPMI.run_host_cmd_on_ipmi_console("lscpu") self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg -D") if l_test == BMC_CONST.HMI_PROC_RECV_DONE: self.test_proc_recv_done() elif l_test == BMC_CONST.HMI_PROC_RECV_ERROR_MASKED: self.test_proc_recv_error_masked() elif l_test == BMC_CONST.HMI_MALFUNCTION_ALERT: self.test_malfunction_allert() elif l_test == BMC_CONST.HMI_HYPERVISOR_RESOURCE_ERROR: self.test_hyp_resource_err() elif l_test == BMC_CONST.TOD_ERRORS: # TOD Error recovery works on systems having more than one chip TOD # Skip this test on single chip systems(as recovery fails on 1S systems) if len(self.l_dic) == 1: l_msg = "This is a single chip system, TOD Error recovery won't work" print l_msg return BMC_CONST.FW_SUCCESS elif len(self.l_dic) > 1: self.test_tod_errors(BMC_CONST.PSS_HAMMING_DISTANCE) self.test_tod_errors(BMC_CONST.INTERNAL_PATH_OR_PARITY_ERROR) self.test_tod_errors(BMC_CONST.TOD_DATA_PARITY_ERROR) self.test_tod_errors(BMC_CONST.TOD_SYNC_CHECK_ERROR) self.test_tod_errors(BMC_CONST.FSM_STATE_PARITY_ERROR) self.test_tod_errors(BMC_CONST.MASTER_PATH_CONTROL_REGISTER) self.test_tod_errors(BMC_CONST.PORT_0_PRIMARY_CONFIGURATION_REGISTER) self.test_tod_errors(BMC_CONST.PORT_1_PRIMARY_CONFIGURATION_REGISTER) self.test_tod_errors(BMC_CONST.PORT_0_SECONDARY_CONFIGURATION_REGISTER) self.test_tod_errors(BMC_CONST.PORT_1_SECONDARY_CONFIGURATION_REGISTER) self.test_tod_errors(BMC_CONST.SLAVE_PATH_CONTROL_REGISTER) self.test_tod_errors(BMC_CONST.INTERNAL_PATH_CONTROL_REGISTER) self.test_tod_errors(BMC_CONST.PR_SC_MS_SL_CONTROL_REGISTER) else: l_msg = "Getting Chip information failed" raise OpTestError(l_msg) elif l_test == BMC_CONST.TFMR_ERRORS: self.testTFMR_Errors(BMC_CONST.TB_PARITY_ERROR) self.testTFMR_Errors(BMC_CONST.TFMR_PARITY_ERROR) self.testTFMR_Errors(BMC_CONST.TFMR_HDEC_PARITY_ERROR) self.testTFMR_Errors(BMC_CONST.TFMR_DEC_PARITY_ERROR) self.testTFMR_Errors(BMC_CONST.TFMR_PURR_PARITY_ERROR) self.testTFMR_Errors(BMC_CONST.TFMR_SPURR_PARITY_ERROR) else: l_msg = "Please provide valid test case" raise OpTestError(l_msg) self.cv_SYSTEM.sys_ipmi_close_console(l_con) print "Gathering the OPAL msg logs" self.cv_HOST.host_gather_opal_msg_log() return BMC_CONST.FW_SUCCESS ## # @brief This function is used to test HMI: processor recovery done # and also this function injecting error on all the cpus one by one and # verify whether cpu is recovered or not. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_proc_recv_done(self): for l_pair in self.l_dic: l_chip = l_pair[0] for l_core in l_pair[1]: l_reg = "1%s013100" % l_core l_cmd = "./putscom -c %s %s 0000000000100000; echo $?" % (l_chip, l_reg) self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg -C") time.sleep(10) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) time.sleep(10) if l_res[-1] == "0": print "Injected thread hang recoverable error" elif l_res[-1] == "1": # putscom returns -5 when it is trying to read from write only access register, # In these cases we should not exit and we will contiue with other error injetions continue else: if any("Kernel panic - not syncing" in line for line in l_res): l_msg = "Processor recovery failed: Kernel got panic" elif any("Petitboot" in line for line in l_res): l_msg = "System reached petitboot:Processor recovery failed" elif any("ISTEP" in line for line in l_res): l_msg = "System started booting: Processor recovery failed" else: l_msg = "Failed to inject thread hang recoverable error" print l_msg raise OpTestError(l_msg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg") if any("Processor Recovery done" in line for line in l_res) and \ any("Harmless Hypervisor Maintenance interrupt [Recovered]" in line for line in l_res): print "Processor recovery done" else: l_msg = "HMI handling failed to log message: for proc_recv_done" raise OpTestError(l_msg) time.sleep(BMC_CONST.HMI_TEST_CASE_SLEEP_TIME) return BMC_CONST.FW_SUCCESS ## # @brief This function is used to test HMI: proc_recv_error_masked # Processor went through recovery for an error which is actually masked for reporting # this function also injecting the error on all the cpu's one-by-one. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_proc_recv_error_masked(self): for l_pair in self.l_dic: l_chip = l_pair[0] for l_core in l_pair[1]: l_reg = "1%s013100" % l_core l_cmd = "./putscom -c %s %s 0000000000080000; echo $?" % (l_chip, l_reg) self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg -C") time.sleep(10) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) time.sleep(10) if l_res[-1] == "0": print "Injected thread hang recoverable error" elif l_res[-1] == "1": continue else: if any("Kernel panic - not syncing" in line for line in l_res): l_msg = "Processor recovery failed: Kernel got panic" elif any("Petitboot" in line for line in l_res): l_msg = "System reached petitboot:Processor recovery failed" elif any("ISTEP" in line for line in l_res): l_msg = "System started booting: Processor recovery failed" else: l_msg = "Failed to inject thread hang recoverable error" print l_msg raise OpTestError(l_msg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg") if any("Processor Recovery done" in line for line in l_res) and \ any("Harmless Hypervisor Maintenance interrupt [Recovered]" in line for line in l_res): print "Processor recovery done" else: l_msg = "HMI handling failed to log message" raise OpTestError(l_msg) time.sleep(BMC_CONST.HMI_TEST_CASE_SLEEP_TIME) return BMC_CONST.FW_SUCCESS ## # @brief This function is used to test hmi malfunction alert:Core checkstop # A processor core in the system has to be checkstopped (failed recovery). # Injecting core checkstop on random core of random chip # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_malfunction_allert(self): # Get random pair of chip vs cores l_pair = random.choice(self.l_dic) # Get random chip id l_chip = l_pair[0] # Get random core number l_core = random.choice(l_pair[1]) l_reg = "1%s013100" % l_core l_cmd = "./putscom -c %s %s 1000000000000000" % (l_chip, l_reg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) if any("Kernel panic - not syncing" in line for line in l_res): print "Malfunction alert: kernel got panic" elif any("login:"******"System booted to host OS without any kernel panic message" elif any("Petitboot" in line for line in l_res): print "System reached petitboot without any kernel panic message" elif any("ISTEP" in line for line in l_res): print "System started booting without any kernel panic message" else: l_msg = "HMI: Malfunction alert failed" raise OpTestError(l_msg) return BMC_CONST.FW_SUCCESS ## # @brief This function is used to test HMI: Hypervisor resource error # Injecting Hypervisor resource error on random core of random chip # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_hyp_resource_err(self): # Get random pair of chip vs cores l_pair = random.choice(self.l_dic) # Get random chip id l_chip = l_pair[0] # Get random core number l_core = random.choice(l_pair[1]) l_reg = "1%s013100" % l_core l_cmd = "./putscom -c %s %s 0000000000008000" % (l_chip, l_reg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) if any("Kernel panic - not syncing" in line for line in l_res) and \ any("Hypervisor Resource error - core check stop" in line for line in l_res): print "Hypervisor resource error: kernel got panic" elif any("login:"******"System booted to host OS without any kernel panic message" elif any("Petitboot" in line for line in l_res): print "System reached petitboot without any kernel panic message" elif any("ISTEP" in line for line in l_res): print "System started booting without any kernel panic message" else: l_msg = "HMI: Hypervisor resource error failed" raise OpTestError(l_msg) return BMC_CONST.FW_SUCCESS ## # @brief This function tests timer facility related error injections and check # the corresponding error got recovered. And this process is repeated # for all the active cores in all the chips. # # @param i_error @type string: this is the type of error want to inject # BMC_CONST.TB_PARITY_ERROR # BMC_CONST.TFMR_PARITY_ERROR # BMC_CONST.TFMR_HDEC_PARITY_ERROR # BMC_CONST.TFMR_DEC_PARITY_ERROR # BMC_CONST.TFMR_PURR_PARITY_ERROR # BMC_CONST.TFMR_SPURR_PARITY_ERROR # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def testTFMR_Errors(self, i_error): l_error = i_error for l_pair in self.l_dic: l_chip = l_pair[0] for l_core in l_pair[1]: l_reg = "1%s013281" % l_core l_cmd = "./putscom -c %s %s %s;echo $?" % (l_chip, l_reg, l_error) self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg -C") l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) time.sleep(10) if l_res[-1] == "0": print "Injected TFMR error %s" % l_error elif l_res[-1] == "1": continue else: if any("Kernel panic - not syncing" in line for line in l_res): l_msg = "TFMR error injection: Kernel got panic" elif any("Petitboot" in line for line in l_res): l_msg = "System reached petitboot:TFMR error injection recovery failed" elif any("ISTEP" in line for line in l_res): l_msg = "System started booting: TFMR error injection recovery failed" else: l_msg = "Failed to inject TFMR error %s " % l_error print l_msg raise OpTestError(l_msg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg") if any("Timer facility experienced an error" in line for line in l_res) and \ any("Severe Hypervisor Maintenance interrupt [Recovered]" in line for line in l_res): print "Timer facility experienced an error and got recovered" else: l_msg = "HMI handling failed to log message" raise OpTestError(l_msg) time.sleep(BMC_CONST.HMI_TEST_CASE_SLEEP_TIME) return BMC_CONST.FW_SUCCESS ## # @brief This function tests chip TOD related error injections and check # the corresponding error got recovered. And this error injection # happening on a random chip. This tod errors should test on systems # having more than one processor socket(chip). On single chip system # TOD error recovery won't work. # # @param i_error @type string: this is the type of error want to inject # These errors represented in common/OpTestConstants.py file. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_tod_errors(self, i_error): l_error = i_error l_pair = random.choice(self.l_dic) # Get random chip id l_chip = l_pair[0] l_cmd = "./putscom -c %s %s %s;echo $?" % (l_chip, BMC_CONST.TOD_ERROR_REG, l_error) self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg -C") l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) time.sleep(10) # As of now putscom command to TOD register will fail with return code -1. # putscom indirectly call getscom to read the value again. # But getscom to TOD error reg there is no access # TOD Error reg has only WO access and there is no read access if l_res[-1] == "1": print "Injected TOD error %s" % l_error else: if any("Kernel panic - not syncing" in line for line in l_res): print "TOD ERROR Injection-kernel got panic" elif any("login:"******"System booted to host OS without any kernel panic message" elif any("Petitboot" in line for line in l_res): print "System reached petitboot without any kernel panic message" elif any("ISTEP" in line for line in l_res): print "System started booting without any kernel panic message" else: l_msg = "TOD: PSS Hamming distance error injection failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console("dmesg") if any("Timer facility experienced an error" in line for line in l_res) and \ any("Severe Hypervisor Maintenance interrupt [Recovered]" in line for line in l_res): print "Timer facility experienced an error and got recovered" else: l_msg = "HMI handling failed to log message" raise OpTestError(l_msg) time.sleep(BMC_CONST.HMI_TEST_CASE_SLEEP_TIME) return BMC_CONST.FW_SUCCESS ## # @brief This function enables a single core # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def host_enable_single_core(self): self.cv_HOST.host_enable_single_core()
class OpTestPrdDriver(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() ## # @brief This function performs below steps # 1. Initially connecting to host and ipmi consoles for execution. # 2. check for IPOLL mask register value to see whether opal-prd is running or not # if it is 0-->opal-prd is running-->continue # else start opal-prd service again # 3. call test_prd_for_fir() function for each core FIR error and this function # can be used for any number of errors, like it is a generic function # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def testPrdDriver(self): self.cv_SYSTEM.sys_bmc_power_on_validate_host() self.test_init() l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_host_login(l_con) self.cv_IPMI.ipmi_host_set_unique_prompt(l_con) self.cv_IPMI.run_host_cmd_on_ipmi_console("cd %s/external/xscom-utils/;" % BMC_CONST.CLONE_SKIBOOT_DIR) # check for IPOLL mask register value to check opal-prd is running or not l_cmd = "./getscom -c 0x0 %s" % BMC_CONST.IPOLL_MASK_REGISTER l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) if l_res[-1] == BMC_CONST.IPOLL_MASK_REGISTER_CONTENT: print "Opal-prd is running" else: self.cv_IPMI.run_host_cmd_on_ipmi_console("service opal-prd start") l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) if l_res[-1] == BMC_CONST.IPOLL_MASK_REGISTER_CONTENT: print "Opal-prd is running" else: l_msg = "IPOLL MASK REGISTER is not getting cleared by opal-prd" raise OpTestError(l_msg) # test for PBA FIR with different core errors # 1.PBAFIR_OCI_APAR_ERR-->OCI Address Parity Error print "PRD: Test for PBAFIR_OCI_APAR_ERR-->OCI Address Parity Error" self.test_prd_for_fir(BMC_CONST.PBA_FAULT_ISOLATION_REGISTER, BMC_CONST.PBA_FAULT_ISOLATION_MASK_REGISTER, BMC_CONST.PBAFIR_OCI_APAR_ERR) # 2.PBAFIR_PB_CE_FW-->PB Read Data CE Error for Forwarded Request print "PRD: Test for PBAFIR_PB_CE_FW-->PB Read Data CE Error for Forwarded Request" self.test_prd_for_fir(BMC_CONST.PBA_FAULT_ISOLATION_REGISTER, BMC_CONST.PBA_FAULT_ISOLATION_MASK_REGISTER, BMC_CONST.PBAFIR_PB_CE_FW) # 3.PBAFIR_PB_RDDATATO_FW-->PB Read Data Timeout for Forwarded Request print "PRD: Test for PBAFIR_PB_RDDATATO_FW-->PB Read Data Timeout for Forwarded Request" self.test_prd_for_fir(BMC_CONST.PBA_FAULT_ISOLATION_REGISTER, BMC_CONST.PBA_FAULT_ISOLATION_MASK_REGISTER, BMC_CONST.PBAFIR_PB_RDDATATO_FW) # 4.PBAFIR_PB_RDADRERR_FW-->PB CRESP Addr Error Received for Forwarded Read Request print "PRD: Test for PBAFIR_PB_RDADRERR_FW-->PB CRESP Addr Error Received for Forwarded Read Request" self.test_prd_for_fir(BMC_CONST.PBA_FAULT_ISOLATION_REGISTER, BMC_CONST.PBA_FAULT_ISOLATION_MASK_REGISTER, BMC_CONST.PBAFIR_PB_RDADRERR_FW) return BMC_CONST.FW_SUCCESS ## # @brief This function injects some core FIR errors and verifies whether opal-prd clears the errors. # and also this function injects errors on random chip. # # @param FIR @type str: Local Fault Isolation register # @param FIMR @type str: Local Fault Isolation mask register # @param ERROR @type int: Core FIR error, this error will be written to FIR. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_prd_for_fir(self, FIR, FIMR, ERROR): chip_id = "0x" + self.random_chip print chip_id print "OPAL-PRD: Injecting error 0x%x on FIR: %s" % (ERROR, FIR) # Read Local Fault Isolation register l_cmd = "./getscom -c %s %s" % (chip_id, FIR) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) # Reading Local Fault Isolation mask register l_cmd = "./getscom -c %s %s" % (chip_id, FIMR) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) print l_res # Changing the FIMR value to un-masked value. LEN = 16 l_len = len(l_res[-1]) l_val = hex(int(("0x" + "0"*(LEN - l_len) + l_res[-1]), 16)& (ERROR ^ 0xffffffffffffffff)) # Writing the same value to Local Fault Isolation mask register again l_cmd = "./putscom -c %s %s %s" % (chip_id, BMC_CONST.PBA_FAULT_ISOLATION_MASK_REGISTER, l_val) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) # Inject a core error on FIR l_cmd = "./putscom -c %s %s %s" % (chip_id, FIR, hex(ERROR)) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) time.sleep(30) # Read Local Fault Isolation register again l_cmd = "./getscom -c %s %s" % (chip_id, FIR) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) print l_res # Check FIR got cleared by opal-prd if l_res[-1] == BMC_CONST.FAULT_ISOLATION_REGISTER_CONTENT: print "Opal-prd handles core hardware error" else: l_msg = "Opal-prd not clearing hardware errors in runtime" print l_msg raise OpTestError(l_msg) # Reading the Local Fault Isolation Mask Register again l_cmd = "./getscom -c %s %s" % (chip_id, FIMR) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) print l_res # check for IPOLL mask register value to see opal-prd cleared the value l_cmd = "./getscom -c %s %s" % (chip_id, BMC_CONST.IPOLL_MASK_REGISTER) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console(l_cmd) if l_res[-1] == BMC_CONST.IPOLL_MASK_REGISTER_CONTENT: print "Opal-prd cleared the IPOLL MASK REGISTER" return BMC_CONST.FW_SUCCESS else: l_msg = "Opal-prd is not clearing the IPOLL MASK REGISTER after injecting core FIR error" print l_msg raise OpTestError(l_msg) ## # @brief This is a common function for all the PRD test cases. This will be executed before # any test case starts. Basically this provides below requirements. # 1. Validates all required host commands # 2. It will clone skiboot source repository # 3. Compile the necessary tools -xscom-utils(getscom and putscom) # 4. Get the list Of Chips. # Ex: ['00000000', '00000001', '00000010'] # 5. generate a random chip. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_init(self): # Get OS level self.cv_HOST.host_get_OS_Level() # Check whether git and gcc commands are available on host self.cv_HOST.host_check_command("git", "gcc") # It will clone skiboot source repository self.cv_HOST.host_clone_skiboot_source(BMC_CONST.CLONE_SKIBOOT_DIR) # Compile the necessary tools xscom-utils and gard utility self.cv_HOST.host_compile_xscom_utilities(BMC_CONST.CLONE_SKIBOOT_DIR) # Getting list of processor chip Id's(executing getscom -l to get chip id's) l_res = self.cv_HOST.host_run_command("cd %s/external/xscom-utils/; ./getscom -l" % BMC_CONST.CLONE_SKIBOOT_DIR) l_res = l_res.splitlines() l_chips = [] for line in l_res: matchObj = re.search("(\d{8}).*processor", line) if matchObj: l_chips.append(matchObj.group(1)) if not l_chips: l_msg = "Getscom failed to list processor chip id's" raise OpTestError(l_msg) l_chips.sort() print l_chips # ['00000000', '00000001', '00000010'] self.random_chip = random.choice(l_chips) # Below will be useful for debug purposes to compare chip information l_res = self.cv_HOST.host_read_msglog_core() print l_res
class OpTestMCColdResetEffects(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP, i_ffdcDir) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() self.opTestSensors = OpTestSensors(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) ## # @brief This function will test BMC Cold reset vs Host FW status # 1. When system is in runtime issue BMC Cold reset. # 2. Check Host FW services and drivers. # 3. Run sensors command # 4. Get list of chips # 5. This is expected to fail. # https://github.com/open-power/op-build/issues/482 # 6. Reboot the system at the end of test. # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_bmc_cold_reset_effects(self): print "Test BMC Cold reset effects versus Host Firmware Status" self.cv_SYSTEM.sys_bmc_power_on_validate_host() print "Issue BMC Cold reset" result = True try: self.cv_SYSTEM.sys_cold_reset_bmc() l_dir = BMC_CONST.SKIBOOT_WORKING_DIR self.cv_HOST.host_clone_skiboot_source(l_dir) self.cv_HOST.host_compile_xscom_utilities(l_dir) l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_host_login(l_con) self.cv_IPMI.ipmi_host_set_unique_prompt(l_con) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.cv_IPMI.run_host_cmd_on_ipmi_console( "cd %s/external/xscom-utils/; ./getscom -l" % l_dir) self.opTestSensors.test_hwmon_driver() self.cv_SYSTEM.sys_ipmi_close_console(l_con) except: result = False pass print "Gathering the OPAL msg logs" self.cv_HOST.host_gather_opal_msg_log() self.cv_IPMI.ipmi_power_off() self.cv_SYSTEM.sys_bmc_power_on_validate_host() if result is False: raise OpTestError("MC Cold reset vs Host FW Test failed")
class OpTestIPMILockMode(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() ## # @brief This function will cover following test steps # 1. It will get the OS level installed on power platform # 2. It will check for kernel version installed on the Open Power Machine # 3. It will check for ipmitool command existence and ipmitool package # 4. Load the necessary ipmi modules based on config values # 5. Issue a ipmi lock command through out-of-band authenticated interface # 6. Now BMC IPMI is in locked mode, at this point only white listed # in-band ipmi commands sholud work(No other in-band ipmi command should work) # 7. Execute and test the functionality of whitelisted in-band ipmi # commands in locked mode # 8. At the end of test issue a ipmi unlock command to revert the availablity of all # in-band ipmi commands in unlocked mode. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_ipmi_lock_mode(self): self.cv_SYSTEM.sys_bmc_power_on_validate_host() # Get OS level l_oslevel = self.cv_HOST.host_get_OS_Level() # Get kernel version l_kernel = self.cv_HOST.host_get_kernel_version() # Checking for ipmitool command and lm_sensors package self.cv_HOST.host_check_command("ipmitool") l_pkg = self.cv_HOST.host_check_pkg_for_utility(l_oslevel, "ipmitool") print "Installed package: %s" % l_pkg # loading below ipmi modules based on config option # ipmi_devintf, ipmi_powernv and ipmi_masghandler self.cv_HOST.host_load_module_based_on_config( l_kernel, BMC_CONST.CONFIG_IPMI_DEVICE_INTERFACE, BMC_CONST.IPMI_DEV_INTF) self.cv_HOST.host_load_module_based_on_config( l_kernel, BMC_CONST.CONFIG_IPMI_POWERNV, BMC_CONST.IPMI_POWERNV) self.cv_HOST.host_load_module_based_on_config( l_kernel, BMC_CONST.CONFIG_IPMI_HANDLER, BMC_CONST.IPMI_MSG_HANDLER) # Issue a ipmi lock command through authenticated interface print "Issuing ipmi lock command through authenticated interface" l_res = self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_LOCK_CMD) l_res = l_res.splitlines() if int(l_res[-1]): l_msg = "IPMI:Lock command failed, There may be two reasons here.\n\ a. check the corresponding parches available in AMI driver code,\n\ b. if patches available then command is failing" print l_msg raise OpTestError(l_msg) print "IPMI:Lock command executed successfully" try: self.run_inband_ipmi_whitelisted_cmds() except: l_msg = "One of white listed in-band ipmi command execution failed" print sys.exc_info() finally: # Issue a ipmi unlock command at the end of test. print "Issuing ipmi unlock command through authenticated interface" self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_UNLOCK_CMD) ## # @brief This function will execute whitelisted in-band ipmi commands # and test the functionality in locked mode. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def run_inband_ipmi_whitelisted_cmds(self): l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_host_login(l_con) self.cv_IPMI.ipmi_host_set_unique_prompt(l_con) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") # Test IPMI white listed commands those should be allowed through un-authenticated # in-band interface # 1.[App] Get Device ID print "Testing Get Device ID command" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_DEVICE_ID) if l_res[-1] != "0": l_msg = "IPMI: Get Device ID command failed" raise OpTestError(l_msg) # 2.[App] Get Device GUID print "Testing Get Device GUID" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_DEVICE_GUID) if l_res[-1] != "0": l_msg = "IPMI: Get Device GUID command failed" raise OpTestError(l_msg) # 3.[App] Get System GUID print "Testing Get system GUID" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SYSTEM_GUID) if l_res[-1] != "0": l_msg = "IPMI: Get System GUID command failed" raise OpTestError(l_msg) # 4.[Storage] Get SEL info print "Testing Get SEL info" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SEL_INFO) if l_res[-1] != "0": l_msg = "IPMI: Get SEL info command failed" raise OpTestError(l_msg) # 5.[Storage] Get SEL time print "Testing Get SEL time" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SEL_TIME_RAW) if l_res[-1] != "0": l_msg = "IPMI: Get SEL time command failed" raise OpTestError(l_msg) # 6. [Storage] Reserve SEL print "Testing Reserve SEL" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_RESERVE_SEL) if l_res[-1] != "0": l_msg = "IPMI: Reserve SEL command failed" raise OpTestError(l_msg) # 7. [Storage] Set SEL time (required for RTC) print "Testing Set SEL time" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SEL_TIME) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_SET_SEL_TIME + " \'" + l_res[-1] + "\'; echo $?") if l_res[-1] != "0": l_msg = "IPMI: Set SEL time command failed" raise OpTestError(l_msg) self.cv_IPMI.run_host_cmd_on_ipmi_console(BMC_CONST.HOST_GET_SEL_TIME) # 8. [Transport] Get LAN parameters print "Testing Get LAN parameters" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_LAN_PARAMETERS) if l_res[-1] != "0": l_msg = "IPMI: Get LAN parameters command failed" raise OpTestError(l_msg) # 9.[Chassis] Get System Boot Options print "Testing Get System Boot Options" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SYSTEM_BOOT_OPTIONS) if l_res[-1] != "0": l_msg = "IPMI: Get System Boot Options command failed" raise OpTestError(l_msg) # 10.[Chassis] Set System Boot Options print "Testing Set System Boot Options" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_SET_SYTEM_BOOT_OPTIONS) if l_res[-1] != "0": l_msg = "IPMI: Set System Boot Options command failed" raise OpTestError(l_msg) self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SYSTEM_BOOT_OPTIONS) # 11. [App] Get BMC Global Enables print "Testing Get BMC Global Enables" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_BMC_GLOBAL_ENABLES_RAW) if l_res[-1] != "0": l_msg = "IPMI: Get BMC Global Enables command failed" raise OpTestError(l_msg) self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_BMC_GLOBAL_ENABLES) # 12. [App] Set BMC Global Enables print "Testing Set BMC Global Enables" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_SET_BMC_GLOBAL_ENABLES_SEL_OFF) if l_res[-1] != "0": l_msg = "IPMI: Set BMC Global Enables sel=off command failed" raise OpTestError(l_msg) self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_BMC_GLOBAL_ENABLES) self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_SET_BMC_GLOBAL_ENABLES_SEL_ON) # 13.[App] Get System Interface Capabilities print "Testing Get System Interface Capabilities" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SYSTEM_INTERFACE_CAPABILITIES_SSIF) if l_res[-1] != "0": l_msg = "IPMI: Get System Interface Capabilities SSIF command failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SYSTEM_INTERFACE_CAPABILITIES_KCS) if l_res[-1] != "0": l_msg = "IPMI: Get System Interface Capabilities KCS command failed" raise OpTestError(l_msg) # 14.[App] Get Message Flags print "Testing Get Message Flags" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_MESSAGE_FLAGS) if l_res[-1] != "0": l_msg = "IPMI: Get Message Flags command failed" raise OpTestError(l_msg) # 15. [App] Get BT Capabilities print "Testing Get BT Capabilities" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_BT_CAPABILITIES) if l_res[-1] != "0": l_msg = "IPMI: Get BT Capabilities command failed" raise OpTestError(l_msg) # 16. [App] Clear Message Flags print "Testing Clear Message Flags" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_CLEAR_MESSAGE_FLAGS) if l_res[-1] != "0": l_msg = "IPMI: Clear Message Flags command failed" raise OpTestError(l_msg) # 17. [OEM] PNOR Access Status print "Testing the PNOR Access Status" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_PNOR_ACCESS_STATUS_DENY) if l_res[-1] != "0": l_msg = "IPMI: PNOR Access Status:deny command failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_PNOR_ACCESS_STATUS_GRANT) if l_res[-1] != "0": l_msg = "IPMI: PNOR Access Status:grant command failed" raise OpTestError(l_msg) # 18. [Storage] Add SEL Entry print "Testing Add SEL Entry" print "Clearing the SEL list" self.cv_IPMI.ipmi_sdr_clear() l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_ADD_SEL_ENTRY) if l_res[-1] != "0": l_msg = "IPMI: Add SEL Entry command failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.ipmitool_execute_command( BMC_CONST.IPMI_LIST_LAST_SEL_EVENT) print "Checking for Reserved entry creation in SEL" if "Reserved" not in l_res: l_msg = "IPMI: Add SEL Entry command, doesn't create an SEL event" raise OpTestError(l_msg) # 19. [App] Set Power State print "Testing Set Power State" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_SET_ACPI_POWER_STATE) if l_res[-1] != "0": l_msg = "IPMI: Set Power State command failed" raise OpTestError(l_msg) # 20. [App] Set watchdog print "Testing Set watchdog" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_SET_WATCHDOG) if l_res[-1] != "0": l_msg = "IPMI: Set watchdog command failed" raise OpTestError(l_msg) self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_MC_WATCHDOG_GET) # 21. [Sensor/Event] Get Sensor Type print "Testing Get Sensor Type" l_res = self.cv_IPMI.ipmitool_execute_command( BMC_CONST.IPMI_SDR_GET_WATCHDOG) matchObj = re.search("Watchdog \((0x\d{1,})\)", l_res) if matchObj: print "Got sensor Id for watchdog: %s" % matchObj.group(1) else: l_msg = "Failed to get sensor id for watchdog sensor" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SENSOR_TYPE_FOR_WATCHDOG + " " + matchObj.group(1) + " ;echo $?") if l_res[-1] != "0": l_msg = "IPMI: Get Sensor Type command failed" raise OpTestError(l_msg) # 22.[Sensor/Event] Get Sensor Reading print "Testing Get Sensor Reading" l_res = self.cv_IPMI.ipmitool_execute_command( BMC_CONST.IPMI_SDR_GET_WATCHDOG) matchObj = re.search("Watchdog \((0x\d{1,})\)", l_res) if matchObj: print "Got sensor Id for watchdog: %s" % matchObj.group(1) else: l_msg = "Failed to get sensor id for watchdog sensor" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_SENSOR_READING + " " + matchObj.group(1) + " ;echo $?") if l_res[-1] != "0": l_msg = "IPMI: Get Sensor Reading command failed" raise OpTestError(l_msg) # 23.[Sensor/Event] Platform Event (0x02) print "Testing Platform Event" self.cv_IPMI.ipmi_sdr_clear() l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_PLATFORM_EVENT) if l_res[-1] != "0": l_msg = "IPMI: Platform Event command failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.ipmitool_execute_command( BMC_CONST.IPMI_LIST_LAST_SEL_EVENT) if "Reserved" not in l_res: l_msg = "IPMI: Platform Event command failed to log SEL event" raise OpTestError(l_msg) # 24. [OEM] PNOR Access Response (0x08) print "Testing PNOR Access Response" self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_PNOR_ACCESS_STATUS_GRANT) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_PNOR_ACCESS_RESPONSE) if l_res[-1] != "0": l_msg = "IPMI: PNOR Access Response command failed" raise OpTestError(l_msg) self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_PNOR_ACCESS_STATUS_DENY) l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_PNOR_ACCESS_RESPONSE) if l_res[-1] != "0": l_msg = "IPMI: PNOR Access Response command failed" raise OpTestError(l_msg) # 25.[Chassis] Chassis Control print "Testing chassis power on" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_CHASSIS_POWER_ON) if l_res[-1] != "0": l_msg = "IPMI: chassis power on command failed" raise OpTestError(l_msg) # 26.[App] 0x38 Get Channel Authentication Cap print "Testing Get Channel Authentication Capabilities" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_CHANNEL_AUTH_CAP) if l_res[-1] != "0": l_msg = "IPMI: Get Channel Authentication Capabilities command failed" raise OpTestError(l_msg) # 27.[App] Reset Watchdog (0x22) print "Testing reset watchdog" self.cv_IPMI.ipmi_sdr_clear() l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_RESET_WATCHDOG) if l_res[-1] != "0": l_msg = "IPMI: Reset Watchdog command failed" raise OpTestError(l_msg) time.sleep(10) # Reset watchdog should create a SEL event log l_res = self.cv_IPMI.ipmitool_execute_command( BMC_CONST.IPMI_LIST_LAST_SEL_EVENT) if "Watchdog" not in l_res: l_msg = "IPMI: Reset Watchdog command, doesn't create an SEL event" raise OpTestError(l_msg) # 28. [App] Get ACPI Power State (0x06) print "Testing Get ACPI Power State" l_res = self.cv_IPMI.run_host_cmd_on_ipmi_console( BMC_CONST.HOST_GET_ACPI_POWER_STATE) if l_res[-1] != "0": l_msg = "IPMI: Get ACPI Power State command failed" raise OpTestError(l_msg)
class OpTestHMIHandling: ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_lparIP The IP address of the LPAR # @param i_lparuser The userid to log into the LPAR # @param i_lparPasswd The password of the userid to log into the LPAR with # def __init__( self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_lparip=None, i_lparuser=None, i_lparPasswd=None, ): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI( i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_lparip, i_lparuser, i_lparPasswd ) self.cv_LPAR = OpTestLpar(i_lparip, i_lparuser, i_lparPasswd, i_bmcIP) self.cv_SYSTEM = OpTestSystem( i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_lparip, i_lparuser, i_lparPasswd, ) self.util = OpTestUtil() ## # @brief This is a common function for all the hmi test cases. This will be executed before # any test case starts. Basically this provides below requirements. # 1. Validates all required lpar commands # 2. It will clone skiboot source repository # 3. Compile the necessary tools xscom-utils and gard utility to test HMI. # 4. Get the list Of Chips and cores in the form of dictionary. # Ex: [['00000000', ['4', '5', '6', 'c', 'd', 'e']], ['00000001', ['4', '5', '6', 'c', 'd', 'e']], ['00000010', ['4', '5', '6', 'c', 'd', 'e']]] # 5. In-order to inject HMI errors on cpu's, cpu should be running, # so disabling the sleep states 1 and 2 of all CPU's. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_init(self): # Get OS level self.cv_LPAR.lpar_get_OS_Level() # Check whether git and gcc commands are available on lpar self.cv_LPAR.lpar_check_command("git") self.cv_LPAR.lpar_check_command("gcc") # It will clone skiboot source repository l_dir = "/tmp/skiboot" self.cv_LPAR.lpar_clone_skiboot_source(l_dir) # Compile the necessary tools xscom-utils and gard utility self.cv_LPAR.lpar_compile_xscom_utilities(l_dir) self.cv_LPAR.lpar_compile_gard_utility(l_dir) # Getting list of processor chip Id's(executing getscom -l to get chip id's) l_res = self.cv_LPAR.lpar_run_command("cd %s/external/xscom-utils/; ./getscom -l" % l_dir) l_res = l_res.splitlines() l_chips = [] for line in l_res: matchObj = re.search("(\d{8}).*processor", line) if matchObj: l_chips.append(matchObj.group(1)) if not l_chips: l_msg = "Getscom failed to list processor chip id's" raise OpTestError(l_msg) l_chips.sort() print l_chips # ['00000000', '00000001', '00000010'] # Currently getting the list of active core id's with respect to each chip is by using opal msg log # TODO: Need to identify best way to get list of cores(If Opal msg log is empty) l_cmd = "cat /sys/firmware/opal/msglog | grep -i CHIP" l_res = self.cv_LPAR.lpar_run_command(l_cmd) l_cores = {} self.l_dic = [] l_res = l_res.splitlines() for line in l_res: matchObj = re.search("Chip (\d{1,2}) Core ([a-z0-9])", line) if matchObj: if l_cores.has_key(int(matchObj.group(1))): (l_cores[int(matchObj.group(1))]).append(matchObj.group(2)) else: l_cores[int(matchObj.group(1))] = list(matchObj.group(2)) if not l_cores: l_msg = "Failed in getting core id's information from OPAL msg log" raise OpTestError(l_msg) print l_cores # {0: ['4', '5', '6', 'c', 'd', 'e'], 1: ['4', '5', '6', 'c', 'd', 'e'], 10: ['4', '5', '6', 'c', 'd', 'e']} l_cores = sorted(l_cores.iteritems()) print l_cores i = 0 for tup in l_cores: new_list = [l_chips[i], tup[1]] self.l_dic.append(new_list) i += 1 print self.l_dic # self.l_dic is a list of chip id's, core id's . and is of below format # [['00000000', ['4', '5', '6', 'c', 'd', 'e']], ['00000001', ['4', '5', '6', 'c', 'd', 'e']], ['00000010', ['4', '5', '6', 'c', 'd', 'e']]] self.l_dir = l_dir # In-order to inject HMI errors on cpu's, cpu should be running, so disabling the sleep states 1 and 2 of all CPU's self.cv_LPAR.lpar_run_command(BMC_CONST.GET_CPU_SLEEP_STATE2) self.cv_LPAR.lpar_run_command(BMC_CONST.GET_CPU_SLEEP_STATE1) self.cv_LPAR.lpar_run_command(BMC_CONST.GET_CPU_SLEEP_STATE0) self.cv_LPAR.lpar_run_command(BMC_CONST.DISABLE_CPU_SLEEP_STATE1) self.cv_LPAR.lpar_run_command(BMC_CONST.DISABLE_CPU_SLEEP_STATE2) self.cv_LPAR.lpar_run_command(BMC_CONST.GET_CPU_SLEEP_STATE2) self.cv_LPAR.lpar_run_command(BMC_CONST.GET_CPU_SLEEP_STATE1) self.cv_LPAR.lpar_run_command(BMC_CONST.GET_CPU_SLEEP_STATE0) ## # @brief This function is mainly used to clear hardware gard entries. # It will perform below steps # 1. Reboot the system(Power off/on) # 2. Clear any Hardware gard entries # 3. Again reboot the system, to make use of garded Hardware. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def clearGardEntries(self): # Power off and on the system. self.cv_IPMI.ipmi_power_off() self.cv_IPMI.ipmi_power_on() if int(self.cv_SYSTEM.sys_ipl_wait_for_working_state()): l_msg = "System failed to boot host OS" raise OpTestError(l_msg) time.sleep(BMC_CONST.LPAR_BRINGUP_TIME) # Clearing gard entries after lpar comes up self.cv_LPAR.lpar_get_OS_Level() l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_lpar_login(l_con) self.cv_IPMI.ipmi_lpar_set_unique_prompt(l_con) self.cv_IPMI.run_lpar_cmd_on_ipmi_console("uname -a") l_dir = "/tmp/skiboot" self.cv_IPMI.run_lpar_cmd_on_ipmi_console("cd %s/external/gard/;" % l_dir) l_cmd = "./gard list; echo $?" self.cv_IPMI.run_lpar_cmd_on_ipmi_console(l_cmd) l_cmd = "./gard clear all; echo $?" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(l_cmd) if int(l_res[-1]): l_msg = "Clearing gard entries through gard tool is failed" raise OpTestError(l_msg) l_cmd = "./gard list; echo $?" self.cv_IPMI.run_lpar_cmd_on_ipmi_console(l_cmd) # Rebooting the system again to make use of garded hardware self.cv_IPMI.ipmi_power_off() self.cv_IPMI.ipmi_power_on() if int(self.cv_SYSTEM.sys_ipl_wait_for_working_state()): l_msg = "System failed to boot host OS" raise OpTestError(l_msg) time.sleep(BMC_CONST.LPAR_BRINGUP_TIME) self.cv_LPAR.lpar_get_OS_Level() self.cv_SYSTEM.sys_ipmi_close_console(l_con) ## # @brief This function executes HMI test case based on the i_test value, Before test starts # disabling kdump service to make sure system reboots, after injecting non-recoverable errors. # # @param i_test @type int: this is the type of test case want to execute # BMC_CONST.HMI_PROC_RECV_DONE: Processor recovery done # BMC_CONST.HMI_PROC_RECV_ERROR_MASKED: proc_recv_error_masked # BMC_CONST.HMI_MALFUNCTION_ALERT: malfunction_alert # BMC_CONST.HMI_HYPERVISOR_RESOURCE_ERROR: hypervisor resource error # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def testHMIHandling(self, i_test): l_test = i_test self.test_init() l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_lpar_login(l_con) self.cv_IPMI.ipmi_lpar_set_unique_prompt(l_con) self.cv_IPMI.run_lpar_cmd_on_ipmi_console("uname -a") self.cv_IPMI.run_lpar_cmd_on_ipmi_console("cat /etc/os-release") self.cv_IPMI.run_lpar_cmd_on_ipmi_console("service kdump status") self.cv_IPMI.run_lpar_cmd_on_ipmi_console("service kdump stop") self.cv_IPMI.run_lpar_cmd_on_ipmi_console("service kdump status") self.cv_IPMI.run_lpar_cmd_on_ipmi_console("cd %s/external/xscom-utils/;" % self.l_dir) self.cv_IPMI.run_lpar_cmd_on_ipmi_console("lscpu") self.cv_IPMI.run_lpar_cmd_on_ipmi_console("dmesg -D") if l_test == BMC_CONST.HMI_PROC_RECV_DONE: self.test_proc_recv_done() elif l_test == BMC_CONST.HMI_PROC_RECV_ERROR_MASKED: self.test_proc_recv_error_masked() elif l_test == BMC_CONST.HMI_MALFUNCTION_ALERT: self.test_malfunction_allert() elif l_test == BMC_CONST.HMI_HYPERVISOR_RESOURCE_ERROR: self.test_hyp_resource_err() else: l_msg = "Please provide valid test case" raise OpTestError(l_msg) self.cv_SYSTEM.sys_ipmi_close_console(l_con) return BMC_CONST.FW_SUCCESS ## # @brief This function is used to test HMI: processor recovery done # and also this function injecting error on all the cpus one by one and # verify whether cpu is recovered or not. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_proc_recv_done(self): for l_pair in self.l_dic: l_chip = l_pair[0] for l_core in l_pair[1]: l_reg = "1%s013100" % l_core l_cmd = "./putscom -c %s %s 0000000000100000; echo $?" % (l_chip, l_reg) self.cv_IPMI.run_lpar_cmd_on_ipmi_console("dmesg -C") time.sleep(10) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(l_cmd) time.sleep(10) if l_res[-1] == "0": print "Injected thread hang recoverable error" else: if any("Kernel panic - not syncing" in line for line in l_res): l_msg = "Processor recovery failed: Kernel got panic" elif any("Petitboot" in line for line in l_res): l_msg = "System reached petitboot:Processor recovery failed" elif any("ISTEP" in line for line in l_res): l_msg = "System started booting: Processor recovery failed" else: l_msg = "Failed to inject thread hang recoverable error" print l_msg raise OpTestError(l_msg) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console("dmesg") if any("Processor Recovery done" in line for line in l_res) and any( "Harmless Hypervisor Maintenance interrupt [Recovered]" in line for line in l_res ): print "Processor recovery done" else: l_msg = "HMI handling failed to log message: for proc_recv_done" raise OpTestError(l_msg) time.sleep(BMC_CONST.HMI_TEST_CASE_SLEEP_TIME) return BMC_CONST.FW_SUCCESS ## # @brief This function is used to test HMI: proc_recv_error_masked # Processor went through recovery for an error which is actually masked for reporting # this function also injecting the error on all the cpu's one-by-one. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_proc_recv_error_masked(self): for l_pair in self.l_dic: l_chip = l_pair[0] for l_core in l_pair[1]: l_reg = "1%s013100" % l_core l_cmd = "./putscom -c %s %s 0000000000080000; echo $?" % (l_chip, l_reg) self.cv_IPMI.run_lpar_cmd_on_ipmi_console("dmesg -C") time.sleep(10) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(l_cmd) time.sleep(10) if l_res[-1] == "0": print "Injected thread hang recoverable error" else: if any("Kernel panic - not syncing" in line for line in l_res): l_msg = "Processor recovery failed: Kernel got panic" elif any("Petitboot" in line for line in l_res): l_msg = "System reached petitboot:Processor recovery failed" elif any("ISTEP" in line for line in l_res): l_msg = "System started booting: Processor recovery failed" else: l_msg = "Failed to inject thread hang recoverable error" print l_msg raise OpTestError(l_msg) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console("dmesg") if any("Processor Recovery done" in line for line in l_res) and any( "Harmless Hypervisor Maintenance interrupt [Recovered]" in line for line in l_res ): print "Processor recovery done" else: l_msg = "HMI handling failed to log message" raise OpTestError(l_msg) time.sleep(BMC_CONST.HMI_TEST_CASE_SLEEP_TIME) return BMC_CONST.FW_SUCCESS ## # @brief This function is used to test hmi malfunction alert:Core checkstop # A processor core in the system has to be checkstopped (failed recovery). # Injecting core checkstop on random core of random chip # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_malfunction_allert(self): # Get random pair of chip vs cores l_pair = random.choice(self.l_dic) # Get random chip id l_chip = l_pair[0] # Get random core number l_core = random.choice(l_pair[1]) l_reg = "1%s013100" % l_core l_cmd = "./putscom -c %s %s 1000000000000000" % (l_chip, l_reg) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(l_cmd) if any("Kernel panic - not syncing" in line for line in l_res): print "Malfunction alert: kernel got panic" elif any("login:"******"System booted to host OS without any kernel panic message" elif any("Petitboot" in line for line in l_res): print "System reached petitboot without any kernel panic message" elif any("ISTEP" in line for line in l_res): print "System started booting without any kernel panic message" else: l_msg = "HMI: Malfunction alert failed" raise OpTestError(l_msg) return BMC_CONST.FW_SUCCESS ## # @brief This function is used to test HMI: Hypervisor resource error # Injecting Hypervisor resource error on random core of random chip # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_hyp_resource_err(self): # Get random pair of chip vs cores l_pair = random.choice(self.l_dic) # Get random chip id l_chip = l_pair[0] # Get random core number l_core = random.choice(l_pair[1]) l_reg = "1%s013100" % l_core l_cmd = "./putscom -c %s %s 0000000000008000" % (l_chip, l_reg) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(l_cmd) if any("Kernel panic - not syncing" in line for line in l_res) and any( "Hypervisor Resource error - core check stop" in line for line in l_res ): print "Hypervisor resource error: kernel got panic" elif any("login:"******"System booted to host OS without any kernel panic message" elif any("Petitboot" in line for line in l_res): print "System reached petitboot without any kernel panic message" elif any("ISTEP" in line for line in l_res): print "System started booting without any kernel panic message" else: l_msg = "HMI: Hypervisor resource error failed" raise OpTestError(l_msg) return BMC_CONST.FW_SUCCESS
class OpTestIPMILockMode(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_lparIP The IP address of the LPAR # @param i_lparuser The userid to log into the LPAR # @param i_lparPasswd The password of the userid to log into the LPAR with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_lparip=None, i_lparuser=None, i_lparPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_lparip, i_lparuser, i_lparPasswd) self.cv_LPAR = OpTestLpar(i_lparip, i_lparuser, i_lparPasswd, i_bmcIP) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_lparip, i_lparuser, i_lparPasswd) self.util = OpTestUtil() ## # @brief This function will cover following test steps # 1. It will get the OS level installed on power platform # 2. It will check for kernel version installed on the Open Power Machine # 3. It will check for ipmitool command existence and ipmitool package # 4. Load the necessary ipmi modules based on config values # 5. Issue a ipmi lock command through out-of-band authenticated interface # 6. Now BMC IPMI is in locked mode, at this point only white listed # in-band ipmi commands sholud work(No other in-band ipmi command should work) # 7. Execute and test the functionality of whitelisted in-band ipmi # commands in locked mode # 8. At the end of test issue a ipmi unlock command to revert the availablity of all # in-band ipmi commands in unlocked mode. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def test_ipmi_lock_mode(self): # Get OS level l_oslevel = self.cv_LPAR.lpar_get_OS_Level() # Get kernel version l_kernel = self.cv_LPAR.lpar_get_kernel_version() # Checking for ipmitool command and lm_sensors package self.cv_LPAR.lpar_check_command("ipmitool") l_pkg = self.cv_LPAR.lpar_check_pkg_for_utility(l_oslevel, "ipmitool") print "Installed package: %s" % l_pkg # loading below ipmi modules based on config option # ipmi_devintf, ipmi_powernv and ipmi_masghandler self.cv_LPAR.lpar_load_module_based_on_config(l_kernel, BMC_CONST.CONFIG_IPMI_DEVICE_INTERFACE, BMC_CONST.IPMI_DEV_INTF) self.cv_LPAR.lpar_load_module_based_on_config(l_kernel, BMC_CONST.CONFIG_IPMI_POWERNV, BMC_CONST.IPMI_POWERNV) self.cv_LPAR.lpar_load_module_based_on_config(l_kernel, BMC_CONST.CONFIG_IPMI_HANDLER, BMC_CONST.IPMI_MSG_HANDLER) # Issue a ipmi lock command through authenticated interface print "Issuing ipmi lock command through authenticated interface" l_res = self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_LOCK_CMD) l_res = l_res.splitlines() if int(l_res[-1]): l_msg = "IPMI:Lock command failed, There may be two reasons here.\n\ a. check the corresponding parches available in AMI driver code,\n\ b. if patches available then command is failing" print l_msg raise OpTestError(l_msg) print "IPMI:Lock command executed successfully" try: self.run_inband_ipmi_whitelisted_cmds() except: l_msg = "One of white listed in-band ipmi command execution failed" print sys.exc_info() finally: # Issue a ipmi unlock command at the end of test. print "Issuing ipmi unlock command through authenticated interface" self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_UNLOCK_CMD) ## # @brief This function will execute whitelisted in-band ipmi commands # and test the functionality in locked mode. # # @return BMC_CONST.FW_SUCCESS or raise OpTestError # def run_inband_ipmi_whitelisted_cmds(self): l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_lpar_login(l_con) self.cv_IPMI.ipmi_lpar_set_unique_prompt(l_con) self.cv_IPMI.run_lpar_cmd_on_ipmi_console("uname -a") # Test IPMI white listed commands those should be allowed through un-authenticated # in-band interface # 1.[App] Get Device ID print "Testing Get Device ID command" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_DEVICE_ID) if l_res[-1] != "0": l_msg = "IPMI: Get Device ID command failed" raise OpTestError(l_msg) # 2.[App] Get Device GUID print "Testing Get Device GUID" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_DEVICE_GUID) if l_res[-1] != "0": l_msg = "IPMI: Get Device GUID command failed" raise OpTestError(l_msg) # 3.[App] Get System GUID print "Testing Get system GUID" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SYSTEM_GUID) if l_res[-1] != "0": l_msg = "IPMI: Get System GUID command failed" raise OpTestError(l_msg) # 4.[Storage] Get SEL info print "Testing Get SEL info" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SEL_INFO) if l_res[-1] != "0": l_msg = "IPMI: Get SEL info command failed" raise OpTestError(l_msg) # 5.[Storage] Get SEL time print "Testing Get SEL time" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SEL_TIME_RAW) if l_res[-1] != "0": l_msg = "IPMI: Get SEL time command failed" raise OpTestError(l_msg) # 6. [Storage] Reserve SEL print "Testing Reserve SEL" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_RESERVE_SEL) if l_res[-1] != "0": l_msg = "IPMI: Reserve SEL command failed" raise OpTestError(l_msg) # 7. [Storage] Set SEL time (required for RTC) print "Testing Set SEL time" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SEL_TIME) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_SET_SEL_TIME + " \'" + l_res[-1] + "\'; echo $?") if l_res[-1] != "0": l_msg = "IPMI: Set SEL time command failed" raise OpTestError(l_msg) self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SEL_TIME) # 8. [Transport] Get LAN parameters print "Testing Get LAN parameters" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_LAN_PARAMETERS) if l_res[-1] != "0": l_msg = "IPMI: Get LAN parameters command failed" raise OpTestError(l_msg) # 9.[Chassis] Get System Boot Options print "Testing Get System Boot Options" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SYSTEM_BOOT_OPTIONS) if l_res[-1] != "0": l_msg = "IPMI: Get System Boot Options command failed" raise OpTestError(l_msg) # 10.[Chassis] Set System Boot Options print "Testing Set System Boot Options" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_SET_SYTEM_BOOT_OPTIONS) if l_res[-1] != "0": l_msg = "IPMI: Set System Boot Options command failed" raise OpTestError(l_msg) self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SYSTEM_BOOT_OPTIONS) # 11. [App] Get BMC Global Enables print "Testing Get BMC Global Enables" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_BMC_GLOBAL_ENABLES_RAW) if l_res[-1] != "0": l_msg = "IPMI: Get BMC Global Enables command failed" raise OpTestError(l_msg) self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_BMC_GLOBAL_ENABLES) # 12. [App] Set BMC Global Enables print "Testing Set BMC Global Enables" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_SET_BMC_GLOBAL_ENABLES_SEL_OFF) if l_res[-1] != "0": l_msg = "IPMI: Set BMC Global Enables sel=off command failed" raise OpTestError(l_msg) self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_BMC_GLOBAL_ENABLES) self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_SET_BMC_GLOBAL_ENABLES_SEL_ON) # 13.[App] Get System Interface Capabilities print "Testing Get System Interface Capabilities" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SYSTEM_INTERFACE_CAPABILITIES_SSIF) if l_res[-1] != "0": l_msg = "IPMI: Get System Interface Capabilities SSIF command failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SYSTEM_INTERFACE_CAPABILITIES_KCS) if l_res[-1] != "0": l_msg = "IPMI: Get System Interface Capabilities KCS command failed" raise OpTestError(l_msg) # 14.[App] Get Message Flags print "Testing Get Message Flags" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_MESSAGE_FLAGS) if l_res[-1] != "0": l_msg = "IPMI: Get Message Flags command failed" raise OpTestError(l_msg) # 15. [App] Get BT Capabilities print "Testing Get BT Capabilities" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_BT_CAPABILITIES) if l_res[-1] != "0": l_msg = "IPMI: Get BT Capabilities command failed" raise OpTestError(l_msg) # 16. [App] Clear Message Flags print "Testing Clear Message Flags" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_CLEAR_MESSAGE_FLAGS) if l_res[-1] != "0": l_msg = "IPMI: Clear Message Flags command failed" raise OpTestError(l_msg) # 17. [OEM] PNOR Access Status print "Testing the PNOR Access Status" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_PNOR_ACCESS_STATUS_DENY) if l_res[-1] != "0": l_msg = "IPMI: PNOR Access Status:deny command failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_PNOR_ACCESS_STATUS_GRANT) if l_res[-1] != "0": l_msg = "IPMI: PNOR Access Status:grant command failed" raise OpTestError(l_msg) # 18. [Storage] Add SEL Entry print "Testing Add SEL Entry" print "Clearing the SEL list" self.cv_IPMI.ipmi_sdr_clear() l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_ADD_SEL_ENTRY) if l_res[-1] != "0": l_msg = "IPMI: Add SEL Entry command failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_LIST_LAST_SEL_EVENT) print "Checking for Reserved entry creation in SEL" if "Reserved" not in l_res: l_msg = "IPMI: Add SEL Entry command, doesn't create an SEL event" raise OpTestError(l_msg) # 19. [App] Set Power State print "Testing Set Power State" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_SET_ACPI_POWER_STATE) if l_res[-1] != "0": l_msg = "IPMI: Set Power State command failed" raise OpTestError(l_msg) # 20. [App] Set watchdog print "Testing Set watchdog" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_SET_WATCHDOG) if l_res[-1] != "0": l_msg = "IPMI: Set watchdog command failed" raise OpTestError(l_msg) self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_MC_WATCHDOG_GET) # 21. [Sensor/Event] Get Sensor Type print "Testing Get Sensor Type" l_res = self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_SDR_GET_WATCHDOG) matchObj = re.search( "Watchdog \((0x\d{1,})\)", l_res) if matchObj: print "Got sensor Id for watchdog: %s" % matchObj.group(1) else: l_msg = "Failed to get sensor id for watchdog sensor" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SENSOR_TYPE_FOR_WATCHDOG + " " + matchObj.group(1) + " ;echo $?") if l_res[-1] != "0": l_msg = "IPMI: Get Sensor Type command failed" raise OpTestError(l_msg) # 22.[Sensor/Event] Get Sensor Reading print "Testing Get Sensor Reading" l_res = self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_SDR_GET_WATCHDOG) matchObj = re.search( "Watchdog \((0x\d{1,})\)", l_res) if matchObj: print "Got sensor Id for watchdog: %s" % matchObj.group(1) else: l_msg = "Failed to get sensor id for watchdog sensor" raise OpTestError(l_msg) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_SENSOR_READING + " " + matchObj.group(1) + " ;echo $?") if l_res[-1] != "0": l_msg = "IPMI: Get Sensor Reading command failed" raise OpTestError(l_msg) # 23.[Sensor/Event] Platform Event (0x02) print "Testing Platform Event" self.cv_IPMI.ipmi_sdr_clear() l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_PLATFORM_EVENT) if l_res[-1] != "0": l_msg = "IPMI: Platform Event command failed" raise OpTestError(l_msg) l_res = self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_LIST_LAST_SEL_EVENT) if "Reserved" not in l_res: l_msg = "IPMI: Platform Event command failed to log SEL event" raise OpTestError(l_msg) # 24. [OEM] PNOR Access Response (0x08) print "Testing PNOR Access Response" self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_PNOR_ACCESS_STATUS_GRANT) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_PNOR_ACCESS_RESPONSE) if l_res[-1] != "0": l_msg = "IPMI: PNOR Access Response command failed" raise OpTestError(l_msg) self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_PNOR_ACCESS_STATUS_DENY) l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_PNOR_ACCESS_RESPONSE) if l_res[-1] != "0": l_msg = "IPMI: PNOR Access Response command failed" raise OpTestError(l_msg) # 25.[Chassis] Chassis Control print "Testing chassis power on" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_CHASSIS_POWER_ON) if l_res[-1] != "0": l_msg = "IPMI: chassis power on command failed" raise OpTestError(l_msg) # 26.[App] 0x38 Get Channel Authentication Cap print "Testing Get Channel Authentication Capabilities" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_CHANNEL_AUTH_CAP) if l_res[-1] != "0": l_msg = "IPMI: Get Channel Authentication Capabilities command failed" raise OpTestError(l_msg) # 27.[App] Reset Watchdog (0x22) print "Testing reset watchdog" self.cv_IPMI.ipmi_sdr_clear() l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_RESET_WATCHDOG) if l_res[-1] != "0": l_msg = "IPMI: Reset Watchdog command failed" raise OpTestError(l_msg) time.sleep(10) # Reset watchdog should create a SEL event log l_res = self.cv_IPMI.ipmitool_execute_command(BMC_CONST.IPMI_LIST_LAST_SEL_EVENT) if "Watchdog" not in l_res: l_msg = "IPMI: Reset Watchdog command, doesn't create an SEL event" raise OpTestError(l_msg) # 28. [App] Get ACPI Power State (0x06) print "Testing Get ACPI Power State" l_res = self.cv_IPMI.run_lpar_cmd_on_ipmi_console(BMC_CONST.LPAR_GET_ACPI_POWER_STATE) if l_res[-1] != "0": l_msg = "IPMI: Get ACPI Power State command failed" raise OpTestError(l_msg)
class OpTestPCI: ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__( self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None, i_hostLspci=None, ): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI( i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd ) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP, i_ffdcDir) self.cv_SYSTEM = OpTestSystem( i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd, ) self.util = OpTestUtil() self.lspci_file = i_hostLspci ## # @brief This function will get the PCI and USB susbsytem Info # And also this test compares known good data of # "lspci -mm -n" which is stored in testcases/data directory # with the current lspci data. # User need to specify the corresponding file name into # machines xml like lspci.txt which contains "lspci -mm -n" # command output in a working good state of system. # tools used are lspci and lsusb # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_host_pci_devices_info(self): if self.lspci_file == "empty.txt": print "Skipping the pci devices comparision as missing the lspci data file name in machines xml" return BMC_CONST.FW_SUCCESS filename = os.path.join(os.path.dirname(__file__).split("testcases")[0], self.lspci_file) if not os.path.isfile(filename): raise OpTestError("lspci file %s not found in top level directory" % filename) self.pci_good_data_file = filename self.test_skiroot_pci_devices() self.cv_IPMI.ipmi_set_boot_to_disk() self.cv_IPMI.ipmi_power_off() self.cv_IPMI.ipmi_power_on() self.cv_IPMI.ipl_wait_for_working_state() self.test_host_pci_devices() ## # @brief This function will get the "lspci -mm -n" output from the petitboot # and compares it with known good lspci data # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_skiroot_pci_devices(self): cmd = "lspci -mm -n" self.console = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_SYSTEM.sys_ipmi_boot_system_to_petitboot(self.console) self.cv_IPMI.ipmi_host_set_unique_prompt(self.console) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.cv_IPMI.run_host_cmd_on_ipmi_console("cat /etc/os-release") res = self.cv_IPMI.run_host_cmd_on_ipmi_console(cmd) self.cv_SYSTEM.sys_ipmi_close_console(self.console) self.pci_data_petitboot = "\n".join(res[1:]) diff_process = subprocess.Popen(["diff", "-u", self.pci_good_data_file, "-"], stdin=subprocess.PIPE) diff_stdout, diff_stderr = diff_process.communicate(self.pci_data_petitboot + "\n") r = diff_process.wait() if r == 0: print "All the pci devices are detected at petitboot" else: print diff_stdout raise OpTestError("There is a mismatch b/w known good output and tested petitboot lspci output") ## # @brief This function will get the "lspci -mm -n" output from the host OS # and compares it with known good lspci data # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_host_pci_devices(self): self.cv_HOST.host_check_command("lspci", "lsusb") self.cv_HOST.host_list_pci_devices() self.cv_HOST.host_get_pci_verbose_info() self.cv_HOST.host_list_usb_devices() l_res = self.cv_HOST.host_run_command("lspci -mm -n") self.pci_data_hostos = l_res.replace("\r\n", "\n") diff_process = subprocess.Popen(["diff", "-u", self.pci_good_data_file, "-"], stdin=subprocess.PIPE) diff_stdout, diff_stderr = diff_process.communicate(self.pci_data_hostos) r = diff_process.wait() if r == 0: print "All the pci devices are detected in host OS" else: print diff_stdout raise OpTestError("There is a mismatch b/w known good output and tested host OS lspci output")
class OpTestNVRAM(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() ## # @brief This function tests nvram partition access, print/update # the config data and dumping the partition's data. All # these operations are done on supported partitions in both # host OS and Petitboot. # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_nvram_configuration(self): # Execute these tests in host OS self.cv_SYSTEM.sys_bmc_power_on_validate_host() self.cv_HOST.host_run_command("uname -a") self.cv_HOST.host_run_command("cat /etc/os-release") self.cv_HOST.host_run_command("nvram -v") self.cv_HOST.host_run_command("nvram --print-config -p ibm,skiboot") self.cv_HOST.host_run_command("nvram --print-config -p common") self.cv_HOST.host_run_command("nvram --print-config -p lnx,oops-log") self.cv_HOST.host_run_command("nvram --print-config -p wwwwwwwwwwww") self.cv_HOST.host_run_command("nvram --print-vpd") self.cv_HOST.host_run_command("nvram --print-all-vpd") self.cv_HOST.host_run_command("nvram --print-err-log") self.cv_HOST.host_run_command("nvram --print-event-scan") self.cv_HOST.host_run_command("nvram --partitions") self.cv_HOST.host_run_command("nvram --dump common") self.cv_HOST.host_run_command("nvram --dump ibm,skiboot") self.cv_HOST.host_run_command("nvram --dump lnx,oops-log") self.cv_HOST.host_run_command("nvram --dump wwwwwwwwwwww") self.cv_HOST.host_run_command("nvram --ascii common") self.cv_HOST.host_run_command("nvram --ascii ibm,skiboot") self.cv_HOST.host_run_command("nvram --ascii lnx,oops-log") self.cv_HOST.host_run_command("nvram --ascii wwwwwwwwwwww") try: self.test_nvram_update_part_config_in_host("common") self.test_nvram_update_part_config_in_host("ibm,skiboot") self.test_nvram_update_part_config_in_host("lnx,oops-log") self.test_nvram_update_part_config_in_host("wwwwwwwwwwww") except OpTestError: print "There is a failure in updating one of NVRAM partitions" # Execute these tests in petitboot self.console = self.cv_SYSTEM.sys_get_ipmi_console() try: self.cv_SYSTEM.sys_ipmi_boot_system_to_petitboot(self.console) self.cv_IPMI.ipmi_host_set_unique_prompt(self.console) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.cv_IPMI.run_host_cmd_on_ipmi_console("cat /etc/os-release") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram -v") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --print-config -p ibm,skiboot") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --print-config -p common") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --print-config -p lnx,oops-log") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --print-config -p wwwwwwwwwwww") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-vpd") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-all-vpd") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-err-log") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --print-event-scan") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --partitions") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --dump common") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --dump ibm,skiboot") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --dump lnx,oops-log") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --dump wwwwwwwwwwww") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --ascii common") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --ascii ibm,skiboot") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --ascii lnx,oops-log") self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram --ascii wwwwwwwwwwww") try: self.test_nvram_update_part_config_in_petitboot("common") self.test_nvram_update_part_config_in_petitboot("ibm,skiboot") self.test_nvram_update_part_config_in_petitboot("lnx,oops-log") self.test_nvram_update_part_config_in_petitboot("wwwwwwwwwwww") except OpTestError: print "There is a failure in updating one of NVRAM partitions" except: self.cv_IPMI.ipmi_set_boot_to_disk() self.cv_IPMI.ipmi_set_boot_to_disk() ## # @brief This function tests nvram update/print config functions for partition i_part # these functions will be tested in host OS # # @param i_part @type string:partition to access i.e common, ibm,skiboot etc # # @return l_res @type list: output of command or raise OpTestError # def test_nvram_update_part_config_in_host(self, i_part): part = i_part self.cv_HOST.host_run_command( "nvram -p %s --update-config 'test-cfg=test-value'" % part) res = self.cv_HOST.host_run_command( "nvram -p %s --print-config=test-cfg" % part) if "test-value" in res: print "Update config to the partition %s works fine" % part else: msg = "failed to update nvram config into the partition %s" % part print msg raise OpTestError(msg) ## # @brief This function tests nvram update/print config functions for partition i_part # these functions will be tested in Petitboot. # # @param i_part @type string:partition to access i.e common, ibm,skiboot etc # # @return l_res @type list: output of command or raise OpTestError # def test_nvram_update_part_config_in_petitboot(self, i_part): part = i_part self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram -p %s --update-config 'test-cfg=test-value'" % part) res_list = self.cv_IPMI.run_host_cmd_on_ipmi_console( "nvram -p %s --print-config=test-cfg" % part) res = ''.join(res_list) if "test-value" in res: print "Update config to the partition %s works fine" % part else: msg = "failed to update nvram config into the partition %s" % part print msg raise OpTestError(msg)
class OpTestMCColdResetEffects(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP, i_ffdcDir) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() self.opTestSensors = OpTestSensors(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) ## # @brief This function will test BMC Cold reset vs Host FW status # 1. When system is in runtime issue BMC Cold reset. # 2. Check Host FW services and drivers. # 3. Run sensors command # 4. Get list of chips # 5. This is expected to fail. # https://github.com/open-power/op-build/issues/482 # 6. Reboot the system at the end of test. # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_bmc_cold_reset_effects(self): print "Test BMC Cold reset effects versus Host Firmware Status" self.cv_SYSTEM.sys_bmc_power_on_validate_host() print "Issue BMC Cold reset" result = True try: self.cv_SYSTEM.sys_cold_reset_bmc() l_dir = BMC_CONST.SKIBOOT_WORKING_DIR self.cv_HOST.host_clone_skiboot_source(l_dir) self.cv_HOST.host_compile_xscom_utilities(l_dir) l_con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_host_login(l_con) self.cv_IPMI.ipmi_host_set_unique_prompt(l_con) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.cv_IPMI.run_host_cmd_on_ipmi_console("cd %s/external/xscom-utils/; ./getscom -l" % l_dir) self.opTestSensors.test_hwmon_driver() self.cv_SYSTEM.sys_ipmi_close_console(l_con) except: result = False pass print "Gathering the OPAL msg logs" self.cv_HOST.host_gather_opal_msg_log() self.cv_IPMI.ipmi_power_off() self.cv_SYSTEM.sys_bmc_power_on_validate_host() if result is False: raise OpTestError("MC Cold reset vs Host FW Test failed")
class OpTestFastReboot(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() ## # @brief This function tests fast reset of power systems. # It will check booting sequence when reboot command # getting executed in both petitboot and host OS # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_opal_fast_reboot(self): self.cv_SYSTEM.sys_bmc_power_on_validate_host() self.cv_HOST.host_run_command(BMC_CONST.NVRAM_SET_FAST_RESET_MODE) res = self.cv_HOST.host_run_command(BMC_CONST.NVRAM_PRINT_FAST_RESET_VALUE) if "feeling-lucky" in res: print "Setting the fast-reset mode successful" else: raise OpTestError("Failed to set the fast-reset mode") self.con = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_IPMI.ipmi_host_login(self.con) self.cv_IPMI.ipmi_host_set_unique_prompt(self.con) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.cv_IPMI.ipmi_set_boot_to_petitboot() self.con.sendline("reboot") self.con.expect(" RESET: Initiating fast reboot", timeout=60) # Exiting to petitboot shell self.con.expect('Petitboot', timeout=BMC_CONST.PETITBOOT_TIMEOUT) self.con.expect('x=exit', timeout=10) # Exiting to petitboot self.con.sendcontrol('l') self.con.send('\x1b[B') self.con.send('\x1b[B') self.con.send('\r') self.con.expect('Exiting petitboot') self.con.send('\r') self.con.send('\x08') self.cv_IPMI.ipmi_host_set_unique_prompt(self.con) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.con.sendline("reboot") self.con.expect(" RESET: Initiating fast reboot", timeout=60) # Exiting to petitboot shell self.con.expect('Petitboot', timeout=BMC_CONST.PETITBOOT_TIMEOUT) self.con.expect('x=exit', timeout=10) print "fast-reset boots the system to runtime" self.cv_IPMI.ipmi_set_boot_to_disk() return BMC_CONST.FW_SUCCESS
class OpTestNVRAM(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() ## # @brief This function tests nvram partition access, print/update # the config data and dumping the partition's data. All # these operations are done on supported partitions in both # host OS and Petitboot. # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_nvram_configuration(self): # Execute these tests in host OS self.cv_SYSTEM.sys_bmc_power_on_validate_host() self.cv_HOST.host_run_command("uname -a") self.cv_HOST.host_run_command("cat /etc/os-release") self.cv_HOST.host_run_command("nvram -v") self.cv_HOST.host_run_command("nvram --print-config -p ibm,skiboot") self.cv_HOST.host_run_command("nvram --print-config -p common") self.cv_HOST.host_run_command("nvram --print-config -p lnx,oops-log") self.cv_HOST.host_run_command("nvram --print-config -p wwwwwwwwwwww") self.cv_HOST.host_run_command("nvram --print-vpd") self.cv_HOST.host_run_command("nvram --print-all-vpd") self.cv_HOST.host_run_command("nvram --print-err-log") self.cv_HOST.host_run_command("nvram --print-event-scan") self.cv_HOST.host_run_command("nvram --partitions") self.cv_HOST.host_run_command("nvram --dump common") self.cv_HOST.host_run_command("nvram --dump ibm,skiboot") self.cv_HOST.host_run_command("nvram --dump lnx,oops-log") self.cv_HOST.host_run_command("nvram --dump wwwwwwwwwwww") self.cv_HOST.host_run_command("nvram --ascii common") self.cv_HOST.host_run_command("nvram --ascii ibm,skiboot") self.cv_HOST.host_run_command("nvram --ascii lnx,oops-log") self.cv_HOST.host_run_command("nvram --ascii wwwwwwwwwwww") try: self.test_nvram_update_part_config_in_host("common") self.test_nvram_update_part_config_in_host("ibm,skiboot") self.test_nvram_update_part_config_in_host("lnx,oops-log") self.test_nvram_update_part_config_in_host("wwwwwwwwwwww") except OpTestError: print "There is a failure in updating one of NVRAM partitions" # Execute these tests in petitboot self.console = self.cv_SYSTEM.sys_get_ipmi_console() try: self.cv_SYSTEM.sys_ipmi_boot_system_to_petitboot(self.console) self.cv_IPMI.ipmi_host_set_unique_prompt(self.console) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.cv_IPMI.run_host_cmd_on_ipmi_console("cat /etc/os-release") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram -v") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-config -p ibm,skiboot") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-config -p common") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-config -p lnx,oops-log") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-config -p wwwwwwwwwwww") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-vpd") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-all-vpd") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-err-log") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --print-event-scan") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --partitions") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --dump common") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --dump ibm,skiboot") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --dump lnx,oops-log") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --dump wwwwwwwwwwww") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --ascii common") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --ascii ibm,skiboot") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --ascii lnx,oops-log") self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram --ascii wwwwwwwwwwww") try: self.test_nvram_update_part_config_in_petitboot("common") self.test_nvram_update_part_config_in_petitboot("ibm,skiboot") self.test_nvram_update_part_config_in_petitboot("lnx,oops-log") self.test_nvram_update_part_config_in_petitboot("wwwwwwwwwwww") except OpTestError: print "There is a failure in updating one of NVRAM partitions" except: self.cv_IPMI.ipmi_set_boot_to_disk() self.cv_IPMI.ipmi_set_boot_to_disk() ## # @brief This function tests nvram update/print config functions for partition i_part # these functions will be tested in host OS # # @param i_part @type string:partition to access i.e common, ibm,skiboot etc # # @return l_res @type list: output of command or raise OpTestError # def test_nvram_update_part_config_in_host(self, i_part): part = i_part self.cv_HOST.host_run_command("nvram -p %s --update-config 'test-cfg=test-value'" % part) res = self.cv_HOST.host_run_command("nvram -p %s --print-config=test-cfg" % part) if "test-value" in res: print "Update config to the partition %s works fine" % part else: msg = "failed to update nvram config into the partition %s" % part print msg raise OpTestError(msg) ## # @brief This function tests nvram update/print config functions for partition i_part # these functions will be tested in Petitboot. # # @param i_part @type string:partition to access i.e common, ibm,skiboot etc # # @return l_res @type list: output of command or raise OpTestError # def test_nvram_update_part_config_in_petitboot(self, i_part): part = i_part self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram -p %s --update-config 'test-cfg=test-value'" % part) res_list = self.cv_IPMI.run_host_cmd_on_ipmi_console("nvram -p %s --print-config=test-cfg" % part) res = ''.join(res_list) if "test-value" in res: print "Update config to the partition %s works fine" % part else: msg = "failed to update nvram config into the partition %s" % part print msg raise OpTestError(msg)
class OpTestPCI(): ## Initialize this object # @param i_bmcIP The IP address of the BMC # @param i_bmcUser The userid to log into the BMC with # @param i_bmcPasswd The password of the userid to log into the BMC with # @param i_bmcUserIpmi The userid to issue the BMC IPMI commands with # @param i_bmcPasswdIpmi The password of BMC IPMI userid # @param i_ffdcDir Optional param to indicate where to write FFDC # # "Only required for inband tests" else Default = None # @param i_hostIP The IP address of the HOST # @param i_hostuser The userid to log into the HOST # @param i_hostPasswd The password of the userid to log into the HOST with # def __init__(self, i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir=None, i_hostip=None, i_hostuser=None, i_hostPasswd=None, i_hostLspci=None): self.cv_BMC = OpTestBMC(i_bmcIP, i_bmcUser, i_bmcPasswd, i_ffdcDir) self.cv_IPMI = OpTestIPMI(i_bmcIP, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.cv_HOST = OpTestHost(i_hostip, i_hostuser, i_hostPasswd, i_bmcIP, i_ffdcDir) self.cv_SYSTEM = OpTestSystem(i_bmcIP, i_bmcUser, i_bmcPasswd, i_bmcUserIpmi, i_bmcPasswdIpmi, i_ffdcDir, i_hostip, i_hostuser, i_hostPasswd) self.util = OpTestUtil() self.lspci_file = i_hostLspci ## # @brief This function will get the PCI and USB susbsytem Info # And also this test compares known good data of # "lspci -mm -n" which is stored in testcases/data directory # with the current lspci data. # User need to specify the corresponding file name into # machines xml like lspci.txt which contains "lspci -mm -n" # command output in a working good state of system. # tools used are lspci and lsusb # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_host_pci_devices_info(self): if self.lspci_file == "empty.txt": print "Skipping the pci devices comparision as missing the lspci data file name in machines xml" return BMC_CONST.FW_SUCCESS filename = os.path.join( os.path.dirname(__file__).split('testcases')[0], self.lspci_file) if not os.path.isfile(filename): raise OpTestError( "lspci file %s not found in top level directory" % filename) self.pci_good_data_file = filename self.test_skiroot_pci_devices() self.cv_IPMI.ipmi_set_boot_to_disk() self.cv_IPMI.ipmi_power_off() self.cv_IPMI.ipmi_power_on() self.cv_IPMI.ipl_wait_for_working_state() self.test_host_pci_devices() ## # @brief This function will get the "lspci -mm -n" output from the petitboot # and compares it with known good lspci data # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_skiroot_pci_devices(self): cmd = "lspci -mm -n" self.console = self.cv_SYSTEM.sys_get_ipmi_console() self.cv_SYSTEM.sys_ipmi_boot_system_to_petitboot(self.console) self.cv_IPMI.ipmi_host_set_unique_prompt(self.console) self.cv_IPMI.run_host_cmd_on_ipmi_console("uname -a") self.cv_IPMI.run_host_cmd_on_ipmi_console("cat /etc/os-release") res = self.cv_IPMI.run_host_cmd_on_ipmi_console(cmd) self.cv_SYSTEM.sys_ipmi_close_console(self.console) self.pci_data_petitboot = '\n'.join(res[1:]) diff_process = subprocess.Popen( ['diff', "-u", self.pci_good_data_file, "-"], stdin=subprocess.PIPE) diff_stdout, diff_stderr = diff_process.communicate( self.pci_data_petitboot + '\n') r = diff_process.wait() if r == 0: print "All the pci devices are detected at petitboot" else: print diff_stdout raise OpTestError( "There is a mismatch b/w known good output and tested petitboot lspci output" ) ## # @brief This function will get the "lspci -mm -n" output from the host OS # and compares it with known good lspci data # # @return BMC_CONST.FW_SUCCESS or BMC_CONST.FW_FAILED # def test_host_pci_devices(self): self.cv_HOST.host_check_command("lspci", "lsusb") self.cv_HOST.host_list_pci_devices() self.cv_HOST.host_get_pci_verbose_info() self.cv_HOST.host_list_usb_devices() l_res = self.cv_HOST.host_run_command("lspci -mm -n") self.pci_data_hostos = l_res.replace("\r\n", "\n") diff_process = subprocess.Popen( ['diff', "-u", self.pci_good_data_file, "-"], stdin=subprocess.PIPE) diff_stdout, diff_stderr = diff_process.communicate( self.pci_data_hostos) r = diff_process.wait() if r == 0: print "All the pci devices are detected in host OS" else: print diff_stdout raise OpTestError( "There is a mismatch b/w known good output and tested host OS lspci output" )