Skip to content

Commit 451bed4

Browse files
committed
Move downtime calculations to their own file
1 parent b0719e1 commit 451bed4

2 files changed

Lines changed: 50 additions & 45 deletions

File tree

master/custom/worker_downtime.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from datetime import datetime, timedelta
2+
3+
4+
def no_builds_between(start, end, *, day_of_week=None, tz=None):
5+
"""A function for "builder.canStartBuild" that implements planned downtime
6+
7+
Avoid a build to be started between start and end time and delay such
8+
builds until end time.
9+
"""
10+
11+
start = datetime.strptime(start, "%H:%M").time()
12+
end = datetime.strptime(end, "%H:%M").time()
13+
def canStartBuild(builder, wfb, request):
14+
now_dt = datetime.now(tz=tz)
15+
if day_of_week is not None and now_dt.weekday() != day_of_week:
16+
return True
17+
now = now_dt.time()
18+
if is_within_time_range(now, start, end):
19+
delay = get_delay(now, end)
20+
# Adapted from: https://docs.buildbot.net/current/manual/customization.html#canstartbuild-functions
21+
wfb.worker.quarantine_timeout = delay
22+
wfb.worker.putInQuarantine()
23+
# This does not take the worker out of quarantine, it only resets
24+
# the timeout value to default (restarting the default
25+
# exponential backoff)
26+
wfb.worker.resetQuarantine()
27+
return False
28+
# Schedule the build now
29+
return True
30+
return canStartBuild
31+
32+
def is_within_time_range(now, start, end):
33+
if start <= end:
34+
return start <= now <= end
35+
else:
36+
return now >= start or now <= end
37+
38+
39+
def get_delay(now, end):
40+
today = datetime.today()
41+
now = datetime.combine(today, now)
42+
end = datetime.combine(today, end)
43+
44+
if now > end:
45+
end += timedelta(days=1)
46+
47+
difference = end - now
48+
return difference.total_seconds()

master/master.cfg

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import os
1414
import subprocess
1515
import sys
1616

17-
from datetime import datetime, timedelta
17+
from datetime import timedelta
1818
from functools import partial
1919
from zoneinfo import ZoneInfo
2020

@@ -52,6 +52,7 @@ from custom.builders import ( # noqa: E402
5252
STABLE,
5353
ONLY_MAIN_BRANCH,
5454
)
55+
from custom.worker_downtime import no_builds_between
5556

5657

5758
def set_up_sentry():
@@ -194,50 +195,6 @@ def is_important_change(change):
194195
return any(is_important_file(filename) for filename in change.files)
195196

196197

197-
def is_within_time_range(now, start, end):
198-
if start <= end:
199-
return start <= now <= end
200-
else:
201-
return now >= start or now <= end
202-
203-
204-
def get_delay(now, end):
205-
today = datetime.today()
206-
now = datetime.combine(today, now)
207-
end = datetime.combine(today, end)
208-
209-
if now > end:
210-
end += timedelta(days=1)
211-
212-
difference = end - now
213-
return difference.total_seconds()
214-
215-
216-
# Avoid a build to be started between start and end time and delay such build
217-
# at end time
218-
def no_builds_between(start, end, *, day_of_week=None, tz=None):
219-
start = datetime.strptime(start, "%H:%M").time()
220-
end = datetime.strptime(end, "%H:%M").time()
221-
def canStartBuild(builder, wfb, request):
222-
now_dt = datetime.now(tz=tz)
223-
if day_of_week is not None and now_dt.weekday() != day_of_week:
224-
return True
225-
now = now_dt.time()
226-
if is_within_time_range(now, start, end):
227-
delay = get_delay(now, end)
228-
# Adapted from: https://docs.buildbot.net/current/manual/customization.html#canstartbuild-functions
229-
wfb.worker.quarantine_timeout = delay
230-
wfb.worker.putInQuarantine()
231-
# This does not take the worker out of quarantine, it only resets
232-
# the timeout value to default (restarting the default
233-
# exponential backoff)
234-
wfb.worker.resetQuarantine()
235-
return False
236-
# Schedule the build now
237-
return True
238-
return canStartBuild
239-
240-
241198
github_status_builders = []
242199
release_status_builders = []
243200
mail_status_builders = []

0 commit comments

Comments
 (0)