bitbake: toaster: update the bldcontrol to the new orm models

We update the build controller application to make proper
use of the bitbake specification in project settings.

Added heuristic to detect when the meta* layers and bitbake
are checked out from Yocto Project poky, and use a single
git checkout.

Building without a proper oe-init-build-env is not yet supported.

(Bitbake rev: 9eafe14956013f5af39b68fc93e1b03e7ea1f5c2)

Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexandru DAMIAN 2014-08-26 15:36:29 +01:00 committed by Richard Purdie
parent 95df54238b
commit ee250eb7e4
4 changed files with 158 additions and 12 deletions

View File

@ -25,7 +25,7 @@ import sys
import re import re
from django.db import transaction from django.db import transaction
from django.db.models import Q from django.db.models import Q
from bldcontrol.models import BuildEnvironment, BRLayer, BRVariable, BRTarget from bldcontrol.models import BuildEnvironment, BRLayer, BRVariable, BRTarget, BRBitbake
import subprocess import subprocess
from toastermain import settings from toastermain import settings
@ -123,8 +123,10 @@ class BuildEnvironmentController(object):
self.connection must be none. self.connection must be none.
""" """
def setLayers(self,ls): def setLayers(self, bbs, ls):
""" Sets the layer variables in the config file, after validating local layer paths. """ Checks-out bitbake executor and layers from git repositories.
Sets the layer variables in the config file, after validating local layer paths.
The bitbakes must be a 1-length list of BRBitbake
The layer paths must be in a list of BRLayer object The layer paths must be in a list of BRLayer object
a word of attention: by convention, the first layer for any build will be poky! a word of attention: by convention, the first layer for any build will be poky!
@ -230,15 +232,22 @@ class LocalhostBEController(BuildEnvironmentController):
self.be.save() self.be.save()
print "Stopped server" print "Stopped server"
def setLayers(self, layers): def setLayers(self, bitbakes, layers):
""" a word of attention: by convention, the first layer for any build will be poky! """ """ a word of attention: by convention, the first layer for any build will be poky! """
assert self.be.sourcedir is not None assert self.be.sourcedir is not None
assert len(bitbakes) == 1
# set layers in the layersource # set layers in the layersource
# 1. get a list of repos, and map dirpaths for each layer # 1. get a list of repos, and map dirpaths for each layer
gitrepos = {} gitrepos = {}
gitrepos[bitbakes[0].giturl] = []
gitrepos[bitbakes[0].giturl].append( ("bitbake", bitbakes[0].dirpath, bitbakes[0].commit) )
for layer in layers: for layer in layers:
# we don't process local URLs
if layer.giturl.startswith("file://"):
continue
if not layer.giturl in gitrepos: if not layer.giturl in gitrepos:
gitrepos[layer.giturl] = [] gitrepos[layer.giturl] = []
gitrepos[layer.giturl].append( (layer.name, layer.dirpath, layer.commit)) gitrepos[layer.giturl].append( (layer.name, layer.dirpath, layer.commit))
@ -250,7 +259,7 @@ class LocalhostBEController(BuildEnvironmentController):
def _getgitdirectoryname(url): def _getgitdirectoryname(url):
import re import re
components = re.split(r'[\.\/]', url) components = re.split(r'[:\.\/]', url)
return components[-2] if components[-1] == "git" else components[-1] return components[-2] if components[-1] == "git" else components[-1]
layerlist = [] layerlist = []
@ -258,7 +267,7 @@ class LocalhostBEController(BuildEnvironmentController):
# 2. checkout the repositories # 2. checkout the repositories
for giturl in gitrepos.keys(): for giturl in gitrepos.keys():
localdirname = os.path.join(self.be.sourcedir, _getgitdirectoryname(giturl)) localdirname = os.path.join(self.be.sourcedir, _getgitdirectoryname(giturl))
print "DEBUG: giturl checking out in current directory", localdirname print "DEBUG: giturl ", giturl ,"checking out in current directory", localdirname
# make sure our directory is a git repository # make sure our directory is a git repository
if os.path.exists(localdirname): if os.path.exists(localdirname):
@ -268,11 +277,14 @@ class LocalhostBEController(BuildEnvironmentController):
self._shellcmd("git clone \"%s\" \"%s\"" % (giturl, localdirname)) self._shellcmd("git clone \"%s\" \"%s\"" % (giturl, localdirname))
# checkout the needed commit # checkout the needed commit
commit = gitrepos[giturl][0][2] commit = gitrepos[giturl][0][2]
self._shellcmd("git fetch --all && git checkout \"%s\"" % commit , localdirname)
print "DEBUG: checked out commit ", commit, "to", localdirname
# if this is the first checkout, take the localdirname as poky dir # branch magic name "HEAD" will inhibit checkout
if self.pokydirname is None: if commit != "HEAD":
print "DEBUG: checking out commit ", commit, "to", localdirname
self._shellcmd("git fetch --all && git checkout \"%s\"" % commit , localdirname)
# take the localdirname as poky dir if we can find the oe-init-build-env
if self.pokydirname is None and os.path.exists(os.path.join(localdirname, "oe-init-build-env")):
print "DEBUG: selected poky dir name", localdirname print "DEBUG: selected poky dir name", localdirname
self.pokydirname = localdirname self.pokydirname = localdirname
@ -282,6 +294,7 @@ class LocalhostBEController(BuildEnvironmentController):
if not os.path.exists(localdirpath): if not os.path.exists(localdirpath):
raise BuildSetupException("Cannot find layer git path '%s' in checked out repository '%s:%s'. Aborting." % (localdirpath, giturl, commit)) raise BuildSetupException("Cannot find layer git path '%s' in checked out repository '%s:%s'. Aborting." % (localdirpath, giturl, commit))
if name != "bitbake":
layerlist.append(localdirpath) layerlist.append(localdirpath)
print "DEBUG: current layer list ", layerlist print "DEBUG: current layer list ", layerlist

