From 5ce4665f2624f29054891fe8128109d6102ca2f3 Mon Sep 17 00:00:00 2001 From: Michael Wood Date: Wed, 6 Apr 2016 17:46:41 +0100 Subject: 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 Signed-off-by: Richard Purdie --- .../bldcontrol/management/commands/runbuilds.py | 81 ++++++++++++++-------- 1 file changed, 52 insertions(+), 29 deletions(-) (limited to 'bitbake') diff --git a/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py b/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py index 4c1c6a7428..27289be5fd 100644 --- a/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py +++ b/bitbake/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) -- cgit v1.2.3-54-g00ecf