1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-08 05:09:24 +00:00

bitbake: 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()

(Bitbake rev: c382f550c62437954205c7dd9c7e1891d5d03945)

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Michael Wood
2016-04-06 17:46:41 +01:00
committed by Richard Purdie
parent 55b6fabd75
commit 5ce4665f26
@@ -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)