| #!/usr/bin/env python3 | 
 |  | 
 | 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 |