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.
- {squad-1.90 → squad-1.92}/CHANGELOG.md +44 -0
- {squad-1.90/squad.egg-info → squad-1.92}/PKG-INFO +1 -1
- {squad-1.90 → squad-1.92}/doc/install.rst +7 -0
- {squad-1.90 → squad-1.92}/setup.py +1 -1
- {squad-1.90 → squad-1.92}/squad/api/ci.py +11 -6
- squad-1.92/squad/api/prometheus.py +52 -0
- {squad-1.90 → squad-1.92}/squad/api/urls.py +2 -0
- {squad-1.90 → squad-1.92}/squad/ci/backend/fake.py +3 -0
- {squad-1.90 → squad-1.92}/squad/ci/backend/lava.py +6 -1
- {squad-1.90 → squad-1.92}/squad/ci/backend/null.py +6 -0
- {squad-1.90 → squad-1.92}/squad/ci/backend/tuxsuite.py +39 -8
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project.jinja2 +8 -0
- {squad-1.90 → squad-1.92}/squad/frontend/urls.py +1 -0
- {squad-1.90 → squad-1.92}/squad/plugins/lib/base_log_parser.py +11 -6
- {squad-1.90 → squad-1.92}/squad/plugins/linux_log_parser.py +14 -11
- {squad-1.90 → squad-1.92}/squad/settings.py +2 -0
- squad-1.92/squad/version.py +1 -0
- {squad-1.90 → squad-1.92/squad.egg-info}/PKG-INFO +1 -1
- {squad-1.90 → squad-1.92}/squad.egg-info/SOURCES.txt +6 -1
- {squad-1.90 → squad-1.92}/squad.egg-info/requires.txt +1 -1
- {squad-1.90 → squad-1.92}/test/api/test_ci.py +9 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/test_lava.py +6 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/test_tuxsuite.py +186 -42
- {squad-1.90 → squad-1.92}/test/frontend/test_tests.py +2 -0
- squad-1.92/test/plugins/linux_log_parser/internal-error-oops.log +1017 -0
- squad-1.92/test/plugins/linux_log_parser/kcsan_full_log.log +3120 -0
- squad-1.92/test/plugins/linux_log_parser/kcsan_simple.log +37 -0
- squad-1.92/test/plugins/linux_log_parser/kernelpanic-multiline.log +1742 -0
- {squad-1.90 → squad-1.92}/test/plugins/test_linux_log_parser.py +80 -52
- {squad-1.90 → squad-1.92}/test/plugins/test_log_parser_base.py +21 -0
- squad-1.90/squad/version.py +0 -1
- {squad-1.90 → squad-1.92}/.ackrc +0 -0
- {squad-1.90 → squad-1.92}/.coveragerc +0 -0
- {squad-1.90 → squad-1.92}/.ctags +0 -0
- {squad-1.90 → squad-1.92}/.dockerignore +0 -0
- {squad-1.90 → squad-1.92}/.gitignore +0 -0
- {squad-1.90 → squad-1.92}/.mailmap +0 -0
- {squad-1.90 → squad-1.92}/.readthedocs.yml +0 -0
- {squad-1.90 → squad-1.92}/.reuse/dep5 +0 -0
- {squad-1.90 → squad-1.92}/COPYING +0 -0
- {squad-1.90 → squad-1.92}/COPYRIGHTS +0 -0
- {squad-1.90 → squad-1.92}/Dockerfile +0 -0
- {squad-1.90 → squad-1.92}/LICENSES/GPL-3.0-or-later.txt +0 -0
- {squad-1.90 → squad-1.92}/LICENSES/MIT.txt +0 -0
- {squad-1.90 → squad-1.92}/LICENSES/OFL-1.1.txt +0 -0
- {squad-1.90 → squad-1.92}/MANIFEST.in +0 -0
- {squad-1.90 → squad-1.92}/Procfile +0 -0
- {squad-1.90 → squad-1.92}/README.rst +0 -0
- {squad-1.90 → squad-1.92}/babel.cfg +0 -0
- {squad-1.90 → squad-1.92}/dev-docker +0 -0
- {squad-1.90 → squad-1.92}/doc/.gitignore +0 -0
- {squad-1.90 → squad-1.92}/doc/Makefile +0 -0
- {squad-1.90 → squad-1.92}/doc/api.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/ci.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/conf.py +0 -0
- {squad-1.90 → squad-1.92}/doc/hacking.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/index.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/intro.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/lava_usecase.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/plugins.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/quickstart.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/translating.rst +0 -0
- {squad-1.90 → squad-1.92}/doc/tuxsuite_usecase.rst +0 -0
- {squad-1.90 → squad-1.92}/docker/db-dumped +0 -0
- {squad-1.90 → squad-1.92}/docker/db-to-be-restored +0 -0
- {squad-1.90 → squad-1.92}/docker/docker-compose.yml +0 -0
- {squad-1.90 → squad-1.92}/docker/extra_settings.py +0 -0
- {squad-1.90 → squad-1.92}/docker/init-db.sh +0 -0
- {squad-1.90 → squad-1.92}/docker/rabbitmq.config +0 -0
- {squad-1.90 → squad-1.92}/docker/squad-apache.conf +0 -0
- {squad-1.90 → squad-1.92}/docker-compose.yaml +0 -0
- {squad-1.90 → squad-1.92}/manage.py +0 -0
- {squad-1.90 → squad-1.92}/package-lock.json +0 -0
- {squad-1.90 → squad-1.92}/package.json +0 -0
- {squad-1.90 → squad-1.92}/pytest.ini +0 -0
- {squad-1.90 → squad-1.92}/requirements-dev.txt +0 -0
- {squad-1.90 → squad-1.92}/requirements.txt +0 -0
- {squad-1.90 → squad-1.92}/scripts/build +0 -0
- {squad-1.90 → squad-1.92}/scripts/check-ci +0 -0
- {squad-1.90 → squad-1.92}/scripts/check-ignore +0 -0
- {squad-1.90 → squad-1.92}/scripts/community_connector/main.js +0 -0
- {squad-1.90 → squad-1.92}/scripts/community_connector/manifest.json +0 -0
- {squad-1.90 → squad-1.92}/scripts/dogfood +0 -0
- {squad-1.90 → squad-1.92}/scripts/get-metrics +0 -0
- {squad-1.90 → squad-1.92}/scripts/get-tests +0 -0
- {squad-1.90 → squad-1.92}/scripts/git-build +0 -0
- {squad-1.90 → squad-1.92}/scripts/pytest +0 -0
- {squad-1.90 → squad-1.92}/scripts/rabbitmq-server +0 -0
- {squad-1.90 → squad-1.92}/scripts/release +0 -0
- {squad-1.90 → squad-1.92}/scripts/release-docker +0 -0
- {squad-1.90 → squad-1.92}/scripts/squad-config +0 -0
- {squad-1.90 → squad-1.92}/scripts/test-ci +0 -0
- {squad-1.90 → squad-1.92}/scripts/test-docker +0 -0
- {squad-1.90 → squad-1.92}/scripts/testdata/gen-ci-jobs +0 -0
- {squad-1.90 → squad-1.92}/scripts/testdata/gen-metrics +0 -0
- {squad-1.90 → squad-1.92}/scripts/testdata/gen-test-data +0 -0
- {squad-1.90 → squad-1.92}/scripts/testdata/gen-tests +0 -0
- {squad-1.90 → squad-1.92}/scripts/testdata/setup-dev +0 -0
- {squad-1.90 → squad-1.92}/scripts/testdata/submit-ci-jobs +0 -0
- {squad-1.90 → squad-1.92}/scripts/testdata/submit-test-data +0 -0
- {squad-1.90 → squad-1.92}/scripts/translate +0 -0
- {squad-1.90 → squad-1.92}/scripts/travis-lava +0 -0
- {squad-1.90 → squad-1.92}/scripts/update-translation-files +0 -0
- {squad-1.90 → squad-1.92}/setup.cfg +0 -0
- {squad-1.90 → squad-1.92}/squad/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/admin.py +0 -0
- {squad-1.90 → squad-1.92}/squad/api/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/api/apps.py +0 -0
- {squad-1.90 → squad-1.92}/squad/api/data.py +0 -0
- {squad-1.90 → squad-1.92}/squad/api/filters.py +0 -0
- {squad-1.90 → squad-1.92}/squad/api/rest.py +0 -0
- {squad-1.90 → squad-1.92}/squad/api/utils.py +0 -0
- {squad-1.90 → squad-1.92}/squad/api/views.py +0 -0
- {squad-1.90 → squad-1.92}/squad/celery.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/admin.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/apps.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/backend/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/exceptions.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/management/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/management/commands/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/management/commands/create_tuxsuite_boot_tests.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/management/commands/listen.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/management/commands/testfetch.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0001_initial.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0002_auto_20170406_1252.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0003_backend_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0004_testjob_failure.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0005_remove_listener_data.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0006_simplify_backend_loading.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0007_auto_20170517_1736.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0008_testjob_testrun.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0009_slug_pattern.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0010_testjob_can_resubmit.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0011_testjob_resubmitted_count.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0012_testjob_build.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0013_testjob_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0014_testjob_target_build.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0015_testjob_populate_target_build.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0016_backend_max_fetch_attempts.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0017_testjob_fetch_attempts.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0018_testjob_dates.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0019_add_fake_backend.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0020_backend_settings_field.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0021_testjob_parent_job.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0022_backend_poll_enabled.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0023_remove_testjob_build.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0024_fix_testjob_environment_validation.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0025_backend_listen_enabled.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0026_job_start_end_time.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0027_add_tuxsuite_implementation_type.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0028_create_testjob_indexes.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0029_create_testjob_results_input.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/0030_testjob_subtasks_count.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/migrations/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/models.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/tasks.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/templates/squad/ci/testjob_resubmit.html.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/templates/squad/ci/testjob_resubmit.txt.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/templatetags/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/templatetags/filter_jobs.py +0 -0
- {squad-1.90 → squad-1.92}/squad/ci/utils.py +0 -0
- {squad-1.90 → squad-1.92}/squad/compat.py +0 -0
- {squad-1.90 → squad-1.92}/squad/container_settings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/admin.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/apps.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/callback.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/comparison.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/data.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/failures.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/history.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/locale/django.pot +0 -0
- {squad-1.90 → squad-1.92}/squad/core/locale/es_MX/LC_MESSAGES/django.po +0 -0
- {squad-1.90 → squad-1.92}/squad/core/locale/pl/LC_MESSAGES/django.po +0 -0
- {squad-1.90 → squad-1.92}/squad/core/locale/pt/LC_MESSAGES/django.po +0 -0
- {squad-1.90 → squad-1.92}/squad/core/locale/pt_BR/LC_MESSAGES/django.po +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/compute_build_summaries.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/compute_project_statuses.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/fill_test_metadata.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/fix_squadplugin_data.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/import_data.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/import_data.rst +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/migrate_test_runs.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/populate_metric_build_and_environment.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/populate_test_build_and_environment.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/prepdump.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/send-email.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/update_project_statuses.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/management/commands/users.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0001_initial.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0002_auto_20160525_1403.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0003_testrun_log_file.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0004_group_user_groups.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0005_token.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0006_auto_20160826_2242.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0007_testrun_data_processed.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0008_status.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0009_testrun_status_recorded.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0010_testrun_datetime.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0011_testrun_metadata_fields.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0012_build_datetime.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0013_testrun_resubmit_url.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0014_testrun_metadata_file.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0015_attachment.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0016_project_is_public.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0017_slug_validator.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0018_build_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0019_build_version.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0020_build_ordering.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0021_global_tokens.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0022_projectstatus.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0023_subscription.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0024_project_build_completion_threshold.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0025_unique_testrun_job_id.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0026_testrun_result_accept_null.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0027_project_notification_strategy.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0028_suite_and_test_name_length.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0029_subscription_email_formats.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0030_remove_project_build_completion_threshold.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0031_environment_expected_test_runs.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0032_testrun_completed.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0033_drop_debversion.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0034_prepare_to_remove_build_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0035_remove_build_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0036_status_tests_skip.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0037_project_status_test_summary_fields.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0038_populate_project_status_cache.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0039_orderings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0040_remove_subscription_html.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0041_projectstatus_notified.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0042_set_projectstatus_notified.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0043_project_status_build.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0044_project_html_mail.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0045_adminsubscription.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0046_projectstatus_last_updated.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0047_populate_projectstatus_last_updated.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0048_moderate_notifications.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0049_projectstatus_plural.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0050_projectstatus_finished.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0051_build_status.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0052_recreate_projectstatus_data.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0053_remove_projectstatus_previous.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0054_custom_email_template.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0055_emailtemplate_subject.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0056_project_description.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0057_projectstatus_has_metrics.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0058_populate_projectstatus_has_metrics.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0059_project_important_metadata_keys.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0060_test_log.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0061_project_enabled_plugins_list.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0062_project_allow_empty_enabled_plugin_list.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0063_project_wait_before_notification.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0064_project_notification_timeout.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0065_projectstatus_notified_on_timeout.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0066_environment_description.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0067_accept_blank_suite_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0068_suite_version.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0069_suite_metadata.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0070_create_suite_test_and_metric_metadata.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0071_migrate_old_tokens.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0072_group_description.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0073_auto_20180420_1643.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0074_add_indexes.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0075_update_project_enabled_plugin_list.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0076_patch_builds.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0077_knownissue.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0078_cache_test_run_counts.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0079_init_cache_test_run_counts.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0080_auto_20180810_0047.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0081_status_has_metrics.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0082_populate_status_has_metrics.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0083_rename_knownissue_environments.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0084_projectstatus_regressions_fixes.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0085_projectstatus_defaults.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0086_xfail.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0087_test_known_issues.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0088_user_subscriptions.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0089_test_has_known_issues.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0090_populate_test_has_known_issues.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0091_notification_delivery_remove_unique_status.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0092_annotation.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0093_historicalemailtemplate.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0094_populatehistoricalemailtemplate.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0095_project_data_retention_days.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0096_build_keep_data.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0097_build_placeholder.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0098_blank_annotation.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0099_metricthreshold.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0100_metric_is_outlier.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0101_project_project_settings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0102_projectstatus_null_metric_summary.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0103_populate_project_status.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0104_delayedreport.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0105_delayed_report_error_message.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0106_delayedreport_output_subject.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0107_move_notification_strategy.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0108_add_email_template_validator.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0109_group_member.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0110_move_users_from_django_groups_to_squad_groups.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0111_remove_group_user_groups.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0112_user_namespaces.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0113_group_project_blank_name_and_description.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0114_project_enabled_plugin_list_can_be_blank.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0115_fix_slug_validation.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0116_make_group_membership_unique.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0117_drop_obsolete_token_model.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0118_project_is_archived.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0119_i18n.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0120_buildsummary.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0121_add_password_patchsource.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0122_fix_patchsource_url_and_token.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0123_django_upgrade_missing_migrations.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0124_set_default_expected_test_runs_to_zero.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0125_fix_missing_status_has_metrics_for_testruns.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0126_metricthreshold_environment.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0127_metric_thresholds_migrate_data.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0128_metric_thresholds_remove_proj_col.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0129_projectstatus_nullable_notified_on_timeout.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0130_project_status_baseline_next.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0131_create_squad_auth_group_and_add_users.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0132_attachment_mimetype.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0133_append_project_permissions_to_squad_auth_group.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0134_longer_metric_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0135_add_privileged_access_level.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0136_migrate_submitters_to_privileged.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0137_patchsource_token_null.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0138_metric_unit.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0139_nullable_test_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0140_increase_gerrit_password_length.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0141_remove_test_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0142_add_testrun_file_storage.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0143_attachment_storage.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0144_attachment_data_null.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0145_pluginscratch.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0146_deprecate_testrun_and_attachment_data_fields.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0147_add_build_and_environment_to_test.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0148_remove_legacy_storage_fields.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0149_build_patch_url.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0150_add_new_notification_strategy.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0151_callback.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0152_add_build_patch_notified.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0153_callback_make_response_content_blob.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0154_project_add_force_finishing_builds_field.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0155_add_build_and_environment_to_metric.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0156_nullable_metric_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0157_remove_metric_name.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0158_add_metric_comparison_to_projectstatus.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0159_nullable_metricthreshold_value.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0160_add_project_to_metricthreshold.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0161_add_metricthreshold_perm_to_squad_group.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0162_project_add_build_confidence_settings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0163_hirtoricalemailtemplate_update.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0164_django_update.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0165_buildsummary_uniqueness.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0166_build_is_release.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0167_add_project_datetime.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0168_add_group_settings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/0169_userpreferences.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/migrations/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/models.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/notification.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/plugins.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/queries.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/statistics.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/tasks/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/tasks/exceptions.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/tasks/notification.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/base.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/diff.html.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/diff.txt.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/failed_test_jobs.html.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/failed_test_jobs.txt.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/moderation.html.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templates/squad/notification/moderation.txt.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templatetags/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/templatetags/squad_notification.py +0 -0
- {squad-1.90 → squad-1.92}/squad/core/utils.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/__main__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/admin.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/apps.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/badges.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/build_settings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/ci.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/comparison.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/extract.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/forms.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/group_settings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/locale/django.pot +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/locale/pl/LC_MESSAGES/django.po +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/locale/pt/LC_MESSAGES/django.po +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/locale/pt_BR/LC_MESSAGES/django.po +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/management/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/management/commands/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/management/commands/get_token.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/metrics.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/project_settings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/queries.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/setup.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/compare.css +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/download +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/download.conf +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/favicon.ico +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/main.css +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/attach_select2.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/build.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/build_compare.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/build_list.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/charts.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/common.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/compare.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/config.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/annotation.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/build_compare.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/build_list_compare.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/build_release.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/cancel.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/charts.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/compare.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/fetch.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/filter.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/metricThreshold.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/project_compare.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/resubmit.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/controllers/testjobs_progress.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/metric.threshold.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/project_compare.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/showHide.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad/table.js +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/static/squad_sign.svg +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/401.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/404.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/django/rest_framework/api.html +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/django/squad/_user_menu.html +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_builds_table.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_env_suite_data.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_metadata.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_pagination.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_permissions.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_project_list.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_regressions_and_fixes.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_results_table.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_results_transitions_filter.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_subscribe.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_results_envbox.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_results_suitebox.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_results_summary.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_results_table.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_run_metric.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_test_run_test.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_unfinished_build.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/_user_menu.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/base.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build-nav.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build_callbacks.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build_metadata.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build_metrics.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/build_settings.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/builds.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/compare.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/compare_builds.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/compare_projects.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group-nav.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/advanced.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/base.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/delete.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/index.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/members.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/new_group.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/group_settings/new_project.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/index.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/knownissues.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/login.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/metrics.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project-nav.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/_threshold_table.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/advanced.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/base.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/build_confidence.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/delete.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/environments.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/index.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/project_settings/thresholds.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_history.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_run.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_run_suite_metrics.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_run_suite_test_details.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/test_run_suite_tests.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/testjob.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/testjobs.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/testjobs_progress.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/tests-details-nav.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/tests.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/api_token.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/base.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/profile.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/projects.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/subscriptions.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templates/squad/user_settings/user_preferences.jinja2 +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templatetags/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/templatetags/squad.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/tests.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/user_settings.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/utils.py +0 -0
- {squad-1.90 → squad-1.92}/squad/frontend/views.py +0 -0
- {squad-1.90 → squad-1.92}/squad/http.py +0 -0
- {squad-1.90 → squad-1.92}/squad/jinja2.py +0 -0
- {squad-1.90 → squad-1.92}/squad/mail.py +0 -0
- {squad-1.90 → squad-1.92}/squad/manage.py +0 -0
- {squad-1.90 → squad-1.92}/squad/plugins/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/plugins/example.py +0 -0
- {squad-1.90 → squad-1.92}/squad/plugins/gerrit.py +0 -0
- {squad-1.90 → squad-1.92}/squad/plugins/github.py +0 -0
- {squad-1.90 → squad-1.92}/squad/plugins/lib/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/run/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/run/__main__.py +0 -0
- {squad-1.90 → squad-1.92}/squad/run/listener.py +0 -0
- {squad-1.90 → squad-1.92}/squad/run/scheduler.py +0 -0
- {squad-1.90 → squad-1.92}/squad/run/worker.py +0 -0
- {squad-1.90 → squad-1.92}/squad/socialaccount.py +0 -0
- {squad-1.90 → squad-1.92}/squad/urls.py +0 -0
- {squad-1.90 → squad-1.92}/squad/wsgi.py +0 -0
- {squad-1.90 → squad-1.92}/squad.egg-info/dependency_links.txt +0 -0
- {squad-1.90 → squad-1.92}/squad.egg-info/entry_points.txt +0 -0
- {squad-1.90 → squad-1.92}/squad.egg-info/top_level.txt +0 -0
- {squad-1.90 → squad-1.92}/squad.svg +0 -0
- {squad-1.90 → squad-1.92}/test/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/test/api/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/test/api/benchmarks.csv +0 -0
- {squad-1.90 → squad-1.92}/test/api/benchmarks.json +0 -0
- {squad-1.90 → squad-1.92}/test/api/definition.yaml +0 -0
- {squad-1.90 → squad-1.92}/test/api/metadata.json +0 -0
- {squad-1.90 → squad-1.92}/test/api/test_data.py +0 -0
- {squad-1.90 → squad-1.92}/test/api/test_rest.py +0 -0
- {squad-1.90 → squad-1.92}/test/api/test_run.log +0 -0
- {squad-1.90 → squad-1.92}/test/api/tests.csv +0 -0
- {squad-1.90 → squad-1.92}/test/api/tests.json +0 -0
- {squad-1.90 → squad-1.92}/test/api/tests.py +0 -0
- {squad-1.90 → squad-1.92}/test/api/tests_log.json +0 -0
- {squad-1.90 → squad-1.92}/test/api/tests_two.json +0 -0
- {squad-1.90 → squad-1.92}/test/api/twoline_definition.yaml +0 -0
- {squad-1.90 → squad-1.92}/test/ci/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/example-broken-log.yaml +0 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/example-lava-log.yaml +0 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/lava.json +0 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/test_fake.py +0 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/test_real_lava.py +0 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/tuxsuite_test_failed_result_sample.json +0 -0
- {squad-1.90 → squad-1.92}/test/ci/backend/tuxsuite_test_result_sample.json +0 -0
- {squad-1.90 → squad-1.92}/test/ci/test_listen.py +0 -0
- {squad-1.90 → squad-1.92}/test/ci/test_models.py +0 -0
- {squad-1.90 → squad-1.92}/test/ci/test_tasks.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_attachment.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_build.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_build_summary.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_callback.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_emailtemplate.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_failures.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_group.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_historical_emailtemplate.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_history.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_import_data.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_import_data_input/1/default/1/metadata.json +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_import_data_input/1/default/1/metrics.json +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_import_data_input/2/default/2/metadata.json +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_import_data_input/2/default/2/metrics.json +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_import_data_input/2/default/2/screenshot.png +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_import_data_input/2/default/2/tests.json +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_import_data_missing_metadata/1/1/tests.json +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_known_issues.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_metric.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_metric_comparison.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_metric_threshold.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_metrics_data.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_metrics_summary.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_notification.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_notification_delivery.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_patch_source.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_project.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_project_status.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_statistics.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_tasks.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_tasks_notification.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_test.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_test_comparison.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_test_data.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_test_run.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_test_summary.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_update_project_statuses.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_user_namespace.py +0 -0
- {squad-1.90 → squad-1.92}/test/core/test_utils.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/test_basics.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/test_comparison.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/test_get_token_command.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/test_group_settings.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/test_history.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/test_template_tags.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/test_test_job.py +0 -0
- {squad-1.90 → squad-1.92}/test/frontend/test_utils.py +0 -0
- {squad-1.90 → squad-1.92}/test/integration/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/test/integration/plugins/test_tradefed.py +0 -0
- {squad-1.90 → squad-1.92}/test/integration/plugins/tradefed-output-20220608105250.tar.xz +0 -0
- {squad-1.90 → squad-1.92}/test/integration/test_build_notification_from_ci.py +0 -0
- {squad-1.90 → squad-1.92}/test/javascript.py +0 -0
- {squad-1.90 → squad-1.92}/test/karma.conf.js +0 -0
- {squad-1.90 → squad-1.92}/test/mock.py +0 -0
- {squad-1.90 → squad-1.92}/test/performance.py +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/__init__.py +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kasan.log +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kernelexceptiontrace.log +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kernelexceptiontrace_without_squarebraces.log +0 -0
- /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
- {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/kfence.log +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/multiple_issues_dmesg.log +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/oops.log +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/linux_log_parser/rcu_warning.log +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/test_gerrit.py +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/test_github.py +0 -0
- {squad-1.90 → squad-1.92}/test/plugins/test_plugin.py +0 -0
- {squad-1.90 → squad-1.92}/test/settings.py +0 -0
- {squad-1.90 → squad-1.92}/test/test_architecture.py +0 -0
- {squad-1.90 → squad-1.92}/test/test_code_quality.py +0 -0
- {squad-1.90 → squad-1.92}/test/test_cors.py +0 -0
- {squad-1.90 → squad-1.92}/test/test_i18n.py +0 -0
- {squad-1.90 → squad-1.92}/test/test_mail.py +0 -0
- {squad-1.90 → squad-1.92}/test/test_pending_migrations.py +0 -0
- {squad-1.90 → squad-1.92}/test/unit/test_annotation.js +0 -0
- {squad-1.90 → squad-1.92}/test/unit/test_cancel.js +0 -0
- {squad-1.90 → squad-1.92}/test/unit/test_charts.js +0 -0
- {squad-1.90 → squad-1.92}/test/unit/test_compare.js +0 -0
- {squad-1.90 → squad-1.92}/test/unit/test_filter.js +0 -0
- {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
|
@@ -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.
|
@@ -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
|
]
|
@@ -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']
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
('
|
10
|
-
('
|
11
|
-
('
|
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
|
-
('
|
16
|
-
('
|
17
|
-
('
|
18
|
-
('
|
19
|
-
('
|
20
|
-
('
|
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(
|
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'
|
@@ -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
|
@@ -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:'))
|