View File

@ -43,7 +43,7 @@ class Command(NoArgsCommand):
# set up the buid environment with the needed layers # set up the buid environment with the needed layers
print "Build %s, Environment %s" % (br, bec.be) print "Build %s, Environment %s" % (br, bec.be)
bec.setLayers(br.brlayer_set.all()) bec.setLayers(br.brbitbake_set.all(), br.brlayer_set.all())
# get the bb server running # get the bb server running
bbctrl = bec.getBBController() bbctrl = bec.getBBController()

View File

@ -0,0 +1,128 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'BRBitbake'
db.create_table(u'bldcontrol_brbitbake', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('req', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['bldcontrol.BuildRequest'], unique=True)),
('giturl', self.gf('django.db.models.fields.CharField')(max_length=254)),
('commit', self.gf('django.db.models.fields.CharField')(max_length=254)),
('dirpath', self.gf('django.db.models.fields.CharField')(max_length=254)),
))
db.send_create_signal(u'bldcontrol', ['BRBitbake'])
def backwards(self, orm):
# Deleting model 'BRBitbake'
db.delete_table(u'bldcontrol_brbitbake')
models = {
u'bldcontrol.brbitbake': {
'Meta': {'object_name': 'BRBitbake'},
'commit': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
'giturl': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']", 'unique': 'True'})
},
u'bldcontrol.brerror': {
'Meta': {'object_name': 'BRError'},
'errmsg': ('django.db.models.fields.TextField', [], {}),
'errtype': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']"}),
'traceback': ('django.db.models.fields.TextField', [], {})
},
u'bldcontrol.brlayer': {
'Meta': {'object_name': 'BRLayer'},
'commit': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
'giturl': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']"})
},
u'bldcontrol.brtarget': {
'Meta': {'object_name': 'BRTarget'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']"}),
'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'task': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
},
u'bldcontrol.brvariable': {
'Meta': {'object_name': 'BRVariable'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']"}),
'value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
u'bldcontrol.buildenvironment': {
'Meta': {'object_name': 'BuildEnvironment'},
'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
'bbaddress': ('django.db.models.fields.CharField', [], {'max_length': '254', 'blank': 'True'}),
'bbport': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
'bbstate': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'bbtoken': ('django.db.models.fields.CharField', [], {'max_length': '126', 'blank': 'True'}),
'betype': ('django.db.models.fields.IntegerField', [], {}),
'builddir': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'lock': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'sourcedir': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
},
u'bldcontrol.buildrequest': {
'Meta': {'object_name': 'BuildRequest'},
'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']", 'null': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
'state': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
},
u'orm.bitbakeversion': {
'Meta': {'object_name': 'BitbakeVersion'},
'branch': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'giturl': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
},
u'orm.build': {
'Meta': {'object_name': 'Build'},
'bitbake_version': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
'build_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'completed_on': ('django.db.models.fields.DateTimeField', [], {}),
'cooker_log_path': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
'distro': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'distro_version': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'errors_no': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'machine': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'outcome': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']", 'null': 'True'}),
'started_on': ('django.db.models.fields.DateTimeField', [], {}),
'timespent': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'warnings_no': ('django.db.models.fields.IntegerField', [], {'default': '0'})
},
u'orm.project': {
'Meta': {'object_name': 'Project'},
'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'user_id': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
}
}
complete_apps = ['bldcontrol']

View File

@ -75,6 +75,11 @@ class BRLayer(models.Model):
commit = models.CharField(max_length = 254) commit = models.CharField(max_length = 254)
dirpath = models.CharField(max_length = 254) dirpath = models.CharField(max_length = 254)
class BRBitbake(models.Model):
req = models.ForeignKey(BuildRequest, unique = True) # only one bitbake for a request
giturl = models.CharField(max_length =254)
commit = models.CharField(max_length = 254)
dirpath = models.CharField(max_length = 254)
class BRVariable(models.Model): class BRVariable(models.Model):
req = models.ForeignKey(BuildRequest) req = models.ForeignKey(BuildRequest)