summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorAlexandru DAMIAN <alexandru.damian@intel.com>2015-05-14 16:44:27 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-05-29 11:59:44 +0100
commit56c5ff920c93a627f6bd473383ab4bbca912fc41 (patch)
tree7a193c508fe8e74786a0d21c6877aef1fd88bbae /bitbake
parente3e85bdf7100cc5619d7f184dc8d9e2a77a03364 (diff)
downloadpoky-56c5ff920c93a627f6bd473383ab4bbca912fc41.tar.gz
bitbake: toaster logger: assign projects to all builds
Bitbake logger now sets a default project if the TOASTER_BRBE or TOASTER_PROJECT Bitbake variables are not set. This a necessary step in getting all builds under a project, as to unify the MANAGED and interactive modes. Other small fixes are included, related to the size of the fields in the database. (Bitbake rev: 5e0bf388f4e5c1cc493ac8264785e631bad2f672) Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/ui/buildinfohelper.py37
-rw-r--r--bitbake/lib/toaster/orm/migrations/0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_.py368
-rw-r--r--bitbake/lib/toaster/orm/models.py15
-rw-r--r--bitbake/lib/toaster/orm/views.py2
4 files changed, 405 insertions, 17 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py
index 6812a52b7b..3ea842cd4b 100644
--- a/bitbake/lib/bb/ui/buildinfohelper.py
+++ b/bitbake/lib/bb/ui/buildinfohelper.py
@@ -31,6 +31,9 @@ from toaster.orm.models import Variable, VariableHistory
31from toaster.orm.models import Package, Package_File, Target_Installed_Package, Target_File 31from toaster.orm.models import Package, Package_File, Target_Installed_Package, Target_File
32from toaster.orm.models import Task_Dependency, Package_Dependency 32from toaster.orm.models import Task_Dependency, Package_Dependency
33from toaster.orm.models import Recipe_Dependency 33from toaster.orm.models import Recipe_Dependency
34
35from toaster.orm.models import Project
36
34from bb.msg import BBLogFormatter as format 37from bb.msg import BBLogFormatter as format
35from django.db import models 38from django.db import models
36from pprint import pformat 39from pprint import pformat
@@ -103,7 +106,7 @@ class ORMWrapper(object):
103 106
104 return vars(self)[dictname][key] 107 return vars(self)[dictname][key]
105 108
106 def create_build_object(self, build_info, brbe): 109 def create_build_object(self, build_info, brbe, project_id):
107 assert 'machine' in build_info 110 assert 'machine' in build_info
108 assert 'distro' in build_info 111 assert 'distro' in build_info
109 assert 'distro_version' in build_info 112 assert 'distro_version' in build_info
@@ -112,7 +115,26 @@ class ORMWrapper(object):
112 assert 'build_name' in build_info 115 assert 'build_name' in build_info
113 assert 'bitbake_version' in build_info 116 assert 'bitbake_version' in build_info
114 117
118 prj = None
119 buildrequest = None
120 if brbe is not None: # this build was triggered by a request from a user
121 logger.debug(1, "buildinfohelper: brbe is %s" % brbe)
122 from bldcontrol.models import BuildEnvironment, BuildRequest
123 br, be = brbe.split(":")
124 buildrequest = BuildRequest.objects.get(pk = br)
125 prj = buildrequest.project
126
127 elif project_id is not None: # this build was triggered by an external system for a specific project
128 logger.debug(1, "buildinfohelper: project is %s" % prj)
129 prj = Project.objects.get(pk = project_id)
130
131 else: # this build was triggered by a legacy system, or command line interactive mode
132 prj, created = Project.objects.get_or_create(pk=0, name="Default Project")
133 logger.debug(1, "buildinfohelper: project is not specified, defaulting to %s" % prj)
134
135
115 build = Build.objects.create( 136 build = Build.objects.create(
137 project = prj,
116 machine=build_info['machine'], 138 machine=build_info['machine'],
117 distro=build_info['distro'], 139 distro=build_info['distro'],
118 distro_version=build_info['distro_version'], 140 distro_version=build_info['distro_version'],
@@ -123,17 +145,11 @@ class ORMWrapper(object):
123 bitbake_version=build_info['bitbake_version']) 145 bitbake_version=build_info['bitbake_version'])
124 146
125 logger.debug(1, "buildinfohelper: build is created %s" % build) 147 logger.debug(1, "buildinfohelper: build is created %s" % build)
126 if brbe is not None:
127 logger.debug(1, "buildinfohelper: brbe is %s" % brbe)
128 from bldcontrol.models import BuildEnvironment, BuildRequest
129 br, be = brbe.split(":")
130 148
131 buildrequest = BuildRequest.objects.get(pk = br) 149 if buildrequest is not None:
132 buildrequest.build = build 150 buildrequest.build = build
133 buildrequest.save() 151 buildrequest.save()
134 152
135 build.project_id = buildrequest.project_id
136 build.save()
137 return build 153 return build
138 154
139 def create_target_objects(self, target_info): 155 def create_target_objects(self, target_info):
@@ -638,6 +654,7 @@ class BuildInfoHelper(object):
638 self.has_build_history = has_build_history 654 self.has_build_history = has_build_history
639 self.tmp_dir = self.server.runCommand(["getVariable", "TMPDIR"])[0] 655 self.tmp_dir = self.server.runCommand(["getVariable", "TMPDIR"])[0]
640 self.brbe = self.server.runCommand(["getVariable", "TOASTER_BRBE"])[0] 656 self.brbe = self.server.runCommand(["getVariable", "TOASTER_BRBE"])[0]
657 self.project = self.server.runCommand(["getVariable", "TOASTER_PROJECT"])[0]
641 logger.debug(1, "buildinfohelper: Build info helper inited %s" % vars(self)) 658 logger.debug(1, "buildinfohelper: Build info helper inited %s" % vars(self))
642 659
643 660
@@ -804,7 +821,7 @@ class BuildInfoHelper(object):
804 assert '_pkgs' in vars(event) 821 assert '_pkgs' in vars(event)
805 build_information = self._get_build_information() 822 build_information = self._get_build_information()
806 823
807 build_obj = self.orm_wrapper.create_build_object(build_information, self.brbe) 824 build_obj = self.orm_wrapper.create_build_object(build_information, self.brbe, self.project)
808 825
809 self.internal_state['build'] = build_obj 826 self.internal_state['build'] = build_obj
810 827
@@ -1233,7 +1250,7 @@ class BuildInfoHelper(object):
1233 logger.debug(1, "buildinfohelper: Saving stored event %s " % tempevent) 1250 logger.debug(1, "buildinfohelper: Saving stored event %s " % tempevent)
1234 self.store_log_event(tempevent) 1251 self.store_log_event(tempevent)
1235 else: 1252 else:
1236 logger.error("buildinfohelper: Events not saved: %s" % self.internal_state['backlog']) 1253 logger.info("buildinfohelper: All events saved")
1237 del self.internal_state['backlog'] 1254 del self.internal_state['backlog']
1238 1255
1239 log_information = {} 1256 log_information = {}
diff --git a/bitbake/lib/toaster/orm/migrations/0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_.py b/bitbake/lib/toaster/orm/migrations/0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_.py
new file mode 100644
index 0000000000..b82cc8d21b
--- /dev/null
+++ b/bitbake/lib/toaster/orm/migrations/0021_auto__chg_field_build_project__chg_field_project_bitbake_version__chg_.py
@@ -0,0 +1,368 @@
1# -*- coding: utf-8 -*-
2from south.utils import datetime_utils as datetime
3from south.db import db
4from south.v2 import SchemaMigration
5from django.db import models
6
7
8class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11
12 # Changing field 'Build.project'
13 db.alter_column(u'orm_build', 'project_id', self.gf('django.db.models.fields.related.ForeignKey')(default=0, to=orm['orm.Project']))
14
15 # Changing field 'Project.bitbake_version'
16 db.alter_column(u'orm_project', 'bitbake_version_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.BitbakeVersion'], null=True))
17
18 # Changing field 'Project.release'
19 db.alter_column(u'orm_project', 'release_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Release'], null=True))
20
21 # Changing field 'Task.cpu_usage'
22 db.alter_column(u'orm_task', 'cpu_usage', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=8, decimal_places=2))
23
24 # Changing field 'Task.elapsed_time'
25 db.alter_column(u'orm_task', 'elapsed_time', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=8, decimal_places=2))
26
27 def backwards(self, orm):
28
29 # Changing field 'Build.project'
30 db.alter_column(u'orm_build', 'project_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Project'], null=True))
31
32 # User chose to not deal with backwards NULL issues for 'Project.bitbake_version'
33 raise RuntimeError("Cannot reverse this migration. 'Project.bitbake_version' and its values cannot be restored.")
34
35 # The following code is provided here to aid in writing a correct migration
36 # Changing field 'Project.bitbake_version'
37 db.alter_column(u'orm_project', 'bitbake_version_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.BitbakeVersion']))
38
39 # User chose to not deal with backwards NULL issues for 'Project.release'
40 raise RuntimeError("Cannot reverse this migration. 'Project.release' and its values cannot be restored.")
41
42 # The following code is provided here to aid in writing a correct migration
43 # Changing field 'Project.release'
44 db.alter_column(u'orm_project', 'release_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Release']))
45
46 # Changing field 'Task.cpu_usage'
47 db.alter_column(u'orm_task', 'cpu_usage', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=6, decimal_places=2))
48
49 # Changing field 'Task.elapsed_time'
50 db.alter_column(u'orm_task', 'elapsed_time', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=6, decimal_places=2))
51
52 models = {
53 u'orm.bitbakeversion': {
54 'Meta': {'object_name': 'BitbakeVersion'},
55 'branch': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
56 'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
57 'giturl': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
58 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
59 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
60 },
61 u'orm.branch': {
62 'Meta': {'unique_together': "(('layer_source', 'name'), ('layer_source', 'up_id'))", 'object_name': 'Branch'},
63 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
64 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'True', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
65 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
66 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
67 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
68 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
69 },
70 u'orm.build': {
71 'Meta': {'object_name': 'Build'},
72 'bitbake_version': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
73 'build_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
74 'completed_on': ('django.db.models.fields.DateTimeField', [], {}),
75 'cooker_log_path': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
76 'distro': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
77 'distro_version': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
78 'errors_no': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
79 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
80 'machine': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
81 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
82 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
83 'started_on': ('django.db.models.fields.DateTimeField', [], {}),
84 'timespent': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
85 'warnings_no': ('django.db.models.fields.IntegerField', [], {'default': '0'})
86 },
87 u'orm.buildartifact': {
88 'Meta': {'object_name': 'BuildArtifact'},
89 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
90 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
91 'file_size': ('django.db.models.fields.IntegerField', [], {}),
92 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
93 },
94 u'orm.helptext': {
95 'Meta': {'object_name': 'HelpText'},
96 'area': ('django.db.models.fields.IntegerField', [], {}),
97 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'helptext_build'", 'to': u"orm['orm.Build']"}),
98 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
99 'key': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
100 'text': ('django.db.models.fields.TextField', [], {})
101 },
102 u'orm.layer': {
103 'Meta': {'unique_together': "(('layer_source', 'up_id'), ('layer_source', 'name'))", 'object_name': 'Layer'},
104 'description': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
105 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
106 'layer_index_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
107 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
108 'local_path': ('django.db.models.fields.FilePathField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
109 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
110 'summary': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
111 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
112 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}),
113 'vcs_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
114 'vcs_web_file_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
115 'vcs_web_tree_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
116 'vcs_web_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'})
117 },
118 u'orm.layer_version': {
119 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Layer_Version'},
120 'branch': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
121 'build': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'layer_version_build'", 'null': 'True', 'to': u"orm['orm.Build']"}),
122 'commit': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
123 'dirpath': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
124 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
125 'layer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_layer'", 'to': u"orm['orm.Layer']"}),
126 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
127 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
128 'project': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Project']", 'null': 'True'}),
129 'up_branch': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Branch']", 'null': 'True'}),
130 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
131 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
132 },
133 u'orm.layersource': {
134 'Meta': {'unique_together': "(('sourcetype', 'apiurl'),)", 'object_name': 'LayerSource'},
135 'apiurl': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
136 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
137 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '63'}),
138 'sourcetype': ('django.db.models.fields.IntegerField', [], {})
139 },
140 u'orm.layerversiondependency': {
141 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'LayerVersionDependency'},
142 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependees'", 'to': u"orm['orm.Layer_Version']"}),
143 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
144 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
145 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependencies'", 'to': u"orm['orm.Layer_Version']"}),
146 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
147 },
148 u'orm.logmessage': {
149 'Meta': {'object_name': 'LogMessage'},
150 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
151 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
152 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
153 'lineno': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
154 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}),
155 'pathname': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
156 'task': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Task']", 'null': 'True', 'blank': 'True'})
157 },
158 u'orm.machine': {
159 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Machine'},
160 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
161 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
162 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
163 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']"}),
164 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
165 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
166 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
167 },
168 u'orm.package': {
169 'Meta': {'object_name': 'Package'},
170 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
171 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
172 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
173 'installed_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}),
174 'installed_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
175 'license': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
176 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
177 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Recipe']", 'null': 'True'}),
178 'revision': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
179 'section': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
180 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
181 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
182 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
183 },
184 u'orm.package_dependency': {
185 'Meta': {'object_name': 'Package_Dependency'},
186 'dep_type': ('django.db.models.fields.IntegerField', [], {}),
187 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_target'", 'to': u"orm['orm.Package']"}),
188 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
189 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_source'", 'to': u"orm['orm.Package']"}),
190 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']", 'null': 'True'})
191 },
192 u'orm.package_file': {
193 'Meta': {'object_name': 'Package_File'},
194 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
195 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildfilelist_package'", 'to': u"orm['orm.Package']"}),
196 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
197 'size': ('django.db.models.fields.IntegerField', [], {})
198 },
199 u'orm.project': {
200 'Meta': {'object_name': 'Project'},
201 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']", 'null': 'True'}),
202 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
203 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
204 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
205 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']", 'null': 'True'}),
206 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
207 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
208 'user_id': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
209 },
210 u'orm.projectlayer': {
211 'Meta': {'unique_together': "(('project', 'layercommit'),)", 'object_name': 'ProjectLayer'},
212 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
213 'layercommit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']", 'null': 'True'}),
214 'optional': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
215 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"})
216 },
217 u'orm.projecttarget': {
218 'Meta': {'object_name': 'ProjectTarget'},
219 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
220 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
221 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
222 'task': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
223 },
224 u'orm.projectvariable': {
225 'Meta': {'object_name': 'ProjectVariable'},
226 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
227 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
228 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
229 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
230 },
231 u'orm.recipe': {
232 'Meta': {'unique_together': "(('layer_version', 'file_path'),)", 'object_name': 'Recipe'},
233 'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
234 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
235 'file_path': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
236 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
237 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
238 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
239 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'recipe_layer_version'", 'to': u"orm['orm.Layer_Version']"}),
240 'license': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
241 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
242 'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
243 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
244 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
245 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}),
246 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
247 },
248 u'orm.recipe_dependency': {
249 'Meta': {'object_name': 'Recipe_Dependency'},
250 'dep_type': ('django.db.models.fields.IntegerField', [], {}),
251 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_depends'", 'to': u"orm['orm.Recipe']"}),
252 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
253 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_recipe'", 'to': u"orm['orm.Recipe']"})
254 },
255 u'orm.release': {
256 'Meta': {'object_name': 'Release'},
257 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']"}),
258 'branch_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50'}),
259 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
260 'helptext': ('django.db.models.fields.TextField', [], {'null': 'True'}),
261 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
262 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
263 },
264 u'orm.releasedefaultlayer': {
265 'Meta': {'object_name': 'ReleaseDefaultLayer'},
266 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
267 'layer_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}),
268 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']"})
269 },
270 u'orm.releaselayersourcepriority': {
271 'Meta': {'unique_together': "(('release', 'layer_source'),)", 'object_name': 'ReleaseLayerSourcePriority'},
272 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
273 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.LayerSource']"}),
274 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
275 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']"})
276 },
277 u'orm.target': {
278 'Meta': {'object_name': 'Target'},
279 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
280 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
281 'image_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
282 'is_image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
283 'license_manifest_path': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True'}),
284 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'})
285 },
286 u'orm.target_file': {
287 'Meta': {'object_name': 'Target_File'},
288 'directory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'directory_set'", 'null': 'True', 'to': u"orm['orm.Target_File']"}),
289 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
290 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
291 'inodetype': ('django.db.models.fields.IntegerField', [], {}),
292 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
293 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
294 'permission': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
295 'size': ('django.db.models.fields.IntegerField', [], {}),
296 'sym_target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'symlink_set'", 'null': 'True', 'to': u"orm['orm.Target_File']"}),
297 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
298 },
299 u'orm.target_image_file': {
300 'Meta': {'object_name': 'Target_Image_File'},
301 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '254'}),
302 'file_size': ('django.db.models.fields.IntegerField', [], {}),
303 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
304 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
305 },
306 u'orm.target_installed_package': {
307 'Meta': {'object_name': 'Target_Installed_Package'},
308 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
309 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildtargetlist_package'", 'to': u"orm['orm.Package']"}),
310 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
311 },
312 u'orm.task': {
313 'Meta': {'ordering': "('order', 'recipe')", 'unique_together': "(('build', 'recipe', 'task_name'),)", 'object_name': 'Task'},
314 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_build'", 'to': u"orm['orm.Build']"}),
315 'cpu_usage': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2'}),
316 'disk_io': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
317 'elapsed_time': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2'}),
318 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
319 'line_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
320 'logfile': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
321 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}),
322 'order': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
323 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
324 'path_to_sstate_obj': ('django.db.models.fields.FilePathField', [], {'max_length': '500', 'blank': 'True'}),
325 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tasks'", 'to': u"orm['orm.Recipe']"}),
326 'script_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
327 'source_url': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
328 'sstate_checksum': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
329 'sstate_result': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
330 'task_executed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
331 'task_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
332 'work_directory': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'})
333 },
334 u'orm.task_dependency': {
335 'Meta': {'object_name': 'Task_Dependency'},
336 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_depends'", 'to': u"orm['orm.Task']"}),
337 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
338 'task': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_task'", 'to': u"orm['orm.Task']"})
339 },
340 u'orm.toastersetting': {
341 'Meta': {'object_name': 'ToasterSetting'},
342 'helptext': ('django.db.models.fields.TextField', [], {}),
343 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
344 'name': ('django.db.models.fields.CharField', [], {'max_length': '63'}),
345 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'})
346 },
347 u'orm.variable': {
348 'Meta': {'object_name': 'Variable'},
349 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'variable_build'", 'to': u"orm['orm.Build']"}),
350 'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
351 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
352 'human_readable_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
353 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
354 'variable_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
355 'variable_value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
356 },
357 u'orm.variablehistory': {
358 'Meta': {'object_name': 'VariableHistory'},
359 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
360 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
361 'line_number': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
362 'operation': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
363 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
364 'variable': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'vhistory'", 'to': u"orm['orm.Variable']"})
365 }
366 }
367
368 complete_apps = ['orm'] \ No newline at end of file
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py
index 29ede657c8..0f725764d5 100644
--- a/bitbake/lib/toaster/orm/models.py
+++ b/bitbake/lib/toaster/orm/models.py
@@ -81,15 +81,18 @@ class ProjectManager(models.Manager):
81 def create(self, *args, **kwargs): 81 def create(self, *args, **kwargs):
82 raise Exception("Invalid call to Project.objects.create. Use Project.objects.create_project() to create a project") 82 raise Exception("Invalid call to Project.objects.create. Use Project.objects.create_project() to create a project")
83 83
84 def get_or_create(self, *args, **kwargs): 84 def get_or_create(self, **kwargs):
85 # allow project creation for default data
86 if 'pk' in kwargs and kwargs['pk'] == 0:
87 return super(ProjectManager, self).get_or_create(**kwargs)
85 raise Exception("Invalid call to Project.objects.get_or_create. Use Project.objects.create_project() to create a project") 88 raise Exception("Invalid call to Project.objects.get_or_create. Use Project.objects.create_project() to create a project")
86 89
87class Project(models.Model): 90class Project(models.Model):
88 search_allowed_fields = ['name', 'short_description', 'release__name', 'release__branch_name'] 91 search_allowed_fields = ['name', 'short_description', 'release__name', 'release__branch_name']
89 name = models.CharField(max_length=100) 92 name = models.CharField(max_length=100)
90 short_description = models.CharField(max_length=50, blank=True) 93 short_description = models.CharField(max_length=50, blank=True)
91 bitbake_version = models.ForeignKey('BitbakeVersion') 94 bitbake_version = models.ForeignKey('BitbakeVersion', null=True)
92 release = models.ForeignKey("Release") 95 release = models.ForeignKey("Release", null=True)
93 created = models.DateTimeField(auto_now_add = True) 96 created = models.DateTimeField(auto_now_add = True)
94 updated = models.DateTimeField(auto_now = True) 97 updated = models.DateTimeField(auto_now = True)
95 # This is a horrible hack; since Toaster has no "User" model available when 98 # This is a horrible hack; since Toaster has no "User" model available when
@@ -223,7 +226,7 @@ class Build(models.Model):
223 226
224 search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"] 227 search_allowed_fields = ['machine', 'cooker_log_path', "target__target", "target__target_image_file__file_name"]
225 228
226 project = models.ForeignKey(Project, null = True) 229 project = models.ForeignKey(Project) # must have a project
227 machine = models.CharField(max_length=100) 230 machine = models.CharField(max_length=100)
228 distro = models.CharField(max_length=100) 231 distro = models.CharField(max_length=100)
229 distro_version = models.CharField(max_length=100) 232 distro_version = models.CharField(max_length=100)
@@ -435,8 +438,8 @@ class Task(models.Model):
435 script_type = models.IntegerField(choices=TASK_CODING, default=CODING_NA) 438 script_type = models.IntegerField(choices=TASK_CODING, default=CODING_NA)
436 line_number = models.IntegerField(default=0) 439 line_number = models.IntegerField(default=0)
437 disk_io = models.IntegerField(null=True) 440 disk_io = models.IntegerField(null=True)
438 cpu_usage = models.DecimalField(max_digits=6, decimal_places=2, null=True) 441 cpu_usage = models.DecimalField(max_digits=8, decimal_places=2, null=True)
439 elapsed_time = models.DecimalField(max_digits=6, decimal_places=2, null=True) 442 elapsed_time = models.DecimalField(max_digits=8, decimal_places=2, null=True)
440 sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA) 443 sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA)
441 message = models.CharField(max_length=240) 444 message = models.CharField(max_length=240)
442 logfile = models.FilePathField(max_length=255, blank=True) 445 logfile = models.FilePathField(max_length=255, blank=True)
diff --git a/bitbake/lib/toaster/orm/views.py b/bitbake/lib/toaster/orm/views.py
index 61d14f9375..f32fa4d225 100644
--- a/bitbake/lib/toaster/orm/views.py
+++ b/bitbake/lib/toaster/orm/views.py
@@ -37,7 +37,7 @@ from django.views.decorators.csrf import csrf_exempt
37def eventfile(request): 37def eventfile(request):
38 """ Receives a file by POST, and runs toaster-eventreply on this file """ 38 """ Receives a file by POST, and runs toaster-eventreply on this file """
39 if request.method != "POST": 39 if request.method != "POST":
40 return HttpResponseBadRequest("This API only accepts POST requests. Post a file with:\n\ncurl -F eventlog=@bitbake_eventlog.json http[s]://[server-address]/orm/eventfile\n", content_type="text/plain;utf8") 40 return HttpResponseBadRequest("This API only accepts POST requests. Post a file with:\n\ncurl -F eventlog=@bitbake_eventlog.json %s\n" % request.build_absolute_uri(reverse('eventfile')), content_type="text/plain;utf8")
41 41
42 # write temporary file 42 # write temporary file
43 (handle, abstemppath) = tempfile.mkstemp(dir="/tmp/") 43 (handle, abstemppath) = tempfile.mkstemp(dir="/tmp/")