| #!/usr/bin/env python |
| |
| r""" |
| This module contains keyword functions to supplement robot's built in |
| functions and use in test where generic robot keywords don't support. |
| """ |
| |
| try: |
| from robot.libraries.BuiltIn import BuiltIn |
| from robot.libraries import DateTime |
| except ImportError: |
| pass |
| import time |
| import os |
| |
| |
| def run_until_keyword_fails(retry, |
| retry_interval, |
| name, |
| *args): |
| r""" |
| Execute a robot keyword repeatedly until it either fails or the timeout |
| value is exceeded. |
| Note: Opposite of robot keyword "Wait Until Keyword Succeeds". |
| |
| Description of argument(s): |
| retry Max timeout time in hour(s). |
| retry_interval Time interval in minute(s) for looping. |
| name Robot keyword to execute. |
| args Robot keyword arguments. |
| """ |
| |
| # Convert the retry time in seconds |
| retry_seconds = DateTime.convert_time(retry) |
| timeout = time.time() + int(retry_seconds) |
| |
| # Convert the interval time in seconds |
| interval_seconds = DateTime.convert_time(retry_interval) |
| interval = int(interval_seconds) |
| |
| BuiltIn().log(timeout) |
| BuiltIn().log(interval) |
| |
| while True: |
| status = BuiltIn().run_keyword_and_return_status(name, *args) |
| |
| # Return if keywords returns as failure. |
| if status is False: |
| BuiltIn().log("Failed as expected") |
| return False |
| # Return if retry timeout as success. |
| elif time.time() > timeout > 0: |
| BuiltIn().log("Max retry timeout") |
| return True |
| time.sleep(interval) |
| BuiltIn().log(time.time()) |
| |
| return True |
| |
| |
| def htx_error_log_to_list(htx_error_log_output): |
| r""" |
| Parse htx error log output string and return list of strings in the form |
| "<field name>:<field value>". |
| The output of this function may be passed to the build_error_dict function. |
| |
| Description of argument(s): |
| htx_error_log_output Error entry string containing the stdout |
| generated by "htxcmdline -geterrlog". |
| |
| Example of htx_error_log_output contents: |
| |
| ######################## Result Starts Here ############################### |
| Currently running ECG/MDT : /usr/lpp/htx/mdt/mdt.whit |
| =========================== |
| --------------------------------------------------------------------- |
| Device id:/dev/nvidia0 |
| Timestamp:Mar 29 19:41:54 2017 |
| err=00000027 |
| sev=1 |
| Exerciser Name:hxenvidia |
| Serial No:Not Available |
| Part No:Not Available |
| Location:Not Available |
| FRU Number:Not Available |
| Device:Not Available |
| Error Text:cudaEventSynchronize for stopEvent returned err = 0039 from file |
| , line 430. |
| --------------------------------------------------------------------- |
| --------------------------------------------------------------------- |
| Device id:/dev/nvidia0 |
| Timestamp:Mar 29 19:41:54 2017 |
| err=00000027 |
| sev=1 |
| Exerciser Name:hxenvidia |
| Serial No:Not Available |
| Part No:Not Available |
| Location:Not Available |
| FRU Number:Not Available |
| Device:Not Available |
| Error Text:Hardware Exerciser stopped on error |
| --------------------------------------------------------------------- |
| ######################### Result Ends Here ################################ |
| |
| Example output: |
| Returns the lists of error string per entry |
| ['Device id:/dev/nvidia0', |
| 'Timestamp:Mar 29 19:41:54 2017', |
| 'err=00000027', |
| 'sev=1', |
| 'Exerciser Name:hxenvidia', |
| 'Serial No:Not Available', |
| 'Part No:Not Available', |
| 'Location:Not Available', |
| 'FRU Number:Not Available', |
| 'Device:Not Available', |
| 'Error Text:cudaEventSynchronize for stopEvent returned err = 0039 |
| from file , line 430.'] |
| """ |
| |
| # List which will hold all the list of entries. |
| error_list = [] |
| |
| temp_error_list = [] |
| parse_walk = False |
| |
| for line in htx_error_log_output.splitlines(): |
| # Skip lines starting with "#" |
| if line.startswith("#"): |
| continue |
| |
| # Mark line starting with "-" and set parse flag. |
| if line.startswith("-") and parse_walk is False: |
| parse_walk = True |
| continue |
| # Mark line starting with "-" and reset parse flag. |
| # Set temp error list to EMPTY. |
| elif line.startswith("-"): |
| error_list.append(temp_error_list) |
| parse_walk = False |
| temp_error_list = [] |
| # Add entry to list if line is not empty |
| elif parse_walk: |
| temp_error_list.append(str(line)) |
| |
| return error_list |
| |
| |
| def build_error_dict(htx_error_log_output): |
| r""" |
| Builds error list into a list of dictionary entries. |
| |
| Description of argument(s): |
| error_list Error list entries. |
| |
| Example output dictionary: |
| { |
| 0: |
| { |
| 'sev': '1', |
| 'err': '00000027', |
| 'Timestamp': 'Mar 29 19:41:54 2017', |
| 'Part No': 'Not Available', |
| 'Serial No': 'Not Available', |
| 'Device': 'Not Available', |
| 'FRU Number': 'Not Available', |
| 'Location': 'Not Available', |
| 'Device id': '/dev/nvidia0', |
| 'Error Text': 'cudaEventSynchronize for stopEvent returned err = 0039 |
| from file , line 430.', |
| 'Exerciser Name': 'hxenvidia' |
| }, |
| 1: |
| { |
| 'sev': '1', |
| 'err': '00000027', |
| 'Timestamp': 'Mar 29 19:41:54 2017', |
| 'Part No': 'Not Available', |
| 'Serial No': 'Not Available', |
| 'Device': 'Not Available', |
| 'FRU Number': 'Not Available', |
| 'Location': 'Not Available', |
| 'Device id': '/dev/nvidia0', |
| 'Error Text': 'Hardware Exerciser stopped on error', |
| 'Exerciser Name': 'hxenvidia' |
| } |
| }, |
| |
| """ |
| |
| # List which will hold all the list of entries. |
| error_list = [] |
| error_list = htx_error_log_to_list(htx_error_log_output) |
| |
| # dictionary which holds the error dictionry entry. |
| error_dict = {} |
| |
| temp_error_dict = {} |
| error_index = 0 |
| |
| # Loop through the error list. |
| for entry_list in error_list: |
| # Loop through the first error list entry. |
| for entry in entry_list: |
| # Split string into list for key value update. |
| # Example: 'Device id:/dev/nvidia0' |
| # Example: 'err=00000027' |
| parm_split = re.split("[:=]", entry) |
| # Populate temp dictionary with key value pair data. |
| temp_error_dict[str(parm_split[0])] = parm_split[1] |
| |
| # Update the master dictionary per entry index. |
| error_dict[error_index] = temp_error_dict |
| # Reset temp dict to EMPTY and increment index count. |
| temp_error_dict = {} |
| error_index += 1 |
| |
| return error_dict |