pulpcore 3.85.1__tar.gz → 3.86.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pulpcore might be problematic. Click here for more details.
- {pulpcore-3.85.1 → pulpcore-3.86.0}/CHANGES.md +38 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/PKG-INFO +2 -2
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/app/__init__.py +1 -1
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/__init__.py +1 -1
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/apps.py +1 -1
- pulpcore-3.86.0/pulpcore/app/management/commands/optimizemigration.py +84 -0
- pulpcore-3.86.0/pulpcore/app/migrations/0139_task_app_lock.py +19 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/status.py +19 -1
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/task.py +6 -1
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/settings.py +12 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/middleware.py +37 -10
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/repo_version_utils.py +8 -2
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/pytest_plugin.py +6 -4
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tasking/tasks.py +16 -15
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tasking/worker.py +48 -29
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_tasking.py +10 -11
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_workers.py +1 -2
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/content/test_heartbeat.py +2 -1
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_repository.py +84 -1
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore.egg-info/PKG-INFO +2 -2
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore.egg-info/SOURCES.txt +2 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore.egg-info/requires.txt +1 -1
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pyproject.toml +3 -3
- {pulpcore-3.85.1 → pulpcore-3.86.0}/CODE_OF_CONDUCT.md +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/COMMITMENT +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/CONTRIBUTING.md +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/COPYRIGHT +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/LICENSE +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/MANIFEST.in +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/README.md +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/ci_requirements.txt +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/functest_requirements.txt +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/manage.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/app/migrations/0001_initial.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/app/migrations/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/app/models.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/app/serializers.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/app/viewsets.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/pytest_plugin.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/rhsm/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/conftest.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/functional/constants.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/unit/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/unit/certdata.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/migrations/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/modelresource.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/models.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/replica.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/serializers.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/tasks/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/tasks/publishing.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/tasks/synchronizing.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/app/viewsets.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/manifest.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/pytest_plugin.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_acs.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_domains.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_labels.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_publish.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_rbac.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_sync.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/unit/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/unit/test_safe_paths.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulp_file/tests/unit/test_serializers.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/access_policy.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/authentication.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/checks.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/entrypoint.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/files.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/global_access_conditions.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/importexport.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/loggers.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/manage.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/add-signing-service.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/analyze-publication.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/dump-permissions.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/migrationstat.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/openapi.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/remove-plugin.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/repository-size.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0091_systemid.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0099_versions_field.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0101_add_domain.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0104_delete_label.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0108_task_versions.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0137_appstatus.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/migrations/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/mime_types.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/modelresource.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/access_policy.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/acs.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/analytics.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/content.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/domain.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/exporter.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/fields.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/generic.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/importer.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/openpgp.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/progress.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/publication.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/replica.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/repository.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/role.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/storage.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/upload.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/models/vulnerability_report.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/netutil.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/openpgp.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/protobuf/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/pulp_hashlib.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/redis_connection.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/replica.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/response.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/role_util.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/access_policy.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/acs.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/content.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/domain.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/exporter.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/fields.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/importer.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/openpgp.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/orphans.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/progress.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/publication.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/purge.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/reclaim.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/repair.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/replica.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/repository.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/status.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/task.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/upload.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/user.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/serializers/vulnerability_report.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/analytics.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/export.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/importer.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/migrate.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/orphan.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/purge.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/reclaim_space.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/replica.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/repository.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/telemetry.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/test.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/upload.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/tasks/vulnerability_report.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/templates/rest_framework/api.html +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/templatetags/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/templatetags/pulp_urls.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/urls.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/util.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/views/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/views/importer.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/views/orphans.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/views/repair.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/views/status.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/access_policy.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/acs.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/content.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/custom_filters.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/domain.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/exporter.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/importer.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/openpgp.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/orphans.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/publication.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/reclaim.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/replica.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/repository.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/task.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/upload.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/user.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/app/wsgi.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/backends.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/cache/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/cache/cache.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/constants.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/content/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/content/authentication.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/content/entrypoint.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/content/handler.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/content/instrumentation.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/download/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/download/base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/download/factory.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/download/file.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/download/http.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/exceptions/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/exceptions/base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/exceptions/plugin.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/exceptions/validation.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/filters.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/metrics.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/migrations.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/openapi/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/openapi/hooks.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/access_policy.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/actions.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/apps.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/authentication/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/cache/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/constants.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/content.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/download/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/exceptions.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/files.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/importexport.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/migrations.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/modelresources.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/models/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/models/role.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/publication_utils.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/pulp_hashlib.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/replica.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/responses.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/serializers/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/serializers/content.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/stages/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/stages/api.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/stages/artifact_stages.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/stages/content_stages.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/stages/declarative_version.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/stages/models.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/storage.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/sync.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/tasking.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/util.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/viewsets/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/plugin/viewsets/content.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/responses.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tasking/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tasking/_util.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tasking/entrypoint.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tasking/kafka.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tasking/storage.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_auth.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_filter.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_login.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_replication.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_repos.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_role.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_scoping.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_status.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_upload.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/assets/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/content_with_coverage.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/functional/utils.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/performance/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/performance/test_performance.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/conftest.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/content/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/content/test_handler.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/download/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/metrics/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/metrics/conftest.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/migration/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/models/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_content.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_remote.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_task.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/roles/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/roles/test_roles.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_user.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/stages/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/stages/test_stages.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_cache.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_chunked_file.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_content_guard.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_files.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_import_checks.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_settings.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_util.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_viewsets.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore.egg-info/dependency_links.txt +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore.egg-info/entry_points.txt +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/pulpcore.egg-info/top_level.txt +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/setup.cfg +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/test_requirements.txt +0 -0
- {pulpcore-3.85.1 → pulpcore-3.86.0}/unittest_requirements.txt +0 -0
|
@@ -8,6 +8,44 @@
|
|
|
8
8
|
|
|
9
9
|
[//]: # (towncrier release notes start)
|
|
10
10
|
|
|
11
|
+
## 3.86.0 (2025-08-21) {: #3.86.0 }
|
|
12
|
+
|
|
13
|
+
### REST API {: #3.86.0-rest-api }
|
|
14
|
+
|
|
15
|
+
#### Features {: #3.86.0-rest-api-feature }
|
|
16
|
+
|
|
17
|
+
- Added a configurable bucket boundary for API request duration metric using the OTEL_PULP_API_HISTOGRAM_BUCKETS setting.
|
|
18
|
+
[#6845](https://github.com/pulp/pulpcore/issues/6845)
|
|
19
|
+
|
|
20
|
+
#### Bugfixes {: #3.86.0-rest-api-bugfix }
|
|
21
|
+
|
|
22
|
+
- Made DjangoMetricsMiddleware aware of OTEL urls exclusion envvars.
|
|
23
|
+
[#6843](https://github.com/pulp/pulpcore/issues/6843)
|
|
24
|
+
- Fixed repository version validation to allow legitimate shared artifacts between content units.
|
|
25
|
+
[#6868](https://github.com/pulp/pulpcore/issues/6868)
|
|
26
|
+
- Fixed a bug that prevents migrations from running.
|
|
27
|
+
|
|
28
|
+
#### Improved Documentation {: #3.86.0-rest-api-doc }
|
|
29
|
+
|
|
30
|
+
- Updated documentation for the TASK_DIAGNOSTICS setting.
|
|
31
|
+
[#6854](https://github.com/pulp/pulpcore/issues/6854)
|
|
32
|
+
|
|
33
|
+
### Plugin API {: #3.86.0-plugin-api }
|
|
34
|
+
|
|
35
|
+
#### Removals {: #3.86.0-plugin-api-removal }
|
|
36
|
+
|
|
37
|
+
- Removed support for synchronous immediate tasks.
|
|
38
|
+
|
|
39
|
+
### Pulp File {: #3.86.0-pulp-file }
|
|
40
|
+
|
|
41
|
+
No significant changes.
|
|
42
|
+
|
|
43
|
+
### Pulp Cert Guard {: #3.86.0-pulp-cert-guard }
|
|
44
|
+
|
|
45
|
+
No significant changes.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
11
49
|
## 3.85.1 (2025-08-12) {: #3.85.1 }
|
|
12
50
|
|
|
13
51
|
### REST API {: #3.85.1-rest-api }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pulpcore
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.86.0
|
|
4
4
|
Summary: Pulp Django Application and Related Modules
|
|
5
5
|
Author-email: Pulp Team <pulp-list@redhat.com>
|
|
6
6
|
Project-URL: Homepage, https://pulpproject.org
|
|
@@ -45,7 +45,7 @@ Requires-Dist: PyOpenSSL<26.0
|
|
|
45
45
|
Requires-Dist: opentelemetry-api<1.37,>=1.27.0
|
|
46
46
|
Requires-Dist: opentelemetry-sdk<1.37,>=1.27.0
|
|
47
47
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http<1.37,>=1.27.0
|
|
48
|
-
Requires-Dist: protobuf<
|
|
48
|
+
Requires-Dist: protobuf<7.0,>=4.21.1
|
|
49
49
|
Requires-Dist: pulp-glue<0.36,>=0.28.0
|
|
50
50
|
Requires-Dist: pygtrie<=2.5.0,>=2.5
|
|
51
51
|
Requires-Dist: psycopg[binary]<3.3,>=3.1.8
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
from collections import defaultdict
|
|
2
|
+
from gettext import gettext as _
|
|
3
|
+
|
|
4
|
+
from django.db import connection
|
|
5
|
+
from django.db.migrations.loader import MigrationLoader
|
|
6
|
+
from django.db.migrations.migration import SwappableTuple
|
|
7
|
+
from django.db.migrations.optimizer import MigrationOptimizer
|
|
8
|
+
from django.db.migrations.writer import MigrationWriter
|
|
9
|
+
from django.conf import settings
|
|
10
|
+
from django.core.management import BaseCommand
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def print_stats(migration):
|
|
14
|
+
operations = migration.operations
|
|
15
|
+
migration_types = defaultdict(int)
|
|
16
|
+
for operation in operations:
|
|
17
|
+
migration_types[operation.__class__.__name__] += 1
|
|
18
|
+
for key, value in migration_types.items():
|
|
19
|
+
print(f"{value: 4} {key}")
|
|
20
|
+
print("---")
|
|
21
|
+
print(_("Total: {count}").format(count=len(operations)))
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Command(BaseCommand):
|
|
25
|
+
"""
|
|
26
|
+
Django management command to optimize a migration.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
help = _("Optimize a migration.")
|
|
30
|
+
|
|
31
|
+
def add_arguments(self, parser):
|
|
32
|
+
parser.add_argument("--dry-run", action="store_true", help=_("Don't change anything."))
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
"--stat", action="store_true", help=_("Print statistics about operations.")
|
|
35
|
+
)
|
|
36
|
+
parser.add_argument("app-label", help=_("App label of the migrations to optimize."))
|
|
37
|
+
parser.add_argument("migration", help=_("Prefix of the migration to optimize."))
|
|
38
|
+
|
|
39
|
+
def handle(self, *args, **options):
|
|
40
|
+
dry_run = options.get("dry_run", False)
|
|
41
|
+
stat = options.get("stat", False)
|
|
42
|
+
app_label = options["app-label"]
|
|
43
|
+
migration_prefix = options["migration"]
|
|
44
|
+
|
|
45
|
+
loader = MigrationLoader(connection)
|
|
46
|
+
|
|
47
|
+
migration = loader.get_migration_by_prefix(app_label, migration_prefix)
|
|
48
|
+
|
|
49
|
+
print(_("Optimizing migration {}").format((migration.app_label, migration.name)))
|
|
50
|
+
if stat:
|
|
51
|
+
print(_("=== Old Migration Summary ==="))
|
|
52
|
+
print_stats(migration)
|
|
53
|
+
|
|
54
|
+
new_dependencies = []
|
|
55
|
+
for dependency in migration.dependencies:
|
|
56
|
+
if (
|
|
57
|
+
isinstance(dependency, SwappableTuple)
|
|
58
|
+
and settings.AUTH_USER_MODEL == dependency.setting
|
|
59
|
+
):
|
|
60
|
+
new_dependencies.append(("__setting__", "AUTH_USER_MODEL"))
|
|
61
|
+
else:
|
|
62
|
+
new_dependencies.append(dependency)
|
|
63
|
+
|
|
64
|
+
optimizer = MigrationOptimizer()
|
|
65
|
+
new_operations = optimizer.optimize(migration.operations, app_label)
|
|
66
|
+
|
|
67
|
+
if new_operations != migration.operations:
|
|
68
|
+
print(
|
|
69
|
+
_("Changed from {old_count} to {new_count} operations.").format(
|
|
70
|
+
old_count=len(migration.operations), new_count=len(new_operations)
|
|
71
|
+
)
|
|
72
|
+
)
|
|
73
|
+
if stat:
|
|
74
|
+
print(_("=== New Migration Summary ==="))
|
|
75
|
+
print_stats(migration)
|
|
76
|
+
|
|
77
|
+
migration.operations = new_operations
|
|
78
|
+
migration.dependencies = new_dependencies
|
|
79
|
+
if not dry_run:
|
|
80
|
+
writer = MigrationWriter(migration)
|
|
81
|
+
with open(writer.path, "w") as output_file:
|
|
82
|
+
output_file.write(writer.as_string())
|
|
83
|
+
else:
|
|
84
|
+
print(_("No optimizations found."))
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Generated by Django 4.2.23 on 2025-08-07 11:43
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
import django.db.models.deletion
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('core', '0138_vulnerabilityreport'),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AddField(
|
|
15
|
+
model_name='task',
|
|
16
|
+
name='app_lock',
|
|
17
|
+
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tasks', to='core.appstatus'),
|
|
18
|
+
),
|
|
19
|
+
]
|
|
@@ -15,6 +15,7 @@ from pulpcore.app.models import BaseModel
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class AppStatusManager(models.Manager):
|
|
18
|
+
# This should be replaced with 3.87.
|
|
18
19
|
def online(self):
|
|
19
20
|
"""
|
|
20
21
|
Returns a queryset of objects that are online.
|
|
@@ -51,8 +52,15 @@ class AppStatusManager(models.Manager):
|
|
|
51
52
|
|
|
52
53
|
class _AppStatusManager(AppStatusManager):
|
|
53
54
|
# This is an intermediate class in order to allow a ZDU.
|
|
54
|
-
# It should be
|
|
55
|
+
# It should be made the real thing with 3.87.
|
|
56
|
+
def __init__(self):
|
|
57
|
+
super().__init__()
|
|
58
|
+
self._current_app_status = None
|
|
59
|
+
|
|
55
60
|
def create(self, app_type, **kwargs):
|
|
61
|
+
if self._current_app_status is not None:
|
|
62
|
+
raise RuntimeError("There is already an app status in this process.")
|
|
63
|
+
|
|
56
64
|
if app_type == "api":
|
|
57
65
|
old_obj = ApiAppStatus.objects.create(**kwargs)
|
|
58
66
|
elif app_type == "worker":
|
|
@@ -63,17 +71,27 @@ class _AppStatusManager(AppStatusManager):
|
|
|
63
71
|
raise NotImplementedError(f"Invalid app_type: {app_type}")
|
|
64
72
|
obj = super().create(app_type=app_type, **kwargs)
|
|
65
73
|
obj._old_status = old_obj
|
|
74
|
+
self._current_app_status = obj
|
|
66
75
|
return obj
|
|
67
76
|
|
|
68
77
|
async def acreate(self, app_type, **kwargs):
|
|
78
|
+
if self._current_app_status is not None:
|
|
79
|
+
raise RuntimeError("There is already an app status in this process.")
|
|
80
|
+
|
|
69
81
|
if app_type == "content":
|
|
70
82
|
old_obj = await ContentAppStatus.objects.acreate(**kwargs)
|
|
71
83
|
else:
|
|
72
84
|
raise NotImplementedError(f"Invalid app_type: {app_type}")
|
|
73
85
|
obj = await super().acreate(app_type=app_type, **kwargs)
|
|
74
86
|
obj._old_status = old_obj
|
|
87
|
+
self._current_app_status = obj
|
|
75
88
|
return obj
|
|
76
89
|
|
|
90
|
+
def current(self):
|
|
91
|
+
if self._current_app_status is None:
|
|
92
|
+
raise RuntimeError("There is no current app status.")
|
|
93
|
+
return self._current_app_status
|
|
94
|
+
|
|
77
95
|
def online(self):
|
|
78
96
|
"""
|
|
79
97
|
Returns a queryset of objects that are online.
|
|
@@ -116,7 +116,8 @@ class Task(BaseModel, AutoAddObjPermsMixin):
|
|
|
116
116
|
Defaults to `True`.
|
|
117
117
|
|
|
118
118
|
Relations:
|
|
119
|
-
|
|
119
|
+
app_lock (AppStatus): The app holding the lock on this task.
|
|
120
|
+
Warning: This is not yet implemented/enforced.
|
|
120
121
|
parent (models.ForeignKey): Task that spawned this task (if any)
|
|
121
122
|
worker (models.ForeignKey): The worker that this task is in
|
|
122
123
|
pulp_domain (models.ForeignKey): The domain the Task is a part of
|
|
@@ -138,6 +139,10 @@ class Task(BaseModel, AutoAddObjPermsMixin):
|
|
|
138
139
|
enc_kwargs = EncryptedJSONField(null=True, encoder=DjangoJSONEncoder)
|
|
139
140
|
|
|
140
141
|
worker = models.ForeignKey("Worker", null=True, related_name="tasks", on_delete=models.SET_NULL)
|
|
142
|
+
# This field is supposed to replace the session advisory locks to protect tasks.
|
|
143
|
+
app_lock = models.ForeignKey(
|
|
144
|
+
"AppStatus", null=True, related_name="tasks", on_delete=models.SET_NULL
|
|
145
|
+
)
|
|
141
146
|
|
|
142
147
|
parent_task = models.ForeignKey(
|
|
143
148
|
"Task", null=True, related_name="child_tasks", on_delete=models.SET_NULL
|
|
@@ -405,6 +405,7 @@ KAFKA_SASL_PASSWORD = None
|
|
|
405
405
|
|
|
406
406
|
# opentelemetry settings
|
|
407
407
|
OTEL_ENABLED = False
|
|
408
|
+
OTEL_PULP_API_HISTOGRAM_BUCKETS = []
|
|
408
409
|
|
|
409
410
|
# VulnerabilityReport settings
|
|
410
411
|
VULN_REPORT_TASK_LIMITER = 10
|
|
@@ -504,6 +505,16 @@ authentication_json_header_openapi_security_scheme_validator = Validator(
|
|
|
504
505
|
messages={"is_type_of": "{name} must be a dictionary."},
|
|
505
506
|
)
|
|
506
507
|
|
|
508
|
+
otel_pulp_api_histogram_buckets_validator = Validator(
|
|
509
|
+
"OTEL_PULP_API_HISTOGRAM_BUCKETS",
|
|
510
|
+
is_type_of=list,
|
|
511
|
+
condition=lambda v: all([isinstance(value, float) for value in v]),
|
|
512
|
+
messages={
|
|
513
|
+
"is_type_of": "{name} must be a list.",
|
|
514
|
+
"condition": "All buckets must be declared as a float value",
|
|
515
|
+
},
|
|
516
|
+
)
|
|
517
|
+
|
|
507
518
|
|
|
508
519
|
def otel_middleware_hook(settings):
|
|
509
520
|
data = {"dynaconf_merge": True}
|
|
@@ -530,6 +541,7 @@ settings = DjangoDynaconf(
|
|
|
530
541
|
unknown_algs_validator,
|
|
531
542
|
json_header_auth_validator,
|
|
532
543
|
authentication_json_header_openapi_security_scheme_validator,
|
|
544
|
+
otel_pulp_api_histogram_buckets_validator,
|
|
533
545
|
],
|
|
534
546
|
post_hooks=(otel_middleware_hook,),
|
|
535
547
|
)
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import time
|
|
2
|
+
import re
|
|
3
|
+
|
|
2
4
|
from contextvars import ContextVar
|
|
5
|
+
from os import environ
|
|
3
6
|
|
|
4
7
|
from django.http.response import Http404
|
|
5
8
|
from django.conf import settings
|
|
@@ -101,15 +104,32 @@ class APIRootRewriteMiddleware:
|
|
|
101
104
|
class DjangoMetricsMiddleware:
|
|
102
105
|
def __init__(self, get_response):
|
|
103
106
|
self.meter = init_otel_meter("pulp-api")
|
|
104
|
-
self.
|
|
105
|
-
name="api.request_duration",
|
|
106
|
-
description="Tracks the duration of HTTP requests",
|
|
107
|
-
unit="ms",
|
|
108
|
-
)
|
|
107
|
+
self._set_histogram(self.meter)
|
|
109
108
|
|
|
110
109
|
self.get_response = get_response
|
|
111
110
|
|
|
111
|
+
def _excluded_urls(self, url):
|
|
112
|
+
|
|
113
|
+
excluded_urls = environ.get(
|
|
114
|
+
"OTEL_PYTHON_EXCLUDED_URLS", environ.get("OTEL_PYTHON_DJANGO_EXCLUDED_URLS", "")
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
if excluded_urls:
|
|
118
|
+
excluded_urls_list = [excluded_url.strip() for excluded_url in excluded_urls.split(",")]
|
|
119
|
+
else:
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
exclusion_pattern = "|".join(excluded_urls_list)
|
|
123
|
+
|
|
124
|
+
if re.search(exclusion_pattern, url):
|
|
125
|
+
return True
|
|
126
|
+
|
|
127
|
+
return False
|
|
128
|
+
|
|
112
129
|
def __call__(self, request):
|
|
130
|
+
if self._excluded_urls(request.build_absolute_uri("?")):
|
|
131
|
+
return self.get_response(request)
|
|
132
|
+
|
|
113
133
|
start_time = time.time()
|
|
114
134
|
response = self.get_response(request)
|
|
115
135
|
end_time = time.time()
|
|
@@ -122,11 +142,18 @@ class DjangoMetricsMiddleware:
|
|
|
122
142
|
return response
|
|
123
143
|
|
|
124
144
|
def _set_histogram(self, meter):
|
|
125
|
-
|
|
126
|
-
name
|
|
127
|
-
description
|
|
128
|
-
unit
|
|
129
|
-
|
|
145
|
+
create_histogram_kwargs = {
|
|
146
|
+
"name": "api.request_duration",
|
|
147
|
+
"description": "Tracks the duration of HTTP requests",
|
|
148
|
+
"unit": "ms",
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if settings.OTEL_PULP_API_HISTOGRAM_BUCKETS:
|
|
152
|
+
create_histogram_kwargs["explicit_bucket_boundaries_advisory"] = (
|
|
153
|
+
settings.OTEL_PULP_API_HISTOGRAM_BUCKETS
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
self.request_duration_histogram = meter.create_histogram(**create_histogram_kwargs)
|
|
130
157
|
|
|
131
158
|
def _process_attributes(self, request, response):
|
|
132
159
|
return {
|
|
@@ -116,9 +116,15 @@ def validate_version_paths(version):
|
|
|
116
116
|
Raises:
|
|
117
117
|
ValueError: If two artifact relative paths overlap
|
|
118
118
|
"""
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
# Get unique (path, artifact) pairs to allow artifacts shared across content
|
|
120
|
+
content_artifacts = (
|
|
121
|
+
ContentArtifact.objects.filter(content__pk__in=version.content)
|
|
122
|
+
.values_list("relative_path", "artifact")
|
|
123
|
+
.distinct()
|
|
121
124
|
)
|
|
125
|
+
|
|
126
|
+
paths = [path for path, artifact_id in content_artifacts]
|
|
127
|
+
|
|
122
128
|
try:
|
|
123
129
|
validate_file_paths(paths)
|
|
124
130
|
except ValueError as e:
|
|
@@ -1013,23 +1013,25 @@ def dispatch_task(pulpcore_bindings):
|
|
|
1013
1013
|
commands = (
|
|
1014
1014
|
"from django_guid import set_guid; "
|
|
1015
1015
|
"from pulpcore.tasking.tasks import dispatch; "
|
|
1016
|
-
"from pulpcore.app.models import TaskGroup; "
|
|
1016
|
+
"from pulpcore.app.models import TaskGroup, AppStatus; "
|
|
1017
1017
|
"from pulpcore.app.util import get_url, set_current_user; "
|
|
1018
1018
|
"from django.contrib.auth import get_user_model; "
|
|
1019
|
+
f"app_status=AppStatus.objects.create(name='test-' + {cid!r},app_type='worker'); "
|
|
1019
1020
|
"User = get_user_model(); "
|
|
1020
1021
|
f"user = User.objects.filter(username='{username}').first(); "
|
|
1021
1022
|
"set_current_user(user); "
|
|
1022
1023
|
f"set_guid({cid!r}); "
|
|
1023
1024
|
f"tg = {task_group_id!r} and TaskGroup.objects.filter(pk={task_group_id!r}).first(); "
|
|
1024
1025
|
f"task = dispatch(*{args!r}, task_group=tg, **{kwargs!r}); "
|
|
1026
|
+
"app_status.delete(); "
|
|
1025
1027
|
"print(get_url(task))"
|
|
1026
1028
|
)
|
|
1027
1029
|
|
|
1028
1030
|
process = subprocess.run(["pulpcore-manager", "shell", "-c", commands], capture_output=True)
|
|
1029
|
-
|
|
1030
|
-
assert process.returncode == 0
|
|
1031
|
+
err_log = process.stderr.decode()
|
|
1032
|
+
assert process.returncode == 0, err_log
|
|
1031
1033
|
task_href = process.stdout.decode().strip()
|
|
1032
|
-
print(
|
|
1034
|
+
print(err_log, file=sys.stderr)
|
|
1033
1035
|
return task_href
|
|
1034
1036
|
|
|
1035
1037
|
return _dispatch_task
|
|
@@ -8,7 +8,6 @@ import sys
|
|
|
8
8
|
import traceback
|
|
9
9
|
import tempfile
|
|
10
10
|
import threading
|
|
11
|
-
from asgiref.sync import sync_to_async
|
|
12
11
|
from gettext import gettext as _
|
|
13
12
|
|
|
14
13
|
from django.conf import settings
|
|
@@ -16,8 +15,12 @@ from django.db import connection, transaction
|
|
|
16
15
|
from django.db.models import Model
|
|
17
16
|
from django_guid import get_guid
|
|
18
17
|
from pulpcore.app.apps import MODULE_PLUGIN_VERSIONS
|
|
19
|
-
from pulpcore.app.models import Task, TaskGroup
|
|
20
|
-
from pulpcore.app.util import
|
|
18
|
+
from pulpcore.app.models import Task, TaskGroup, AppStatus
|
|
19
|
+
from pulpcore.app.util import (
|
|
20
|
+
current_task,
|
|
21
|
+
get_domain,
|
|
22
|
+
get_prn,
|
|
23
|
+
)
|
|
21
24
|
from pulpcore.constants import (
|
|
22
25
|
TASK_FINAL_STATES,
|
|
23
26
|
TASK_INCOMPLETE_STATES,
|
|
@@ -81,19 +84,11 @@ def _execute_task(task):
|
|
|
81
84
|
immediate = task.immediate
|
|
82
85
|
is_coroutine_fn = asyncio.iscoroutinefunction(func)
|
|
83
86
|
|
|
84
|
-
if not is_coroutine_fn:
|
|
85
|
-
|
|
86
|
-
deprecation_logger.warning(
|
|
87
|
-
"Immediate tasks must be coroutine functions. "
|
|
88
|
-
"Support for non-coroutine immediate tasks will be dropped "
|
|
89
|
-
"in pulpcore 3.85."
|
|
90
|
-
)
|
|
91
|
-
func = sync_to_async(func)
|
|
92
|
-
is_coroutine_fn = True
|
|
93
|
-
else:
|
|
94
|
-
func(*args, **kwargs)
|
|
87
|
+
if immediate and not is_coroutine_fn:
|
|
88
|
+
raise ValueError("Immediate tasks must be async functions.")
|
|
95
89
|
|
|
96
90
|
if is_coroutine_fn:
|
|
91
|
+
# both regular and immediate tasks can be coroutines, but only immediate must timeout
|
|
97
92
|
_logger.debug("Task is coroutine %s", task.pk)
|
|
98
93
|
coro = func(*args, **kwargs)
|
|
99
94
|
if immediate:
|
|
@@ -110,6 +105,8 @@ def _execute_task(task):
|
|
|
110
105
|
timeout=IMMEDIATE_TIMEOUT,
|
|
111
106
|
)
|
|
112
107
|
)
|
|
108
|
+
else:
|
|
109
|
+
func(*args, **kwargs)
|
|
113
110
|
|
|
114
111
|
except Exception:
|
|
115
112
|
exc_type, exc, tb = sys.exc_info()
|
|
@@ -240,6 +237,7 @@ def dispatch(
|
|
|
240
237
|
immediate=immediate,
|
|
241
238
|
deferred=deferred,
|
|
242
239
|
profile_options=x_task_diagnostics_var.get(None),
|
|
240
|
+
app_lock=(immediate and AppStatus.objects.current()) or None,
|
|
243
241
|
)
|
|
244
242
|
task.refresh_from_db() # The database may have assigned a timestamp for us.
|
|
245
243
|
if immediate:
|
|
@@ -272,13 +270,16 @@ def dispatch(
|
|
|
272
270
|
try:
|
|
273
271
|
execute_task(task)
|
|
274
272
|
finally:
|
|
275
|
-
#
|
|
273
|
+
# Whether the task fails or not, we should always restore the workdir.
|
|
276
274
|
os.chdir(cur_dir)
|
|
277
275
|
|
|
278
276
|
if resources:
|
|
279
277
|
notify_workers = True
|
|
280
278
|
elif deferred:
|
|
279
|
+
# Resources are blocked. Let the others handle it.
|
|
281
280
|
notify_workers = True
|
|
281
|
+
task.app_lock = None
|
|
282
|
+
task.save()
|
|
282
283
|
else:
|
|
283
284
|
task.set_canceling()
|
|
284
285
|
task.set_canceled(TASK_STATES.CANCELED, "Resources temporarily unavailable.")
|
|
@@ -363,41 +363,60 @@ class PulpcoreWorker:
|
|
|
363
363
|
def iter_tasks(self):
|
|
364
364
|
"""Iterate over ready tasks and yield each task while holding the lock."""
|
|
365
365
|
while not self.shutdown_requested:
|
|
366
|
-
# When batching this query, be sure to use "pulp_created" as a cursor
|
|
366
|
+
# When batching this query, be sure to use "pulp_created" as a cursor.
|
|
367
367
|
for task in Task.objects.filter(
|
|
368
368
|
state__in=TASK_INCOMPLETE_STATES,
|
|
369
369
|
unblocked_at__isnull=False,
|
|
370
370
|
).order_by("-immediate", F("pulp_created") + Value(timedelta(seconds=8)) * Random()):
|
|
371
|
-
# This code will only be called if we acquired the lock successfully
|
|
372
|
-
# The lock will be automatically be released at the end of the block
|
|
371
|
+
# This code will only be called if we acquired the lock successfully.
|
|
372
|
+
# The lock will be automatically be released at the end of the block.
|
|
373
373
|
with contextlib.suppress(AdvisoryLockError), task:
|
|
374
|
-
#
|
|
375
|
-
task.
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
if
|
|
386
|
-
|
|
374
|
+
# We got the advisory lock (OLD) now try to get the app_lock (NEW).
|
|
375
|
+
rows = Task.objects.filter(pk=task.pk, app_lock=None).update(
|
|
376
|
+
app_lock=AppStatus.objects.current()
|
|
377
|
+
)
|
|
378
|
+
if rows == 0:
|
|
379
|
+
_logger.error(
|
|
380
|
+
"Acquired advisory lock but missed the app_lock for the task. "
|
|
381
|
+
"This should only happen during the upgrade phase to the new app_lock."
|
|
382
|
+
)
|
|
383
|
+
continue
|
|
384
|
+
try:
|
|
385
|
+
# Check if someone else changed the task before we got the lock.
|
|
386
|
+
task.refresh_from_db()
|
|
387
|
+
|
|
388
|
+
if task.state == TASK_STATES.CANCELING and task.worker is None:
|
|
389
|
+
# No worker picked this task up before being canceled.
|
|
390
|
+
if self.cancel_abandoned_task(task, TASK_STATES.CANCELED):
|
|
391
|
+
# Continue looking for the next task without considering this
|
|
392
|
+
# tasks resources, as we just released them.
|
|
393
|
+
continue
|
|
394
|
+
if task.state in [TASK_STATES.RUNNING, TASK_STATES.CANCELING]:
|
|
395
|
+
# A running task without a lock must be abandoned.
|
|
396
|
+
if self.cancel_abandoned_task(
|
|
397
|
+
task, TASK_STATES.FAILED, "Worker has gone missing."
|
|
398
|
+
):
|
|
399
|
+
# Continue looking for the next task without considering this
|
|
400
|
+
# tasks resources, as we just released them.
|
|
401
|
+
continue
|
|
402
|
+
|
|
403
|
+
# This statement is using lazy evaluation.
|
|
404
|
+
if (
|
|
405
|
+
task.state == TASK_STATES.WAITING
|
|
406
|
+
and task.unblocked_at is not None
|
|
407
|
+
and self.is_compatible(task)
|
|
387
408
|
):
|
|
388
|
-
|
|
389
|
-
#
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
# Start from the top of the Task list
|
|
400
|
-
break
|
|
409
|
+
yield task
|
|
410
|
+
# Start from the top of the Task list.
|
|
411
|
+
break
|
|
412
|
+
finally:
|
|
413
|
+
rows = Task.objects.filter(
|
|
414
|
+
pk=task.pk, app_lock=AppStatus.objects.current()
|
|
415
|
+
).update(app_lock=None)
|
|
416
|
+
if rows != 1:
|
|
417
|
+
raise RuntimeError(
|
|
418
|
+
"Something other than us is messing around with locks."
|
|
419
|
+
)
|
|
401
420
|
else:
|
|
402
421
|
# No task found in the for-loop
|
|
403
422
|
break
|
|
@@ -490,22 +490,21 @@ class TestImmediateTaskWithNoResource:
|
|
|
490
490
|
assert task.worker is None
|
|
491
491
|
|
|
492
492
|
@pytest.mark.parallel
|
|
493
|
-
def test_executes_on_api_worker_when_no_async(
|
|
493
|
+
def test_executes_on_api_worker_when_no_async(
|
|
494
|
+
self, pulpcore_bindings, dispatch_task, monitor_task
|
|
495
|
+
):
|
|
494
496
|
"""
|
|
495
497
|
GIVEN a task with no resource requirements
|
|
496
498
|
AND the task IS NOT an async function
|
|
497
499
|
WHEN dispatching a task as immediate
|
|
498
|
-
THEN the
|
|
500
|
+
THEN the dispatch should throw an error
|
|
499
501
|
"""
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
assert task.state == "completed"
|
|
507
|
-
assert task.worker is None
|
|
508
|
-
assert "Support for non-coroutine immediate tasks will be dropped" in stderr_content
|
|
502
|
+
with pytest.raises(PulpTaskError) as ctx:
|
|
503
|
+
task_href = dispatch_task(
|
|
504
|
+
"pulpcore.app.tasks.test.sleep", args=(LT_TIMEOUT,), immediate=True
|
|
505
|
+
)
|
|
506
|
+
monitor_task(task_href)
|
|
507
|
+
assert "Immediate tasks must be async functions" in ctx.value.task.error["description"]
|
|
509
508
|
|
|
510
509
|
@pytest.mark.parallel
|
|
511
510
|
def test_timeouts_on_api_worker(self, pulpcore_bindings, dispatch_task):
|
|
@@ -4,7 +4,6 @@ import pytest
|
|
|
4
4
|
import subprocess
|
|
5
5
|
import uuid
|
|
6
6
|
from datetime import datetime, timedelta
|
|
7
|
-
from random import choice
|
|
8
7
|
from time import sleep
|
|
9
8
|
|
|
10
9
|
|
|
@@ -23,7 +22,7 @@ def test_worker_actions(pulpcore_bindings):
|
|
|
23
22
|
assert val is not None
|
|
24
23
|
|
|
25
24
|
# Pick a random worker to be used for the next assertions.
|
|
26
|
-
chosen_worker =
|
|
25
|
+
chosen_worker = next(worker for worker in workers if not worker.name.startswith("test-"))
|
|
27
26
|
|
|
28
27
|
# Read a worker by its pulp_href.
|
|
29
28
|
read_worker = pulpcore_bindings.WorkersApi.read(chosen_worker.pulp_href)
|