bitbake: toaster: update database schema
This patch updates the database schema to resolve a number of issues discovered while implementing the UI interface. We do not expect that all the data will come in valid at this point. [YOCTO #5453] [YOCTO #5833] [YOCTO #5836] [YOCTO #5811] [YOCTO #5812] [YOCTO #5820] (Bitbake rev: f8ad96d10a095e21fd2ce424c45e17f54642fb54) Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
0bad725381
commit
24f0617e25
|
@ -44,7 +44,6 @@ class ORMWrapper(object):
|
||||||
|
|
||||||
def create_build_object(self, build_info):
|
def create_build_object(self, build_info):
|
||||||
assert 'machine' in build_info
|
assert 'machine' in build_info
|
||||||
assert 'image_fstypes' in build_info
|
|
||||||
assert 'distro' in build_info
|
assert 'distro' in build_info
|
||||||
assert 'distro_version' in build_info
|
assert 'distro_version' in build_info
|
||||||
assert 'started_on' in build_info
|
assert 'started_on' in build_info
|
||||||
|
@ -54,7 +53,6 @@ class ORMWrapper(object):
|
||||||
|
|
||||||
build = Build.objects.create(
|
build = Build.objects.create(
|
||||||
machine=build_info['machine'],
|
machine=build_info['machine'],
|
||||||
image_fstypes=build_info['image_fstypes'],
|
|
||||||
distro=build_info['distro'],
|
distro=build_info['distro'],
|
||||||
distro_version=build_info['distro_version'],
|
distro_version=build_info['distro_version'],
|
||||||
started_on=build_info['started_on'],
|
started_on=build_info['started_on'],
|
||||||
|
@ -74,8 +72,7 @@ class ORMWrapper(object):
|
||||||
tgt_object = Target.objects.create( build = target_info['build'],
|
tgt_object = Target.objects.create( build = target_info['build'],
|
||||||
target = tgt_name,
|
target = tgt_name,
|
||||||
is_image = False,
|
is_image = False,
|
||||||
file_name = "",
|
);
|
||||||
file_size = 0);
|
|
||||||
targets.append(tgt_object)
|
targets.append(tgt_object)
|
||||||
return targets
|
return targets
|
||||||
|
|
||||||
|
@ -375,7 +372,6 @@ class BuildInfoHelper(object):
|
||||||
build_info['distro_version'] = self.server.runCommand(["getVariable", "DISTRO_VERSION"])[0]
|
build_info['distro_version'] = self.server.runCommand(["getVariable", "DISTRO_VERSION"])[0]
|
||||||
build_info['started_on'] = datetime.datetime.now()
|
build_info['started_on'] = datetime.datetime.now()
|
||||||
build_info['completed_on'] = datetime.datetime.now()
|
build_info['completed_on'] = datetime.datetime.now()
|
||||||
build_info['image_fstypes'] = self._remove_redundant(self.server.runCommand(["getVariable", "IMAGE_FSTYPES"])[0] or "")
|
|
||||||
build_info['cooker_log_path'] = self.server.runCommand(["getVariable", "BB_CONSOLELOG"])[0]
|
build_info['cooker_log_path'] = self.server.runCommand(["getVariable", "BB_CONSOLELOG"])[0]
|
||||||
build_info['build_name'] = self.server.runCommand(["getVariable", "BUILDNAME"])[0]
|
build_info['build_name'] = self.server.runCommand(["getVariable", "BUILDNAME"])[0]
|
||||||
build_info['bitbake_version'] = self.server.runCommand(["getVariable", "BB_VERSION"])[0]
|
build_info['bitbake_version'] = self.server.runCommand(["getVariable", "BB_VERSION"])[0]
|
||||||
|
@ -633,7 +629,6 @@ class BuildInfoHelper(object):
|
||||||
recipe_info['license'] = event._depgraph['pn'][pn]['license']
|
recipe_info['license'] = event._depgraph['pn'][pn]['license']
|
||||||
recipe_info['description'] = event._depgraph['pn'][pn]['description']
|
recipe_info['description'] = event._depgraph['pn'][pn]['description']
|
||||||
recipe_info['section'] = event._depgraph['pn'][pn]['section']
|
recipe_info['section'] = event._depgraph['pn'][pn]['section']
|
||||||
recipe_info['licensing_info'] = 'Not Available'
|
|
||||||
recipe_info['homepage'] = event._depgraph['pn'][pn]['homepage']
|
recipe_info['homepage'] = event._depgraph['pn'][pn]['homepage']
|
||||||
recipe_info['bugtracker'] = event._depgraph['pn'][pn]['bugtracker']
|
recipe_info['bugtracker'] = event._depgraph['pn'][pn]['bugtracker']
|
||||||
recipe_info['file_path'] = file_name
|
recipe_info['file_path'] = file_name
|
||||||
|
@ -728,7 +723,6 @@ class BuildInfoHelper(object):
|
||||||
m = re.match("([^:]*): md5 checksum matched for ([^;]*)", event.msg)
|
m = re.match("([^:]*): md5 checksum matched for ([^;]*)", event.msg)
|
||||||
if m:
|
if m:
|
||||||
(pn, fn) = m.groups()
|
(pn, fn) = m.groups()
|
||||||
self.internal_state['recipes'][pn].licensing_info = fn
|
|
||||||
self.internal_state['recipes'][pn].save()
|
self.internal_state['recipes'][pn].save()
|
||||||
|
|
||||||
if event.levelno < format.WARNING:
|
if event.levelno < format.WARNING:
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
<td>{% time_difference build.started_on build.completed_on %}</td>
|
<td>{% time_difference build.started_on build.completed_on %}</td>
|
||||||
<td>{{build.errors_no}}:{% if build.errors_no %}{% for error in logs %}{% if error.build == build %}{% if error.level == 2 %}<p>{{error.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
|
<td>{{build.errors_no}}:{% if build.errors_no %}{% for error in logs %}{% if error.build == build %}{% if error.level == 2 %}<p>{{error.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
|
||||||
<td>{{build.warnings_no}}:{% if build.warnings_no %}{% for warning in logs %}{% if warning.build == build %}{% if warning.level == 1 %}<p>{{warning.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
|
<td>{{build.warnings_no}}:{% if build.warnings_no %}{% for warning in logs %}{% if warning.build == build %}{% if warning.level == 1 %}<p>{{warning.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
|
||||||
<td>{% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}{{build.image_fstypes}}{% endif %}{% endfor %}{% endif %}</td>
|
<td>TBD: determine image file list</td>
|
||||||
<td>{{build.cooker_log_path}}</td>
|
<td>{{build.cooker_log_path}}</td>
|
||||||
<td>{{build.bitbake_version}}</td>
|
<td>{{build.bitbake_version}}</td>
|
||||||
<td>{{build.build_name}}</td>
|
<td>{{build.build_name}}</td>
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
<th>Description</th>
|
<th>Description</th>
|
||||||
<th>Section</th>
|
<th>Section</th>
|
||||||
<th>License</th>
|
<th>License</th>
|
||||||
<th>License file</th>
|
|
||||||
<th>Homepage</th>
|
<th>Homepage</th>
|
||||||
<th>Bugtracker</th>
|
<th>Bugtracker</th>
|
||||||
<th>File_path</th>
|
<th>File_path</th>
|
||||||
|
@ -34,7 +33,6 @@
|
||||||
<td>{{recipe.description}}</td>
|
<td>{{recipe.description}}</td>
|
||||||
<td>{{recipe.section}}</td>
|
<td>{{recipe.section}}</td>
|
||||||
<td>{{recipe.license}}</td>
|
<td>{{recipe.license}}</td>
|
||||||
<td>{{recipe.licensing_info}}</td>
|
|
||||||
<td>{{recipe.homepage}}</td>
|
<td>{{recipe.homepage}}</td>
|
||||||
<td>{{recipe.bugtracker}}</td>
|
<td>{{recipe.bugtracker}}</td>
|
||||||
<td>{{recipe.file_path}}</td>
|
<td>{{recipe.file_path}}</td>
|
||||||
|
|
|
@ -0,0 +1,301 @@
|
||||||
|
# -*- 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 'Target_Image_File'
|
||||||
|
db.create_table(u'orm_target_image_file', (
|
||||||
|
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||||
|
('target', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Target'])),
|
||||||
|
('file_name', self.gf('django.db.models.fields.FilePathField')(max_length=100)),
|
||||||
|
('file_size', self.gf('django.db.models.fields.IntegerField')()),
|
||||||
|
))
|
||||||
|
db.send_create_signal(u'orm', ['Target_Image_File'])
|
||||||
|
|
||||||
|
# Adding model 'Target_File'
|
||||||
|
db.create_table(u'orm_target_file', (
|
||||||
|
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||||
|
('target', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Target'])),
|
||||||
|
('path', self.gf('django.db.models.fields.FilePathField')(max_length=100)),
|
||||||
|
('size', self.gf('django.db.models.fields.IntegerField')()),
|
||||||
|
('inodetype', self.gf('django.db.models.fields.IntegerField')()),
|
||||||
|
('permission', self.gf('django.db.models.fields.IntegerField')()),
|
||||||
|
('owner', self.gf('django.db.models.fields.CharField')(max_length=128)),
|
||||||
|
('group', self.gf('django.db.models.fields.CharField')(max_length=128)),
|
||||||
|
('directory', self.gf('django.db.models.fields.related.ForeignKey')(related_name='directory_set', to=orm['orm.Target_File'])),
|
||||||
|
('sym_target', self.gf('django.db.models.fields.related.ForeignKey')(related_name='symlink_set', blank=True, to=orm['orm.Target_File'])),
|
||||||
|
))
|
||||||
|
db.send_create_signal(u'orm', ['Target_File'])
|
||||||
|
|
||||||
|
# Adding field 'VariableHistory.value'
|
||||||
|
db.add_column(u'orm_variablehistory', 'value',
|
||||||
|
self.gf('django.db.models.fields.TextField')(default='', blank=True),
|
||||||
|
keep_default=False)
|
||||||
|
|
||||||
|
# Deleting field 'Recipe.licensing_info'
|
||||||
|
db.delete_column(u'orm_recipe', 'licensing_info')
|
||||||
|
|
||||||
|
# Deleting field 'Target.file_name'
|
||||||
|
db.delete_column(u'orm_target', 'file_name')
|
||||||
|
|
||||||
|
# Deleting field 'Target.file_size'
|
||||||
|
db.delete_column(u'orm_target', 'file_size')
|
||||||
|
|
||||||
|
# Deleting field 'Build.image_fstypes'
|
||||||
|
db.delete_column(u'orm_build', 'image_fstypes')
|
||||||
|
|
||||||
|
# Adding field 'Build.timespent'
|
||||||
|
db.add_column(u'orm_build', 'timespent',
|
||||||
|
self.gf('django.db.models.fields.IntegerField')(default=0),
|
||||||
|
keep_default=False)
|
||||||
|
|
||||||
|
# Adding field 'LogMessage.task'
|
||||||
|
db.add_column(u'orm_logmessage', 'task',
|
||||||
|
self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Task'], null=True, blank=True),
|
||||||
|
keep_default=False)
|
||||||
|
|
||||||
|
|
||||||
|
# Changing field 'Task.elapsed_time'
|
||||||
|
db.alter_column(u'orm_task', 'elapsed_time', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=6, decimal_places=2))
|
||||||
|
# Adding unique constraint on 'Task', fields ['build', 'recipe', 'task_name']
|
||||||
|
db.create_unique(u'orm_task', ['build_id', 'recipe_id', 'task_name'])
|
||||||
|
|
||||||
|
|
||||||
|
def backwards(self, orm):
|
||||||
|
# Removing unique constraint on 'Task', fields ['build', 'recipe', 'task_name']
|
||||||
|
db.delete_unique(u'orm_task', ['build_id', 'recipe_id', 'task_name'])
|
||||||
|
|
||||||
|
# Deleting model 'Target_Image_File'
|
||||||
|
db.delete_table(u'orm_target_image_file')
|
||||||
|
|
||||||
|
# Deleting model 'Target_File'
|
||||||
|
db.delete_table(u'orm_target_file')
|
||||||
|
|
||||||
|
# Deleting field 'VariableHistory.value'
|
||||||
|
db.delete_column(u'orm_variablehistory', 'value')
|
||||||
|
|
||||||
|
# Adding field 'Recipe.licensing_info'
|
||||||
|
db.add_column(u'orm_recipe', 'licensing_info',
|
||||||
|
self.gf('django.db.models.fields.TextField')(default='', blank=True),
|
||||||
|
keep_default=False)
|
||||||
|
|
||||||
|
|
||||||
|
# User chose to not deal with backwards NULL issues for 'Target.file_name'
|
||||||
|
raise RuntimeError("Cannot reverse this migration. 'Target.file_name' and its values cannot be restored.")
|
||||||
|
|
||||||
|
# The following code is provided here to aid in writing a correct migration # Adding field 'Target.file_name'
|
||||||
|
db.add_column(u'orm_target', 'file_name',
|
||||||
|
self.gf('django.db.models.fields.CharField')(max_length=100),
|
||||||
|
keep_default=False)
|
||||||
|
|
||||||
|
|
||||||
|
# User chose to not deal with backwards NULL issues for 'Target.file_size'
|
||||||
|
raise RuntimeError("Cannot reverse this migration. 'Target.file_size' and its values cannot be restored.")
|
||||||
|
|
||||||
|
# The following code is provided here to aid in writing a correct migration # Adding field 'Target.file_size'
|
||||||
|
db.add_column(u'orm_target', 'file_size',
|
||||||
|
self.gf('django.db.models.fields.IntegerField')(),
|
||||||
|
keep_default=False)
|
||||||
|
|
||||||
|
|
||||||
|
# User chose to not deal with backwards NULL issues for 'Build.image_fstypes'
|
||||||
|
raise RuntimeError("Cannot reverse this migration. 'Build.image_fstypes' and its values cannot be restored.")
|
||||||
|
|
||||||
|
# The following code is provided here to aid in writing a correct migration # Adding field 'Build.image_fstypes'
|
||||||
|
db.add_column(u'orm_build', 'image_fstypes',
|
||||||
|
self.gf('django.db.models.fields.CharField')(max_length=100),
|
||||||
|
keep_default=False)
|
||||||
|
|
||||||
|
# Deleting field 'Build.timespent'
|
||||||
|
db.delete_column(u'orm_build', 'timespent')
|
||||||
|
|
||||||
|
# Deleting field 'LogMessage.task'
|
||||||
|
db.delete_column(u'orm_logmessage', 'task_id')
|
||||||
|
|
||||||
|
|
||||||
|
# Changing field 'Task.elapsed_time'
|
||||||
|
db.alter_column(u'orm_task', 'elapsed_time', self.gf('django.db.models.fields.CharField')(max_length=50))
|
||||||
|
|
||||||
|
models = {
|
||||||
|
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'}),
|
||||||
|
'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.layer': {
|
||||||
|
'Meta': {'object_name': 'Layer'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'layer_index_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
|
||||||
|
'local_path': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||||
|
},
|
||||||
|
u'orm.layer_version': {
|
||||||
|
'Meta': {'object_name': 'Layer_Version'},
|
||||||
|
'branch': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
|
||||||
|
'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_build'", 'to': u"orm['orm.Build']"}),
|
||||||
|
'commit': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'layer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_layer'", 'to': u"orm['orm.Layer']"}),
|
||||||
|
'priority': ('django.db.models.fields.IntegerField', [], {})
|
||||||
|
},
|
||||||
|
u'orm.logmessage': {
|
||||||
|
'Meta': {'object_name': 'LogMessage'},
|
||||||
|
'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'lineno': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||||
|
'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}),
|
||||||
|
'pathname': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
|
||||||
|
'task': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Task']", 'null': 'True', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
u'orm.package': {
|
||||||
|
'Meta': {'object_name': 'Package'},
|
||||||
|
'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
|
||||||
|
'description': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'installed_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}),
|
||||||
|
'installed_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'license': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Recipe']", 'null': 'True'}),
|
||||||
|
'revision': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
|
||||||
|
'section': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
|
||||||
|
'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'summary': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
|
||||||
|
'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
u'orm.package_dependency': {
|
||||||
|
'Meta': {'object_name': 'Package_Dependency'},
|
||||||
|
'dep_type': ('django.db.models.fields.IntegerField', [], {}),
|
||||||
|
'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_target'", 'to': u"orm['orm.Package']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_source'", 'to': u"orm['orm.Package']"}),
|
||||||
|
'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']", 'null': 'True'})
|
||||||
|
},
|
||||||
|
u'orm.package_file': {
|
||||||
|
'Meta': {'object_name': 'Package_File'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildfilelist_package'", 'to': u"orm['orm.Package']"}),
|
||||||
|
'path': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
|
||||||
|
'size': ('django.db.models.fields.IntegerField', [], {})
|
||||||
|
},
|
||||||
|
u'orm.recipe': {
|
||||||
|
'Meta': {'object_name': 'Recipe'},
|
||||||
|
'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
|
||||||
|
'description': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
|
||||||
|
'file_path': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
|
||||||
|
'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'recipe_layer_version'", 'to': u"orm['orm.Layer_Version']"}),
|
||||||
|
'license': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
|
||||||
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
|
||||||
|
'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
|
||||||
|
'summary': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
|
||||||
|
'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
u'orm.recipe_dependency': {
|
||||||
|
'Meta': {'object_name': 'Recipe_Dependency'},
|
||||||
|
'dep_type': ('django.db.models.fields.IntegerField', [], {}),
|
||||||
|
'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_depends'", 'to': u"orm['orm.Recipe']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_recipe'", 'to': u"orm['orm.Recipe']"})
|
||||||
|
},
|
||||||
|
u'orm.target': {
|
||||||
|
'Meta': {'object_name': 'Target'},
|
||||||
|
'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'is_image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'target': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||||
|
},
|
||||||
|
u'orm.target_file': {
|
||||||
|
'Meta': {'object_name': 'Target_File'},
|
||||||
|
'directory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'directory_set'", 'to': u"orm['orm.Target_File']"}),
|
||||||
|
'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'inodetype': ('django.db.models.fields.IntegerField', [], {}),
|
||||||
|
'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||||
|
'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
|
||||||
|
'permission': ('django.db.models.fields.IntegerField', [], {}),
|
||||||
|
'size': ('django.db.models.fields.IntegerField', [], {}),
|
||||||
|
'sym_target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'symlink_set'", 'blank': 'True', 'to': u"orm['orm.Target_File']"}),
|
||||||
|
'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
|
||||||
|
},
|
||||||
|
u'orm.target_image_file': {
|
||||||
|
'Meta': {'object_name': 'Target_Image_File'},
|
||||||
|
'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
|
||||||
|
'file_size': ('django.db.models.fields.IntegerField', [], {}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
|
||||||
|
},
|
||||||
|
u'orm.target_installed_package': {
|
||||||
|
'Meta': {'object_name': 'Target_Installed_Package'},
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildtargetlist_package'", 'to': u"orm['orm.Package']"}),
|
||||||
|
'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
|
||||||
|
},
|
||||||
|
u'orm.task': {
|
||||||
|
'Meta': {'ordering': "('order', 'recipe')", 'unique_together': "(('build', 'recipe', 'task_name'),)", 'object_name': 'Task'},
|
||||||
|
'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_build'", 'to': u"orm['orm.Build']"}),
|
||||||
|
'cpu_usage': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '6', 'decimal_places': '2'}),
|
||||||
|
'disk_io': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||||
|
'elapsed_time': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '6', 'decimal_places': '2'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'line_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'logfile': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
|
||||||
|
'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}),
|
||||||
|
'order': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||||
|
'outcome': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
|
||||||
|
'path_to_sstate_obj': ('django.db.models.fields.FilePathField', [], {'max_length': '500', 'blank': 'True'}),
|
||||||
|
'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'build_recipe'", 'to': u"orm['orm.Recipe']"}),
|
||||||
|
'script_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'source_url': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
|
||||||
|
'sstate_checksum': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
|
||||||
|
'sstate_result': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||||
|
'task_executed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'task_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'work_directory': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'})
|
||||||
|
},
|
||||||
|
u'orm.task_dependency': {
|
||||||
|
'Meta': {'object_name': 'Task_Dependency'},
|
||||||
|
'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_depends'", 'to': u"orm['orm.Task']"}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'task': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_task'", 'to': u"orm['orm.Task']"})
|
||||||
|
},
|
||||||
|
u'orm.variable': {
|
||||||
|
'Meta': {'object_name': 'Variable'},
|
||||||
|
'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'variable_build'", 'to': u"orm['orm.Build']"}),
|
||||||
|
'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||||
|
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||||
|
'human_readable_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'variable_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||||
|
'variable_value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
|
||||||
|
},
|
||||||
|
u'orm.variablehistory': {
|
||||||
|
'Meta': {'object_name': 'VariableHistory'},
|
||||||
|
'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
|
||||||
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
|
'line_number': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||||
|
'operation': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
|
||||||
|
'value': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||||
|
'variable': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'vhistory'", 'to': u"orm['orm.Variable']"})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
complete_apps = ['orm']
|
|
@ -34,11 +34,9 @@ class Build(models.Model):
|
||||||
(IN_PROGRESS, 'In Progress'),
|
(IN_PROGRESS, 'In Progress'),
|
||||||
)
|
)
|
||||||
|
|
||||||
search_allowed_fields = ['machine', 'image_fstypes',
|
search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"]
|
||||||
'cooker_log_path', "target__target"]
|
|
||||||
|
|
||||||
machine = models.CharField(max_length=100)
|
machine = models.CharField(max_length=100)
|
||||||
image_fstypes = models.CharField(max_length=100)
|
|
||||||
distro = models.CharField(max_length=100)
|
distro = models.CharField(max_length=100)
|
||||||
distro_version = models.CharField(max_length=100)
|
distro_version = models.CharField(max_length=100)
|
||||||
started_on = models.DateTimeField()
|
started_on = models.DateTimeField()
|
||||||
|
@ -53,16 +51,46 @@ class Build(models.Model):
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class Target(models.Model):
|
class Target(models.Model):
|
||||||
search_allowed_fields = ['target', 'image_fstypes', 'file_name']
|
search_allowed_fields = ['target', 'file_name']
|
||||||
build = models.ForeignKey(Build)
|
build = models.ForeignKey(Build)
|
||||||
target = models.CharField(max_length=100)
|
target = models.CharField(max_length=100)
|
||||||
is_image = models.BooleanField(default = False)
|
is_image = models.BooleanField(default = False)
|
||||||
file_name = models.CharField(max_length=100)
|
|
||||||
file_size = models.IntegerField()
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.target
|
return self.target
|
||||||
|
|
||||||
|
class Target_Image_File(models.Model):
|
||||||
|
target = models.ForeignKey(Target)
|
||||||
|
file_name = models.FilePathField(max_length=100)
|
||||||
|
file_size = models.IntegerField()
|
||||||
|
|
||||||
|
class Target_File(models.Model):
|
||||||
|
ITYPE_REGULAR = 1
|
||||||
|
ITYPE_DIRECTORY = 2
|
||||||
|
ITYPE_SYMLINK = 3
|
||||||
|
ITYPE_SOCKET = 4
|
||||||
|
ITYPE_FIFO = 5
|
||||||
|
ITYPE_CHARACTER = 6
|
||||||
|
ITYPE_BLOCK = 7
|
||||||
|
ITYPE_SYMBLINK = 8
|
||||||
|
ITYPES = ( (ITYPE_REGULAR ,'regular'),
|
||||||
|
( ITYPE_DIRECTORY ,'directory'),
|
||||||
|
( ITYPE_SYMLINK ,'symlink'),
|
||||||
|
( ITYPE_SOCKET ,'socket'),
|
||||||
|
( ITYPE_FIFO ,'fifo'),
|
||||||
|
( ITYPE_CHARACTER ,'character'),
|
||||||
|
( ITYPE_BLOCK ,'block'),
|
||||||
|
( ITYPE_SYMLINK ,'symblink'))
|
||||||
|
|
||||||
|
target = models.ForeignKey(Target)
|
||||||
|
path = models.FilePathField()
|
||||||
|
size = models.IntegerField()
|
||||||
|
inodetype = models.IntegerField(choices = ITYPES)
|
||||||
|
permission = models.IntegerField()
|
||||||
|
owner = models.CharField(max_length=128)
|
||||||
|
group = models.CharField(max_length=128)
|
||||||
|
directory = models.ForeignKey('Target_File', related_name="directory_set")
|
||||||
|
sym_target = models.ForeignKey('Target_File', related_name="symlink_set", blank=True)
|
||||||
|
|
||||||
|
|
||||||
class TaskManager(models.Manager):
|
class TaskManager(models.Manager):
|
||||||
|
@ -149,7 +177,7 @@ class Task(models.Model):
|
||||||
line_number = models.IntegerField(default=0)
|
line_number = models.IntegerField(default=0)
|
||||||
disk_io = models.IntegerField(null=True)
|
disk_io = models.IntegerField(null=True)
|
||||||
cpu_usage = models.DecimalField(max_digits=6, decimal_places=2, null=True)
|
cpu_usage = models.DecimalField(max_digits=6, decimal_places=2, null=True)
|
||||||
elapsed_time = models.CharField(max_length=50, default=0)
|
elapsed_time = models.DecimalField(max_digits=6, decimal_places=2, null=True)
|
||||||
sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA)
|
sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA)
|
||||||
message = models.CharField(max_length=240)
|
message = models.CharField(max_length=240)
|
||||||
logfile = models.FilePathField(max_length=255, blank=True)
|
logfile = models.FilePathField(max_length=255, blank=True)
|
||||||
|
@ -236,7 +264,6 @@ class Recipe(models.Model):
|
||||||
description = models.CharField(max_length=100, blank=True)
|
description = models.CharField(max_length=100, blank=True)
|
||||||
section = models.CharField(max_length=100, blank=True)
|
section = models.CharField(max_length=100, blank=True)
|
||||||
license = models.CharField(max_length=200, blank=True)
|
license = models.CharField(max_length=200, blank=True)
|
||||||
licensing_info = models.TextField(blank=True)
|
|
||||||
homepage = models.URLField(blank=True)
|
homepage = models.URLField(blank=True)
|
||||||
bugtracker = models.URLField(blank=True)
|
bugtracker = models.URLField(blank=True)
|
||||||
file_path = models.FilePathField(max_length=255)
|
file_path = models.FilePathField(max_length=255)
|
||||||
|
@ -280,6 +307,7 @@ class Variable(models.Model):
|
||||||
|
|
||||||
class VariableHistory(models.Model):
|
class VariableHistory(models.Model):
|
||||||
variable = models.ForeignKey(Variable, related_name='vhistory')
|
variable = models.ForeignKey(Variable, related_name='vhistory')
|
||||||
|
value = models.TextField(blank=True)
|
||||||
file_name = models.FilePathField(max_length=255)
|
file_name = models.FilePathField(max_length=255)
|
||||||
line_number = models.IntegerField(null=True)
|
line_number = models.IntegerField(null=True)
|
||||||
operation = models.CharField(max_length=16)
|
operation = models.CharField(max_length=16)
|
||||||
|
@ -294,6 +322,7 @@ class LogMessage(models.Model):
|
||||||
(ERROR, "error") )
|
(ERROR, "error") )
|
||||||
|
|
||||||
build = models.ForeignKey(Build)
|
build = models.ForeignKey(Build)
|
||||||
|
task = models.ForeignKey(Task, blank = True, null=True)
|
||||||
level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
|
level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
|
||||||
message=models.CharField(max_length=240)
|
message=models.CharField(max_length=240)
|
||||||
pathname = models.FilePathField(max_length=255, blank=True)
|
pathname = models.FilePathField(max_length=255, blank=True)
|
||||||
|
|
|
@ -94,7 +94,7 @@
|
||||||
<td class="warnings_no">{% if build.warnings_no %}<a class="warnings_no warning" href="{% url "builddashboard" build.id %}#warnings">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>{%endif%}</td>
|
<td class="warnings_no">{% if build.warnings_no %}<a class="warnings_no warning" href="{% url "builddashboard" build.id %}#warnings">{{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a>{%endif%}</td>
|
||||||
<td class="time"><a href="{% url "buildtime" build.id %}">{{build.timespent|sectohms}}</a></td>
|
<td class="time"><a href="{% url "buildtime" build.id %}">{{build.timespent|sectohms}}</a></td>
|
||||||
<td class="log">{{build.cooker_log_path}}</td>
|
<td class="log">{{build.cooker_log_path}}</td>
|
||||||
<td class="output">{% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}<a href="{%url "builddashboard" build.id%}#images">{{build.image_fstypes}}</a>{% endif %}{% endfor %}{% endif %}</td>
|
<td class="output">{% if build.outcome == 0 %}{% for t in build.target_set.all %}{% if t.is_image %}<a href="{%url "builddashboard" build.id%}#images">TODO: compute image output fstypes</a>{% endif %}{% endfor %}{% endif %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -329,7 +329,7 @@ def builds(request):
|
||||||
},
|
},
|
||||||
{'name': 'Output', 'clclass': 'output',
|
{'name': 'Output', 'clclass': 'output',
|
||||||
'qhelp': "The root file system types produced by the build. You can find them in your <code>/build/tmp/deploy/images/</code> directory",
|
'qhelp': "The root file system types produced by the build. You can find them in your <code>/build/tmp/deploy/images/</code> directory",
|
||||||
'orderfield': _get_toggle_order(request, "image_fstypes")
|
# TODO: compute image fstypes from Target_Image_File
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue