diff options
author | Alexandru DAMIAN <alexandru.damian@intel.com> | 2015-05-14 16:44:27 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-05-29 11:59:44 +0100 |
commit | 56c5ff920c93a627f6bd473383ab4bbca912fc41 (patch) | |
tree | 7a193c508fe8e74786a0d21c6877aef1fd88bbae /bitbake | |
parent | e3e85bdf7100cc5619d7f184dc8d9e2a77a03364 (diff) | |
download | poky-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')
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 | |||
31 | from toaster.orm.models import Package, Package_File, Target_Installed_Package, Target_File | 31 | from toaster.orm.models import Package, Package_File, Target_Installed_Package, Target_File |
32 | from toaster.orm.models import Task_Dependency, Package_Dependency | 32 | from toaster.orm.models import Task_Dependency, Package_Dependency |
33 | from toaster.orm.models import Recipe_Dependency | 33 | from toaster.orm.models import Recipe_Dependency |
34 | |||
35 | from toaster.orm.models import Project | ||
36 | |||
34 | from bb.msg import BBLogFormatter as format | 37 | from bb.msg import BBLogFormatter as format |
35 | from django.db import models | 38 | from django.db import models |
36 | from pprint import pformat | 39 | from 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 -*- | ||
2 | from south.utils import datetime_utils as datetime | ||
3 | from south.db import db | ||
4 | from south.v2 import SchemaMigration | ||
5 | from django.db import models | ||
6 | |||
7 | |||
8 | class 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 | ||
87 | class Project(models.Model): | 90 | class 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 | |||
37 | def eventfile(request): | 37 | def 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/") |