pulpcore 3.90.0__tar.gz → 3.91.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.90.0 → pulpcore-3.91.0}/CHANGES.md +30 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/PKG-INFO +1 -1
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/__init__.py +1 -1
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/__init__.py +1 -1
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/apps.py +16 -2
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/util.py +1 -29
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/constants.py +2 -3
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/instrumentation.py +18 -15
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/exceptions/__init__.py +0 -1
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/exceptions/base.py +0 -4
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/tasks.py +1 -1
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/worker.py +116 -84
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -3
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -1
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/PKG-INFO +1 -1
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pyproject.toml +2 -2
- {pulpcore-3.90.0 → pulpcore-3.91.0}/CODE_OF_CONDUCT.md +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/COMMITMENT +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/CONTRIBUTING.md +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/COPYRIGHT +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/LICENSE +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/MANIFEST.in +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/README.md +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/ci_requirements.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/functest_requirements.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/manage.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/migrations/0001_initial.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/migrations/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/models.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/serializers.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/viewsets.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/pytest_plugin.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/rhsm/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/conftest.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/constants.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/unit/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/unit/certdata.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/migrations/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/modelresource.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/models.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/replica.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/serializers.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/tasks/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/tasks/publishing.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/tasks/synchronizing.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/viewsets.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/manifest.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/pytest_plugin.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_acs.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_domains.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_filesystem_export.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_labels.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_publish.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_rbac.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_sync.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/unit/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/unit/test_safe_paths.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/unit/test_serializers.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/access_policy.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/authentication.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/checks.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/entrypoint.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/files.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/global_access_conditions.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/importexport.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/loggers.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/manage.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/add-signing-service.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/analyze-publication.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/dump-permissions.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/migrationstat.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/openapi.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/optimizemigration.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/remove-plugin.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/repository-size.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/shell.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0091_systemid.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0099_versions_field.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0101_add_domain.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0104_delete_label.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0108_task_versions.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0137_appstatus.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0139_task_app_lock.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0140_require_appstatus_zdu.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0141_alter_appstatus_name.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0142_task_result.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0143_require_app_lock_zdu.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0144_delete_old_appstatus.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0145_domainize_import_export.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/mime_types.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/modelresource.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/access_policy.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/acs.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/analytics.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/content.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/domain.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/exporter.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/fields.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/generic.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/importer.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/openpgp.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/progress.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/publication.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/replica.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/repository.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/role.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/status.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/storage.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/task.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/upload.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/vulnerability_report.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/netutil.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/openpgp.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/protobuf/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/pulp_hashlib.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/redis_connection.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/replica.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/response.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/role_util.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/access_policy.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/acs.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/content.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/domain.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/exporter.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/fields.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/importer.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/openpgp.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/orphans.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/progress.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/publication.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/purge.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/reclaim.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/repair.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/replica.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/repository.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/status.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/task.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/upload.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/user.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/vulnerability_report.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/settings.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/analytics.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/export.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/importer.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/migrate.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/orphan.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/purge.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/reclaim_space.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/replica.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/repository.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/telemetry.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/test.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/upload.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/vulnerability_report.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/templates/rest_framework/api.html +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/templatetags/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/templatetags/pulp_urls.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/urls.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/importer.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/orphans.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/repair.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/status.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/access_policy.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/acs.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/content.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/custom_filters.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/domain.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/exporter.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/importer.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/openpgp.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/orphans.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/publication.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/reclaim.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/replica.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/repository.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/task.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/upload.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/user.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/wsgi.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/backends.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/cache/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/cache/cache.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/authentication.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/entrypoint.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/handler.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/factory.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/file.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/http.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/exceptions/plugin.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/exceptions/validation.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/filters.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/metrics.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/middleware.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/migrations.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/openapi/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/openapi/hooks.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/access_policy.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/actions.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/apps.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/authentication/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/cache/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/constants.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/content.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/download/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/exceptions.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/files.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/importexport.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/migrations.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/modelresources.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/models/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/models/role.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/publication_utils.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/pulp_hashlib.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/replica.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/repo_version_utils.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/responses.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/serializers/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/serializers/content.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/api.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/artifact_stages.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/content_stages.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/declarative_version.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/models.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/storage.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/sync.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/tasking.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/util.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/viewsets/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/viewsets/content.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/pytest_plugin.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/responses.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/_util.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/entrypoint.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/kafka.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/storage.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_auth.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_filter.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_login.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_replication.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_repos.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_role.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_scoping.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_status.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_tasking.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_upload.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_workers.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/assets/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/content_with_coverage.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/utils.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/performance/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/performance/test_performance.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/conftest.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/content/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/content/test_handler.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/content/test_heartbeat.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/download/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/metrics/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/metrics/conftest.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/migration/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_content.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_remote.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_repository.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_task.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/roles/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/roles/test_roles.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_user.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/stages/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/stages/test_stages.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_cache.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_chunked_file.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_content_guard.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_files.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_import_checks.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_settings.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_util.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_viewsets.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/SOURCES.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/dependency_links.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/entry_points.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/requires.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/top_level.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/setup.cfg +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/test_requirements.txt +0 -0
- {pulpcore-3.90.0 → pulpcore-3.91.0}/unittest_requirements.txt +0 -0
|
@@ -8,6 +8,36 @@
|
|
|
8
8
|
|
|
9
9
|
[//]: # (towncrier release notes start)
|
|
10
10
|
|
|
11
|
+
## 3.91.0 (2025-10-01) {: #3.91.0 }
|
|
12
|
+
|
|
13
|
+
### REST API {: #3.91.0-rest-api }
|
|
14
|
+
|
|
15
|
+
#### Features {: #3.91.0-rest-api-feature }
|
|
16
|
+
|
|
17
|
+
- Changed orphan cleanup to run as a scheduled task.
|
|
18
|
+
- Removed the use of session scoped advisory locks from workers janitorial work.
|
|
19
|
+
|
|
20
|
+
#### Bugfixes {: #3.91.0-rest-api-bugfix }
|
|
21
|
+
|
|
22
|
+
- Fix situations with a single worker per installation failing to unblock all tasks that come in quick succession.
|
|
23
|
+
[#6873](https://github.com/pulp/pulpcore/issues/6873)
|
|
24
|
+
- Fixed exception propagation in the pulp-content instrumentation middleware.
|
|
25
|
+
[#6925](https://github.com/pulp/pulpcore/issues/6925)
|
|
26
|
+
|
|
27
|
+
### Plugin API {: #3.91.0-plugin-api }
|
|
28
|
+
|
|
29
|
+
No significant changes.
|
|
30
|
+
|
|
31
|
+
### Pulp File {: #3.91.0-pulp-file }
|
|
32
|
+
|
|
33
|
+
No significant changes.
|
|
34
|
+
|
|
35
|
+
### Pulp Cert Guard {: #3.91.0-pulp-cert-guard }
|
|
36
|
+
|
|
37
|
+
No significant changes.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
11
41
|
## 3.90.0 (2025-09-23) {: #3.90.0 }
|
|
12
42
|
|
|
13
43
|
### REST API {: #3.90.0-rest-api }
|
|
@@ -8,7 +8,7 @@ from django import apps
|
|
|
8
8
|
from django.conf import settings
|
|
9
9
|
from django.core.exceptions import ImproperlyConfigured
|
|
10
10
|
from django.db import connection, transaction
|
|
11
|
-
from django.db.models.signals import post_migrate
|
|
11
|
+
from django.db.models.signals import post_migrate, pre_migrate
|
|
12
12
|
from django.utils.module_loading import module_has_submodule
|
|
13
13
|
|
|
14
14
|
from pulpcore.exceptions.plugin import MissingPlugin
|
|
@@ -239,7 +239,7 @@ class PulpAppConfig(PulpPluginAppConfig):
|
|
|
239
239
|
label = "core"
|
|
240
240
|
|
|
241
241
|
# The version of this app
|
|
242
|
-
version = "3.
|
|
242
|
+
version = "3.91.0"
|
|
243
243
|
|
|
244
244
|
# The python package name providing this app
|
|
245
245
|
python_package_name = "pulpcore"
|
|
@@ -250,6 +250,7 @@ class PulpAppConfig(PulpPluginAppConfig):
|
|
|
250
250
|
super().ready()
|
|
251
251
|
from . import checks # noqa
|
|
252
252
|
|
|
253
|
+
pre_migrate.connect(_clean_app_status, sender=self, dispatch_uid="clean_app_status")
|
|
253
254
|
post_migrate.connect(
|
|
254
255
|
_ensure_default_domain, sender=self, dispatch_uid="ensure_default_domain"
|
|
255
256
|
)
|
|
@@ -263,6 +264,19 @@ class PulpAppConfig(PulpPluginAppConfig):
|
|
|
263
264
|
)
|
|
264
265
|
|
|
265
266
|
|
|
267
|
+
def _clean_app_status(sender, apps, verbosity, **kwargs):
|
|
268
|
+
from django.contrib.postgres.functions import TransactionNow
|
|
269
|
+
from django.db.models import F
|
|
270
|
+
|
|
271
|
+
try:
|
|
272
|
+
AppStatus = apps.get_model("core", "AppStatus")
|
|
273
|
+
except LookupError:
|
|
274
|
+
if verbosity >= 1:
|
|
275
|
+
print(_("AppStatus model does not exist. Skipping pre migrate cleanup."))
|
|
276
|
+
else:
|
|
277
|
+
AppStatus.objects.filter(last_heartbeat__lt=TransactionNow() - F("ttl")).delete()
|
|
278
|
+
|
|
279
|
+
|
|
266
280
|
def _populate_access_policies(sender, apps, verbosity, **kwargs):
|
|
267
281
|
from pulpcore.app.util import get_view_urlpattern
|
|
268
282
|
from pulpcore.app.viewsets import LoginViewSet
|
|
@@ -25,7 +25,6 @@ from rest_framework.reverse import reverse as drf_reverse
|
|
|
25
25
|
from pulpcore.app.loggers import deprecation_logger
|
|
26
26
|
from pulpcore.app.apps import pulp_plugin_configs
|
|
27
27
|
from pulpcore.app import models
|
|
28
|
-
from pulpcore.exceptions import AdvisoryLockError
|
|
29
28
|
from pulpcore.exceptions.validation import InvalidSignatureError
|
|
30
29
|
|
|
31
30
|
|
|
@@ -468,6 +467,7 @@ def configure_cleanup():
|
|
|
468
467
|
settings.TMPFILE_PROTECTION_TIME,
|
|
469
468
|
),
|
|
470
469
|
("tasks", "pulpcore.app.tasks.purge.purge", settings.TASK_PROTECTION_TIME),
|
|
470
|
+
("content", "pulpcore.app.tasks.orphan.orphan_cleanup", settings.ORPHAN_PROTECTION_TIME),
|
|
471
471
|
]:
|
|
472
472
|
if protection_time > 0:
|
|
473
473
|
dispatch_interval = timedelta(minutes=protection_time)
|
|
@@ -636,34 +636,6 @@ def get_worker_name():
|
|
|
636
636
|
return f"{os.getpid()}@{socket.gethostname()}"
|
|
637
637
|
|
|
638
638
|
|
|
639
|
-
class PGAdvisoryLock:
|
|
640
|
-
"""
|
|
641
|
-
A context manager that will hold a postgres advisory lock non-blocking.
|
|
642
|
-
|
|
643
|
-
The locks can be chosen from a lock group to avoid collisions. They will never collide with the
|
|
644
|
-
locks used for tasks.
|
|
645
|
-
"""
|
|
646
|
-
|
|
647
|
-
def __init__(self, lock, lock_group=0):
|
|
648
|
-
self.lock_group = lock_group
|
|
649
|
-
self.lock = lock
|
|
650
|
-
|
|
651
|
-
def __enter__(self):
|
|
652
|
-
with connection.cursor() as cursor:
|
|
653
|
-
cursor.execute("SELECT pg_try_advisory_lock(%s, %s)", [self.lock_group, self.lock])
|
|
654
|
-
acquired = cursor.fetchone()[0]
|
|
655
|
-
if not acquired:
|
|
656
|
-
raise AdvisoryLockError("Could not acquire lock.")
|
|
657
|
-
return self
|
|
658
|
-
|
|
659
|
-
def __exit__(self, exc_type, exc_value, traceback):
|
|
660
|
-
with connection.cursor() as cursor:
|
|
661
|
-
cursor.execute("SELECT pg_advisory_unlock(%s, %s)", [self.lock_group, self.lock])
|
|
662
|
-
released = cursor.fetchone()[0]
|
|
663
|
-
if not released:
|
|
664
|
-
raise RuntimeError("Lock not held.")
|
|
665
|
-
|
|
666
|
-
|
|
667
639
|
def normalize_http_status(status):
|
|
668
640
|
"""Convert the HTTP status code to 2xx, 3xx, etc., normalizing the last two digits."""
|
|
669
641
|
if 100 <= status < 200:
|
|
@@ -6,11 +6,10 @@ from types import SimpleNamespace
|
|
|
6
6
|
# The group will be 0.
|
|
7
7
|
# The numbers are randomly chosen.
|
|
8
8
|
# !!! Never change these values !!!
|
|
9
|
-
TASK_DISPATCH_LOCK = 21
|
|
10
9
|
TASK_SCHEDULING_LOCK = 42
|
|
11
10
|
TASK_UNBLOCKING_LOCK = 84
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
TASK_METRICS_LOCK = 74
|
|
12
|
+
WORKER_CLEANUP_LOCK = 11
|
|
14
13
|
|
|
15
14
|
# Reasons to send along a task worker wakeup call.
|
|
16
15
|
TASK_WAKEUP_UNBLOCK = "unblock"
|
|
@@ -21,23 +21,26 @@ def instrumentation(exporter=None, reader=None, provider=None):
|
|
|
21
21
|
try:
|
|
22
22
|
response = await handler(request)
|
|
23
23
|
status_code = response.status
|
|
24
|
+
|
|
25
|
+
return response
|
|
24
26
|
except web.HTTPException as exc:
|
|
25
27
|
status_code = exc.status
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
duration_ms
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
28
|
+
raise exc
|
|
29
|
+
except Exception as exc:
|
|
30
|
+
status_code = exc.status if hasattr(exc, "status") else 500
|
|
31
|
+
raise exc
|
|
32
|
+
finally:
|
|
33
|
+
duration_ms = (time.time() - start_time) * 1000
|
|
34
|
+
|
|
35
|
+
request_duration_histogram.record(
|
|
36
|
+
duration_ms,
|
|
37
|
+
attributes={
|
|
38
|
+
"http.method": request.method,
|
|
39
|
+
"http.status_code": normalize_http_status(status_code),
|
|
40
|
+
"http.route": _get_view_request_handler_func(request),
|
|
41
|
+
"worker.name": get_worker_name(),
|
|
42
|
+
},
|
|
43
|
+
)
|
|
41
44
|
|
|
42
45
|
return middleware
|
|
43
46
|
|
|
@@ -64,10 +64,6 @@ class ResourceImmutableError(PulpException):
|
|
|
64
64
|
return msg
|
|
65
65
|
|
|
66
66
|
|
|
67
|
-
class AdvisoryLockError(Exception):
|
|
68
|
-
"""Exception to signal that a lock could not be acquired."""
|
|
69
|
-
|
|
70
|
-
|
|
71
67
|
class TimeoutException(PulpException):
|
|
72
68
|
"""
|
|
73
69
|
Exception to signal timeout error.
|
|
@@ -297,7 +297,7 @@ async def adispatch(
|
|
|
297
297
|
task.set_canceling()
|
|
298
298
|
task.set_canceled(TASK_STATES.CANCELED, "Resources temporarily unavailable.")
|
|
299
299
|
if send_wakeup_signal:
|
|
300
|
-
wakeup_worker(TASK_WAKEUP_UNBLOCK)
|
|
300
|
+
await sync_to_async(wakeup_worker)(TASK_WAKEUP_UNBLOCK)
|
|
301
301
|
return task
|
|
302
302
|
|
|
303
303
|
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
from gettext import gettext as _
|
|
2
2
|
|
|
3
|
+
import functools
|
|
3
4
|
import logging
|
|
4
5
|
import os
|
|
5
6
|
import random
|
|
6
7
|
import select
|
|
7
8
|
import signal
|
|
8
9
|
import socket
|
|
9
|
-
import contextlib
|
|
10
10
|
from datetime import datetime, timedelta
|
|
11
11
|
from multiprocessing import Process
|
|
12
12
|
from tempfile import TemporaryDirectory
|
|
13
13
|
from packaging.version import parse as parse_version
|
|
14
14
|
|
|
15
15
|
from django.conf import settings
|
|
16
|
-
from django.db import connection, DatabaseError, IntegrityError
|
|
16
|
+
from django.db import connection, transaction, DatabaseError, IntegrityError
|
|
17
17
|
from django.db.models import Case, Count, F, Max, Value, When
|
|
18
18
|
from django.utils import timezone
|
|
19
19
|
|
|
@@ -22,15 +22,14 @@ from pulpcore.constants import (
|
|
|
22
22
|
TASK_INCOMPLETE_STATES,
|
|
23
23
|
TASK_SCHEDULING_LOCK,
|
|
24
24
|
TASK_UNBLOCKING_LOCK,
|
|
25
|
-
|
|
25
|
+
TASK_METRICS_LOCK,
|
|
26
|
+
WORKER_CLEANUP_LOCK,
|
|
26
27
|
TASK_WAKEUP_UNBLOCK,
|
|
27
28
|
TASK_WAKEUP_HANDLE,
|
|
28
29
|
)
|
|
29
30
|
from pulpcore.metrics import init_otel_meter
|
|
30
31
|
from pulpcore.app.apps import pulp_plugin_configs
|
|
31
32
|
from pulpcore.app.models import Task, AppStatus
|
|
32
|
-
from pulpcore.app.util import PGAdvisoryLock
|
|
33
|
-
from pulpcore.exceptions import AdvisoryLockError
|
|
34
33
|
|
|
35
34
|
from pulpcore.tasking.storage import WorkerDirectory
|
|
36
35
|
from pulpcore.tasking._util import (
|
|
@@ -59,6 +58,30 @@ IGNORED_TASKS_CLEANUP_INTERVAL = 100
|
|
|
59
58
|
THRESHOLD_UNBLOCKED_WAITING_TIME = 5
|
|
60
59
|
|
|
61
60
|
|
|
61
|
+
def exclusive(lock):
|
|
62
|
+
"""
|
|
63
|
+
Runs function in a transaction holding the specified lock.
|
|
64
|
+
Returns None if the lock could not be acquired.
|
|
65
|
+
It should be used for actions that only need to be performed by a single worker.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
def _decorator(f):
|
|
69
|
+
@functools.wraps(f)
|
|
70
|
+
def _f(self, *args, **kwargs):
|
|
71
|
+
with transaction.atomic():
|
|
72
|
+
with connection.cursor() as cursor:
|
|
73
|
+
cursor.execute("SELECT pg_try_advisory_xact_lock(%s, %s)", [0, lock])
|
|
74
|
+
acquired = cursor.fetchone()[0]
|
|
75
|
+
if acquired:
|
|
76
|
+
return f(self, *args, **kwargs)
|
|
77
|
+
else:
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
return _f
|
|
81
|
+
|
|
82
|
+
return _decorator
|
|
83
|
+
|
|
84
|
+
|
|
62
85
|
class PulpcoreWorker:
|
|
63
86
|
def __init__(self, auxiliary=False):
|
|
64
87
|
# Notification states from several signal handlers
|
|
@@ -112,9 +135,9 @@ class PulpcoreWorker:
|
|
|
112
135
|
description="The age of the longest waiting task.",
|
|
113
136
|
unit="seconds",
|
|
114
137
|
)
|
|
115
|
-
self.
|
|
138
|
+
self.otel_enabled = True
|
|
116
139
|
else:
|
|
117
|
-
self.
|
|
140
|
+
self.otel_enabled = False
|
|
118
141
|
|
|
119
142
|
def _signal_handler(self, thesignal, frame):
|
|
120
143
|
if thesignal in (signal.SIGHUP, signal.SIGTERM):
|
|
@@ -187,16 +210,57 @@ class PulpcoreWorker:
|
|
|
187
210
|
):
|
|
188
211
|
self.ignored_task_ids.remove(pk)
|
|
189
212
|
|
|
190
|
-
|
|
213
|
+
@exclusive(WORKER_CLEANUP_LOCK)
|
|
214
|
+
def app_worker_cleanup(self):
|
|
191
215
|
qs = AppStatus.objects.missing()
|
|
192
216
|
for app_worker in qs:
|
|
193
217
|
_logger.warning(
|
|
194
218
|
"Cleanup record of missing %s process %s.", app_worker.app_type, app_worker.name
|
|
195
219
|
)
|
|
196
220
|
qs.delete()
|
|
221
|
+
# This will also serve as a pacemaker because it will be triggered regularly.
|
|
222
|
+
# Don't bother the others.
|
|
223
|
+
self.wakeup_unblock = True
|
|
224
|
+
|
|
225
|
+
@exclusive(TASK_SCHEDULING_LOCK)
|
|
226
|
+
def dispatch_scheduled_tasks(self):
|
|
227
|
+
dispatch_scheduled_tasks()
|
|
228
|
+
|
|
229
|
+
@exclusive(TASK_METRICS_LOCK)
|
|
230
|
+
def record_unblocked_waiting_tasks_metric(self, now):
|
|
231
|
+
# This "reporting code" must not me moved inside a task, because it is supposed
|
|
232
|
+
# to be able to report on a congested tasking system to produce reliable results.
|
|
233
|
+
# For performance reasons we aggregate these statistics on a single database call.
|
|
234
|
+
unblocked_tasks_stats = (
|
|
235
|
+
Task.objects.filter(unblocked_at__isnull=False, state=TASK_STATES.WAITING)
|
|
236
|
+
.annotate(unblocked_for=Value(timezone.now()) - F("unblocked_at"))
|
|
237
|
+
.aggregate(
|
|
238
|
+
longest_unblocked_waiting_time=Max("unblocked_for", default=timezone.timedelta(0)),
|
|
239
|
+
unblocked_tasks_count_gte_threshold=Count(
|
|
240
|
+
Case(
|
|
241
|
+
When(
|
|
242
|
+
unblocked_for__gte=Value(
|
|
243
|
+
timezone.timedelta(seconds=THRESHOLD_UNBLOCKED_WAITING_TIME)
|
|
244
|
+
),
|
|
245
|
+
then=1,
|
|
246
|
+
)
|
|
247
|
+
)
|
|
248
|
+
),
|
|
249
|
+
)
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
self.tasks_unblocked_queue_meter.set(
|
|
253
|
+
unblocked_tasks_stats["unblocked_tasks_count_gte_threshold"]
|
|
254
|
+
)
|
|
255
|
+
self.tasks_longest_unblocked_time_meter.set(
|
|
256
|
+
unblocked_tasks_stats["longest_unblocked_waiting_time"].seconds
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
self.cursor.execute(f"NOTIFY pulp_worker_metrics_heartbeat, '{str(now)}'")
|
|
197
260
|
|
|
198
261
|
def beat(self):
|
|
199
|
-
|
|
262
|
+
now = timezone.now()
|
|
263
|
+
if self.app_status.last_heartbeat < now - self.heartbeat_period:
|
|
200
264
|
self.handle_worker_heartbeat()
|
|
201
265
|
if self.ignored_task_ids:
|
|
202
266
|
self.ignored_task_countdown -= 1
|
|
@@ -207,14 +271,14 @@ class PulpcoreWorker:
|
|
|
207
271
|
self.worker_cleanup_countdown -= 1
|
|
208
272
|
if self.worker_cleanup_countdown <= 0:
|
|
209
273
|
self.worker_cleanup_countdown = WORKER_CLEANUP_INTERVAL
|
|
210
|
-
self.
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
def notify_workers(self, reason
|
|
274
|
+
self.app_worker_cleanup()
|
|
275
|
+
|
|
276
|
+
self.dispatch_scheduled_tasks()
|
|
277
|
+
|
|
278
|
+
if self.otel_enabled and now > self.last_metric_heartbeat + self.heartbeat_period:
|
|
279
|
+
self.record_unblocked_waiting_tasks_metric(now)
|
|
280
|
+
|
|
281
|
+
def notify_workers(self, reason):
|
|
218
282
|
self.cursor.execute("SELECT pg_notify('pulp_worker_wakeup', %s)", (reason,))
|
|
219
283
|
|
|
220
284
|
def cancel_abandoned_task(self, task, final_state, reason=None):
|
|
@@ -274,25 +338,29 @@ class PulpcoreWorker:
|
|
|
274
338
|
Also it clears the notification about tasks to be unblocked and sends the notification that
|
|
275
339
|
new unblocked tasks are made available.
|
|
276
340
|
|
|
277
|
-
Returns the
|
|
341
|
+
Returns None if another worker held the lock, True if unblocked tasks exist, else False.
|
|
278
342
|
"""
|
|
279
343
|
|
|
280
344
|
assert not self.auxiliary
|
|
281
345
|
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
346
|
+
self.wakeup_unblock = False
|
|
347
|
+
result = self._unblock_tasks()
|
|
348
|
+
if result is not None and (
|
|
349
|
+
Task.objects.filter(
|
|
350
|
+
state__in=[TASK_STATES.WAITING, TASK_STATES.CANCELING], app_lock=None
|
|
351
|
+
)
|
|
352
|
+
.exclude(unblocked_at=None)
|
|
353
|
+
.exists()
|
|
354
|
+
):
|
|
355
|
+
self.notify_workers(TASK_WAKEUP_HANDLE)
|
|
356
|
+
return True
|
|
288
357
|
|
|
289
|
-
|
|
290
|
-
"""Iterate over waiting tasks and mark them unblocked accordingly.
|
|
358
|
+
return result
|
|
291
359
|
|
|
292
|
-
|
|
293
|
-
|
|
360
|
+
@exclusive(TASK_UNBLOCKING_LOCK)
|
|
361
|
+
def _unblock_tasks(self):
|
|
362
|
+
"""Iterate over waiting tasks and mark them unblocked accordingly."""
|
|
294
363
|
|
|
295
|
-
count = 0
|
|
296
364
|
taken_exclusive_resources = set()
|
|
297
365
|
taken_shared_resources = set()
|
|
298
366
|
# When batching this query, be sure to use "pulp_created" as a cursor
|
|
@@ -320,7 +388,6 @@ class PulpcoreWorker:
|
|
|
320
388
|
task.pulp_domain.name,
|
|
321
389
|
)
|
|
322
390
|
task.unblock()
|
|
323
|
-
count += 1
|
|
324
391
|
|
|
325
392
|
elif (
|
|
326
393
|
task.state == TASK_STATES.WAITING
|
|
@@ -339,7 +406,6 @@ class PulpcoreWorker:
|
|
|
339
406
|
task.pulp_domain.name,
|
|
340
407
|
)
|
|
341
408
|
task.unblock()
|
|
342
|
-
count += 1
|
|
343
409
|
elif task.state == TASK_STATES.RUNNING and task.unblocked_at is None:
|
|
344
410
|
# This should not happen in normal operation.
|
|
345
411
|
# And it is only an issue if the worker running that task died, because it will
|
|
@@ -355,8 +421,7 @@ class PulpcoreWorker:
|
|
|
355
421
|
# Record the resources of the pending task
|
|
356
422
|
taken_exclusive_resources.update(exclusive_resources)
|
|
357
423
|
taken_shared_resources.update(shared_resources)
|
|
358
|
-
|
|
359
|
-
return count
|
|
424
|
+
return False
|
|
360
425
|
|
|
361
426
|
def sleep(self):
|
|
362
427
|
"""Wait for signals on the wakeup channel while heart beating."""
|
|
@@ -364,13 +429,16 @@ class PulpcoreWorker:
|
|
|
364
429
|
_logger.debug(_("Worker %s entering sleep state."), self.name)
|
|
365
430
|
while not self.shutdown_requested and not self.wakeup_handle:
|
|
366
431
|
r, w, x = select.select(
|
|
367
|
-
[self.sentinel, connection.connection],
|
|
432
|
+
[self.sentinel, connection.connection],
|
|
433
|
+
[],
|
|
434
|
+
[],
|
|
435
|
+
0 if self.wakeup_unblock else self.heartbeat_period.seconds,
|
|
368
436
|
)
|
|
369
437
|
self.beat()
|
|
370
438
|
if connection.connection in r:
|
|
371
439
|
connection.connection.execute("SELECT 1")
|
|
372
|
-
|
|
373
|
-
|
|
440
|
+
if self.wakeup_unblock:
|
|
441
|
+
self.unblock_tasks()
|
|
374
442
|
if self.sentinel in r:
|
|
375
443
|
os.read(self.sentinel, 256)
|
|
376
444
|
_logger.debug(_("Worker %s leaving sleep state."), self.name)
|
|
@@ -407,21 +475,21 @@ class PulpcoreWorker:
|
|
|
407
475
|
[self.sentinel, connection.connection, task_process.sentinel],
|
|
408
476
|
[],
|
|
409
477
|
[],
|
|
410
|
-
self.heartbeat_period.seconds,
|
|
478
|
+
0 if self.wakeup_unblock or self.cancel_task else self.heartbeat_period.seconds,
|
|
411
479
|
)
|
|
412
480
|
self.beat()
|
|
413
481
|
if connection.connection in r:
|
|
414
482
|
connection.connection.execute("SELECT 1")
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
483
|
+
if self.cancel_task:
|
|
484
|
+
_logger.info(
|
|
485
|
+
_("Received signal to cancel current task %s in domain: %s."),
|
|
486
|
+
task.pk,
|
|
487
|
+
domain.name,
|
|
488
|
+
)
|
|
489
|
+
cancel_state = TASK_STATES.CANCELED
|
|
490
|
+
self.cancel_task = False
|
|
491
|
+
if self.wakeup_unblock:
|
|
492
|
+
self.unblock_tasks()
|
|
425
493
|
if task_process.sentinel in r:
|
|
426
494
|
if not task_process.is_alive():
|
|
427
495
|
break
|
|
@@ -540,42 +608,6 @@ class PulpcoreWorker:
|
|
|
540
608
|
if rows != 1:
|
|
541
609
|
raise RuntimeError("Something other than us is messing around with locks.")
|
|
542
610
|
|
|
543
|
-
def _record_unblocked_waiting_tasks_metric(self):
|
|
544
|
-
now = timezone.now()
|
|
545
|
-
if now > self.last_metric_heartbeat + self.heartbeat_period:
|
|
546
|
-
with contextlib.suppress(AdvisoryLockError), PGAdvisoryLock(
|
|
547
|
-
TASK_METRICS_HEARTBEAT_LOCK
|
|
548
|
-
):
|
|
549
|
-
# For performance reasons we aggregate these statistics on a single database call.
|
|
550
|
-
unblocked_tasks_stats = (
|
|
551
|
-
Task.objects.filter(unblocked_at__isnull=False, state=TASK_STATES.WAITING)
|
|
552
|
-
.annotate(unblocked_for=Value(timezone.now()) - F("unblocked_at"))
|
|
553
|
-
.aggregate(
|
|
554
|
-
longest_unblocked_waiting_time=Max(
|
|
555
|
-
"unblocked_for", default=timezone.timedelta(0)
|
|
556
|
-
),
|
|
557
|
-
unblocked_tasks_count_gte_threshold=Count(
|
|
558
|
-
Case(
|
|
559
|
-
When(
|
|
560
|
-
unblocked_for__gte=Value(
|
|
561
|
-
timezone.timedelta(seconds=THRESHOLD_UNBLOCKED_WAITING_TIME)
|
|
562
|
-
),
|
|
563
|
-
then=1,
|
|
564
|
-
)
|
|
565
|
-
)
|
|
566
|
-
),
|
|
567
|
-
)
|
|
568
|
-
)
|
|
569
|
-
|
|
570
|
-
self.tasks_unblocked_queue_meter.set(
|
|
571
|
-
unblocked_tasks_stats["unblocked_tasks_count_gte_threshold"]
|
|
572
|
-
)
|
|
573
|
-
self.tasks_longest_unblocked_time_meter.set(
|
|
574
|
-
unblocked_tasks_stats["longest_unblocked_waiting_time"].seconds
|
|
575
|
-
)
|
|
576
|
-
|
|
577
|
-
self.cursor.execute(f"NOTIFY pulp_worker_metrics_heartbeat, '{str(now)}'")
|
|
578
|
-
|
|
579
611
|
def run(self, burst=False):
|
|
580
612
|
with WorkerDirectory(self.name):
|
|
581
613
|
signal.signal(signal.SIGINT, self._signal_handler)
|
|
@@ -589,7 +621,7 @@ class PulpcoreWorker:
|
|
|
589
621
|
if not self.auxiliary:
|
|
590
622
|
# Attempt to flush the task queue completely.
|
|
591
623
|
# Stop iteration if no new tasks were found to unblock.
|
|
592
|
-
while self.unblock_tasks():
|
|
624
|
+
while self.unblock_tasks() is not False:
|
|
593
625
|
self.handle_unblocked_tasks()
|
|
594
626
|
self.handle_unblocked_tasks()
|
|
595
627
|
else:
|
|
@@ -8,7 +8,6 @@ the case.
|
|
|
8
8
|
import pytest
|
|
9
9
|
import uuid
|
|
10
10
|
|
|
11
|
-
from pulpcore.app import settings
|
|
12
11
|
from pulpcore.client.pulpcore.exceptions import ApiException
|
|
13
12
|
|
|
14
13
|
from pulpcore.client.pulp_file import RepositorySyncURL
|
|
@@ -16,8 +15,6 @@ from pulpcore.client.pulp_file import RepositorySyncURL
|
|
|
16
15
|
NUM_REPOS = 1
|
|
17
16
|
NUM_EXPORTERS = 4
|
|
18
17
|
|
|
19
|
-
pytestmark = pytest.mark.skipif(settings.DOMAIN_ENABLED, reason="Domains do not support export.")
|
|
20
|
-
|
|
21
18
|
|
|
22
19
|
@pytest.fixture
|
|
23
20
|
def create_exporter(pulpcore_bindings, gen_object_with_cleanup, add_to_filesystem_cleanup):
|
{pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py
RENAMED
|
@@ -21,7 +21,6 @@ NUM_REPOS = 2
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
pytestmark = [
|
|
24
|
-
pytest.mark.skipif(settings.DOMAIN_ENABLED, reason="Domains do not support import."),
|
|
25
24
|
pytest.mark.skipif(
|
|
26
25
|
"/tmp" not in settings.ALLOWED_IMPORT_PATHS,
|
|
27
26
|
reason="Cannot run import-tests unless /tmp is in ALLOWED_IMPORT_PATHS ({}).".format(
|
|
@@ -7,7 +7,7 @@ build-backend = 'setuptools.build_meta'
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "pulpcore"
|
|
10
|
-
version = "3.
|
|
10
|
+
version = "3.91.0"
|
|
11
11
|
description = "Pulp Django Application and Related Modules"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
authors = [
|
|
@@ -204,7 +204,7 @@ ignore = [
|
|
|
204
204
|
[tool.bumpversion]
|
|
205
205
|
# This section is managed by the plugin template. Do not edit manually.
|
|
206
206
|
|
|
207
|
-
current_version = "3.
|
|
207
|
+
current_version = "3.91.0"
|
|
208
208
|
commit = false
|
|
209
209
|
tag = false
|
|
210
210
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<alpha>0a)?(?P<patch>\\d+)(\\.(?P<release>[a-z]+))?"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|