squad 1.90__tar.gz → 1.92__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (641) hide show
  1. {squad-1.90 → squad-1.92}/CHANGELOG.md +44 -0
  2. {squad-1.90/squad.egg-info → squad-1.92}/PKG-INFO +1 -1
  3. {squad-1.90 → squad-1.92}/doc/install.rst +7 -0
  4. {squad-1.90 → squad-1.92}/setup.py +1 -1
  5. {squad-1.90 → squad-1.92}/squad/api/ci.py +11 -6
  6. squad-1.92/squad/api/prometheus.py +52 -0
  7. {squad-1.90 → squad-1.92}/squad/api/urls.py +2 -0
  8. {squad-1.90 → squad-1.92}/squad/ci/backend/fake.py +3 -0
  9. {squad-1.90 → squad-1.92}/squad/ci/backend/lava.py +6 -1
  10. {squad-1.90 → squad-1.92}/squad/ci/backend/null.py +6 -0
  11. {squad-1.90 → squad-1.92}/squad/ci/backend/tuxsuite.py +39 -8
  12. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project.jinja2 +8 -0
  13. {squad-1.90 → squad-1.92}/squad/frontend/urls.py +1 -0
  14. {squad-1.90 → squad-1.92}/squad/plugins/lib/base_log_parser.py +11 -6
  15. {squad-1.90 → squad-1.92}/squad/plugins/linux_log_parser.py +14 -11
  16. {squad-1.90 → squad-1.92}/squad/settings.py +2 -0
  17. squad-1.92/squad/version.py +1 -0
  18. {squad-1.90 → squad-1.92/squad.egg-info}/PKG-INFO +1 -1
  19. {squad-1.90 → squad-1.92}/squad.egg-info/SOURCES.txt +6 -1
  20. {squad-1.90 → squad-1.92}/squad.egg-info/requires.txt +1 -1
  21. {squad-1.90 → squad-1.92}/test/api/test_ci.py +9 -0
  22. {squad-1.90 → squad-1.92}/test/ci/backend/test_lava.py +6 -0
  23. {squad-1.90 → squad-1.92}/test/ci/backend/test_tuxsuite.py +186 -42
  24. {squad-1.90 → squad-1.92}/test/frontend/test_tests.py +2 -0
  25. squad-1.92/test/plugins/linux_log_parser/internal-error-oops.log +1017 -0
  26. squad-1.92/test/plugins/linux_log_parser/kcsan_full_log.log +3120 -0
  27. squad-1.92/test/plugins/linux_log_parser/kcsan_simple.log +37 -0
  28. squad-1.92/test/plugins/linux_log_parser/kernelpanic-multiline.log +1742 -0
  29. {squad-1.90 → squad-1.92}/test/plugins/test_linux_log_parser.py +80 -52
  30. {squad-1.90 → squad-1.92}/test/plugins/test_log_parser_base.py +21 -0
  31. squad-1.90/squad/version.py +0 -1
  32. {squad-1.90 → squad-1.92}/.ackrc +0 -0
  33. {squad-1.90 → squad-1.92}/.coveragerc +0 -0
  34. {squad-1.90 → squad-1.92}/.ctags +0 -0
  35. {squad-1.90 → squad-1.92}/.dockerignore +0 -0
  36. {squad-1.90 → squad-1.92}/.gitignore +0 -0
  37. {squad-1.90 → squad-1.92}/.mailmap +0 -0
  38. {squad-1.90 → squad-1.92}/.readthedocs.yml +0 -0
  39. {squad-1.90 → squad-1.92}/.reuse/dep5 +0 -0
  40. {squad-1.90 → squad-1.92}/COPYING +0 -0
  41. {squad-1.90 → squad-1.92}/COPYRIGHTS +0 -0
  42. {squad-1.90 → squad-1.92}/Dockerfile +0 -0
  43. {squad-1.90 → squad-1.92}/LICENSES/GPL-3.0-or-later.txt +0 -0
  44. {squad-1.90 → squad-1.92}/LICENSES/MIT.txt +0 -0
  45. {squad-1.90 → squad-1.92}/LICENSES/OFL-1.1.txt +0 -0
  46. {squad-1.90 → squad-1.92}/MANIFEST.in +0 -0
  47. {squad-1.90 → squad-1.92}/Procfile +0 -0
  48. {squad-1.90 → squad-1.92}/README.rst +0 -0
  49. {squad-1.90 → squad-1.92}/babel.cfg +0 -0
  50. {squad-1.90 → squad-1.92}/dev-docker +0 -0
  51. {squad-1.90 → squad-1.92}/doc/.gitignore +0 -0
  52. {squad-1.90 → squad-1.92}/doc/Makefile +0 -0
  53. {squad-1.90 → squad-1.92}/doc/api.rst +0 -0
  54. {squad-1.90 → squad-1.92}/doc/ci.rst +0 -0
  55. {squad-1.90 → squad-1.92}/doc/conf.py +0 -0
  56. {squad-1.90 → squad-1.92}/doc/hacking.rst +0 -0
  57. {squad-1.90 → squad-1.92}/doc/index.rst +0 -0
  58. {squad-1.90 → squad-1.92}/doc/intro.rst +0 -0
  59. {squad-1.90 → squad-1.92}/doc/lava_usecase.rst +0 -0
  60. {squad-1.90 → squad-1.92}/doc/plugins.rst +0 -0
  61. {squad-1.90 → squad-1.92}/doc/quickstart.rst +0 -0
  62. {squad-1.90 → squad-1.92}/doc/translating.rst +0 -0
  63. {squad-1.90 → squad-1.92}/doc/tuxsuite_usecase.rst +0 -0
  64. {squad-1.90 → squad-1.92}/docker/db-dumped +0 -0
  65. {squad-1.90 → squad-1.92}/docker/db-to-be-restored +0 -0
  66. {squad-1.90 → squad-1.92}/docker/docker-compose.yml +0 -0
  67. {squad-1.90 → squad-1.92}/docker/extra_settings.py +0 -0
  68. {squad-1.90 → squad-1.92}/docker/init-db.sh +0 -0
  69. {squad-1.90 → squad-1.92}/docker/rabbitmq.config +0 -0
  70. {squad-1.90 → squad-1.92}/docker/squad-apache.conf +0 -0
  71. {squad-1.90 → squad-1.92}/docker-compose.yaml +0 -0
  72. {squad-1.90 → squad-1.92}/manage.py +0 -0
  73. {squad-1.90 → squad-1.92}/package-lock.json +0 -0
  74. {squad-1.90 → squad-1.92}/package.json +0 -0
  75. {squad-1.90 → squad-1.92}/pytest.ini +0 -0
  76. {squad-1.90 → squad-1.92}/requirements-dev.txt +0 -0
  77. {squad-1.90 → squad-1.92}/requirements.txt +0 -0
  78. {squad-1.90 → squad-1.92}/scripts/build +0 -0
  79. {squad-1.90 → squad-1.92}/scripts/check-ci +0 -0
  80. {squad-1.90 → squad-1.92}/scripts/check-ignore +0 -0
  81. {squad-1.90 → squad-1.92}/scripts/community_connector/main.js +0 -0
  82. {squad-1.90 → squad-1.92}/scripts/community_connector/manifest.json +0 -0
  83. {squad-1.90 → squad-1.92}/scripts/dogfood +0 -0
  84. {squad-1.90 → squad-1.92}/scripts/get-metrics +0 -0
  85. {squad-1.90 → squad-1.92}/scripts/get-tests +0 -0
  86. {squad-1.90 → squad-1.92}/scripts/git-build +0 -0
  87. {squad-1.90 → squad-1.92}/scripts/pytest +0 -0
  88. {squad-1.90 → squad-1.92}/scripts/rabbitmq-server +0 -0
  89. {squad-1.90 → squad-1.92}/scripts/release +0 -0
  90. {squad-1.90 → squad-1.92}/scripts/release-docker +0 -0
  91. {squad-1.90 → squad-1.92}/scripts/squad-config +0 -0
  92. {squad-1.90 → squad-1.92}/scripts/test-ci +0 -0
  93. {squad-1.90 → squad-1.92}/scripts/test-docker +0 -0
  94. {squad-1.90 → squad-1.92}/scripts/testdata/gen-ci-jobs +0 -0
  95. {squad-1.90 → squad-1.92}/scripts/testdata/gen-metrics +0 -0
  96. {squad-1.90 → squad-1.92}/scripts/testdata/gen-test-data +0 -0
  97. {squad-1.90 → squad-1.92}/scripts/testdata/gen-tests +0 -0
  98. {squad-1.90 → squad-1.92}/scripts/testdata/setup-dev +0 -0
  99. {squad-1.90 → squad-1.92}/scripts/testdata/submit-ci-jobs +0 -0
  100. {squad-1.90 → squad-1.92}/scripts/testdata/submit-test-data +0 -0
  101. {squad-1.90 → squad-1.92}/scripts/translate +0 -0
  102. {squad-1.90 → squad-1.92}/scripts/travis-lava +0 -0
  103. {squad-1.90 → squad-1.92}/scripts/update-translation-files +0 -0
  104. {squad-1.90 → squad-1.92}/setup.cfg +0 -0
  105. {squad-1.90 → squad-1.92}/squad/__init__.py +0 -0
  106. {squad-1.90 → squad-1.92}/squad/admin.py +0 -0
  107. {squad-1.90 → squad-1.92}/squad/api/__init__.py +0 -0
  108. {squad-1.90 → squad-1.92}/squad/api/apps.py +0 -0
  109. {squad-1.90 → squad-1.92}/squad/api/data.py +0 -0
  110. {squad-1.90 → squad-1.92}/squad/api/filters.py +0 -0
  111. {squad-1.90 → squad-1.92}/squad/api/rest.py +0 -0
  112. {squad-1.90 → squad-1.92}/squad/api/utils.py +0 -0
  113. {squad-1.90 → squad-1.92}/squad/api/views.py +0 -0
  114. {squad-1.90 → squad-1.92}/squad/celery.py +0 -0
  115. {squad-1.90 → squad-1.92}/squad/ci/__init__.py +0 -0
  116. {squad-1.90 → squad-1.92}/squad/ci/admin.py +0 -0
  117. {squad-1.90 → squad-1.92}/squad/ci/apps.py +0 -0
  118. {squad-1.90 → squad-1.92}/squad/ci/backend/__init__.py +0 -0
  119. {squad-1.90 → squad-1.92}/squad/ci/exceptions.py +0 -0
  120. {squad-1.90 → squad-1.92}/squad/ci/management/__init__.py +0 -0
  121. {squad-1.90 → squad-1.92}/squad/ci/management/commands/__init__.py +0 -0
  122. {squad-1.90 → squad-1.92}/squad/ci/management/commands/create_tuxsuite_boot_tests.py +0 -0
  123. {squad-1.90 → squad-1.92}/squad/ci/management/commands/listen.py +0 -0
  124. {squad-1.90 → squad-1.92}/squad/ci/management/commands/testfetch.py +0 -0
  125. {squad-1.90 → squad-1.92}/squad/ci/migrations/0001_initial.py +0 -0
  126. {squad-1.90 → squad-1.92}/squad/ci/migrations/0002_auto_20170406_1252.py +0 -0
  127. {squad-1.90 → squad-1.92}/squad/ci/migrations/0003_backend_name.py +0 -0
  128. {squad-1.90 → squad-1.92}/squad/ci/migrations/0004_testjob_failure.py +0 -0
  129. {squad-1.90 → squad-1.92}/squad/ci/migrations/0005_remove_listener_data.py +0 -0
  130. {squad-1.90 → squad-1.92}/squad/ci/migrations/0006_simplify_backend_loading.py +0 -0
  131. {squad-1.90 → squad-1.92}/squad/ci/migrations/0007_auto_20170517_1736.py +0 -0
  132. {squad-1.90 → squad-1.92}/squad/ci/migrations/0008_testjob_testrun.py +0 -0
  133. {squad-1.90 → squad-1.92}/squad/ci/migrations/0009_slug_pattern.py +0 -0
  134. {squad-1.90 → squad-1.92}/squad/ci/migrations/0010_testjob_can_resubmit.py +0 -0
  135. {squad-1.90 → squad-1.92}/squad/ci/migrations/0011_testjob_resubmitted_count.py +0 -0
  136. {squad-1.90 → squad-1.92}/squad/ci/migrations/0012_testjob_build.py +0 -0
  137. {squad-1.90 → squad-1.92}/squad/ci/migrations/0013_testjob_name.py +0 -0
  138. {squad-1.90 → squad-1.92}/squad/ci/migrations/0014_testjob_target_build.py +0 -0
  139. {squad-1.90 → squad-1.92}/squad/ci/migrations/0015_testjob_populate_target_build.py +0 -0
  140. {squad-1.90 → squad-1.92}/squad/ci/migrations/0016_backend_max_fetch_attempts.py +0 -0
  141. {squad-1.90 → squad-1.92}/squad/ci/migrations/0017_testjob_fetch_attempts.py +0 -0
  142. {squad-1.90 → squad-1.92}/squad/ci/migrations/0018_testjob_dates.py +0 -0
  143. {squad-1.90 → squad-1.92}/squad/ci/migrations/0019_add_fake_backend.py +0 -0
  144. {squad-1.90 → squad-1.92}/squad/ci/migrations/0020_backend_settings_field.py +0 -0
  145. {squad-1.90 → squad-1.92}/squad/ci/migrations/0021_testjob_parent_job.py +0 -0
  146. {squad-1.90 → squad-1.92}/squad/ci/migrations/0022_backend_poll_enabled.py +0 -0
  147. {squad-1.90 → squad-1.92}/squad/ci/migrations/0023_remove_testjob_build.py +0 -0
  148. {squad-1.90 → squad-1.92}/squad/ci/migrations/0024_fix_testjob_environment_validation.py +0 -0
  149. {squad-1.90 → squad-1.92}/squad/ci/migrations/0025_backend_listen_enabled.py +0 -0
  150. {squad-1.90 → squad-1.92}/squad/ci/migrations/0026_job_start_end_time.py +0 -0
  151. {squad-1.90 → squad-1.92}/squad/ci/migrations/0027_add_tuxsuite_implementation_type.py +0 -0
  152. {squad-1.90 → squad-1.92}/squad/ci/migrations/0028_create_testjob_indexes.py +0 -0
  153. {squad-1.90 → squad-1.92}/squad/ci/migrations/0029_create_testjob_results_input.py +0 -0
  154. {squad-1.90 → squad-1.92}/squad/ci/migrations/0030_testjob_subtasks_count.py +0 -0
  155. {squad-1.90 → squad-1.92}/squad/ci/migrations/__init__.py +0 -0
  156. {squad-1.90 → squad-1.92}/squad/ci/models.py +0 -0
  157. {squad-1.90 → squad-1.92}/squad/ci/tasks.py +0 -0
  158. {squad-1.90 → squad-1.92}/squad/ci/templates/squad/ci/testjob_resubmit.html.jinja2 +0 -0
  159. {squad-1.90 → squad-1.92}/squad/ci/templates/squad/ci/testjob_resubmit.txt.jinja2 +0 -0
  160. {squad-1.90 → squad-1.92}/squad/ci/templatetags/__init__.py +0 -0
  161. {squad-1.90 → squad-1.92}/squad/ci/templatetags/filter_jobs.py +0 -0
  162. {squad-1.90 → squad-1.92}/squad/ci/utils.py +0 -0
  163. {squad-1.90 → squad-1.92}/squad/compat.py +0 -0
  164. {squad-1.90 → squad-1.92}/squad/container_settings.py +0 -0
  165. {squad-1.90 → squad-1.92}/squad/core/__init__.py +0 -0
  166. {squad-1.90 → squad-1.92}/squad/core/admin.py +0 -0
  167. {squad-1.90 → squad-1.92}/squad/core/apps.py +0 -0
  168. {squad-1.90 → squad-1.92}/squad/core/callback.py +0 -0
  169. {squad-1.90 → squad-1.92}/squad/core/comparison.py +0 -0
  170. {squad-1.90 → squad-1.92}/squad/core/data.py +0 -0
  171. {squad-1.90 → squad-1.92}/squad/core/failures.py +0 -0
  172. {squad-1.90 → squad-1.92}/squad/core/history.py +0 -0
  173. {squad-1.90 → squad-1.92}/squad/core/locale/django.pot +0 -0
  174. {squad-1.90 → squad-1.92}/squad/core/locale/es_MX/LC_MESSAGES/django.po +0 -0
  175. {squad-1.90 → squad-1.92}/squad/core/locale/pl/LC_MESSAGES/django.po +0 -0
  176. {squad-1.90 → squad-1.92}/squad/core/locale/pt/LC_MESSAGES/django.po +0 -0
  177. {squad-1.90 → squad-1.92}/squad/core/locale/pt_BR/LC_MESSAGES/django.po +0 -0
  178. {squad-1.90 → squad-1.92}/squad/core/management/__init__.py +0 -0
  179. {squad-1.90 → squad-1.92}/squad/core/management/commands/__init__.py +0 -0
  180. {squad-1.90 → squad-1.92}/squad/core/management/commands/compute_build_summaries.py +0 -0
  181. {squad-1.90 → squad-1.92}/squad/core/management/commands/compute_project_statuses.py +0 -0
  182. {squad-1.90 → squad-1.92}/squad/core/management/commands/fill_test_metadata.py +0 -0
  183. {squad-1.90 → squad-1.92}/squad/core/management/commands/fix_squadplugin_data.py +0 -0
  184. {squad-1.90 → squad-1.92}/squad/core/management/commands/import_data.py +0 -0
  185. {squad-1.90 → squad-1.92}/squad/core/management/commands/import_data.rst +0 -0
  186. {squad-1.90 → squad-1.92}/squad/core/management/commands/migrate_test_runs.py +0 -0
  187. {squad-1.90 → squad-1.92}/squad/core/management/commands/populate_metric_build_and_environment.py +0 -0
  188. {squad-1.90 → squad-1.92}/squad/core/management/commands/populate_test_build_and_environment.py +0 -0
  189. {squad-1.90 → squad-1.92}/squad/core/management/commands/prepdump.py +0 -0
  190. {squad-1.90 → squad-1.92}/squad/core/management/commands/send-email.py +0 -0
  191. {squad-1.90 → squad-1.92}/squad/core/management/commands/update_project_statuses.py +0 -0
  192. {squad-1.90 → squad-1.92}/squad/core/management/commands/users.py +0 -0
  193. {squad-1.90 → squad-1.92}/squad/core/migrations/0001_initial.py +0 -0
  194. {squad-1.90 → squad-1.92}/squad/core/migrations/0002_auto_20160525_1403.py +0 -0
  195. {squad-1.90 → squad-1.92}/squad/core/migrations/0003_testrun_log_file.py +0 -0
  196. {squad-1.90 → squad-1.92}/squad/core/migrations/0004_group_user_groups.py +0 -0
  197. {squad-1.90 → squad-1.92}/squad/core/migrations/0005_token.py +0 -0
  198. {squad-1.90 → squad-1.92}/squad/core/migrations/0006_auto_20160826_2242.py +0 -0
  199. {squad-1.90 → squad-1.92}/squad/core/migrations/0007_testrun_data_processed.py +0 -0
  200. {squad-1.90 → squad-1.92}/squad/core/migrations/0008_status.py +0 -0
  201. {squad-1.90 → squad-1.92}/squad/core/migrations/0009_testrun_status_recorded.py +0 -0
  202. {squad-1.90 → squad-1.92}/squad/core/migrations/0010_testrun_datetime.py +0 -0
  203. {squad-1.90 → squad-1.92}/squad/core/migrations/0011_testrun_metadata_fields.py +0 -0
  204. {squad-1.90 → squad-1.92}/squad/core/migrations/0012_build_datetime.py +0 -0
  205. {squad-1.90 → squad-1.92}/squad/core/migrations/0013_testrun_resubmit_url.py +0 -0
  206. {squad-1.90 → squad-1.92}/squad/core/migrations/0014_testrun_metadata_file.py +0 -0
  207. {squad-1.90 → squad-1.92}/squad/core/migrations/0015_attachment.py +0 -0
  208. {squad-1.90 → squad-1.92}/squad/core/migrations/0016_project_is_public.py +0 -0
  209. {squad-1.90 → squad-1.92}/squad/core/migrations/0017_slug_validator.py +0 -0
  210. {squad-1.90 → squad-1.92}/squad/core/migrations/0018_build_name.py +0 -0
  211. {squad-1.90 → squad-1.92}/squad/core/migrations/0019_build_version.py +0 -0
  212. {squad-1.90 → squad-1.92}/squad/core/migrations/0020_build_ordering.py +0 -0
  213. {squad-1.90 → squad-1.92}/squad/core/migrations/0021_global_tokens.py +0 -0
  214. {squad-1.90 → squad-1.92}/squad/core/migrations/0022_projectstatus.py +0 -0
  215. {squad-1.90 → squad-1.92}/squad/core/migrations/0023_subscription.py +0 -0
  216. {squad-1.90 → squad-1.92}/squad/core/migrations/0024_project_build_completion_threshold.py +0 -0
  217. {squad-1.90 → squad-1.92}/squad/core/migrations/0025_unique_testrun_job_id.py +0 -0
  218. {squad-1.90 → squad-1.92}/squad/core/migrations/0026_testrun_result_accept_null.py +0 -0
  219. {squad-1.90 → squad-1.92}/squad/core/migrations/0027_project_notification_strategy.py +0 -0
  220. {squad-1.90 → squad-1.92}/squad/core/migrations/0028_suite_and_test_name_length.py +0 -0
  221. {squad-1.90 → squad-1.92}/squad/core/migrations/0029_subscription_email_formats.py +0 -0
  222. {squad-1.90 → squad-1.92}/squad/core/migrations/0030_remove_project_build_completion_threshold.py +0 -0
  223. {squad-1.90 → squad-1.92}/squad/core/migrations/0031_environment_expected_test_runs.py +0 -0
  224. {squad-1.90 → squad-1.92}/squad/core/migrations/0032_testrun_completed.py +0 -0
  225. {squad-1.90 → squad-1.92}/squad/core/migrations/0033_drop_debversion.py +0 -0
  226. {squad-1.90 → squad-1.92}/squad/core/migrations/0034_prepare_to_remove_build_name.py +0 -0
  227. {squad-1.90 → squad-1.92}/squad/core/migrations/0035_remove_build_name.py +0 -0
  228. {squad-1.90 → squad-1.92}/squad/core/migrations/0036_status_tests_skip.py +0 -0
  229. {squad-1.90 → squad-1.92}/squad/core/migrations/0037_project_status_test_summary_fields.py +0 -0
  230. {squad-1.90 → squad-1.92}/squad/core/migrations/0038_populate_project_status_cache.py +0 -0
  231. {squad-1.90 → squad-1.92}/squad/core/migrations/0039_orderings.py +0 -0
  232. {squad-1.90 → squad-1.92}/squad/core/migrations/0040_remove_subscription_html.py +0 -0
  233. {squad-1.90 → squad-1.92}/squad/core/migrations/0041_projectstatus_notified.py +0 -0
  234. {squad-1.90 → squad-1.92}/squad/core/migrations/0042_set_projectstatus_notified.py +0 -0
  235. {squad-1.90 → squad-1.92}/squad/core/migrations/0043_project_status_build.py +0 -0
  236. {squad-1.90 → squad-1.92}/squad/core/migrations/0044_project_html_mail.py +0 -0
  237. {squad-1.90 → squad-1.92}/squad/core/migrations/0045_adminsubscription.py +0 -0
  238. {squad-1.90 → squad-1.92}/squad/core/migrations/0046_projectstatus_last_updated.py +0 -0
  239. {squad-1.90 → squad-1.92}/squad/core/migrations/0047_populate_projectstatus_last_updated.py +0 -0
  240. {squad-1.90 → squad-1.92}/squad/core/migrations/0048_moderate_notifications.py +0 -0
  241. {squad-1.90 → squad-1.92}/squad/core/migrations/0049_projectstatus_plural.py +0 -0
  242. {squad-1.90 → squad-1.92}/squad/core/migrations/0050_projectstatus_finished.py +0 -0
  243. {squad-1.90 → squad-1.92}/squad/core/migrations/0051_build_status.py +0 -0
  244. {squad-1.90 → squad-1.92}/squad/core/migrations/0052_recreate_projectstatus_data.py +0 -0
  245. {squad-1.90 → squad-1.92}/squad/core/migrations/0053_remove_projectstatus_previous.py +0 -0
  246. {squad-1.90 → squad-1.92}/squad/core/migrations/0054_custom_email_template.py +0 -0
  247. {squad-1.90 → squad-1.92}/squad/core/migrations/0055_emailtemplate_subject.py +0 -0
  248. {squad-1.90 → squad-1.92}/squad/core/migrations/0056_project_description.py +0 -0
  249. {squad-1.90 → squad-1.92}/squad/core/migrations/0057_projectstatus_has_metrics.py +0 -0
  250. {squad-1.90 → squad-1.92}/squad/core/migrations/0058_populate_projectstatus_has_metrics.py +0 -0
  251. {squad-1.90 → squad-1.92}/squad/core/migrations/0059_project_important_metadata_keys.py +0 -0
  252. {squad-1.90 → squad-1.92}/squad/core/migrations/0060_test_log.py +0 -0
  253. {squad-1.90 → squad-1.92}/squad/core/migrations/0061_project_enabled_plugins_list.py +0 -0
  254. {squad-1.90 → squad-1.92}/squad/core/migrations/0062_project_allow_empty_enabled_plugin_list.py +0 -0
  255. {squad-1.90 → squad-1.92}/squad/core/migrations/0063_project_wait_before_notification.py +0 -0
  256. {squad-1.90 → squad-1.92}/squad/core/migrations/0064_project_notification_timeout.py +0 -0
  257. {squad-1.90 → squad-1.92}/squad/core/migrations/0065_projectstatus_notified_on_timeout.py +0 -0
  258. {squad-1.90 → squad-1.92}/squad/core/migrations/0066_environment_description.py +0 -0
  259. {squad-1.90 → squad-1.92}/squad/core/migrations/0067_accept_blank_suite_name.py +0 -0
  260. {squad-1.90 → squad-1.92}/squad/core/migrations/0068_suite_version.py +0 -0
  261. {squad-1.90 → squad-1.92}/squad/core/migrations/0069_suite_metadata.py +0 -0
  262. {squad-1.90 → squad-1.92}/squad/core/migrations/0070_create_suite_test_and_metric_metadata.py +0 -0
  263. {squad-1.90 → squad-1.92}/squad/core/migrations/0071_migrate_old_tokens.py +0 -0
  264. {squad-1.90 → squad-1.92}/squad/core/migrations/0072_group_description.py +0 -0
  265. {squad-1.90 → squad-1.92}/squad/core/migrations/0073_auto_20180420_1643.py +0 -0
  266. {squad-1.90 → squad-1.92}/squad/core/migrations/0074_add_indexes.py +0 -0
  267. {squad-1.90 → squad-1.92}/squad/core/migrations/0075_update_project_enabled_plugin_list.py +0 -0
  268. {squad-1.90 → squad-1.92}/squad/core/migrations/0076_patch_builds.py +0 -0
  269. {squad-1.90 → squad-1.92}/squad/core/migrations/0077_knownissue.py +0 -0
  270. {squad-1.90 → squad-1.92}/squad/core/migrations/0078_cache_test_run_counts.py +0 -0
  271. {squad-1.90 → squad-1.92}/squad/core/migrations/0079_init_cache_test_run_counts.py +0 -0
  272. {squad-1.90 → squad-1.92}/squad/core/migrations/0080_auto_20180810_0047.py +0 -0
  273. {squad-1.90 → squad-1.92}/squad/core/migrations/0081_status_has_metrics.py +0 -0
  274. {squad-1.90 → squad-1.92}/squad/core/migrations/0082_populate_status_has_metrics.py +0 -0
  275. {squad-1.90 → squad-1.92}/squad/core/migrations/0083_rename_knownissue_environments.py +0 -0
  276. {squad-1.90 → squad-1.92}/squad/core/migrations/0084_projectstatus_regressions_fixes.py +0 -0
  277. {squad-1.90 → squad-1.92}/squad/core/migrations/0085_projectstatus_defaults.py +0 -0
  278. {squad-1.90 → squad-1.92}/squad/core/migrations/0086_xfail.py +0 -0
  279. {squad-1.90 → squad-1.92}/squad/core/migrations/0087_test_known_issues.py +0 -0
  280. {squad-1.90 → squad-1.92}/squad/core/migrations/0088_user_subscriptions.py +0 -0
  281. {squad-1.90 → squad-1.92}/squad/core/migrations/0089_test_has_known_issues.py +0 -0
  282. {squad-1.90 → squad-1.92}/squad/core/migrations/0090_populate_test_has_known_issues.py +0 -0
  283. {squad-1.90 → squad-1.92}/squad/core/migrations/0091_notification_delivery_remove_unique_status.py +0 -0
  284. {squad-1.90 → squad-1.92}/squad/core/migrations/0092_annotation.py +0 -0
  285. {squad-1.90 → squad-1.92}/squad/core/migrations/0093_historicalemailtemplate.py +0 -0
  286. {squad-1.90 → squad-1.92}/squad/core/migrations/0094_populatehistoricalemailtemplate.py +0 -0
  287. {squad-1.90 → squad-1.92}/squad/core/migrations/0095_project_data_retention_days.py +0 -0
  288. {squad-1.90 → squad-1.92}/squad/core/migrations/0096_build_keep_data.py +0 -0
  289. {squad-1.90 → squad-1.92}/squad/core/migrations/0097_build_placeholder.py +0 -0
  290. {squad-1.90 → squad-1.92}/squad/core/migrations/0098_blank_annotation.py +0 -0
  291. {squad-1.90 → squad-1.92}/squad/core/migrations/0099_metricthreshold.py +0 -0
  292. {squad-1.90 → squad-1.92}/squad/core/migrations/0100_metric_is_outlier.py +0 -0
  293. {squad-1.90 → squad-1.92}/squad/core/migrations/0101_project_project_settings.py +0 -0
  294. {squad-1.90 → squad-1.92}/squad/core/migrations/0102_projectstatus_null_metric_summary.py +0 -0
  295. {squad-1.90 → squad-1.92}/squad/core/migrations/0103_populate_project_status.py +0 -0
  296. {squad-1.90 → squad-1.92}/squad/core/migrations/0104_delayedreport.py +0 -0
  297. {squad-1.90 → squad-1.92}/squad/core/migrations/0105_delayed_report_error_message.py +0 -0
  298. {squad-1.90 → squad-1.92}/squad/core/migrations/0106_delayedreport_output_subject.py +0 -0
  299. {squad-1.90 → squad-1.92}/squad/core/migrations/0107_move_notification_strategy.py +0 -0
  300. {squad-1.90 → squad-1.92}/squad/core/migrations/0108_add_email_template_validator.py +0 -0
  301. {squad-1.90 → squad-1.92}/squad/core/migrations/0109_group_member.py +0 -0
  302. {squad-1.90 → squad-1.92}/squad/core/migrations/0110_move_users_from_django_groups_to_squad_groups.py +0 -0
  303. {squad-1.90 → squad-1.92}/squad/core/migrations/0111_remove_group_user_groups.py +0 -0
  304. {squad-1.90 → squad-1.92}/squad/core/migrations/0112_user_namespaces.py +0 -0
  305. {squad-1.90 → squad-1.92}/squad/core/migrations/0113_group_project_blank_name_and_description.py +0 -0
  306. {squad-1.90 → squad-1.92}/squad/core/migrations/0114_project_enabled_plugin_list_can_be_blank.py +0 -0
  307. {squad-1.90 → squad-1.92}/squad/core/migrations/0115_fix_slug_validation.py +0 -0
  308. {squad-1.90 → squad-1.92}/squad/core/migrations/0116_make_group_membership_unique.py +0 -0
  309. {squad-1.90 → squad-1.92}/squad/core/migrations/0117_drop_obsolete_token_model.py +0 -0
  310. {squad-1.90 → squad-1.92}/squad/core/migrations/0118_project_is_archived.py +0 -0
  311. {squad-1.90 → squad-1.92}/squad/core/migrations/0119_i18n.py +0 -0
  312. {squad-1.90 → squad-1.92}/squad/core/migrations/0120_buildsummary.py +0 -0
  313. {squad-1.90 → squad-1.92}/squad/core/migrations/0121_add_password_patchsource.py +0 -0
  314. {squad-1.90 → squad-1.92}/squad/core/migrations/0122_fix_patchsource_url_and_token.py +0 -0
  315. {squad-1.90 → squad-1.92}/squad/core/migrations/0123_django_upgrade_missing_migrations.py +0 -0
  316. {squad-1.90 → squad-1.92}/squad/core/migrations/0124_set_default_expected_test_runs_to_zero.py +0 -0
  317. {squad-1.90 → squad-1.92}/squad/core/migrations/0125_fix_missing_status_has_metrics_for_testruns.py +0 -0
  318. {squad-1.90 → squad-1.92}/squad/core/migrations/0126_metricthreshold_environment.py +0 -0
  319. {squad-1.90 → squad-1.92}/squad/core/migrations/0127_metric_thresholds_migrate_data.py +0 -0
  320. {squad-1.90 → squad-1.92}/squad/core/migrations/0128_metric_thresholds_remove_proj_col.py +0 -0
  321. {squad-1.90 → squad-1.92}/squad/core/migrations/0129_projectstatus_nullable_notified_on_timeout.py +0 -0
  322. {squad-1.90 → squad-1.92}/squad/core/migrations/0130_project_status_baseline_next.py +0 -0
  323. {squad-1.90 → squad-1.92}/squad/core/migrations/0131_create_squad_auth_group_and_add_users.py +0 -0
  324. {squad-1.90 → squad-1.92}/squad/core/migrations/0132_attachment_mimetype.py +0 -0
  325. {squad-1.90 → squad-1.92}/squad/core/migrations/0133_append_project_permissions_to_squad_auth_group.py +0 -0
  326. {squad-1.90 → squad-1.92}/squad/core/migrations/0134_longer_metric_name.py +0 -0
  327. {squad-1.90 → squad-1.92}/squad/core/migrations/0135_add_privileged_access_level.py +0 -0
  328. {squad-1.90 → squad-1.92}/squad/core/migrations/0136_migrate_submitters_to_privileged.py +0 -0
  329. {squad-1.90 → squad-1.92}/squad/core/migrations/0137_patchsource_token_null.py +0 -0
  330. {squad-1.90 → squad-1.92}/squad/core/migrations/0138_metric_unit.py +0 -0
  331. {squad-1.90 → squad-1.92}/squad/core/migrations/0139_nullable_test_name.py +0 -0
  332. {squad-1.90 → squad-1.92}/squad/core/migrations/0140_increase_gerrit_password_length.py +0 -0
  333. {squad-1.90 → squad-1.92}/squad/core/migrations/0141_remove_test_name.py +0 -0
  334. {squad-1.90 → squad-1.92}/squad/core/migrations/0142_add_testrun_file_storage.py +0 -0
  335. {squad-1.90 → squad-1.92}/squad/core/migrations/0143_attachment_storage.py +0 -0
  336. {squad-1.90 → squad-1.92}/squad/core/migrations/0144_attachment_data_null.py +0 -0
  337. {squad-1.90 → squad-1.92}/squad/core/migrations/0145_pluginscratch.py +0 -0
  338. {squad-1.90 → squad-1.92}/squad/core/migrations/0146_deprecate_testrun_and_attachment_data_fields.py +0 -0
  339. {squad-1.90 → squad-1.92}/squad/core/migrations/0147_add_build_and_environment_to_test.py +0 -0
  340. {squad-1.90 → squad-1.92}/squad/core/migrations/0148_remove_legacy_storage_fields.py +0 -0
  341. {squad-1.90 → squad-1.92}/squad/core/migrations/0149_build_patch_url.py +0 -0
  342. {squad-1.90 → squad-1.92}/squad/core/migrations/0150_add_new_notification_strategy.py +0 -0
  343. {squad-1.90 → squad-1.92}/squad/core/migrations/0151_callback.py +0 -0
  344. {squad-1.90 → squad-1.92}/squad/core/migrations/0152_add_build_patch_notified.py +0 -0
  345. {squad-1.90 → squad-1.92}/squad/core/migrations/0153_callback_make_response_content_blob.py +0 -0
  346. {squad-1.90 → squad-1.92}/squad/core/migrations/0154_project_add_force_finishing_builds_field.py +0 -0
  347. {squad-1.90 → squad-1.92}/squad/core/migrations/0155_add_build_and_environment_to_metric.py +0 -0
  348. {squad-1.90 → squad-1.92}/squad/core/migrations/0156_nullable_metric_name.py +0 -0
  349. {squad-1.90 → squad-1.92}/squad/core/migrations/0157_remove_metric_name.py +0 -0
  350. {squad-1.90 → squad-1.92}/squad/core/migrations/0158_add_metric_comparison_to_projectstatus.py +0 -0
  351. {squad-1.90 → squad-1.92}/squad/core/migrations/0159_nullable_metricthreshold_value.py +0 -0
  352. {squad-1.90 → squad-1.92}/squad/core/migrations/0160_add_project_to_metricthreshold.py +0 -0
  353. {squad-1.90 → squad-1.92}/squad/core/migrations/0161_add_metricthreshold_perm_to_squad_group.py +0 -0
  354. {squad-1.90 → squad-1.92}/squad/core/migrations/0162_project_add_build_confidence_settings.py +0 -0
  355. {squad-1.90 → squad-1.92}/squad/core/migrations/0163_hirtoricalemailtemplate_update.py +0 -0
  356. {squad-1.90 → squad-1.92}/squad/core/migrations/0164_django_update.py +0 -0
  357. {squad-1.90 → squad-1.92}/squad/core/migrations/0165_buildsummary_uniqueness.py +0 -0
  358. {squad-1.90 → squad-1.92}/squad/core/migrations/0166_build_is_release.py +0 -0
  359. {squad-1.90 → squad-1.92}/squad/core/migrations/0167_add_project_datetime.py +0 -0
  360. {squad-1.90 → squad-1.92}/squad/core/migrations/0168_add_group_settings.py +0 -0
  361. {squad-1.90 → squad-1.92}/squad/core/migrations/0169_userpreferences.py +0 -0
  362. {squad-1.90 → squad-1.92}/squad/core/migrations/__init__.py +0 -0
  363. {squad-1.90 → squad-1.92}/squad/core/models.py +0 -0
  364. {squad-1.90 → squad-1.92}/squad/core/notification.py +0 -0
  365. {squad-1.90 → squad-1.92}/squad/core/plugins.py +0 -0
  366. {squad-1.90 → squad-1.92}/squad/core/queries.py +0 -0
  367. {squad-1.90 → squad-1.92}/squad/core/statistics.py +0 -0
  368. {squad-1.90 → squad-1.92}/squad/core/tasks/__init__.py +0 -0
  369. {squad-1.90 → squad-1.92}/squad/core/tasks/exceptions.py +0 -0
  370. {squad-1.90 → squad-1.92}/squad/core/tasks/notification.py +0 -0
  371. {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/base.jinja2 +0 -0
  372. {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/diff.html.jinja2 +0 -0
  373. {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/diff.txt.jinja2 +0 -0
  374. {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/failed_test_jobs.html.jinja2 +0 -0
  375. {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/failed_test_jobs.txt.jinja2 +0 -0
  376. {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/moderation.html.jinja2 +0 -0
  377. {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/moderation.txt.jinja2 +0 -0
  378. {squad-1.90 → squad-1.92}/squad/core/templatetags/__init__.py +0 -0
  379. {squad-1.90 → squad-1.92}/squad/core/templatetags/squad_notification.py +0 -0
  380. {squad-1.90 → squad-1.92}/squad/core/utils.py +0 -0
  381. {squad-1.90 → squad-1.92}/squad/frontend/__init__.py +0 -0
  382. {squad-1.90 → squad-1.92}/squad/frontend/__main__.py +0 -0
  383. {squad-1.90 → squad-1.92}/squad/frontend/admin.py +0 -0
  384. {squad-1.90 → squad-1.92}/squad/frontend/apps.py +0 -0
  385. {squad-1.90 → squad-1.92}/squad/frontend/badges.py +0 -0
  386. {squad-1.90 → squad-1.92}/squad/frontend/build_settings.py +0 -0
  387. {squad-1.90 → squad-1.92}/squad/frontend/ci.py +0 -0
  388. {squad-1.90 → squad-1.92}/squad/frontend/comparison.py +0 -0
  389. {squad-1.90 → squad-1.92}/squad/frontend/extract.py +0 -0
  390. {squad-1.90 → squad-1.92}/squad/frontend/forms.py +0 -0
  391. {squad-1.90 → squad-1.92}/squad/frontend/group_settings.py +0 -0
  392. {squad-1.90 → squad-1.92}/squad/frontend/locale/django.pot +0 -0
  393. {squad-1.90 → squad-1.92}/squad/frontend/locale/pl/LC_MESSAGES/django.po +0 -0
  394. {squad-1.90 → squad-1.92}/squad/frontend/locale/pt/LC_MESSAGES/django.po +0 -0
  395. {squad-1.90 → squad-1.92}/squad/frontend/locale/pt_BR/LC_MESSAGES/django.po +0 -0
  396. {squad-1.90 → squad-1.92}/squad/frontend/management/__init__.py +0 -0
  397. {squad-1.90 → squad-1.92}/squad/frontend/management/commands/__init__.py +0 -0
  398. {squad-1.90 → squad-1.92}/squad/frontend/management/commands/get_token.py +0 -0
  399. {squad-1.90 → squad-1.92}/squad/frontend/metrics.py +0 -0
  400. {squad-1.90 → squad-1.92}/squad/frontend/project_settings.py +0 -0
  401. {squad-1.90 → squad-1.92}/squad/frontend/queries.py +0 -0
  402. {squad-1.90 → squad-1.92}/squad/frontend/setup.py +0 -0
  403. {squad-1.90 → squad-1.92}/squad/frontend/static/compare.css +0 -0
  404. {squad-1.90 → squad-1.92}/squad/frontend/static/download +0 -0
  405. {squad-1.90 → squad-1.92}/squad/frontend/static/download.conf +0 -0
  406. {squad-1.90 → squad-1.92}/squad/frontend/static/favicon.ico +0 -0
  407. {squad-1.90 → squad-1.92}/squad/frontend/static/main.css +0 -0
  408. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/attach_select2.js +0 -0
  409. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/build.js +0 -0
  410. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/build_compare.js +0 -0
  411. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/build_list.js +0 -0
  412. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/charts.js +0 -0
  413. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/common.js +0 -0
  414. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/compare.js +0 -0
  415. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/config.js +0 -0
  416. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/annotation.js +0 -0
  417. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/build_compare.js +0 -0
  418. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/build_list_compare.js +0 -0
  419. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/build_release.js +0 -0
  420. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/cancel.js +0 -0
  421. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/charts.js +0 -0
  422. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/compare.js +0 -0
  423. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/fetch.js +0 -0
  424. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/filter.js +0 -0
  425. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/metricThreshold.js +0 -0
  426. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/project_compare.js +0 -0
  427. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/resubmit.js +0 -0
  428. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/testjobs_progress.js +0 -0
  429. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/metric.threshold.js +0 -0
  430. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/project_compare.js +0 -0
  431. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/showHide.js +0 -0
  432. {squad-1.90 → squad-1.92}/squad/frontend/static/squad/table.js +0 -0
  433. {squad-1.90 → squad-1.92}/squad/frontend/static/squad_sign.svg +0 -0
  434. {squad-1.90 → squad-1.92}/squad/frontend/templates/401.jinja2 +0 -0
  435. {squad-1.90 → squad-1.92}/squad/frontend/templates/404.jinja2 +0 -0
  436. {squad-1.90 → squad-1.92}/squad/frontend/templates/django/rest_framework/api.html +0 -0
  437. {squad-1.90 → squad-1.92}/squad/frontend/templates/django/squad/_user_menu.html +0 -0
  438. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_builds_table.jinja2 +0 -0
  439. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_env_suite_data.jinja2 +0 -0
  440. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_metadata.jinja2 +0 -0
  441. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_pagination.jinja2 +0 -0
  442. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_permissions.jinja2 +0 -0
  443. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_project_list.jinja2 +0 -0
  444. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_regressions_and_fixes.jinja2 +0 -0
  445. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_results_table.jinja2 +0 -0
  446. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_results_transitions_filter.jinja2 +0 -0
  447. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_subscribe.jinja2 +0 -0
  448. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_results_envbox.jinja2 +0 -0
  449. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_results_suitebox.jinja2 +0 -0
  450. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_results_summary.jinja2 +0 -0
  451. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_results_table.jinja2 +0 -0
  452. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_run_metric.jinja2 +0 -0
  453. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_run_test.jinja2 +0 -0
  454. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_unfinished_build.jinja2 +0 -0
  455. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_user_menu.jinja2 +0 -0
  456. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/base.jinja2 +0 -0
  457. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build-nav.jinja2 +0 -0
  458. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build.jinja2 +0 -0
  459. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build_callbacks.jinja2 +0 -0
  460. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build_metadata.jinja2 +0 -0
  461. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build_metrics.jinja2 +0 -0
  462. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build_settings.jinja2 +0 -0
  463. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/builds.jinja2 +0 -0
  464. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/compare.jinja2 +0 -0
  465. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/compare_builds.jinja2 +0 -0
  466. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/compare_projects.jinja2 +0 -0
  467. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group-nav.jinja2 +0 -0
  468. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group.jinja2 +0 -0
  469. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/advanced.jinja2 +0 -0
  470. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/base.jinja2 +0 -0
  471. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/delete.jinja2 +0 -0
  472. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/index.jinja2 +0 -0
  473. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/members.jinja2 +0 -0
  474. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/new_group.jinja2 +0 -0
  475. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/new_project.jinja2 +0 -0
  476. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/index.jinja2 +0 -0
  477. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/knownissues.jinja2 +0 -0
  478. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/login.jinja2 +0 -0
  479. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/metrics.jinja2 +0 -0
  480. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project-nav.jinja2 +0 -0
  481. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/_threshold_table.jinja2 +0 -0
  482. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/advanced.jinja2 +0 -0
  483. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/base.jinja2 +0 -0
  484. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/build_confidence.jinja2 +0 -0
  485. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/delete.jinja2 +0 -0
  486. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/environments.jinja2 +0 -0
  487. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/index.jinja2 +0 -0
  488. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/thresholds.jinja2 +0 -0
  489. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_history.jinja2 +0 -0
  490. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_run.jinja2 +0 -0
  491. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_run_suite_metrics.jinja2 +0 -0
  492. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_run_suite_test_details.jinja2 +0 -0
  493. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_run_suite_tests.jinja2 +0 -0
  494. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/testjob.jinja2 +0 -0
  495. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/testjobs.jinja2 +0 -0
  496. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/testjobs_progress.jinja2 +0 -0
  497. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/tests-details-nav.jinja2 +0 -0
  498. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/tests.jinja2 +0 -0
  499. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/api_token.jinja2 +0 -0
  500. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/base.jinja2 +0 -0
  501. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/profile.jinja2 +0 -0
  502. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/projects.jinja2 +0 -0
  503. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/subscriptions.jinja2 +0 -0
  504. {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/user_preferences.jinja2 +0 -0
  505. {squad-1.90 → squad-1.92}/squad/frontend/templatetags/__init__.py +0 -0
  506. {squad-1.90 → squad-1.92}/squad/frontend/templatetags/squad.py +0 -0
  507. {squad-1.90 → squad-1.92}/squad/frontend/tests.py +0 -0
  508. {squad-1.90 → squad-1.92}/squad/frontend/user_settings.py +0 -0
  509. {squad-1.90 → squad-1.92}/squad/frontend/utils.py +0 -0
  510. {squad-1.90 → squad-1.92}/squad/frontend/views.py +0 -0
  511. {squad-1.90 → squad-1.92}/squad/http.py +0 -0
  512. {squad-1.90 → squad-1.92}/squad/jinja2.py +0 -0
  513. {squad-1.90 → squad-1.92}/squad/mail.py +0 -0
  514. {squad-1.90 → squad-1.92}/squad/manage.py +0 -0
  515. {squad-1.90 → squad-1.92}/squad/plugins/__init__.py +0 -0
  516. {squad-1.90 → squad-1.92}/squad/plugins/example.py +0 -0
  517. {squad-1.90 → squad-1.92}/squad/plugins/gerrit.py +0 -0
  518. {squad-1.90 → squad-1.92}/squad/plugins/github.py +0 -0
  519. {squad-1.90 → squad-1.92}/squad/plugins/lib/__init__.py +0 -0
  520. {squad-1.90 → squad-1.92}/squad/run/__init__.py +0 -0
  521. {squad-1.90 → squad-1.92}/squad/run/__main__.py +0 -0
  522. {squad-1.90 → squad-1.92}/squad/run/listener.py +0 -0
  523. {squad-1.90 → squad-1.92}/squad/run/scheduler.py +0 -0
  524. {squad-1.90 → squad-1.92}/squad/run/worker.py +0 -0
  525. {squad-1.90 → squad-1.92}/squad/socialaccount.py +0 -0
  526. {squad-1.90 → squad-1.92}/squad/urls.py +0 -0
  527. {squad-1.90 → squad-1.92}/squad/wsgi.py +0 -0
  528. {squad-1.90 → squad-1.92}/squad.egg-info/dependency_links.txt +0 -0
  529. {squad-1.90 → squad-1.92}/squad.egg-info/entry_points.txt +0 -0
  530. {squad-1.90 → squad-1.92}/squad.egg-info/top_level.txt +0 -0
  531. {squad-1.90 → squad-1.92}/squad.svg +0 -0
  532. {squad-1.90 → squad-1.92}/test/__init__.py +0 -0
  533. {squad-1.90 → squad-1.92}/test/api/__init__.py +0 -0
  534. {squad-1.90 → squad-1.92}/test/api/benchmarks.csv +0 -0
  535. {squad-1.90 → squad-1.92}/test/api/benchmarks.json +0 -0
  536. {squad-1.90 → squad-1.92}/test/api/definition.yaml +0 -0
  537. {squad-1.90 → squad-1.92}/test/api/metadata.json +0 -0
  538. {squad-1.90 → squad-1.92}/test/api/test_data.py +0 -0
  539. {squad-1.90 → squad-1.92}/test/api/test_rest.py +0 -0
  540. {squad-1.90 → squad-1.92}/test/api/test_run.log +0 -0
  541. {squad-1.90 → squad-1.92}/test/api/tests.csv +0 -0
  542. {squad-1.90 → squad-1.92}/test/api/tests.json +0 -0
  543. {squad-1.90 → squad-1.92}/test/api/tests.py +0 -0
  544. {squad-1.90 → squad-1.92}/test/api/tests_log.json +0 -0
  545. {squad-1.90 → squad-1.92}/test/api/tests_two.json +0 -0
  546. {squad-1.90 → squad-1.92}/test/api/twoline_definition.yaml +0 -0
  547. {squad-1.90 → squad-1.92}/test/ci/__init__.py +0 -0
  548. {squad-1.90 → squad-1.92}/test/ci/backend/__init__.py +0 -0
  549. {squad-1.90 → squad-1.92}/test/ci/backend/example-broken-log.yaml +0 -0
  550. {squad-1.90 → squad-1.92}/test/ci/backend/example-lava-log.yaml +0 -0
  551. {squad-1.90 → squad-1.92}/test/ci/backend/lava.json +0 -0
  552. {squad-1.90 → squad-1.92}/test/ci/backend/test_fake.py +0 -0
  553. {squad-1.90 → squad-1.92}/test/ci/backend/test_real_lava.py +0 -0
  554. {squad-1.90 → squad-1.92}/test/ci/backend/tuxsuite_test_failed_result_sample.json +0 -0
  555. {squad-1.90 → squad-1.92}/test/ci/backend/tuxsuite_test_result_sample.json +0 -0
  556. {squad-1.90 → squad-1.92}/test/ci/test_listen.py +0 -0
  557. {squad-1.90 → squad-1.92}/test/ci/test_models.py +0 -0
  558. {squad-1.90 → squad-1.92}/test/ci/test_tasks.py +0 -0
  559. {squad-1.90 → squad-1.92}/test/core/__init__.py +0 -0
  560. {squad-1.90 → squad-1.92}/test/core/test_attachment.py +0 -0
  561. {squad-1.90 → squad-1.92}/test/core/test_build.py +0 -0
  562. {squad-1.90 → squad-1.92}/test/core/test_build_summary.py +0 -0
  563. {squad-1.90 → squad-1.92}/test/core/test_callback.py +0 -0
  564. {squad-1.90 → squad-1.92}/test/core/test_emailtemplate.py +0 -0
  565. {squad-1.90 → squad-1.92}/test/core/test_failures.py +0 -0
  566. {squad-1.90 → squad-1.92}/test/core/test_group.py +0 -0
  567. {squad-1.90 → squad-1.92}/test/core/test_historical_emailtemplate.py +0 -0
  568. {squad-1.90 → squad-1.92}/test/core/test_history.py +0 -0
  569. {squad-1.90 → squad-1.92}/test/core/test_import_data.py +0 -0
  570. {squad-1.90 → squad-1.92}/test/core/test_import_data_input/1/default/1/metadata.json +0 -0
  571. {squad-1.90 → squad-1.92}/test/core/test_import_data_input/1/default/1/metrics.json +0 -0
  572. {squad-1.90 → squad-1.92}/test/core/test_import_data_input/2/default/2/metadata.json +0 -0
  573. {squad-1.90 → squad-1.92}/test/core/test_import_data_input/2/default/2/metrics.json +0 -0
  574. {squad-1.90 → squad-1.92}/test/core/test_import_data_input/2/default/2/screenshot.png +0 -0
  575. {squad-1.90 → squad-1.92}/test/core/test_import_data_input/2/default/2/tests.json +0 -0
  576. {squad-1.90 → squad-1.92}/test/core/test_import_data_missing_metadata/1/1/tests.json +0 -0
  577. {squad-1.90 → squad-1.92}/test/core/test_known_issues.py +0 -0
  578. {squad-1.90 → squad-1.92}/test/core/test_metric.py +0 -0
  579. {squad-1.90 → squad-1.92}/test/core/test_metric_comparison.py +0 -0
  580. {squad-1.90 → squad-1.92}/test/core/test_metric_threshold.py +0 -0
  581. {squad-1.90 → squad-1.92}/test/core/test_metrics_data.py +0 -0
  582. {squad-1.90 → squad-1.92}/test/core/test_metrics_summary.py +0 -0
  583. {squad-1.90 → squad-1.92}/test/core/test_notification.py +0 -0
  584. {squad-1.90 → squad-1.92}/test/core/test_notification_delivery.py +0 -0
  585. {squad-1.90 → squad-1.92}/test/core/test_patch_source.py +0 -0
  586. {squad-1.90 → squad-1.92}/test/core/test_project.py +0 -0
  587. {squad-1.90 → squad-1.92}/test/core/test_project_status.py +0 -0
  588. {squad-1.90 → squad-1.92}/test/core/test_statistics.py +0 -0
  589. {squad-1.90 → squad-1.92}/test/core/test_tasks.py +0 -0
  590. {squad-1.90 → squad-1.92}/test/core/test_tasks_notification.py +0 -0
  591. {squad-1.90 → squad-1.92}/test/core/test_test.py +0 -0
  592. {squad-1.90 → squad-1.92}/test/core/test_test_comparison.py +0 -0
  593. {squad-1.90 → squad-1.92}/test/core/test_test_data.py +0 -0
  594. {squad-1.90 → squad-1.92}/test/core/test_test_run.py +0 -0
  595. {squad-1.90 → squad-1.92}/test/core/test_test_summary.py +0 -0
  596. {squad-1.90 → squad-1.92}/test/core/test_update_project_statuses.py +0 -0
  597. {squad-1.90 → squad-1.92}/test/core/test_user_namespace.py +0 -0
  598. {squad-1.90 → squad-1.92}/test/core/test_utils.py +0 -0
  599. {squad-1.90 → squad-1.92}/test/frontend/__init__.py +0 -0
  600. {squad-1.90 → squad-1.92}/test/frontend/test_basics.py +0 -0
  601. {squad-1.90 → squad-1.92}/test/frontend/test_comparison.py +0 -0
  602. {squad-1.90 → squad-1.92}/test/frontend/test_get_token_command.py +0 -0
  603. {squad-1.90 → squad-1.92}/test/frontend/test_group_settings.py +0 -0
  604. {squad-1.90 → squad-1.92}/test/frontend/test_history.py +0 -0
  605. {squad-1.90 → squad-1.92}/test/frontend/test_template_tags.py +0 -0
  606. {squad-1.90 → squad-1.92}/test/frontend/test_test_job.py +0 -0
  607. {squad-1.90 → squad-1.92}/test/frontend/test_utils.py +0 -0
  608. {squad-1.90 → squad-1.92}/test/integration/__init__.py +0 -0
  609. {squad-1.90 → squad-1.92}/test/integration/plugins/test_tradefed.py +0 -0
  610. {squad-1.90 → squad-1.92}/test/integration/plugins/tradefed-output-20220608105250.tar.xz +0 -0
  611. {squad-1.90 → squad-1.92}/test/integration/test_build_notification_from_ci.py +0 -0
  612. {squad-1.90 → squad-1.92}/test/javascript.py +0 -0
  613. {squad-1.90 → squad-1.92}/test/karma.conf.js +0 -0
  614. {squad-1.90 → squad-1.92}/test/mock.py +0 -0
  615. {squad-1.90 → squad-1.92}/test/performance.py +0 -0
  616. {squad-1.90 → squad-1.92}/test/plugins/__init__.py +0 -0
  617. {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kasan.log +0 -0
  618. {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log +0 -0
  619. {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kernelexceptiontrace.log +0 -0
  620. {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kernelexceptiontrace_without_squarebraces.log +0 -0
  621. /squad-1.90/test/plugins/linux_log_parser/kernelpanic.log → /squad-1.92/test/plugins/linux_log_parser/kernelpanic-single-and-multiline.log +0 -0
  622. {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kfence.log +0 -0
  623. {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/multiple_issues_dmesg.log +0 -0
  624. {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/oops.log +0 -0
  625. {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/rcu_warning.log +0 -0
  626. {squad-1.90 → squad-1.92}/test/plugins/test_gerrit.py +0 -0
  627. {squad-1.90 → squad-1.92}/test/plugins/test_github.py +0 -0
  628. {squad-1.90 → squad-1.92}/test/plugins/test_plugin.py +0 -0
  629. {squad-1.90 → squad-1.92}/test/settings.py +0 -0
  630. {squad-1.90 → squad-1.92}/test/test_architecture.py +0 -0
  631. {squad-1.90 → squad-1.92}/test/test_code_quality.py +0 -0
  632. {squad-1.90 → squad-1.92}/test/test_cors.py +0 -0
  633. {squad-1.90 → squad-1.92}/test/test_i18n.py +0 -0
  634. {squad-1.90 → squad-1.92}/test/test_mail.py +0 -0
  635. {squad-1.90 → squad-1.92}/test/test_pending_migrations.py +0 -0
  636. {squad-1.90 → squad-1.92}/test/unit/test_annotation.js +0 -0
  637. {squad-1.90 → squad-1.92}/test/unit/test_cancel.js +0 -0
  638. {squad-1.90 → squad-1.92}/test/unit/test_charts.js +0 -0
  639. {squad-1.90 → squad-1.92}/test/unit/test_compare.js +0 -0
  640. {squad-1.90 → squad-1.92}/test/unit/test_filter.js +0 -0
  641. {squad-1.90 → squad-1.92}/test/unit/test_resubmit.js +0 -0
@@ -1,3 +1,47 @@
1
+ # 1.92
2
+
3
+ This 1.92 release avoids an extra retry when fetching errored builds/tests in Tuxsuite.
4
+
5
+ # 1.91
6
+
7
+ This 1.91 release brings a few changes worth pointing out separately:
8
+
9
+ * Tuxsuite backend: add support for changing environment name if "test_name" is present. Artificial boot tests
10
+ when jobs fail or get canceled. Also checks if the testjob's project contains a token allowing authenticated
11
+ urls in Tuxsuite.
12
+
13
+ * Log parser: Katie is putting a lot of work in improving linux-log-parser plugin. The idea is that it will
14
+ become its own project in the future
15
+
16
+ * Add support for performance tracking when supported (Sentry)
17
+
18
+ * Support for prometheus-like metrics output for supporting environments (AMQ)
19
+
20
+ Full set of changes going in:
21
+
22
+ * api/ci: check job id before accepting test job
23
+ * api/prometheus.py: add initial prometheus metrics endpoint
24
+ * ci/tuxsuite.py:
25
+ * add support for fetching authenticated tuxsuite urls
26
+ * change environment name if test_name is available
27
+ * create artificial boot test
28
+ * handle canceled tests
29
+ * ci: lava: fix login test name
30
+ * frontend/project.jinja2: add project description to project's home page
31
+ * frontend: urls: point test to details page
32
+ * plugins/linux_log_parser:
33
+ * Add a new multiline regex for KCSAN
34
+ * Add regex for capturing multiline kernel panic
35
+ * Ensure .* regex doesn't capture too much
36
+ * Extract reused regex components
37
+ * No longer create tests for passes
38
+ * Remove unhelpful information from test names
39
+ * Add support for PID after timestamp
40
+ * Add support for multiline oops message
41
+ * Improve log parser patterns
42
+ * setup: change package to psycopg2-binary
43
+
44
+
1
45
  # 1.90
2
46
 
3
47
  This 1.90 release makes linux-log-parser more plugable, meaning that it could be
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: squad
3
- Version: 1.90
3
+ Version: 1.92
4
4
  Summary: Software Quality Dashboard
5
5
  Home-page: https://github.com/Linaro/squad
6
6
  Author: Antonio Terceiro
@@ -214,6 +214,13 @@ __ https://docs.djangoproject.com/en/1.11/topics/email/
214
214
  it's recommended to disable sending admin notifications by setting
215
215
  ``SQUAD_SEND_ADMIN_ERROR_EMAIL = False``.
216
216
 
217
+ * ``SENTRY_TRACES_SAMPLE_RATE``: Specifies the rate at which traces
218
+ (for performance monitoring) are sampled by Sentry. This value must be a
219
+ float between 0.0 and 1.0, where 1.0 represents 100% of traces being
220
+ captured. If not set, it defaults to 0. This option is used to configure
221
+ Sentry's performance monitoring, allowing you to control how much tracing
222
+ data is sent to Sentry. It works alongside the SENTRY_DSN setting.
223
+
217
224
  * ``SQUAD_STATIC_DIR``: Directory where SQUAD will find it's preprocessed
218
225
  static assets. This usually does not need to be set manually, and exists
219
226
  mostly for use in the Docker image.
@@ -18,7 +18,7 @@ if os.getenv('REQ_IGNORE_VERSIONS'):
18
18
  requirements = [req.split('>=')[0] for req in requirements]
19
19
 
20
20
  extras_require = {
21
- 'postgres': 'psycopg2',
21
+ 'postgres': 'psycopg2-binary',
22
22
  }
23
23
 
24
24
 
@@ -73,15 +73,26 @@ def submit_job(request, group_slug, project_slug, version, environment_slug):
73
73
  @csrf_exempt
74
74
  @auth_privileged
75
75
  def watch_job(request, group_slug, project_slug, version, environment_slug):
76
+
77
+ # testjob_id points to the backend's test job
78
+ testjob_id = request.POST.get('testjob_id', None)
79
+ if testjob_id is None:
80
+ return HttpResponseBadRequest("testjob_id is required")
81
+
76
82
  backend_name = request.POST.get('backend')
77
83
  if backend_name is None:
78
84
  return HttpResponseBadRequest("backend field is required")
85
+
79
86
  backend = None
80
87
  try:
81
88
  backend = Backend.objects.get(name=request.POST.get('backend'))
82
89
  except Backend.DoesNotExist:
83
90
  return HttpResponseBadRequest("requested backend does not exist")
84
91
 
92
+ check = backend.get_implementation().check_job_id(testjob_id)
93
+ if check is not True:
94
+ return HttpResponseBadRequest(check)
95
+
85
96
  # project has to exist or request will result with 400
86
97
  project = request.project
87
98
  if backend is None or project is None:
@@ -90,12 +101,6 @@ def watch_job(request, group_slug, project_slug, version, environment_slug):
90
101
  # create Build object
91
102
  build, _ = project.builds.get_or_create(version=version)
92
103
 
93
- # testjob_id points to the backend's test job
94
- testjob_id = request.POST.get('testjob_id', None)
95
-
96
- if testjob_id is None:
97
- return HttpResponseBadRequest("testjob_id is required")
98
-
99
104
  # create TestJob object
100
105
  test_job = TestJob(
101
106
  backend=backend,
@@ -0,0 +1,52 @@
1
+ import re
2
+ import requests
3
+ import celery
4
+
5
+ from django.conf import settings
6
+ from django.http import HttpResponse, HttpResponseForbidden
7
+ from django.views.decorators.csrf import csrf_exempt
8
+ from django.views.decorators.http import require_http_methods
9
+
10
+ from squad.http import auth_user_from_request
11
+
12
+
13
+ @csrf_exempt
14
+ @require_http_methods(['GET'])
15
+ def metrics(request):
16
+ user = auth_user_from_request(request, request.user)
17
+ if not user.is_authenticated:
18
+ return HttpResponseForbidden()
19
+
20
+ output = ''
21
+ available_queues = None
22
+
23
+ active_queues = celery.current_app.control.inspect().active_queues()
24
+ if active_queues is not None:
25
+ active_workers = set()
26
+ available_queues = set()
27
+ for worker_name, queues in active_queues.items():
28
+ active_workers.add(worker_name)
29
+ available_queues |= set([q['name'] for q in queues])
30
+
31
+ output += '# TYPE workers_count counter\n'
32
+ output += f'workers_count {len(active_workers)}\n'
33
+
34
+ # TODO: check how to get metrics for non-RabbitMQ brokers
35
+ if settings.CELERY_BROKER_URL:
36
+ rabbitmq_url = settings.CELERY_BROKER_URL.replace('amqps://', 'https://').replace('amqp://', 'http://')
37
+ rabbitmq_url = re.sub(r':\d+$', '', rabbitmq_url)
38
+ rabbitmq_url += '/api/queues'
39
+
40
+ response = requests.get(rabbitmq_url)
41
+ queues = response.json()
42
+ available_queues = {r["queue"] for r in settings.CELERY_TASK_ROUTES.values()}
43
+
44
+ for queue in queues:
45
+ if queue['name'] in available_queues:
46
+ metric_name = f'queue_{queue["name"]}_count'
47
+ length = queue['messages_ready']
48
+
49
+ output += f'\n# TYPE {metric_name} counter'
50
+ output += f'\n{metric_name} {length}'
51
+
52
+ return HttpResponse(output, status=200, content_type="text/plain;")
@@ -5,6 +5,7 @@ from rest_framework.schemas import get_schema_view
5
5
  from . import views
6
6
  from . import data
7
7
  from . import ci
8
+ from . import prometheus
8
9
  from . import rest
9
10
 
10
11
 
@@ -26,4 +27,5 @@ urlpatterns = [
26
27
  url(r'^resubmit/([0-9]+)', ci.resubmit_job),
27
28
  url(r'^forceresubmit/([0-9]+)', ci.force_resubmit_job),
28
29
  url(r'^version/', views.version),
30
+ url(r'^prometheus/', prometheus.metrics),
29
31
  ]
@@ -72,6 +72,9 @@ class Backend(object):
72
72
  def check_job_definition(self, definition):
73
73
  return True
74
74
 
75
+ def check_job_id(self, job_id):
76
+ return True
77
+
75
78
  def get_job_definition(self, test_job):
76
79
  return "sample job definition"
77
80
 
@@ -683,7 +683,7 @@ class Backend(BaseBackend):
683
683
  if clone_measurements_to_tests:
684
684
  res_value = result['result']
685
685
  results.update({res_name: res_value})
686
- elif result['name'] == 'auto-login-action' and handle_lava_boot:
686
+ elif 'login-action' in result['name'] and handle_lava_boot:
687
687
  # add artificial 'boot' test result for each test job
688
688
  # by default the boot test is named after the device_type
689
689
  boot = "boot-%s" % test_job.name
@@ -785,6 +785,11 @@ class Backend(BaseBackend):
785
785
  except yaml.YAMLError as e:
786
786
  return str(e)
787
787
 
788
+ def check_job_id(self, job_id):
789
+ if re.match(r"^\d+$", str(job_id)) is not None:
790
+ return True
791
+ return "LAVA job id should be an integer"
792
+
788
793
  def get_job_definition(self, job_id):
789
794
  if self.use_xml_rpc:
790
795
  return self.proxy.scheduler.jobs.definition(job_id)
@@ -143,6 +143,12 @@ class Backend:
143
143
  """
144
144
  raise NotImplementedError
145
145
 
146
+ def check_job_id(self, job_id):
147
+ """
148
+ Returns True if job id matches what the backend expect, else returns the error message
149
+ """
150
+ raise NotImplementedError
151
+
146
152
  def format_message(self, msg):
147
153
  if self.data and hasattr(self.data, "name"):
148
154
  return self.data.name + ': ' + msg
@@ -120,6 +120,13 @@ class Backend(BaseBackend):
120
120
  # The regex below is supposed to find only one match
121
121
  return matches[0]
122
122
 
123
+ def check_job_id(self, job_id):
124
+ try:
125
+ self.parse_job_id(job_id)
126
+ return True
127
+ except FetchIssue as e:
128
+ return str(e)
129
+
123
130
  def generate_job_id(self, result_type, result):
124
131
  """
125
132
  The job id for TuxSuite results is generated using 3 pieces of info:
@@ -144,7 +151,11 @@ class Backend(BaseBackend):
144
151
  url = reduce(urljoin, urlbits)
145
152
 
146
153
  try:
147
- response = Backend.get_session().request("GET", url)
154
+ headers = {}
155
+ if hasattr(self, 'auth_token') and self.auth_token is not None:
156
+ headers = {'Authorization': self.auth_token}
157
+
158
+ response = Backend.get_session().request("GET", url, headers=headers)
148
159
  except Exception as e:
149
160
  raise TemporaryFetchIssue(f"Can't retrieve from {url}: {e}")
150
161
 
@@ -224,6 +235,11 @@ class Backend(BaseBackend):
224
235
  if 'toolchain' in build_metadata_keys and 'kconfig' in build_metadata_keys and metadata['build_name'] in [None, '']:
225
236
  metadata['build_name'] = self.generate_test_name(build_metadata)
226
237
 
238
+ def add_skip_boot_test(self, tests, metadata):
239
+ # Create an artificial boot test and mark it as skip
240
+ boot_test_name = 'boot/' + (metadata.get('build_name') or 'boot')
241
+ tests[boot_test_name] = None
242
+
227
243
  def parse_build_results(self, test_job, job_url, results, settings):
228
244
  required_keys = ['build_status', 'warnings_count', 'download_url', 'retry']
229
245
  self.__check_required_keys__(required_keys, results)
@@ -233,9 +249,6 @@ class Backend(BaseBackend):
233
249
  test_job.name = test_name
234
250
 
235
251
  build_status = results['build_status']
236
- if build_status == 'error' and results['retry'] < 2:
237
- # SQUAD should retry fetching the build until retry == 2
238
- raise TemporaryFetchIssue(results.get('status_message', 'TuxSuite Error'))
239
252
 
240
253
  # Make metadata
241
254
  metadata_keys = settings.get('BUILD_METADATA_KEYS', [])
@@ -254,7 +267,7 @@ class Backend(BaseBackend):
254
267
  metrics = {}
255
268
 
256
269
  completed = True
257
- if results['retry'] >= 2:
270
+ if build_status == 'error':
258
271
  # This indicates that TuxSuite gave up trying to work on this build
259
272
  status = 'Incomplete'
260
273
  tests[f'build/{test_name}'] = 'skip'
@@ -318,6 +331,11 @@ class Backend(BaseBackend):
318
331
  metadata_keys = settings.get('TEST_METADATA_KEYS', [])
319
332
  metadata = {k: results.get(k) for k in metadata_keys}
320
333
 
334
+ # Change environment name
335
+ if 'test_name' in results and results.get('test_name') is not None:
336
+ test_job.environment = results.get('test_name')
337
+ test_job.save()
338
+
321
339
  # Add extra metadata from metadata file if it exists
322
340
  self.update_metadata_from_file(results=results, metadata=metadata)
323
341
 
@@ -340,6 +358,8 @@ class Backend(BaseBackend):
340
358
  else:
341
359
  test_job.failure = 'sanity test failed'
342
360
 
361
+ self.add_skip_boot_test(tests, metadata)
362
+
343
363
  return status, completed, metadata, tests, metrics, logs
344
364
 
345
365
  # Fetch results even if the job fails, but has results
@@ -348,8 +368,14 @@ class Backend(BaseBackend):
348
368
 
349
369
  elif results['result'] == 'error':
350
370
  test_job.failure = 'tuxsuite infrastructure error'
371
+ self.add_skip_boot_test(tests, metadata)
351
372
  return 'Incomplete', completed, metadata, tests, metrics, logs
352
373
 
374
+ elif results['result'] == 'canceled':
375
+ test_job.failure = 'tuxsuite job canceled'
376
+ self.add_skip_boot_test(tests, metadata)
377
+ return 'Canceled', completed, metadata, tests, metrics, logs
378
+
353
379
  # If boot result is unkown, a retry is needed, otherwise, it either passed or failed
354
380
  if 'unknown' == results['results']['boot']:
355
381
  return None
@@ -384,6 +410,10 @@ class Backend(BaseBackend):
384
410
 
385
411
  def fetch(self, test_job):
386
412
  url = self.job_url(test_job)
413
+
414
+ settings = self.__resolve_settings__(test_job)
415
+ self.auth_token = settings.get('TUXSUITE_TOKEN', None)
416
+
387
417
  if test_job.input:
388
418
  results = self.fetch_from_results_input(test_job)
389
419
  test_job.input = None
@@ -393,11 +423,12 @@ class Backend(BaseBackend):
393
423
  if results.get('state') != 'finished':
394
424
  return None
395
425
 
396
- settings = self.__resolve_settings__(test_job)
397
-
398
426
  result_type = self.parse_job_id(test_job.job_id)[0]
399
427
  parse_results = getattr(self, f'parse_{result_type.lower()}_results')
400
- return parse_results(test_job, url, results, settings)
428
+ parsed = parse_results(test_job, url, results, settings)
429
+
430
+ self.auth_token = None
431
+ return parsed
401
432
 
402
433
  def job_url(self, test_job):
403
434
  result_type, tux_project, tux_uid = self.parse_job_id(test_job.job_id)
@@ -6,6 +6,14 @@
6
6
 
7
7
  {% include "squad/project-nav.jinja2" %}
8
8
 
9
+
10
+ {% if project.description%}
11
+ <h2>{{ _('Description') }}</h2>
12
+ <div class='description-{{project.id}}'>
13
+ {{project.description}}
14
+ </div>
15
+ {% endif %}
16
+
9
17
  {% if last_build %}
10
18
  <div>
11
19
  <h2>
@@ -52,6 +52,7 @@ urlpatterns = [
52
52
  url(r'^(%s)/(%s)/build/([^/]+)/attachments/testrun/([^/]+)/([^/]+)$' % group_and_project, views.build_attachment, name='build_attachments'),
53
53
  url(r'^(%s)/(%s)/build/([^/]+)/testrun/([^/]+)/suite/([^/]+)/tests/$' % group_and_project, views.test_run_suite_tests, name='testrun_suite_tests'),
54
54
  url(r'^(%s)/(%s)/build/([^/]+)/testrun/([^/]+)/suite/([^/]+)/test/([^/]+)/history/$' % group_and_project, tests.test_history, name='test_history'),
55
+ url(r'^(%s)/(%s)/build/([^/]+)/testrun/([^/]+)/suite/([^/]+)/test/([^/]+)/$' % group_and_project, views.test_run_suite_test_details, name='testrun_suite_test_details'),
55
56
  url(r'^(%s)/(%s)/build/([^/]+)/testrun/([^/]+)/suite/([^/]+)/test/([^/]+)/details/$' % group_and_project, views.test_run_suite_test_details, name='testrun_suite_test_details'),
56
57
  url(r'^(%s)/(%s)/build/([^/]+)/testrun/([^/]+)/suite/([^/]+)/metrics/$' % group_and_project, views.test_run_suite_metrics, name='testrun_suite_metrics'),
57
58
  url(r'^(%s)/(%s)/build/([^/]+)/testrun/([^/]+)/suite/([^/]+)/test/([^/]+)/log$' % group_and_project, views.test_details_log, name='test_details_log'),
@@ -8,6 +8,11 @@ REGEX_NAME = 0
8
8
  REGEX_BODY = 1
9
9
  REGEX_EXTRACT_NAME = 2
10
10
 
11
+ tstamp = r"\[[ \d]+\.[ \d]+\]"
12
+ pid = r"(?:\s*?\[\s*?[CT]\d+\s*?\])"
13
+ not_newline_or_plus = r"[^\+\n]"
14
+ square_brackets_and_contents = r"\[[^\]]+\]"
15
+
11
16
 
12
17
  class BaseLogParser:
13
18
  def compile_regexes(self, regexes):
@@ -15,8 +20,13 @@ class BaseLogParser:
15
20
  return re.compile(r"|".join(combined), re.S | re.M)
16
21
 
17
22
  def remove_numbers_and_time(self, snippet):
23
+ # [ 1067.461794][ T132] BUG: KCSAN: data-race in do_page_fault spectre_v4_enable_task_mitigation
24
+ # -> [ .][ T] BUG: KCSAN: data-race in do_page_fault spectre_v_enable_task_mitigation
18
25
  without_numbers = re.sub(r"(0x[a-f0-9]+|[<\[][0-9a-f]+?[>\]]|\d+)", "", snippet)
19
- without_time = re.sub(r"^\[[^\]]+\]", "", without_numbers)
26
+
27
+ # [ .][ T] BUG: KCSAN: data-race in do_page_fault spectre_v_enable_task_mitigation
28
+ # -> BUG: KCSAN: data-race in do_page_fault spectre_v_enable_task_mitigation
29
+ without_time = re.sub(f"^{square_brackets_and_contents}({square_brackets_and_contents})?", "", without_numbers) # noqa
20
30
 
21
31
  return without_time
22
32
 
@@ -56,11 +66,6 @@ class BaseLogParser:
56
66
  tests_without_shas_to_create = defaultdict(set)
57
67
  tests_with_shas_to_create = defaultdict(set)
58
68
 
59
- # If there are no lines, use the default name and create a passing
60
- # test. For example "check-kernel-oops"
61
- if not lines:
62
- tests_without_shas_to_create[test_name] = []
63
-
64
69
  # If there are lines, then create the tests for these.
65
70
  for line in lines:
66
71
  extracted_name = self.create_name(line, test_regex)
@@ -1,23 +1,26 @@
1
1
  import logging
2
2
  import re
3
3
  from squad.plugins import Plugin as BasePlugin
4
- from squad.plugins.lib.base_log_parser import BaseLogParser, REGEX_NAME, REGEX_EXTRACT_NAME
4
+ from squad.plugins.lib.base_log_parser import BaseLogParser, REGEX_NAME, REGEX_EXTRACT_NAME, tstamp, pid, not_newline_or_plus
5
5
 
6
6
  logger = logging.getLogger()
7
7
 
8
8
  MULTILINERS = [
9
- ('check-kernel-exception', r'-+\[? cut here \]?-+.*?-+\[? end trace \w* \]?-+', r"\d][^\+\n]*"),
10
- ('check-kernel-kasan', r'=+\n\[[\s\.\d]+\]\s+BUG: KASAN:.*?=+', r"BUG: KASAN:[^\+\n]*"),
11
- ('check-kernel-kfence', r'=+\n\[[\s\.\d]+\]\s+BUG: KFENCE:.*?=+', r"BUG: KFENCE:[^\+\n]*"),
9
+ ('exception', fr'-+\[? cut here \]?-+.*?{tstamp}{pid}?\s+-+\[? end trace \w* \]?-+', fr"\n{tstamp}{not_newline_or_plus}*"), # noqa
10
+ ('kasan', fr'{tstamp}{pid}?\s+=+\n{tstamp}{pid}?\s+BUG: KASAN:.*?\n*?{tstamp}{pid}?\s+=+', fr"BUG: KASAN:{not_newline_or_plus}*"), # noqa
11
+ ('kcsan', fr'{tstamp}{pid}?\s+=+\n{tstamp}{pid}?\s+BUG: KCSAN:.*?=+', fr"BUG: KCSAN:{not_newline_or_plus}*"), # noqa
12
+ ('kfence', fr'{tstamp}{pid}?\s+=+\n{tstamp}{pid}?\s+BUG: KFENCE:.*?{tstamp}{pid}?\s+=+', fr"BUG: KFENCE:{not_newline_or_plus}*"), # noqa
13
+ ('panic-multiline', fr'{tstamp}{pid}?\s+Kernel panic - [^\n]+\n.*?-+\[? end Kernel panic - [^\n]+ \]?-*', fr"Kernel {not_newline_or_plus}*"), # noqa
14
+ ('internal-error-oops', fr'{tstamp}{pid}?\s+Internal error: Oops.*?-+\[? end trace \w+ \]?-+', fr"Oops{not_newline_or_plus}*"), # noqa
12
15
  ]
13
16
 
14
17
  ONELINERS = [
15
- ('check-kernel-oops', r'^[^\n]+Oops(?: -|:).*?$', r"Oops[^\+\n]*"),
16
- ('check-kernel-fault', r'^[^\n]+Unhandled fault.*?$', r"Unhandled [^\+\n]*"),
17
- ('check-kernel-warning', r'^[^\n]+WARNING:.*?$', r"WARNING: [^\+\n]*"),
18
- ('check-kernel-bug', r'^[^\n]+(?: kernel BUG at|BUG:).*?$', r"BUG[^\+\n]*"),
19
- ('check-kernel-invalid-opcode', r'^[^\n]+invalid opcode:.*?$', r"invalid opcode: [^\+\n]*"),
20
- ('check-kernel-panic', r'Kernel panic - not syncing.*?$', r"Kernel [^\+\n]*"),
18
+ ('oops', r'^[^\n]+Oops(?: -|:).*?$', fr"Oops{not_newline_or_plus}*"), # noqa
19
+ ('fault', r'^[^\n]+Unhandled fault.*?$', fr"Unhandled {not_newline_or_plus}*"), # noqa
20
+ ('warning', r'^[^\n]+WARNING:.*?$', fr"WARNING:{not_newline_or_plus}*"), # noqa
21
+ ('bug', r'^[^\n]+(?: kernel BUG at|BUG:).*?$', fr"BUG{not_newline_or_plus}*"), # noqa
22
+ ('invalid-opcode', r'^[^\n]+invalid opcode:.*?$', fr"invalid opcode:{not_newline_or_plus}*"), # noqa
23
+ ('panic', r'Kernel panic - not syncing.*?$', fr"Kernel {not_newline_or_plus}*"), # noqa
21
24
  ]
22
25
 
23
26
  # Tip: broader regexes should come first
@@ -38,7 +41,7 @@ class Plugin(BasePlugin, BaseLogParser):
38
41
  return boot_log, test_log
39
42
 
40
43
  def __kernel_msgs_only(self, log):
41
- kernel_msgs = re.findall(r'(\[[ \d]+\.[ \d]+\] .*?)$', log, re.S | re.M)
44
+ kernel_msgs = re.findall(f'({tstamp}{pid}? .*?)$', log, re.S | re.M) # noqa
42
45
  return '\n'.join(kernel_msgs)
43
46
 
44
47
  def postprocess_testrun(self, testrun):
@@ -422,6 +422,7 @@ CRISPY_TEMPLATE_PACK = 'bootstrap3'
422
422
 
423
423
  # Sentry support
424
424
  SENTRY_DSN = os.getenv('SENTRY_DSN')
425
+ SENTRY_TRACES_SAMPLE_RATE = os.getenv('SENTRY_TRACES_SAMPLE_RATE', '0')
425
426
  if SENTRY_DSN:
426
427
  try:
427
428
  import sentry_sdk
@@ -432,6 +433,7 @@ if SENTRY_DSN:
432
433
  dsn=SENTRY_DSN,
433
434
  integrations=[DjangoIntegration(), CeleryIntegration()],
434
435
  release='%s@%s' % (os.getenv('ENV', 'squad'), squad_version),
436
+ traces_sample_rate=float(SENTRY_TRACES_SAMPLE_RATE),
435
437
  )
436
438
  except ImportError:
437
439
  pass
@@ -0,0 +1 @@
1
+ __version__ = '1.92'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: squad
3
- Version: 1.90
3
+ Version: 1.92
4
4
  Summary: Software Quality Dashboard
5
5
  Home-page: https://github.com/Linaro/squad
6
6
  Author: Antonio Terceiro
@@ -100,6 +100,7 @@ squad/api/apps.py
100
100
  squad/api/ci.py
101
101
  squad/api/data.py
102
102
  squad/api/filters.py
103
+ squad/api/prometheus.py
103
104
  squad/api/rest.py
104
105
  squad/api/urls.py
105
106
  squad/api/utils.py
@@ -617,11 +618,15 @@ test/plugins/test_github.py
617
618
  test/plugins/test_linux_log_parser.py
618
619
  test/plugins/test_log_parser_base.py
619
620
  test/plugins/test_plugin.py
621
+ test/plugins/linux_log_parser/internal-error-oops.log
620
622
  test/plugins/linux_log_parser/kasan.log
623
+ test/plugins/linux_log_parser/kcsan_full_log.log
624
+ test/plugins/linux_log_parser/kcsan_simple.log
621
625
  test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log
622
626
  test/plugins/linux_log_parser/kernelexceptiontrace.log
623
627
  test/plugins/linux_log_parser/kernelexceptiontrace_without_squarebraces.log
624
- test/plugins/linux_log_parser/kernelpanic.log
628
+ test/plugins/linux_log_parser/kernelpanic-multiline.log
629
+ test/plugins/linux_log_parser/kernelpanic-single-and-multiline.log
625
630
  test/plugins/linux_log_parser/kfence.log
626
631
  test/plugins/linux_log_parser/multiple_issues_dmesg.log
627
632
  test/plugins/linux_log_parser/oops.log
@@ -31,4 +31,4 @@ svgwrite
31
31
  whitenoise
32
32
 
33
33
  [postgres]
34
- psycopg2
34
+ psycopg2-binary
@@ -156,6 +156,15 @@ class CiApiTest(TestCase):
156
156
  r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
157
157
  self.assertEqual(400, r.status_code)
158
158
 
159
+ @patch('squad.ci.backend.fake.Backend.check_job_id', return_value='bad definition')
160
+ def test_bad_job_id(self, check_job_id):
161
+ args = {
162
+ 'backend': 'lava',
163
+ 'testjob_id': 'invalid job id'
164
+ }
165
+ r = self.client.post('/api/submitjob/mygroup/myproject/1/myenv', args)
166
+ self.assertEqual(400, r.status_code)
167
+
159
168
  def test_disabled_environment(self):
160
169
  args = {
161
170
  'backend': 'lava',
@@ -448,6 +448,12 @@ class LavaTest(TestCase):
448
448
  check = lava.check_job_definition(definition)
449
449
  self.assertIn('found unexpected end of stream', check)
450
450
 
451
+ def test_check_job_id(self):
452
+ lava = LAVABackend(None)
453
+ self.assertTrue(lava.check_job_id(1))
454
+ self.assertTrue(lava.check_job_id('1'))
455
+ self.assertEqual("LAVA job id should be an integer", lava.check_job_id("abc"))
456
+
451
457
  def test_lava_job_name(self):
452
458
  lava = LAVABackend(None)
453
459
  self.assertIsNone(lava._Backend__lava_job_name('no name:'))