summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/orm/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/toaster/orm/models.py')
-rw-r--r--bitbake/lib/toaster/orm/models.py258
1 files changed, 258 insertions, 0 deletions
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py
new file mode 100644
index 0000000000..cb6581c9e1
--- /dev/null
+++ b/bitbake/lib/toaster/orm/models.py
@@ -0,0 +1,258 @@
1#
2# BitBake Toaster Implementation
3#
4# Copyright (C) 2013 Intel Corporation
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License version 2 as
8# published by the Free Software Foundation.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along
16# with this program; if not, write to the Free Software Foundation, Inc.,
17# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
19from django.db import models
20from django.utils.encoding import python_2_unicode_compatible
21
22
23class Build(models.Model):
24 SUCCEEDED = 0
25 FAILED = 1
26 IN_PROGRESS = 2
27
28 BUILD_OUTCOME = (
29 (SUCCEEDED, 'Succeeded'),
30 (FAILED, 'Failed'),
31 (IN_PROGRESS, 'In Progress'),
32 )
33
34 search_allowed_fields = ['machine',
35 'cooker_log_path']
36
37 machine = models.CharField(max_length=100)
38 image_fstypes = models.CharField(max_length=100)
39 distro = models.CharField(max_length=100)
40 distro_version = models.CharField(max_length=100)
41 started_on = models.DateTimeField()
42 completed_on = models.DateTimeField()
43 outcome = models.IntegerField(choices=BUILD_OUTCOME, default=IN_PROGRESS)
44 errors_no = models.IntegerField(default=0)
45 warnings_no = models.IntegerField(default=0)
46 cooker_log_path = models.CharField(max_length=500)
47 build_name = models.CharField(max_length=100)
48 bitbake_version = models.CharField(max_length=50)
49
50@python_2_unicode_compatible
51class Target(models.Model):
52 search_allowed_fields = ['target', 'image_fstypes', 'file_name']
53 build = models.ForeignKey(Build)
54 target = models.CharField(max_length=100)
55 is_image = models.BooleanField(default = False)
56 file_name = models.CharField(max_length=100)
57 file_size = models.IntegerField()
58
59 def __str__(self):
60 return self.target
61
62
63class Task(models.Model):
64
65 SSTATE_NA = 0
66 SSTATE_MISS = 1
67 SSTATE_FAILED = 2
68 SSTATE_RESTORED = 3
69
70 SSTATE_RESULT = (
71 (SSTATE_NA, 'Not Applicable'), # For rest of tasks, but they still need checking.
72 (SSTATE_MISS, 'Missing'), # it is a miss
73 (SSTATE_FAILED, 'Failed'), # there was a pkg, but the script failed
74 (SSTATE_RESTORED, 'Restored'), # succesfully restored
75 )
76
77 CODING_PYTHON = 0
78 CODING_SHELL = 1
79
80 TASK_CODING = (
81 (CODING_PYTHON, 'Python'),
82 (CODING_SHELL, 'Shell'),
83 )
84
85 OUTCOME_SUCCESS = 0
86 OUTCOME_COVERED = 1
87 OUTCOME_SSTATE = 2
88 OUTCOME_EXISTING = 3
89 OUTCOME_FAILED = 4
90 OUTCOME_NA = 5
91
92 TASK_OUTCOME = (
93 (OUTCOME_SUCCESS, 'Succeeded'),
94 (OUTCOME_COVERED, 'Covered'),
95 (OUTCOME_SSTATE, 'Sstate'),
96 (OUTCOME_EXISTING, 'Existing'),
97 (OUTCOME_FAILED, 'Failed'),
98 (OUTCOME_NA, 'Not Available'),
99 )
100
101 build = models.ForeignKey(Build, related_name='task_build')
102 order = models.IntegerField(null=True)
103 task_executed = models.BooleanField(default=False) # True means Executed, False means Prebuilt
104 outcome = models.IntegerField(choices=TASK_OUTCOME, default=OUTCOME_NA)
105 sstate_checksum = models.CharField(max_length=100, blank=True)
106 path_to_sstate_obj = models.FilePathField(max_length=500, blank=True)
107 recipe = models.ForeignKey('Recipe', related_name='build_recipe')
108 task_name = models.CharField(max_length=100)
109 source_url = models.FilePathField(max_length=255, blank=True)
110 work_directory = models.FilePathField(max_length=255, blank=True)
111 script_type = models.IntegerField(choices=TASK_CODING, default=CODING_PYTHON)
112 line_number = models.IntegerField(default=0)
113 disk_io = models.IntegerField(null=True)
114 cpu_usage = models.DecimalField(max_digits=6, decimal_places=2, null=True)
115 elapsed_time = models.CharField(max_length=50, default=0)
116 sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA)
117 message = models.CharField(max_length=240)
118 logfile = models.FilePathField(max_length=255, blank=True)
119
120 class Meta:
121 ordering = ('order', 'recipe' ,)
122
123
124class Task_Dependency(models.Model):
125 task = models.ForeignKey(Task, related_name='task_dependencies_task')
126 depends_on = models.ForeignKey(Task, related_name='task_dependencies_depends')
127
128
129class Build_Package(models.Model):
130 build = models.ForeignKey('Build')
131 recipe = models.ForeignKey('Recipe', null=True)
132 name = models.CharField(max_length=100)
133 version = models.CharField(max_length=100, blank=True)
134 revision = models.CharField(max_length=32, blank=True)
135 summary = models.CharField(max_length=200, blank=True)
136 description = models.CharField(max_length=200, blank=True)
137 size = models.IntegerField(default=0)
138 section = models.CharField(max_length=80, blank=True)
139 license = models.CharField(max_length=80, blank=True)
140
141class Build_Package_Dependency(models.Model):
142 TYPE_RDEPENDS = 0
143 TYPE_RPROVIDES = 1
144 TYPE_RRECOMMENDS = 2
145 TYPE_RSUGGESTS = 3
146 TYPE_RREPLACES = 4
147 TYPE_RCONFLICTS = 5
148 DEPENDS_TYPE = (
149 (TYPE_RDEPENDS, "rdepends"),
150 (TYPE_RPROVIDES, "rprovides"),
151 (TYPE_RRECOMMENDS, "rrecommends"),
152 (TYPE_RSUGGESTS, "rsuggests"),
153 (TYPE_RREPLACES, "rreplaces"),
154 (TYPE_RCONFLICTS, "rconflicts"),
155 )
156 package = models.ForeignKey(Build_Package, related_name='bpackage_dependencies_package')
157 depends_on = models.CharField(max_length=100) # soft dependency
158 dep_type = models.IntegerField(choices=DEPENDS_TYPE)
159
160
161class Target_Package(models.Model):
162 target = models.ForeignKey('Target')
163 recipe = models.ForeignKey('Recipe', null=True)
164 name = models.CharField(max_length=100)
165 version = models.CharField(max_length=100, blank=True)
166 size = models.IntegerField()
167
168
169class Target_Package_Dependency(models.Model):
170 TYPE_DEPENDS = 0
171 TYPE_RDEPENDS = 1
172 TYPE_RECOMMENDS = 2
173
174 DEPENDS_TYPE = (
175 (TYPE_DEPENDS, "depends"),
176 (TYPE_RDEPENDS, "rdepends"),
177 (TYPE_RECOMMENDS, "recommends"),
178 )
179 package = models.ForeignKey(Target_Package, related_name='tpackage_dependencies_package')
180 depends_on = models.ForeignKey(Target_Package, related_name='tpackage_dependencies_depends')
181 dep_type = models.IntegerField(choices=DEPENDS_TYPE)
182
183
184class Build_File(models.Model):
185 bpackage = models.ForeignKey(Build_Package, related_name='filelist_bpackage')
186 path = models.FilePathField(max_length=255, blank=True)
187 size = models.IntegerField()
188
189class Target_File(models.Model):
190 tpackage = models.ForeignKey(Target_Package, related_name='filelist_tpackage')
191 path = models.FilePathField(max_length=255, blank=True)
192 size = models.IntegerField()
193
194
195class Recipe(models.Model):
196 name = models.CharField(max_length=100, blank=True)
197 version = models.CharField(max_length=100, blank=True)
198 layer_version = models.ForeignKey('Layer_Version', related_name='recipe_layer_version')
199 summary = models.CharField(max_length=100, blank=True)
200 description = models.CharField(max_length=100, blank=True)
201 section = models.CharField(max_length=100, blank=True)
202 license = models.CharField(max_length=200, blank=True)
203 licensing_info = models.TextField(blank=True)
204 homepage = models.URLField(blank=True)
205 bugtracker = models.URLField(blank=True)
206 author = models.CharField(max_length=100, blank=True)
207 file_path = models.FilePathField(max_length=255)
208
209
210class Recipe_Dependency(models.Model):
211 TYPE_DEPENDS = 0
212 TYPE_RDEPENDS = 1
213
214 DEPENDS_TYPE = (
215 (TYPE_DEPENDS, "depends"),
216 (TYPE_RDEPENDS, "rdepends"),
217 )
218 recipe = models.ForeignKey(Recipe, related_name='r_dependencies_recipe')
219 depends_on = models.ForeignKey(Recipe, related_name='r_dependencies_depends')
220 dep_type = models.IntegerField(choices=DEPENDS_TYPE)
221
222class Layer(models.Model):
223 name = models.CharField(max_length=100)
224 local_path = models.FilePathField(max_length=255)
225 layer_index_url = models.URLField()
226
227
228class Layer_Version(models.Model):
229 layer = models.ForeignKey(Layer, related_name='layer_version_layer')
230 branch = models.CharField(max_length=50)
231 commit = models.CharField(max_length=100)
232 priority = models.IntegerField()
233
234
235class Variable(models.Model):
236 build = models.ForeignKey(Build, related_name='variable_build')
237 variable_name = models.CharField(max_length=100)
238 variable_value = models.TextField(blank=True)
239 file = models.FilePathField(max_length=255)
240 changed = models.BooleanField(default=False)
241 human_readable_name = models.CharField(max_length=200)
242 description = models.TextField(blank=True)
243
244
245class LogMessage(models.Model):
246 INFO = 0
247 WARNING = 1
248 ERROR = 2
249
250 LOG_LEVEL = ( (INFO, "info"),
251 (WARNING, "warn"),
252 (ERROR, "error") )
253
254 build = models.ForeignKey(Build)
255 level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
256 message=models.CharField(max_length=240)
257 pathname = models.FilePathField(max_length=255, blank=True)
258 lineno = models.IntegerField(null=True)