models.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  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. from django.db import models
  19. from django.utils.encoding import python_2_unicode_compatible
  20. class Build(models.Model):
  21. SUCCEEDED = 0
  22. FAILED = 1
  23. IN_PROGRESS = 2
  24. BUILD_OUTCOME = (
  25. (SUCCEEDED, 'Succeeded'),
  26. (FAILED, 'Failed'),
  27. (IN_PROGRESS, 'In Progress'),
  28. )
  29. search_allowed_fields = ['machine',
  30. 'cooker_log_path']
  31. machine = models.CharField(max_length=100)
  32. image_fstypes = models.CharField(max_length=100)
  33. distro = models.CharField(max_length=100)
  34. distro_version = models.CharField(max_length=100)
  35. started_on = models.DateTimeField()
  36. completed_on = models.DateTimeField()
  37. outcome = models.IntegerField(choices=BUILD_OUTCOME, default=IN_PROGRESS)
  38. errors_no = models.IntegerField(default=0)
  39. warnings_no = models.IntegerField(default=0)
  40. cooker_log_path = models.CharField(max_length=500)
  41. build_name = models.CharField(max_length=100)
  42. bitbake_version = models.CharField(max_length=50)
  43. @python_2_unicode_compatible
  44. class Target(models.Model):
  45. search_allowed_fields = ['target', 'image_fstypes', 'file_name']
  46. build = models.ForeignKey(Build)
  47. target = models.CharField(max_length=100)
  48. is_image = models.BooleanField(default = False)
  49. file_name = models.CharField(max_length=100)
  50. file_size = models.IntegerField()
  51. def __str__(self):
  52. return self.target
  53. class Task(models.Model):
  54. SSTATE_NA = 0
  55. SSTATE_MISS = 1
  56. SSTATE_FAILED = 2
  57. SSTATE_RESTORED = 3
  58. SSTATE_RESULT = (
  59. (SSTATE_NA, 'Not Applicable'), # For rest of tasks, but they still need checking.
  60. (SSTATE_MISS, 'Missing'), # it is a miss
  61. (SSTATE_FAILED, 'Failed'), # there was a pkg, but the script failed
  62. (SSTATE_RESTORED, 'Restored'), # succesfully restored
  63. )
  64. CODING_PYTHON = 0
  65. CODING_SHELL = 1
  66. TASK_CODING = (
  67. (CODING_PYTHON, 'Python'),
  68. (CODING_SHELL, 'Shell'),
  69. )
  70. OUTCOME_SUCCESS = 0
  71. OUTCOME_COVERED = 1
  72. OUTCOME_SSTATE = 2
  73. OUTCOME_EXISTING = 3
  74. OUTCOME_FAILED = 4
  75. OUTCOME_NA = 5
  76. TASK_OUTCOME = (
  77. (OUTCOME_SUCCESS, 'Succeeded'),
  78. (OUTCOME_COVERED, 'Covered'),
  79. (OUTCOME_SSTATE, 'Sstate'),
  80. (OUTCOME_EXISTING, 'Existing'),
  81. (OUTCOME_FAILED, 'Failed'),
  82. (OUTCOME_NA, 'Not Available'),
  83. )
  84. build = models.ForeignKey(Build, related_name='task_build')
  85. order = models.IntegerField(null=True)
  86. task_executed = models.BooleanField(default=False) # True means Executed, False means Prebuilt
  87. outcome = models.IntegerField(choices=TASK_OUTCOME, default=OUTCOME_NA)
  88. sstate_checksum = models.CharField(max_length=100, blank=True)
  89. path_to_sstate_obj = models.FilePathField(max_length=500, blank=True)
  90. recipe = models.ForeignKey('Recipe', related_name='build_recipe')
  91. task_name = models.CharField(max_length=100)
  92. source_url = models.FilePathField(max_length=255, blank=True)
  93. work_directory = models.FilePathField(max_length=255, blank=True)
  94. script_type = models.IntegerField(choices=TASK_CODING, default=CODING_PYTHON)
  95. line_number = models.IntegerField(default=0)
  96. disk_io = models.IntegerField(null=True)
  97. cpu_usage = models.DecimalField(max_digits=6, decimal_places=2, null=True)
  98. elapsed_time = models.CharField(max_length=50, default=0)
  99. sstate_result = models.IntegerField(choices=SSTATE_RESULT, default=SSTATE_NA)
  100. message = models.CharField(max_length=240)
  101. logfile = models.FilePathField(max_length=255, blank=True)
  102. class Meta:
  103. ordering = ('order', 'recipe' ,)
  104. class Task_Dependency(models.Model):
  105. task = models.ForeignKey(Task, related_name='task_dependencies_task')
  106. depends_on = models.ForeignKey(Task, related_name='task_dependencies_depends')
  107. class Build_Package(models.Model):
  108. build = models.ForeignKey('Build')
  109. recipe = models.ForeignKey('Recipe', null=True)
  110. name = models.CharField(max_length=100)
  111. version = models.CharField(max_length=100, blank=True)
  112. revision = models.CharField(max_length=32, blank=True)
  113. summary = models.CharField(max_length=200, blank=True)
  114. description = models.CharField(max_length=200, blank=True)
  115. size = models.IntegerField(default=0)
  116. section = models.CharField(max_length=80, blank=True)
  117. license = models.CharField(max_length=80, blank=True)
  118. class Build_Package_Dependency(models.Model):
  119. TYPE_RDEPENDS = 0
  120. TYPE_RPROVIDES = 1
  121. TYPE_RRECOMMENDS = 2
  122. TYPE_RSUGGESTS = 3
  123. TYPE_RREPLACES = 4
  124. TYPE_RCONFLICTS = 5
  125. DEPENDS_TYPE = (
  126. (TYPE_RDEPENDS, "rdepends"),
  127. (TYPE_RPROVIDES, "rprovides"),
  128. (TYPE_RRECOMMENDS, "rrecommends"),
  129. (TYPE_RSUGGESTS, "rsuggests"),
  130. (TYPE_RREPLACES, "rreplaces"),
  131. (TYPE_RCONFLICTS, "rconflicts"),
  132. )
  133. package = models.ForeignKey(Build_Package, related_name='bpackage_dependencies_package')
  134. depends_on = models.CharField(max_length=100) # soft dependency
  135. dep_type = models.IntegerField(choices=DEPENDS_TYPE)
  136. class Target_Package(models.Model):
  137. target = models.ForeignKey('Target')
  138. recipe = models.ForeignKey('Recipe', null=True)
  139. name = models.CharField(max_length=100)
  140. version = models.CharField(max_length=100, blank=True)
  141. size = models.IntegerField()
  142. class Target_Package_Dependency(models.Model):
  143. TYPE_DEPENDS = 0
  144. TYPE_RDEPENDS = 1
  145. TYPE_RECOMMENDS = 2
  146. DEPENDS_TYPE = (
  147. (TYPE_DEPENDS, "depends"),
  148. (TYPE_RDEPENDS, "rdepends"),
  149. (TYPE_RECOMMENDS, "recommends"),
  150. )
  151. package = models.ForeignKey(Target_Package, related_name='tpackage_dependencies_package')
  152. depends_on = models.ForeignKey(Target_Package, related_name='tpackage_dependencies_depends')
  153. dep_type = models.IntegerField(choices=DEPENDS_TYPE)
  154. class Build_File(models.Model):
  155. bpackage = models.ForeignKey(Build_Package, related_name='filelist_bpackage')
  156. path = models.FilePathField(max_length=255, blank=True)
  157. size = models.IntegerField()
  158. class Target_File(models.Model):
  159. tpackage = models.ForeignKey(Target_Package, related_name='filelist_tpackage')
  160. path = models.FilePathField(max_length=255, blank=True)
  161. size = models.IntegerField()
  162. class Recipe(models.Model):
  163. name = models.CharField(max_length=100, blank=True)
  164. version = models.CharField(max_length=100, blank=True)
  165. layer_version = models.ForeignKey('Layer_Version', related_name='recipe_layer_version')
  166. summary = models.CharField(max_length=100, blank=True)
  167. description = models.CharField(max_length=100, blank=True)
  168. section = models.CharField(max_length=100, blank=True)
  169. license = models.CharField(max_length=200, blank=True)
  170. licensing_info = models.TextField(blank=True)
  171. homepage = models.URLField(blank=True)
  172. bugtracker = models.URLField(blank=True)
  173. author = models.CharField(max_length=100, blank=True)
  174. file_path = models.FilePathField(max_length=255)
  175. class Recipe_Dependency(models.Model):
  176. TYPE_DEPENDS = 0
  177. TYPE_RDEPENDS = 1
  178. DEPENDS_TYPE = (
  179. (TYPE_DEPENDS, "depends"),
  180. (TYPE_RDEPENDS, "rdepends"),
  181. )
  182. recipe = models.ForeignKey(Recipe, related_name='r_dependencies_recipe')
  183. depends_on = models.ForeignKey(Recipe, related_name='r_dependencies_depends')
  184. dep_type = models.IntegerField(choices=DEPENDS_TYPE)
  185. class Layer(models.Model):
  186. name = models.CharField(max_length=100)
  187. local_path = models.FilePathField(max_length=255)
  188. layer_index_url = models.URLField()
  189. class Layer_Version(models.Model):
  190. layer = models.ForeignKey(Layer, related_name='layer_version_layer')
  191. branch = models.CharField(max_length=50)
  192. commit = models.CharField(max_length=100)
  193. priority = models.IntegerField()
  194. class Variable(models.Model):
  195. build = models.ForeignKey(Build, related_name='variable_build')
  196. variable_name = models.CharField(max_length=100)
  197. variable_value = models.TextField(blank=True)
  198. file = models.FilePathField(max_length=255)
  199. changed = models.BooleanField(default=False)
  200. human_readable_name = models.CharField(max_length=200)
  201. description = models.TextField(blank=True)
  202. class LogMessage(models.Model):
  203. INFO = 0
  204. WARNING = 1
  205. ERROR = 2
  206. LOG_LEVEL = ( (INFO, "info"),
  207. (WARNING, "warn"),
  208. (ERROR, "error") )
  209. build = models.ForeignKey(Build)
  210. level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
  211. message=models.CharField(max_length=240)
  212. pathname = models.FilePathField(max_length=255, blank=True)
  213. lineno = models.IntegerField(null=True)