summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Wood <michael.g.wood@intel.com>2016-04-06 17:46:41 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-04-06 23:00:10 +0100
commitc382f550c62437954205c7dd9c7e1891d5d03945 (patch)
treebdb923508d9ce9a48a83d6f0a3f92bdcc3e8b351
parent23d0a7f9664450a09c2610631b38590a09b33744 (diff)
downloadbitbake-contrib-c382f550c62437954205c7dd9c7e1891d5d03945.tar.gz
toaster: runbuilds Clean up runbuilds
- Organise the imports into logical groups - Fix 80 col wrapping - Remove catch all exceptions - Log to the toaster log - Use QuerySet functions such as .first() and Q() Signed-off-by: Michael Wood <michael.g.wood@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/toaster/bldcontrol/management/commands/runbuilds.py81
1 files changed, 52 insertions, 29 deletions
diff --git a/lib/toaster/bldcontrol/management/commands/runbuilds.py b/lib/toaster/bldcontrol/management/commands/runbuilds.py
index 4c1c6a742..27289be5f 100644
--- a/lib/toaster/bldcontrol/management/commands/runbuilds.py
+++ b/lib/toaster/bldcontrol/management/commands/runbuilds.py
@@ -2,18 +2,25 @@ from django.core.management.base import NoArgsCommand, CommandError
from django.db import transaction
from django.db.models import Q
+from bldcontrol.bbcontroller import getBuildEnvironmentController
+from bldcontrol.bbcontroller import ShellCmdException, BuildSetupException
+from bldcontrol.models import BuildRequest, BuildEnvironment
+from bldcontrol.models import BRError, BRVariable
+
from orm.models import Build, ToasterSetting, LogMessage, Target
-from bldcontrol.bbcontroller import getBuildEnvironmentController, ShellCmdException, BuildSetupException
-from bldcontrol.models import BuildRequest, BuildEnvironment, BRError, BRVariable
+
import os
import logging
import time
+import sys
+import traceback
-logger = logging.getLogger("ToasterScheduler")
+logger = logging.getLogger("toaster")
class Command(NoArgsCommand):
args = ""
- help = "Schedules and executes build requests as possible. Does not return (interrupt with Ctrl-C)"
+ help = "Schedules and executes build requests as possible."
+ "Does not return (interrupt with Ctrl-C)"
@transaction.atomic
@@ -25,21 +32,19 @@ class Command(NoArgsCommand):
@transaction.atomic
def _selectBuildRequest(self):
- br = BuildRequest.objects.filter(state = BuildRequest.REQ_QUEUED).order_by('pk')[0]
- br.state = BuildRequest.REQ_INPROGRESS
- br.save()
+ br = BuildRequest.objects.filter(state=BuildRequest.REQ_QUEUED).first()
return br
def schedule(self):
- import traceback
try:
- br = None
- try:
- # select the build environment and the request to build
- br = self._selectBuildRequest()
- except IndexError as e:
- #logger.debug("runbuilds: No build request")
+ # select the build environment and the request to build
+ br = self._selectBuildRequest()
+ if br:
+ br.state = BuildRequest.REQ_INPROGRESS
+ br.save()
+ else:
return
+
try:
bec = self._selectBuildEnvironment()
except IndexError as e:
@@ -49,15 +54,17 @@ class Command(NoArgsCommand):
logger.debug("runbuilds: No build env")
return
- logger.debug("runbuilds: starting build %s, environment %s" % (str(br).decode('utf-8'), bec.be))
+ logger.debug("runbuilds: starting build %s, environment %s" % \
+ (str(br).decode('utf-8'), bec.be))
# let the build request know where it is being executed
br.environment = bec.be
br.save()
# this triggers an async build
- bec.triggerBuild(br.brbitbake, br.brlayer_set.all(), br.brvariable_set.all(),
- br.brtarget_set.all(), "%d:%d" % (br.pk, bec.be.pk))
+ bec.triggerBuild(br.brbitbake, br.brlayer_set.all(),
+ br.brvariable_set.all(), br.brtarget_set.all(),
+ "%d:%d" % (br.pk, bec.be.pk))
except Exception as e:
logger.error("runbuilds: Error launching build %s" % e)
@@ -88,9 +95,6 @@ class Command(NoArgsCommand):
def cleanup(self):
from django.utils import timezone
from datetime import timedelta
- # update all Builds that failed to start
-
- for br in BuildRequest.objects.filter(state = BuildRequest.REQ_FAILED, build__outcome = Build.IN_PROGRESS):
# environments locked for more than 30 seconds
# they should be unlocked
BuildEnvironment.objects.filter(
@@ -102,22 +106,30 @@ class Command(NoArgsCommand):
).update(lock=BuildEnvironment.LOCK_FREE)
+ # update all Builds that were in progress and failed to start
+ for br in BuildRequest.objects.filter(
+ state=BuildRequest.REQ_FAILED,
+ build__outcome=Build.IN_PROGRESS):
# transpose the launch errors in ToasterExceptions
br.build.outcome = Build.FAILED
for brerror in br.brerror_set.all():
logger.debug("Saving error %s" % brerror)
- LogMessage.objects.create(build = br.build, level = LogMessage.EXCEPTION, message = brerror.errmsg)
+ LogMessage.objects.create(build=br.build,
+ level=LogMessage.EXCEPTION,
+ message=brerror.errmsg)
br.build.save()
- # we don't have a true build object here; hence, toasterui didn't have a change to release the BE lock
+ # we don't have a true build object here; hence, toasterui
+ # didn't have a change to release the BE lock
br.environment.lock = BuildEnvironment.LOCK_FREE
br.environment.save()
-
# update all BuildRequests without a build created
for br in BuildRequest.objects.filter(build = None):
- br.build = Build.objects.create(project = br.project, completed_on = br.updated, started_on = br.created)
+ br.build = Build.objects.create(project=br.project,
+ completed_on=br.updated,
+ started_on=br.created)
br.build.outcome = Build.FAILED
try:
br.build.machine = br.brvariable_set.get(name='MACHINE').value
@@ -126,13 +138,16 @@ class Command(NoArgsCommand):
br.save()
# transpose target information
for brtarget in br.brtarget_set.all():
- Target.objects.create(build=br.build, target=brtarget.target, task=brtarget.task)
+ Target.objects.create(build=br.build,
+ target=brtarget.target,
+ task=brtarget.task)
# transpose the launch errors in ToasterExceptions
for brerror in br.brerror_set.all():
- LogMessage.objects.create(build = br.build, level = LogMessage.EXCEPTION, message = brerror.errmsg)
+ LogMessage.objects.create(build=br.build,
+ level=LogMessage.EXCEPTION,
+ message=brerror.errmsg)
br.build.save()
- pass
# Make sure the LOCK is removed for builds which have been fully
# cancelled
@@ -148,9 +163,17 @@ class Command(NoArgsCommand):
while True:
try:
self.cleanup()
+ except Exception as e:
+ logger.warn("runbuilds: cleanup exception %s" % str(e))
+
+ try:
self.archive()
+ except Exception as e:
+ logger.warn("runbuilds: archive exception %s" % str(e))
+
+ try:
self.schedule()
- except:
- pass
+ except Exception as e:
+ logger.warn("runbuilds: schedule exception %s" % str(e))
time.sleep(1)