squad 1.83__tar.gz → 1.85__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {squad-1.83 → squad-1.85}/.readthedocs.yml +1 -1
- {squad-1.83 → squad-1.85}/CHANGELOG.md +28 -0
- {squad-1.83 → squad-1.85}/MANIFEST.in +1 -0
- {squad-1.83 → squad-1.85}/PKG-INFO +1 -1
- {squad-1.83 → squad-1.85}/doc/ci.rst +3 -3
- {squad-1.83 → squad-1.85}/doc/install.rst +68 -2
- {squad-1.83 → squad-1.85}/doc/intro.rst +3 -3
- {squad-1.83 → squad-1.85}/doc/lava_usecase.rst +1 -1
- {squad-1.83 → squad-1.85}/doc/plugins.rst +2 -2
- {squad-1.83 → squad-1.85}/doc/tuxsuite_usecase.rst +1 -1
- squad-1.85/docker/docker-compose.yml +147 -0
- squad-1.85/docker/init-db.sh +10 -0
- squad-1.85/docker/rabbitmq.config +8 -0
- squad-1.85/docker/squad-apache.conf +64 -0
- {squad-1.83 → squad-1.85}/squad/api/ci.py +10 -0
- {squad-1.83 → squad-1.85}/squad/api/rest.py +4 -3
- {squad-1.83 → squad-1.85}/squad/ci/backend/fake.py +9 -0
- {squad-1.83 → squad-1.85}/squad/ci/backend/lava.py +17 -0
- {squad-1.83 → squad-1.85}/squad/ci/backend/null.py +23 -3
- {squad-1.83 → squad-1.85}/squad/ci/backend/tuxsuite.py +5 -0
- {squad-1.83 → squad-1.85}/squad/ci/models.py +4 -1
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/testjobs.jinja2 +8 -6
- squad-1.85/squad/version.py +1 -0
- {squad-1.83 → squad-1.85}/squad.egg-info/PKG-INFO +1 -1
- {squad-1.83 → squad-1.85}/squad.egg-info/SOURCES.txt +7 -0
- {squad-1.83 → squad-1.85}/test/api/test_ci.py +2 -0
- {squad-1.83 → squad-1.85}/test/api/test_rest.py +28 -0
- squad-1.85/test/frontend/__init__.py +0 -0
- squad-1.85/test/integration/__init__.py +0 -0
- squad-1.85/test/plugins/__init__.py +0 -0
- squad-1.83/squad/version.py +0 -1
- {squad-1.83 → squad-1.85}/.ackrc +0 -0
- {squad-1.83 → squad-1.85}/.coveragerc +0 -0
- {squad-1.83 → squad-1.85}/.ctags +0 -0
- {squad-1.83 → squad-1.85}/.dockerignore +0 -0
- {squad-1.83 → squad-1.85}/.github/workflows/release.yml +0 -0
- {squad-1.83 → squad-1.85}/.github/workflows/test.yml +0 -0
- {squad-1.83 → squad-1.85}/.gitignore +0 -0
- {squad-1.83 → squad-1.85}/.mailmap +0 -0
- {squad-1.83 → squad-1.85}/.reuse/dep5 +0 -0
- {squad-1.83 → squad-1.85}/COPYING +0 -0
- {squad-1.83 → squad-1.85}/COPYRIGHTS +0 -0
- {squad-1.83 → squad-1.85}/Dockerfile +0 -0
- {squad-1.83 → squad-1.85}/LICENSES/GPL-3.0-or-later.txt +0 -0
- {squad-1.83 → squad-1.85}/LICENSES/MIT.txt +0 -0
- {squad-1.83 → squad-1.85}/LICENSES/OFL-1.1.txt +0 -0
- {squad-1.83 → squad-1.85}/Procfile +0 -0
- {squad-1.83 → squad-1.85}/README.rst +0 -0
- {squad-1.83 → squad-1.85}/babel.cfg +0 -0
- {squad-1.83 → squad-1.85}/dev-docker +0 -0
- {squad-1.83 → squad-1.85}/doc/.gitignore +0 -0
- {squad-1.83 → squad-1.85}/doc/Makefile +0 -0
- {squad-1.83 → squad-1.85}/doc/api.rst +0 -0
- {squad-1.83 → squad-1.85}/doc/conf.py +0 -0
- {squad-1.83 → squad-1.85}/doc/hacking.rst +0 -0
- {squad-1.83 → squad-1.85}/doc/index.rst +0 -0
- {squad-1.83 → squad-1.85}/doc/quickstart.rst +0 -0
- {squad-1.83 → squad-1.85}/doc/translating.rst +0 -0
- /squad-1.83/squad/api/__init__.py → /squad-1.85/docker/db-dumped +0 -0
- /squad-1.83/squad/ci/__init__.py → /squad-1.85/docker/db-to-be-restored +0 -0
- /squad-1.83/squad/ci/management/__init__.py → /squad-1.85/docker/extra_settings.py +0 -0
- {squad-1.83 → squad-1.85}/docker-compose.yaml +0 -0
- {squad-1.83 → squad-1.85}/manage.py +0 -0
- {squad-1.83 → squad-1.85}/package-lock.json +0 -0
- {squad-1.83 → squad-1.85}/package.json +0 -0
- {squad-1.83 → squad-1.85}/pytest.ini +0 -0
- {squad-1.83 → squad-1.85}/requirements-dev.txt +0 -0
- {squad-1.83 → squad-1.85}/requirements.txt +0 -0
- {squad-1.83 → squad-1.85}/scripts/build +0 -0
- {squad-1.83 → squad-1.85}/scripts/check-ci +0 -0
- {squad-1.83 → squad-1.85}/scripts/check-ignore +0 -0
- {squad-1.83 → squad-1.85}/scripts/community_connector/main.js +0 -0
- {squad-1.83 → squad-1.85}/scripts/community_connector/manifest.json +0 -0
- {squad-1.83 → squad-1.85}/scripts/dogfood +0 -0
- {squad-1.83 → squad-1.85}/scripts/get-metrics +0 -0
- {squad-1.83 → squad-1.85}/scripts/get-tests +0 -0
- {squad-1.83 → squad-1.85}/scripts/git-build +0 -0
- {squad-1.83 → squad-1.85}/scripts/pytest +0 -0
- {squad-1.83 → squad-1.85}/scripts/rabbitmq-server +0 -0
- {squad-1.83 → squad-1.85}/scripts/release +0 -0
- {squad-1.83 → squad-1.85}/scripts/release-docker +0 -0
- {squad-1.83 → squad-1.85}/scripts/squad-config +0 -0
- {squad-1.83 → squad-1.85}/scripts/test-ci +0 -0
- {squad-1.83 → squad-1.85}/scripts/test-docker +0 -0
- {squad-1.83 → squad-1.85}/scripts/testdata/gen-ci-jobs +0 -0
- {squad-1.83 → squad-1.85}/scripts/testdata/gen-metrics +0 -0
- {squad-1.83 → squad-1.85}/scripts/testdata/gen-test-data +0 -0
- {squad-1.83 → squad-1.85}/scripts/testdata/gen-tests +0 -0
- {squad-1.83 → squad-1.85}/scripts/testdata/setup-dev +0 -0
- {squad-1.83 → squad-1.85}/scripts/testdata/submit-ci-jobs +0 -0
- {squad-1.83 → squad-1.85}/scripts/testdata/submit-test-data +0 -0
- {squad-1.83 → squad-1.85}/scripts/translate +0 -0
- {squad-1.83 → squad-1.85}/scripts/travis-lava +0 -0
- {squad-1.83 → squad-1.85}/scripts/update-translation-files +0 -0
- {squad-1.83 → squad-1.85}/scripts/upload +0 -0
- {squad-1.83 → squad-1.85}/setup.cfg +0 -0
- {squad-1.83 → squad-1.85}/setup.py +0 -0
- {squad-1.83 → squad-1.85}/squad/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/admin.py +0 -0
- {squad-1.83/squad/ci/management/commands → squad-1.85/squad/api}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/api/apps.py +0 -0
- {squad-1.83 → squad-1.85}/squad/api/data.py +0 -0
- {squad-1.83 → squad-1.85}/squad/api/filters.py +0 -0
- {squad-1.83 → squad-1.85}/squad/api/urls.py +0 -0
- {squad-1.83 → squad-1.85}/squad/api/utils.py +0 -0
- {squad-1.83 → squad-1.85}/squad/api/views.py +0 -0
- {squad-1.83 → squad-1.85}/squad/celery.py +0 -0
- {squad-1.83/squad/ci/migrations → squad-1.85/squad/ci}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/admin.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/apps.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/backend/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/exceptions.py +0 -0
- {squad-1.83/squad/ci/templatetags → squad-1.85/squad/ci/management}/__init__.py +0 -0
- {squad-1.83/squad/core → squad-1.85/squad/ci/management/commands}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/management/commands/create_tuxsuite_boot_tests.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/management/commands/listen.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/management/commands/testfetch.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0001_initial.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0002_auto_20170406_1252.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0003_backend_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0004_testjob_failure.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0005_remove_listener_data.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0006_simplify_backend_loading.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0007_auto_20170517_1736.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0008_testjob_testrun.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0009_slug_pattern.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0010_testjob_can_resubmit.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0011_testjob_resubmitted_count.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0012_testjob_build.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0013_testjob_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0014_testjob_target_build.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0015_testjob_populate_target_build.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0016_backend_max_fetch_attempts.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0017_testjob_fetch_attempts.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0018_testjob_dates.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0019_add_fake_backend.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0020_backend_settings_field.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0021_testjob_parent_job.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0022_backend_poll_enabled.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0023_remove_testjob_build.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0024_fix_testjob_environment_validation.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0025_backend_listen_enabled.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0026_job_start_end_time.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0027_add_tuxsuite_implementation_type.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0028_create_testjob_indexes.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0029_create_testjob_results_input.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/migrations/0030_testjob_subtasks_count.py +0 -0
- {squad-1.83/squad/core/management → squad-1.85/squad/ci/migrations}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/tasks.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/templates/squad/ci/testjob_resubmit.html.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/templates/squad/ci/testjob_resubmit.txt.jinja2 +0 -0
- {squad-1.83/squad/core/management/commands → squad-1.85/squad/ci/templatetags}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/templatetags/filter_jobs.py +0 -0
- {squad-1.83 → squad-1.85}/squad/ci/utils.py +0 -0
- {squad-1.83 → squad-1.85}/squad/compat.py +0 -0
- {squad-1.83 → squad-1.85}/squad/container_settings.py +0 -0
- {squad-1.83/squad/core/migrations → squad-1.85/squad/core}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/admin.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/apps.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/callback.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/comparison.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/data.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/failures.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/history.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/locale/django.pot +0 -0
- {squad-1.83 → squad-1.85}/squad/core/locale/es_MX/LC_MESSAGES/django.po +0 -0
- {squad-1.83 → squad-1.85}/squad/core/locale/pl/LC_MESSAGES/django.po +0 -0
- {squad-1.83 → squad-1.85}/squad/core/locale/pt/LC_MESSAGES/django.po +0 -0
- {squad-1.83 → squad-1.85}/squad/core/locale/pt_BR/LC_MESSAGES/django.po +0 -0
- {squad-1.83/squad/core/templatetags → squad-1.85/squad/core/management}/__init__.py +0 -0
- {squad-1.83/squad/frontend/management → squad-1.85/squad/core/management/commands}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/compute_build_summaries.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/compute_project_statuses.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/fill_test_metadata.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/fix_squadplugin_data.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/import_data.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/import_data.rst +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/migrate_test_runs.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/populate_metric_build_and_environment.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/populate_test_build_and_environment.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/prepdump.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/send-email.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/update_project_statuses.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/management/commands/users.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0001_initial.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0002_auto_20160525_1403.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0003_testrun_log_file.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0004_group_user_groups.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0005_token.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0006_auto_20160826_2242.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0007_testrun_data_processed.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0008_status.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0009_testrun_status_recorded.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0010_testrun_datetime.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0011_testrun_metadata_fields.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0012_build_datetime.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0013_testrun_resubmit_url.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0014_testrun_metadata_file.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0015_attachment.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0016_project_is_public.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0017_slug_validator.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0018_build_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0019_build_version.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0020_build_ordering.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0021_global_tokens.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0022_projectstatus.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0023_subscription.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0024_project_build_completion_threshold.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0025_unique_testrun_job_id.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0026_testrun_result_accept_null.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0027_project_notification_strategy.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0028_suite_and_test_name_length.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0029_subscription_email_formats.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0030_remove_project_build_completion_threshold.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0031_environment_expected_test_runs.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0032_testrun_completed.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0033_drop_debversion.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0034_prepare_to_remove_build_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0035_remove_build_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0036_status_tests_skip.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0037_project_status_test_summary_fields.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0038_populate_project_status_cache.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0039_orderings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0040_remove_subscription_html.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0041_projectstatus_notified.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0042_set_projectstatus_notified.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0043_project_status_build.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0044_project_html_mail.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0045_adminsubscription.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0046_projectstatus_last_updated.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0047_populate_projectstatus_last_updated.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0048_moderate_notifications.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0049_projectstatus_plural.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0050_projectstatus_finished.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0051_build_status.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0052_recreate_projectstatus_data.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0053_remove_projectstatus_previous.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0054_custom_email_template.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0055_emailtemplate_subject.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0056_project_description.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0057_projectstatus_has_metrics.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0058_populate_projectstatus_has_metrics.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0059_project_important_metadata_keys.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0060_test_log.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0061_project_enabled_plugins_list.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0062_project_allow_empty_enabled_plugin_list.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0063_project_wait_before_notification.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0064_project_notification_timeout.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0065_projectstatus_notified_on_timeout.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0066_environment_description.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0067_accept_blank_suite_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0068_suite_version.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0069_suite_metadata.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0070_create_suite_test_and_metric_metadata.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0071_migrate_old_tokens.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0072_group_description.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0073_auto_20180420_1643.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0074_add_indexes.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0075_update_project_enabled_plugin_list.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0076_patch_builds.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0077_knownissue.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0078_cache_test_run_counts.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0079_init_cache_test_run_counts.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0080_auto_20180810_0047.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0081_status_has_metrics.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0082_populate_status_has_metrics.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0083_rename_knownissue_environments.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0084_projectstatus_regressions_fixes.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0085_projectstatus_defaults.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0086_xfail.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0087_test_known_issues.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0088_user_subscriptions.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0089_test_has_known_issues.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0090_populate_test_has_known_issues.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0091_notification_delivery_remove_unique_status.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0092_annotation.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0093_historicalemailtemplate.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0094_populatehistoricalemailtemplate.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0095_project_data_retention_days.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0096_build_keep_data.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0097_build_placeholder.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0098_blank_annotation.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0099_metricthreshold.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0100_metric_is_outlier.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0101_project_project_settings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0102_projectstatus_null_metric_summary.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0103_populate_project_status.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0104_delayedreport.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0105_delayed_report_error_message.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0106_delayedreport_output_subject.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0107_move_notification_strategy.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0108_add_email_template_validator.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0109_group_member.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0110_move_users_from_django_groups_to_squad_groups.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0111_remove_group_user_groups.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0112_user_namespaces.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0113_group_project_blank_name_and_description.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0114_project_enabled_plugin_list_can_be_blank.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0115_fix_slug_validation.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0116_make_group_membership_unique.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0117_drop_obsolete_token_model.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0118_project_is_archived.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0119_i18n.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0120_buildsummary.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0121_add_password_patchsource.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0122_fix_patchsource_url_and_token.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0123_django_upgrade_missing_migrations.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0124_set_default_expected_test_runs_to_zero.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0125_fix_missing_status_has_metrics_for_testruns.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0126_metricthreshold_environment.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0127_metric_thresholds_migrate_data.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0128_metric_thresholds_remove_proj_col.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0129_projectstatus_nullable_notified_on_timeout.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0130_project_status_baseline_next.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0131_create_squad_auth_group_and_add_users.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0132_attachment_mimetype.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0133_append_project_permissions_to_squad_auth_group.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0134_longer_metric_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0135_add_privileged_access_level.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0136_migrate_submitters_to_privileged.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0137_patchsource_token_null.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0138_metric_unit.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0139_nullable_test_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0140_increase_gerrit_password_length.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0141_remove_test_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0142_add_testrun_file_storage.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0143_attachment_storage.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0144_attachment_data_null.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0145_pluginscratch.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0146_deprecate_testrun_and_attachment_data_fields.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0147_add_build_and_environment_to_test.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0148_remove_legacy_storage_fields.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0149_build_patch_url.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0150_add_new_notification_strategy.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0151_callback.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0152_add_build_patch_notified.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0153_callback_make_response_content_blob.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0154_project_add_force_finishing_builds_field.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0155_add_build_and_environment_to_metric.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0156_nullable_metric_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0157_remove_metric_name.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0158_add_metric_comparison_to_projectstatus.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0159_nullable_metricthreshold_value.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0160_add_project_to_metricthreshold.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0161_add_metricthreshold_perm_to_squad_group.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0162_project_add_build_confidence_settings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0163_hirtoricalemailtemplate_update.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0164_django_update.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0165_buildsummary_uniqueness.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0166_build_is_release.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0167_add_project_datetime.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0168_add_group_settings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/migrations/0169_userpreferences.py +0 -0
- {squad-1.83/squad/frontend/management/commands → squad-1.85/squad/core/migrations}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/models.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/notification.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/plugins.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/queries.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/statistics.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/tasks/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/tasks/exceptions.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/tasks/notification.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/templates/squad/notification/base.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/core/templates/squad/notification/diff.html.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/core/templates/squad/notification/diff.txt.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/core/templates/squad/notification/failed_test_jobs.html.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/core/templates/squad/notification/failed_test_jobs.txt.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/core/templates/squad/notification/moderation.html.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/core/templates/squad/notification/moderation.txt.jinja2 +0 -0
- {squad-1.83/squad/frontend → squad-1.85/squad/core}/templatetags/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/templatetags/squad_notification.py +0 -0
- {squad-1.83 → squad-1.85}/squad/core/utils.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/__main__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/admin.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/apps.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/badges.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/build_settings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/ci.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/comparison.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/extract.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/forms.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/group_settings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/locale/django.pot +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/locale/pl/LC_MESSAGES/django.po +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/locale/pt/LC_MESSAGES/django.po +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/locale/pt_BR/LC_MESSAGES/django.po +0 -0
- {squad-1.83/test/ci → squad-1.85/squad/frontend/management}/__init__.py +0 -0
- {squad-1.83/test/ci/backend → squad-1.85/squad/frontend/management/commands}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/management/commands/get_token.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/metrics.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/project_settings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/queries.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/setup.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/compare.css +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/download +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/download.conf +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/favicon.ico +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/main.css +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/attach_select2.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/build.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/build_compare.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/build_list.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/charts.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/common.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/compare.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/config.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/annotation.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/build_compare.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/build_list_compare.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/build_release.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/cancel.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/charts.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/compare.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/fetch.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/filter.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/metricThreshold.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/project_compare.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/resubmit.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/controllers/testjobs_progress.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/metric.threshold.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/project_compare.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/showHide.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad/table.js +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/static/squad_sign.svg +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/401.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/404.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/django/rest_framework/api.html +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/django/squad/_user_menu.html +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_builds_table.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_env_suite_data.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_metadata.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_pagination.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_permissions.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_project_list.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_regressions_and_fixes.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_results_table.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_results_transitions_filter.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_subscribe.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_test_results_envbox.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_test_results_suitebox.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_test_results_summary.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_test_results_table.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_test_run_metric.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_test_run_test.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_unfinished_build.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/_user_menu.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/base.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/build-nav.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/build.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/build_callbacks.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/build_metadata.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/build_metrics.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/build_settings.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/builds.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/compare.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/compare_builds.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/compare_projects.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group-nav.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group_settings/advanced.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group_settings/base.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group_settings/delete.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group_settings/index.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group_settings/members.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group_settings/new_group.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/group_settings/new_project.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/index.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/knownissues.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/login.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/metrics.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project-nav.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project_settings/_threshold_table.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project_settings/advanced.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project_settings/base.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project_settings/build_confidence.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project_settings/delete.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project_settings/environments.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project_settings/index.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/project_settings/thresholds.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/test_history.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/test_run.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/test_run_suite_metrics.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/test_run_suite_test_details.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/test_run_suite_tests.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/testjob.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/testjobs_progress.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/tests-details-nav.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/tests.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/user_settings/api_token.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/user_settings/base.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/user_settings/profile.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/user_settings/projects.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/user_settings/subscriptions.jinja2 +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templates/squad/user_settings/user_preferences.jinja2 +0 -0
- {squad-1.83/test/core → squad-1.85/squad/frontend/templatetags}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/templatetags/squad.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/tests.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/urls.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/user_settings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/utils.py +0 -0
- {squad-1.83 → squad-1.85}/squad/frontend/views.py +0 -0
- {squad-1.83 → squad-1.85}/squad/http.py +0 -0
- {squad-1.83 → squad-1.85}/squad/jinja2.py +0 -0
- {squad-1.83 → squad-1.85}/squad/mail.py +0 -0
- {squad-1.83 → squad-1.85}/squad/manage.py +0 -0
- {squad-1.83 → squad-1.85}/squad/plugins/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/plugins/example.py +0 -0
- {squad-1.83 → squad-1.85}/squad/plugins/gerrit.py +0 -0
- {squad-1.83 → squad-1.85}/squad/plugins/github.py +0 -0
- {squad-1.83 → squad-1.85}/squad/plugins/linux_log_parser.py +0 -0
- {squad-1.83 → squad-1.85}/squad/run/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/run/__main__.py +0 -0
- {squad-1.83 → squad-1.85}/squad/run/listener.py +0 -0
- {squad-1.83 → squad-1.85}/squad/run/scheduler.py +0 -0
- {squad-1.83 → squad-1.85}/squad/run/worker.py +0 -0
- {squad-1.83 → squad-1.85}/squad/settings.py +0 -0
- {squad-1.83 → squad-1.85}/squad/socialaccount.py +0 -0
- {squad-1.83 → squad-1.85}/squad/urls.py +0 -0
- {squad-1.83 → squad-1.85}/squad/wsgi.py +0 -0
- {squad-1.83 → squad-1.85}/squad.egg-info/dependency_links.txt +0 -0
- {squad-1.83 → squad-1.85}/squad.egg-info/entry_points.txt +0 -0
- {squad-1.83 → squad-1.85}/squad.egg-info/requires.txt +0 -0
- {squad-1.83 → squad-1.85}/squad.egg-info/top_level.txt +0 -0
- {squad-1.83 → squad-1.85}/squad.svg +0 -0
- {squad-1.83 → squad-1.85}/test/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/test/api/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/test/api/benchmarks.csv +0 -0
- {squad-1.83 → squad-1.85}/test/api/benchmarks.json +0 -0
- {squad-1.83 → squad-1.85}/test/api/definition.yaml +0 -0
- {squad-1.83 → squad-1.85}/test/api/metadata.json +0 -0
- {squad-1.83 → squad-1.85}/test/api/test_data.py +0 -0
- {squad-1.83 → squad-1.85}/test/api/test_run.log +0 -0
- {squad-1.83 → squad-1.85}/test/api/tests.csv +0 -0
- {squad-1.83 → squad-1.85}/test/api/tests.json +0 -0
- {squad-1.83 → squad-1.85}/test/api/tests.py +0 -0
- {squad-1.83 → squad-1.85}/test/api/tests_log.json +0 -0
- {squad-1.83 → squad-1.85}/test/api/tests_two.json +0 -0
- {squad-1.83 → squad-1.85}/test/api/twoline_definition.yaml +0 -0
- {squad-1.83/test/frontend → squad-1.85/test/ci}/__init__.py +0 -0
- {squad-1.83/test/integration → squad-1.85/test/ci/backend}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/example-broken-log.yaml +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/example-lava-log.yaml +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/lava.json +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/test_fake.py +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/test_lava.py +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/test_real_lava.py +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/test_tuxsuite.py +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/tuxsuite_test_failed_result_sample.json +0 -0
- {squad-1.83 → squad-1.85}/test/ci/backend/tuxsuite_test_result_sample.json +0 -0
- {squad-1.83 → squad-1.85}/test/ci/test_listen.py +0 -0
- {squad-1.83 → squad-1.85}/test/ci/test_models.py +0 -0
- {squad-1.83 → squad-1.85}/test/ci/test_tasks.py +0 -0
- {squad-1.83/test/plugins → squad-1.85/test/core}/__init__.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_attachment.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_build.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_build_summary.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_callback.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_emailtemplate.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_failures.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_group.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_historical_emailtemplate.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_history.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_import_data.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_import_data_input/1/default/1/metadata.json +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_import_data_input/1/default/1/metrics.json +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_import_data_input/2/default/2/metadata.json +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_import_data_input/2/default/2/metrics.json +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_import_data_input/2/default/2/screenshot.png +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_import_data_input/2/default/2/tests.json +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_import_data_missing_metadata/1/1/tests.json +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_known_issues.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_metric.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_metric_comparison.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_metric_threshold.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_metrics_data.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_metrics_summary.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_notification.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_notification_delivery.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_patch_source.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_project.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_project_status.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_statistics.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_tasks.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_tasks_notification.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_test.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_test_comparison.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_test_data.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_test_run.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_test_summary.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_update_project_statuses.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_user_namespace.py +0 -0
- {squad-1.83 → squad-1.85}/test/core/test_utils.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_basics.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_comparison.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_get_token_command.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_group_settings.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_history.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_template_tags.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_test_job.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_tests.py +0 -0
- {squad-1.83 → squad-1.85}/test/frontend/test_utils.py +0 -0
- {squad-1.83 → squad-1.85}/test/integration/plugins/test_tradefed.py +0 -0
- {squad-1.83 → squad-1.85}/test/integration/plugins/tradefed-output-20220608105250.tar.xz +0 -0
- {squad-1.83 → squad-1.85}/test/integration/test_build_notification_from_ci.py +0 -0
- {squad-1.83 → squad-1.85}/test/javascript.py +0 -0
- {squad-1.83 → squad-1.85}/test/karma.conf.js +0 -0
- {squad-1.83 → squad-1.85}/test/mock.py +0 -0
- {squad-1.83 → squad-1.85}/test/performance.py +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/linux_log_parser/kasan.log +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/linux_log_parser/kernel_bug_and_invalid_opcode.log +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/linux_log_parser/kernelexceptiontrace.log +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/linux_log_parser/kernelpanic.log +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/linux_log_parser/kfence.log +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/linux_log_parser/multiple_issues_dmesg.log +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/linux_log_parser/oops.log +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/linux_log_parser/rcu_warning.log +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/test_gerrit.py +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/test_github.py +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/test_linux_log_parser.py +0 -0
- {squad-1.83 → squad-1.85}/test/plugins/test_plugin.py +0 -0
- {squad-1.83 → squad-1.85}/test/settings.py +0 -0
- {squad-1.83 → squad-1.85}/test/test_architecture.py +0 -0
- {squad-1.83 → squad-1.85}/test/test_code_quality.py +0 -0
- {squad-1.83 → squad-1.85}/test/test_cors.py +0 -0
- {squad-1.83 → squad-1.85}/test/test_i18n.py +0 -0
- {squad-1.83 → squad-1.85}/test/test_mail.py +0 -0
- {squad-1.83 → squad-1.85}/test/test_pending_migrations.py +0 -0
- {squad-1.83 → squad-1.85}/test/unit/test_annotation.js +0 -0
- {squad-1.83 → squad-1.85}/test/unit/test_cancel.js +0 -0
- {squad-1.83 → squad-1.85}/test/unit/test_charts.js +0 -0
- {squad-1.83 → squad-1.85}/test/unit/test_compare.js +0 -0
- {squad-1.83 → squad-1.85}/test/unit/test_filter.js +0 -0
- {squad-1.83 → squad-1.85}/test/unit/test_resubmit.js +0 -0
@@ -1,3 +1,31 @@
|
|
1
|
+
# 1.85
|
2
|
+
|
3
|
+
This 1.85 release changes the test jobs page to only display resubmit and cancel buttons
|
4
|
+
when backend really supports it.
|
5
|
+
|
6
|
+
# 1.84
|
7
|
+
|
8
|
+
This 1.84 release has a new way to run SQUAD via docker-compose, thanks to @swvanbuuren!
|
9
|
+
|
10
|
+
The release also counts with a few improvements on the REST API and CI module.
|
11
|
+
|
12
|
+
Complete list of changes going in:
|
13
|
+
|
14
|
+
* api: rest:
|
15
|
+
* register only one build endpoint
|
16
|
+
* add skip filter
|
17
|
+
* ci:
|
18
|
+
* fetch LAVA job definition for watchjobs
|
19
|
+
* fix variable naming of get_job_definition methods
|
20
|
+
* add test for getting job definitions to testing backend
|
21
|
+
* account for backends without job definition
|
22
|
+
* docs:
|
23
|
+
* .readthedocs.yml: bump Python to 3.10
|
24
|
+
* update authorization token header in SQUAD docs
|
25
|
+
* make docker compose definition generic
|
26
|
+
* add docker compose example incl. documentation
|
27
|
+
* change localhost port behavior
|
28
|
+
|
1
29
|
# 1.83
|
2
30
|
|
3
31
|
This 1.83 release improves documentation and how to run SQUAD.
|
@@ -30,6 +30,7 @@ recursive-include squad/*/templates/ *
|
|
30
30
|
recursive-include test/ *.py *.json *.csv *.log *.png *.yaml *.js
|
31
31
|
recursive-include scripts/ *
|
32
32
|
recursive-include doc/ *
|
33
|
+
recursive-include docker/ *
|
33
34
|
recursive-include LICENSES/ *
|
34
35
|
recursive-include .reuse/ *
|
35
36
|
|
@@ -61,7 +61,7 @@ Example (with test job definition as POST parameter)::
|
|
61
61
|
|
62
62
|
$ DEFINITION="$(cat /path/to/definition.txt)"
|
63
63
|
$ curl \
|
64
|
-
--header "
|
64
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
65
65
|
--form backend=lava \
|
66
66
|
--form definition="$DEFINITION" \
|
67
67
|
https://squad.example.com/api/submitjob/my-group/my-project/x.y.z/my-ci-env
|
@@ -69,7 +69,7 @@ Example (with test job definition as POST parameter)::
|
|
69
69
|
Example (with test job definition as file upload)::
|
70
70
|
|
71
71
|
$ curl \
|
72
|
-
--header "
|
72
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
73
73
|
--form backend=lava \
|
74
74
|
--form definition=@/path/to/definition.txt \
|
75
75
|
https://squad.example.com/api/submitjob/my-group/my-project/x.y.z/my-ci-env
|
@@ -109,7 +109,7 @@ processing. The API is following:
|
|
109
109
|
Example (with test job definition as POST parameter)::
|
110
110
|
|
111
111
|
$ curl \
|
112
|
-
--header "
|
112
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
113
113
|
--form backend=lava \
|
114
114
|
--form testjob_id=123456 \
|
115
115
|
https://squad.example.com/api/watchjob/my-group/my-project/x.y.z/my-ci-env
|
@@ -27,7 +27,6 @@ Install squad with Postgres support::
|
|
27
27
|
|
28
28
|
pip3 install squad[postgres]
|
29
29
|
|
30
|
-
|
31
30
|
Message broker
|
32
31
|
--------------
|
33
32
|
|
@@ -210,7 +209,7 @@ __ https://docs.djangoproject.com/en/1.11/topics/email/
|
|
210
209
|
* ``SQUAD_SEND_ADMIN_ERROR_EMAIL``: Determines whether or not to send exception
|
211
210
|
notifications to administrators. Defaults to ``True``.
|
212
211
|
|
213
|
-
* ``SENTRY_DSN``: Defines Sentry's DSN token, if defined SQUAD will attempt to
|
212
|
+
* ``SENTRY_DSN``: Defines Sentry's DSN token, if defined SQUAD will attempt to
|
214
213
|
import Sentry SDK and use it. Defaults to ``None``. If Sentry is configured
|
215
214
|
it's recommended to disable sending admin notifications by setting
|
216
215
|
``SQUAD_SEND_ADMIN_ERROR_EMAIL = False``.
|
@@ -275,3 +274,70 @@ automate SQUAD setup with containers. Details about user management with
|
|
275
274
|
* --not-staff Make this user no longer a staff member
|
276
275
|
* --superuser Make this user a superuser
|
277
276
|
* --not-superuser Make this user no longer a superuser
|
277
|
+
|
278
|
+
Docker compose setup
|
279
|
+
--------------------
|
280
|
+
|
281
|
+
Alternatively, SQUAD can be run inside a Docker container using `Docker Compose
|
282
|
+
<https://docs.docker.com/compose/>`_. A baseline setup is provided here__.
|
283
|
+
|
284
|
+
__ https://github.com/linaro/squad/tree/master/docker
|
285
|
+
|
286
|
+
Not only will this run all SQUAD processes, but also automatically pull and
|
287
|
+
start all required services to run a local SQUAD instance with a web interface.
|
288
|
+
All container images are pulled automatically from Dockerhub__.
|
289
|
+
|
290
|
+
__ https://hub.docker.com/
|
291
|
+
|
292
|
+
Please be aware, that some of the predefined settings, like ``SQUAD_BASE_URL``
|
293
|
+
or ``SQUAD_EMAIL_FROM`` in ``docker-compose.yml`` and ``squad-apache.conf`` will
|
294
|
+
need to be changed. To use this setup, copy all of the provided files locally
|
295
|
+
and run the docker using::
|
296
|
+
|
297
|
+
docker compose up -d
|
298
|
+
|
299
|
+
After that, the logs and status of the container can be checked resp. using::
|
300
|
+
|
301
|
+
docker compose logs
|
302
|
+
|
303
|
+
and::
|
304
|
+
|
305
|
+
docker stats
|
306
|
+
|
307
|
+
If everything has started successfully, the frontend should be reachable under
|
308
|
+
http://localhost:10080.
|
309
|
+
|
310
|
+
Before being able to actually use the frontend of SQUAD, a user that acts as an
|
311
|
+
administrator (with superuser rights) needs to be created. This can be done by
|
312
|
+
entering the container with::
|
313
|
+
|
314
|
+
docker compose exec squad-frontend /bin/bash
|
315
|
+
|
316
|
+
While being in the container, a new administrator account can be created with the
|
317
|
+
following command::
|
318
|
+
|
319
|
+
squad-admin createsuperuser
|
320
|
+
|
321
|
+
After this command, enter the required data and exit the container environment
|
322
|
+
by issuing ``exit``.
|
323
|
+
|
324
|
+
Now, you should be able to login on the frontend web interface, using the
|
325
|
+
credentials you just entered while creating the administrator account.
|
326
|
+
|
327
|
+
To stop the SQUAD instance, issue the following command to stop the container::
|
328
|
+
|
329
|
+
docker compose down
|
330
|
+
|
331
|
+
Database dump and restore
|
332
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~
|
333
|
+
|
334
|
+
Note that container must be running for the following commands to work.
|
335
|
+
|
336
|
+
To dump the database to the file `db-dumped`, issue the following command::
|
337
|
+
|
338
|
+
docker compose exec -t postgres pg_dump -F custom -U postgres -f /db-dumped squad
|
339
|
+
|
340
|
+
To restore the database from the file `db-to-be-restored`, issue the following
|
341
|
+
command::
|
342
|
+
|
343
|
+
docker compose exec -t postgres pg_restore -U postgres -c -d squad -j4 /db-to-be-restored
|
@@ -84,7 +84,7 @@ the format of the data files.
|
|
84
84
|
Example with test data as file uploads::
|
85
85
|
|
86
86
|
$ curl \
|
87
|
-
--header "
|
87
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
88
88
|
--form tests=@/path/to/test-results.json \
|
89
89
|
--form metrics=@/path/to/metrics.json \
|
90
90
|
--form metadata=@/path/to/metadata.json \
|
@@ -96,7 +96,7 @@ Example with test data as file uploads::
|
|
96
96
|
Example with test data as regular ``POST`` parameters::
|
97
97
|
|
98
98
|
$ curl \
|
99
|
-
--header "
|
99
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
100
100
|
--form tests='{"test1": "pass", "test2": "fail"}' \
|
101
101
|
--form metrics='{"metric1": 21, "metric2": 4}' \
|
102
102
|
--form metadata='{"foo": "bar", "baz": "qux", "job_id": 123}' \
|
@@ -118,7 +118,7 @@ Example with test data using Python's requests library:
|
|
118
118
|
metadata = json.dumps({"foo": "bar", "baz": "qux", "job_id": 123})
|
119
119
|
log = 'log text ...'
|
120
120
|
|
121
|
-
headers = {"
|
121
|
+
headers = {"Authorization": f"token {os.getenv('SQUAD_TOKEN')}"}
|
122
122
|
url = 'https://squad.example.com/api/submit/my-group/my-project/x.y.z/my-ci-env'
|
123
123
|
data = {"metadata": metadata, "log": log, "tests": tests_file}
|
124
124
|
|
@@ -67,7 +67,7 @@ api for submitting a new test job::
|
|
67
67
|
|
68
68
|
wget https://validation.linaro.org/static/docs/v2/examples/test-jobs/qemu-pipeline-first-job.yaml
|
69
69
|
curl localhost:8000/api/submitjob/<group-slug>/<project-slug>/<build-version>/<env> \
|
70
|
-
--header "
|
70
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
71
71
|
--form "backend=<backend-name>" \
|
72
72
|
--form "definition=@qemu-pipeline-first-job.yaml"
|
73
73
|
|
@@ -118,7 +118,7 @@ by a freshly opened Github Pull Request::
|
|
118
118
|
|
119
119
|
$ curl \
|
120
120
|
-X POST \
|
121
|
-
--header "
|
121
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
122
122
|
-d patch_source=your-github-patch-source \
|
123
123
|
-d patch_baseline=build-v1 \
|
124
124
|
-d patch_id=the_owner/the_repo/8223a534d7bf \
|
@@ -150,7 +150,7 @@ by a freshly created change::
|
|
150
150
|
|
151
151
|
$ curl \
|
152
152
|
-X POST \
|
153
|
-
--header "
|
153
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
154
154
|
-d patch_source=your-gerrit-patch-source \
|
155
155
|
-d patch_baseline=build-v1 \
|
156
156
|
-d patch_id=change-id/patchset \
|
@@ -63,7 +63,7 @@ to send to SQUAD's API for fetching::
|
|
63
63
|
...
|
64
64
|
|
65
65
|
curl localhost:8000/api/watchjob/<group-slug>/<project-slug>/<build-version>/<env> \
|
66
|
-
--header "
|
66
|
+
--header "Authorization: token $SQUAD_TOKEN" \
|
67
67
|
--form "backend=tuxsuite.com" \
|
68
68
|
--form "job_id=BUILD:linaro@lkft#2843VDPeVhg4yaTkgTur0T3ykmq"
|
69
69
|
|
@@ -0,0 +1,147 @@
|
|
1
|
+
version: "3.9"
|
2
|
+
|
3
|
+
services:
|
4
|
+
|
5
|
+
setup-volumes:
|
6
|
+
# We can use any image we want as long as we can chown
|
7
|
+
image: busybox
|
8
|
+
# Need a user priviliged enough to chown
|
9
|
+
user: "root"
|
10
|
+
# Specify the group in question
|
11
|
+
volumes:
|
12
|
+
# The volumes to chown
|
13
|
+
- squad-frontend:/app/
|
14
|
+
- squad-storage:/storage/
|
15
|
+
command:
|
16
|
+
- /bin/sh
|
17
|
+
- -c
|
18
|
+
- |
|
19
|
+
chown -R 1000:1000 /app
|
20
|
+
chown -R 1000:1000 /storage
|
21
|
+
|
22
|
+
#
|
23
|
+
# QA-Reports frontend
|
24
|
+
#
|
25
|
+
squad-frontend:
|
26
|
+
image: squadproject/squad
|
27
|
+
command:
|
28
|
+
- /bin/sh
|
29
|
+
- -c
|
30
|
+
- |
|
31
|
+
sleep 10
|
32
|
+
squad --bind 0.0.0.0:8000 --timeout=60 --workers=8 --log-level DEBUG
|
33
|
+
environment:
|
34
|
+
DATABASE: "ENGINE=django.db.backends.postgresql_psycopg2:NAME=squad:HOST=postgres:USER=squad:PASSWORD=squad"
|
35
|
+
SQUAD_STATIC_DIR: "/app/static"
|
36
|
+
SQUAD_EXTRA_SETTINGS: "/app/extra_settings.py"
|
37
|
+
SQUAD_CELERY_BROKER_URL: "amqp://rabbitmq"
|
38
|
+
SQUAD_BASE_URL: "https://www.your-squad-url.org"
|
39
|
+
# SENTRY_DSN: "<sentry-dsn>"
|
40
|
+
SECRET_KEY_FILE: "/app/secret.dat"
|
41
|
+
SQUAD_SITE_NAME: "SQUAD Site"
|
42
|
+
SQUAD_EMAIL_FROM: "squad@www.your-squad-url.org"
|
43
|
+
volumes:
|
44
|
+
- squad-frontend:/app/
|
45
|
+
- squad-storage:/storage/
|
46
|
+
- squad-static-files:/app/static
|
47
|
+
- ./extra_settings.py:/app/extra_settings.py
|
48
|
+
depends_on:
|
49
|
+
setup-volumes:
|
50
|
+
# Wait for the ownership to change
|
51
|
+
condition: service_completed_successfully
|
52
|
+
|
53
|
+
#
|
54
|
+
# QA-Reports worker
|
55
|
+
#
|
56
|
+
squad-worker:
|
57
|
+
image: squadproject/squad
|
58
|
+
command: squad-worker
|
59
|
+
environment:
|
60
|
+
DATABASE: "ENGINE=django.db.backends.postgresql_psycopg2:NAME=squad:HOST=postgres:USER=squad:PASSWORD=squad"
|
61
|
+
SQUAD_CELERY_BROKER_URL: "amqp://rabbitmq"
|
62
|
+
# SENTRY_DSN: "<sentry-dsn>"
|
63
|
+
SECRET_KEY_FILE: "/app/secret.dat"
|
64
|
+
SQUAD_EMAIL_HOST: "squad@www.your-squad-url.org"
|
65
|
+
SQUAD_EMAIL_FROM: "squad@www.your-squad-url.org"
|
66
|
+
volumes:
|
67
|
+
- squad-storage:/storage/
|
68
|
+
|
69
|
+
#
|
70
|
+
# QA-Reports listener
|
71
|
+
#
|
72
|
+
squad-listener:
|
73
|
+
image: squadproject/squad
|
74
|
+
command:
|
75
|
+
- /bin/sh
|
76
|
+
- -c
|
77
|
+
- |
|
78
|
+
sleep 20
|
79
|
+
squad-listener
|
80
|
+
environment:
|
81
|
+
DATABASE: "ENGINE=django.db.backends.postgresql_psycopg2:NAME=squad:HOST=postgres:USER=squad:PASSWORD=squad"
|
82
|
+
SECRET_KEY_FILE: "/app/secret.dat"
|
83
|
+
volumes:
|
84
|
+
- squad-frontend:/app/
|
85
|
+
- squad-storage:/storage/
|
86
|
+
|
87
|
+
#
|
88
|
+
# QA-Reports scheduler
|
89
|
+
#
|
90
|
+
squad-scheduler:
|
91
|
+
image: squadproject/squad
|
92
|
+
command: squad-scheduler --schedule=/app/celerybeat-schedule.db
|
93
|
+
environment:
|
94
|
+
DATABASE: "ENGINE=django.db.backends.postgresql_psycopg2:NAME=squad:HOST=postgres:USER=squad:PASSWORD=squad"
|
95
|
+
SQUAD_CELERY_BROKER_URL: "amqp://rabbitmq"
|
96
|
+
SECRET_KEY_FILE: "/app/secret.dat"
|
97
|
+
volumes:
|
98
|
+
- squad-frontend:/app/
|
99
|
+
|
100
|
+
#
|
101
|
+
# Postgres
|
102
|
+
#
|
103
|
+
postgres:
|
104
|
+
image: postgres:13.1
|
105
|
+
healthcheck:
|
106
|
+
test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "postgres" ]
|
107
|
+
timeout: 45s
|
108
|
+
interval: 10s
|
109
|
+
retries: 10
|
110
|
+
restart: always
|
111
|
+
environment:
|
112
|
+
- POSTGRES_USER=postgres
|
113
|
+
- POSTGRES_PASSWORD=defaultpostgrespassword
|
114
|
+
- INIT_DB_USER=squad
|
115
|
+
- INIT_DB_PASS=squad
|
116
|
+
- INIT_DB_NAME=squad
|
117
|
+
volumes:
|
118
|
+
- ./init-db.sh:/docker-entrypoint-initdb.d/init-user-db.sh
|
119
|
+
- postgres-db:/var/lib/postgresql/data
|
120
|
+
- ./db-dumped:/db-dumped
|
121
|
+
- ./db-to-be-restored:/db-to-be-restored
|
122
|
+
|
123
|
+
#
|
124
|
+
# RabbitMQ
|
125
|
+
#
|
126
|
+
rabbitmq:
|
127
|
+
image: rabbitmq:3-management-alpine
|
128
|
+
volumes:
|
129
|
+
- ./rabbitmq.config:/etc/rabbitmq/rabbitmq.config
|
130
|
+
|
131
|
+
#
|
132
|
+
# Apache
|
133
|
+
#
|
134
|
+
httpd:
|
135
|
+
image: httpd:2.4
|
136
|
+
command: httpd -D FOREGROUND
|
137
|
+
volumes:
|
138
|
+
- squad-static-files:/squad_static/static
|
139
|
+
- ./squad-apache.conf:/usr/local/apache2/conf/httpd.conf
|
140
|
+
ports:
|
141
|
+
- ${SQUAD_DOCKER_PORT:-10080}:80
|
142
|
+
|
143
|
+
volumes:
|
144
|
+
squad-static-files:
|
145
|
+
squad-frontend:
|
146
|
+
squad-storage:
|
147
|
+
postgres-db:
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
set -ex
|
3
|
+
|
4
|
+
echo "Running DB Initialization!"
|
5
|
+
|
6
|
+
PGPASSWORD=${POSTGRES_PASSWORD} psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" -c \
|
7
|
+
"CREATE USER ${INIT_DB_USER} WITH PASSWORD'"${INIT_DB_PASS}"';"
|
8
|
+
|
9
|
+
PGPASSWORD=${POSTGRES_PASSWORD} psql -v ON_ERROR_STOP=1 --username "${POSTGRES_USER}" -c \
|
10
|
+
"CREATE DATABASE ${INIT_DB_NAME} OWNER ${INIT_DB_USER}"
|
@@ -0,0 +1,64 @@
|
|
1
|
+
LogLevel debug
|
2
|
+
|
3
|
+
Listen 80
|
4
|
+
|
5
|
+
# Load some mods
|
6
|
+
LoadModule headers_module modules/mod_headers.so
|
7
|
+
LoadModule mime_module modules/mod_mime.so
|
8
|
+
LoadModule ssl_module modules/mod_ssl.so
|
9
|
+
LoadModule unixd_module modules/mod_unixd.so
|
10
|
+
LoadModule authz_core_module modules/mod_authz_core.so
|
11
|
+
LoadModule alias_module modules/mod_alias.so
|
12
|
+
LoadModule mpm_event_module modules/mod_mpm_event.so
|
13
|
+
LoadModule cgid_module modules/mod_cgid.so
|
14
|
+
LoadModule deflate_module modules/mod_deflate.so
|
15
|
+
LoadModule filter_module modules/mod_filter.so
|
16
|
+
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
|
17
|
+
LoadModule proxy_module modules/mod_proxy.so
|
18
|
+
LoadModule proxy_http_module modules/mod_proxy_http.so
|
19
|
+
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
|
20
|
+
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
|
21
|
+
LoadModule vhost_alias_module modules/mod_vhost_alias.so
|
22
|
+
LoadModule rewrite_module modules/mod_rewrite.so
|
23
|
+
|
24
|
+
# Configure mod_deflate
|
25
|
+
# these are known to be safe with MSIE 6
|
26
|
+
AddOutputFilterByType DEFLATE text/html text/plain text/xml
|
27
|
+
|
28
|
+
# everything else may cause problems with MSIE 6
|
29
|
+
AddOutputFilterByType DEFLATE text/css
|
30
|
+
AddOutputFilterByType DEFLATE application/x-javascript application/javascript application/ecmascript application/json
|
31
|
+
AddOutputFilterByType DEFLATE application/rss+xml
|
32
|
+
AddOutputFilterByType DEFLATE application/xml
|
33
|
+
|
34
|
+
# Add Content-Type image for svg images
|
35
|
+
AddType image/svg+xml .svg
|
36
|
+
|
37
|
+
ServerName www.your-squad-url.org
|
38
|
+
|
39
|
+
<VirtualHost *:80>
|
40
|
+
ProxyPreserveHost On
|
41
|
+
|
42
|
+
RewriteEngine On
|
43
|
+
|
44
|
+
# http -> https
|
45
|
+
RewriteCond %{HTTP:X-Forwarded-Proto} =http
|
46
|
+
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
|
47
|
+
|
48
|
+
# Security headers
|
49
|
+
Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
|
50
|
+
Header always set X-Content-Type-Options "nosniff;"
|
51
|
+
Header always set Content-Security-Policy "default-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' www.gravatar.com; style-src 'self' 'unsafe-inline'; font-src 'self';"
|
52
|
+
# Set default cache controll if there isn't any
|
53
|
+
Header setIfEmpty Cache-Control "no-cache"
|
54
|
+
|
55
|
+
# Serve static files separately
|
56
|
+
Alias /static "/squad_static/static"
|
57
|
+
<Directory "/squad_static/static">
|
58
|
+
Require all granted
|
59
|
+
</Directory>
|
60
|
+
|
61
|
+
ProxyPassMatch ^/static !
|
62
|
+
# the following should contain the SQUAD's frontend container service name!
|
63
|
+
ProxyPass "/" http://squad-frontend:8000/
|
64
|
+
</VirtualHost>
|
@@ -106,6 +106,16 @@ def watch_job(request, group_slug, project_slug, version, environment_slug):
|
|
106
106
|
job_id=testjob_id
|
107
107
|
)
|
108
108
|
|
109
|
+
# check if backend is able to fetch job definition
|
110
|
+
try:
|
111
|
+
definition = backend.get_job_definition(testjob_id)
|
112
|
+
if not definition:
|
113
|
+
return HttpResponseBadRequest(f"No job definition found for job {testjob_id}: {definition}")
|
114
|
+
test_job.definition = definition
|
115
|
+
except NotImplementedError:
|
116
|
+
# backend does not work with job definitions
|
117
|
+
pass
|
118
|
+
|
109
119
|
# sanitize job_url
|
110
120
|
try:
|
111
121
|
backend.get_implementation().job_url(test_job)
|
@@ -227,7 +227,7 @@ class TestFilter(filters.FilterSet):
|
|
227
227
|
|
228
228
|
class Meta:
|
229
229
|
model = Test
|
230
|
-
fields = {'result': ['exact', 'in'],
|
230
|
+
fields = {'result': ['exact', 'in', 'isnull'],
|
231
231
|
'suite_id': ['exact', 'in'],
|
232
232
|
'environment_id': ['exact', 'in'],
|
233
233
|
'metadata_id': ['exact', 'in'],
|
@@ -1880,13 +1880,14 @@ router.register(r'projects', ProjectViewSet).register(
|
|
1880
1880
|
parents_query_lookups=['project_id'],
|
1881
1881
|
**drf_basename('project-builds')
|
1882
1882
|
)
|
1883
|
-
router.register(r'builds', BuildViewSet)
|
1883
|
+
builds = router.register(r'builds', BuildViewSet)
|
1884
|
+
builds.register(
|
1884
1885
|
r'tests',
|
1885
1886
|
TestViewSet,
|
1886
1887
|
parents_query_lookups=['build_id'],
|
1887
1888
|
**drf_basename('build-tests')
|
1888
1889
|
)
|
1889
|
-
|
1890
|
+
builds.register(
|
1890
1891
|
r'metrics',
|
1891
1892
|
MetricViewSet,
|
1892
1893
|
parents_query_lookups=['build_id'],
|
@@ -60,11 +60,20 @@ class Backend(object):
|
|
60
60
|
def job_url(self, test_job):
|
61
61
|
return 'https://example.com/job/%s' % test_job.job_id
|
62
62
|
|
63
|
+
def has_resubmit(self):
|
64
|
+
return False
|
65
|
+
|
66
|
+
def has_cancel(self):
|
67
|
+
return True
|
68
|
+
|
63
69
|
def cancel(self, test_job):
|
64
70
|
return True
|
65
71
|
|
66
72
|
def check_job_definition(self, definition):
|
67
73
|
return True
|
68
74
|
|
75
|
+
def get_job_definition(self, test_job):
|
76
|
+
return "sample job definition"
|
77
|
+
|
69
78
|
def supports_callbacks(self):
|
70
79
|
return False
|
@@ -106,6 +106,9 @@ class Backend(BaseBackend):
|
|
106
106
|
return job_id
|
107
107
|
return [job_id]
|
108
108
|
|
109
|
+
def has_cancel(self):
|
110
|
+
return True
|
111
|
+
|
109
112
|
def cancel(self, test_job):
|
110
113
|
if test_job.submitted and test_job.job_id is not None:
|
111
114
|
return self.__cancel_job__(test_job.job_id)
|
@@ -329,6 +332,9 @@ class Backend(BaseBackend):
|
|
329
332
|
scheme = socket_url.scheme
|
330
333
|
return '%s://%s:%s' % (scheme, hostname, port)
|
331
334
|
|
335
|
+
def has_resubmit(self):
|
336
|
+
return True
|
337
|
+
|
332
338
|
def resubmit(self, test_job):
|
333
339
|
with self.handle_job_submission():
|
334
340
|
new_job_id_list = self.__resubmit__(test_job.job_id)
|
@@ -775,3 +781,14 @@ class Backend(BaseBackend):
|
|
775
781
|
return True
|
776
782
|
except yaml.YAMLError as e:
|
777
783
|
return str(e)
|
784
|
+
|
785
|
+
def get_job_definition(self, job_id):
|
786
|
+
if self.use_xml_rpc:
|
787
|
+
return self.proxy.scheduler.jobs.definition(job_id)
|
788
|
+
job_resp = requests.get(
|
789
|
+
f'{self.api_url_base}/jobs/{job_id}/definition/',
|
790
|
+
headers=self.authentication,
|
791
|
+
timeout=self.settings.get(timeout_variable_name, DEFAULT_TIMEOUT)
|
792
|
+
)
|
793
|
+
if job_resp.status_code == 200:
|
794
|
+
return job_resp.json()
|
@@ -8,7 +8,7 @@ logger = logging.getLogger('squad.ci.backend')
|
|
8
8
|
description = "None"
|
9
9
|
|
10
10
|
|
11
|
-
class Backend
|
11
|
+
class Backend:
|
12
12
|
|
13
13
|
"""
|
14
14
|
This is the interface that all backends must implement. Depending on the
|
@@ -39,6 +39,13 @@ class Backend(object):
|
|
39
39
|
"""
|
40
40
|
raise NotImplementedError
|
41
41
|
|
42
|
+
def has_resubmit(self):
|
43
|
+
"""
|
44
|
+
If the backend has a resubmit method implemented, override this to
|
45
|
+
return True.
|
46
|
+
"""
|
47
|
+
return False
|
48
|
+
|
42
49
|
def resubmit(self, test_job):
|
43
50
|
"""
|
44
51
|
Re-submits given test job to the backend service
|
@@ -84,6 +91,13 @@ class Backend(object):
|
|
84
91
|
"""
|
85
92
|
raise NotImplementedError
|
86
93
|
|
94
|
+
def has_cancel(self):
|
95
|
+
"""
|
96
|
+
If the backend has a cancel method implemented, override this to
|
97
|
+
return True.
|
98
|
+
"""
|
99
|
+
return False
|
100
|
+
|
87
101
|
def cancel(self, test_job):
|
88
102
|
"""
|
89
103
|
Cancels the job if the backend allows it. It will not raise any
|
@@ -92,18 +106,24 @@ class Backend(object):
|
|
92
106
|
"""
|
93
107
|
raise NotImplementedError
|
94
108
|
|
95
|
-
def job_url(
|
109
|
+
def job_url(self, test_job):
|
96
110
|
"""
|
97
111
|
Returns the URL of the test job in the backend
|
98
112
|
"""
|
99
113
|
raise NotImplementedError
|
100
114
|
|
101
|
-
def check_job_definition(
|
115
|
+
def check_job_definition(self, definition):
|
102
116
|
"""
|
103
117
|
Returns True if job definition checks out or an error message
|
104
118
|
"""
|
105
119
|
raise NotImplementedError
|
106
120
|
|
121
|
+
def get_job_definition(self, job_id):
|
122
|
+
"""
|
123
|
+
Returns the job definition for a given test job
|
124
|
+
"""
|
125
|
+
raise NotImplementedError
|
126
|
+
|
107
127
|
def supports_callbacks(self):
|
108
128
|
"""
|
109
129
|
Returns True if this backend supports callbacks, False otherwise
|
@@ -216,6 +216,9 @@ class Backend(models.Model):
|
|
216
216
|
def check_job_definition(self, definition):
|
217
217
|
return self.get_implementation().check_job_definition(definition)
|
218
218
|
|
219
|
+
def get_job_definition(self, job_id):
|
220
|
+
return self.get_implementation().get_job_definition(job_id)
|
221
|
+
|
219
222
|
def supports_callbacks(self):
|
220
223
|
return self.get_implementation().supports_callbacks()
|
221
224
|
|
@@ -379,7 +382,7 @@ class TestJob(models.Model):
|
|
379
382
|
if self.job_status == "Canceled":
|
380
383
|
return False
|
381
384
|
|
382
|
-
if self.job_id is not None:
|
385
|
+
if self.job_id is not None and self.backend.get_implementation().has_cancel():
|
383
386
|
return self.backend.get_implementation().cancel(self)
|
384
387
|
|
385
388
|
self.fetched = True
|