Make timeout value apply to entire job

Rather than have the job timeout apply to each of the three run steps
(pre, run, and post) individualy convert the timeout to a cummulative
timeout that applies across all three steps. This is more intuitive to
users and allows us to continue to have long job timeouts without
multiplying their effect when things go wrong.

Change-Id: I8f46736e578c8ea3e9f2fba25f53ab47715101af
This commit is contained in:
Clark Boylan 2018-02-06 15:00:55 -08:00
parent c65f4014a1
commit b124455697
1 changed files with 17 additions and 3 deletions

View File

@ -835,6 +835,13 @@ class AnsibleJob(object):
repo.checkout(selected_ref)
return selected_ref
def getAnsibleTimeout(self, start, timeout):
if timeout is not None:
now = time.time()
elapsed = now - start
timeout = timeout - elapsed
return timeout
def runPlaybooks(self, args):
result = None
@ -852,10 +859,15 @@ class AnsibleJob(object):
pre_failed = False
success = False
self.started = True
time_started = time.time()
# timeout value is total job timeout or put another way
# the cummulative time that pre, run, and post can consume.
job_timeout = args['timeout']
for index, playbook in enumerate(self.jobdir.pre_playbooks):
# TODOv3(pabelanger): Implement pre-run timeout setting.
ansible_timeout = self.getAnsibleTimeout(time_started, job_timeout)
pre_status, pre_code = self.runAnsiblePlaybook(
playbook, args['timeout'], phase='pre', index=index)
playbook, ansible_timeout, phase='pre', index=index)
if pre_status != self.RESULT_NORMAL or pre_code != 0:
# These should really never fail, so return None and have
# zuul try again
@ -863,8 +875,9 @@ class AnsibleJob(object):
break
if not pre_failed:
ansible_timeout = self.getAnsibleTimeout(time_started, job_timeout)
job_status, job_code = self.runAnsiblePlaybook(
self.jobdir.playbook, args['timeout'], phase='run')
self.jobdir.playbook, ansible_timeout, phase='run')
if job_status == self.RESULT_ABORTED:
return 'ABORTED'
elif job_status == self.RESULT_TIMED_OUT:
@ -885,8 +898,9 @@ class AnsibleJob(object):
for index, playbook in enumerate(self.jobdir.post_playbooks):
# TODOv3(pabelanger): Implement post-run timeout setting.
ansible_timeout = self.getAnsibleTimeout(time_started, job_timeout)
post_status, post_code = self.runAnsiblePlaybook(
playbook, args['timeout'], success, phase='post', index=index)
playbook, ansible_timeout, success, phase='post', index=index)
if post_status == self.RESULT_ABORTED:
return 'ABORTED'
if post_status != self.RESULT_NORMAL or post_code != 0: