| #!/usr/bin/python |
| """This script keeps running until one of the two following conditions occur: |
| 1) A line in the file specified by argv[1] contains argv[2] => This will exit |
| with a result code of 0 and print SUCCESSS. |
| 2) argv[3] seconds or more occur since invoking the script => This will exit |
| with a result code of 0 (because Jenkins would autokill the build if we |
| returned an error code) and print TIMEOUT. |
| |
| Please note: |
| The timeout specified by argv[3] may be checked with a precision of up to 5 |
| seconds, so it may be possible that the script runs for argv[3] + 5 secs (or |
| even a little bit more). |
| """ |
| import sys |
| import time |
| import re |
| |
| |
| OUTPUT_FILE = sys.argv[1] |
| REGEX_END_LINE = r'^.*' + sys.argv[2] + '.*$' |
| MAX_TIME_TO_RUN = int(sys.argv[3]) |
| |
| def is_end_line(line) : |
| """Returns true if a given file contains the 'End line' string. |
| """ |
| |
| if re.match(REGEX_END_LINE, line) : |
| return True |
| else : |
| return False |
| |
| def main() : |
| """Opens the OUTPUT_FILE and continuously reads lines from it until either |
| there are no more lines or the end line is reached. In the former case, it |
| waits an exponentially increasing time interval for more lines to be printed |
| onto the file. |
| |
| If MAX_TIME_TO_RUN seconds are elapsed, then the script also terminates, |
| with an error condition. |
| """ |
| timeout_time = time.time() + MAX_TIME_TO_RUN |
| |
| output_file = open(OUTPUT_FILE, 'r') |
| |
| # Min and max waiting times (sec.) between reading two lines of the file. |
| MIN_READ_DELAY = 0.1 |
| MAX_READ_DELAY = 5 |
| READ_DELAY_INCREM_FACTOR = 1.5 # Times what the read delay is increased. |
| |
| secs_before_read = 2 |
| end_not_reached = True |
| |
| while end_not_reached : |
| line = output_file.readline() |
| |
| if (len(line) == 0) : |
| time.sleep(secs_before_read) |
| # Sleep with exponential backoff. |
| secs_before_read = MAX_READ_DELAY \ |
| if (secs_before_read > MAX_READ_DELAY) \ |
| else secs_before_read * READ_DELAY_INCREM_FACTOR |
| else : |
| secs_before_read = MIN_READ_DELAY |
| end_not_reached = not is_end_line(line) |
| |
| |
| if (time.time() >= timeout_time) : |
| print "TIMEOUT" |
| exit(0) |
| |
| print "SUCCESS" |
| exit(0) |
| |
| main() |