Get diff from last stable build, not just previous build
[akaros.git] / tools / jenkins / utils / wait_until.py
1 #!/usr/bin/python
2 """This script keeps running until one of the two following conditions occur:
3 1) A line in the file specified by argv[1] contains argv[2] => This will exit
4    with a result code of 0 and print SUCCESSS.
5 2) argv[3] seconds or more occur since invoking the script => This will exit
6    with a result code of 0 (because Jenkins would autokill the build if we
7    returned an error code) and print TIMEOUT.
8
9 Please note:
10     The timeout specified by argv[3] may be checked with a precision of up to 5
11     seconds, so it may be possible that the script runs for argv[3] + 5 secs (or
12     even a little bit more).
13 """
14 import sys
15 import time
16 import re
17
18
19 OUTPUT_FILE = sys.argv[1]
20 REGEX_END_LINE = r'^.*' + sys.argv[2] + '.*$'
21 MAX_TIME_TO_RUN = int(sys.argv[3])
22
23 def is_end_line(line) :
24         """Returns true if a given file contains the 'End line' string.
25         """
26
27         if re.match(REGEX_END_LINE, line) :
28                 return True
29         else :
30                 return False
31
32 def main() :
33         """Opens the OUTPUT_FILE and continuously reads lines from it until either
34         there are no more lines or the end line is reached. In the former case, it
35         waits an exponentially increasing time interval for more lines to be printed
36         onto the file.
37
38         If MAX_TIME_TO_RUN seconds are elapsed, then the script also terminates, 
39         with an error condition.
40         """
41         timeout_time = time.time() + MAX_TIME_TO_RUN
42
43         output_file = open(OUTPUT_FILE, 'r')
44
45         # Min and max waiting times (sec.) between reading two lines of the file.
46         MIN_READ_DELAY = 0.1
47         MAX_READ_DELAY = 5
48         READ_DELAY_INCREM_FACTOR = 1.5 # Times what the read delay is increased.
49
50         secs_before_read = 2
51         end_not_reached = True
52
53         while end_not_reached :
54                 line = output_file.readline()
55                 
56                 if (len(line) == 0) :
57                         time.sleep(secs_before_read)
58                         # Sleep with exponential backoff.
59                         secs_before_read = MAX_READ_DELAY \
60                                            if (secs_before_read > MAX_READ_DELAY) \
61                                            else secs_before_read * READ_DELAY_INCREM_FACTOR
62                 else :
63                         secs_before_read = MIN_READ_DELAY
64                         end_not_reached = not is_end_line(line)
65
66
67                 if (time.time() >= timeout_time) :
68                         print "TIMEOUT"
69                         exit(0)
70
71         print "SUCCESS"
72         exit(0)
73
74 main()