pulpcore 3.115.2__tar.gz → 3.115.4__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.
- {pulpcore-3.115.2 → pulpcore-3.115.4}/CHANGES.md +50 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/PKG-INFO +1 -1
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/__init__.py +1 -1
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/__init__.py +1 -1
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/apps.py +1 -1
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/base.py +11 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/domain.py +1 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/publication.py +28 -4
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/redis_worker.py +68 -17
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_crud_domains.py +38 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +75 -0
- pulpcore-3.115.4/pulpcore/tests/unit/tasking/test_waiting_tasks_metric.py +132 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/PKG-INFO +1 -1
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/SOURCES.txt +1 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pyproject.toml +3 -2
- {pulpcore-3.115.2 → pulpcore-3.115.4}/CODE_OF_CONDUCT.md +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/COMMITMENT +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/CONTRIBUTING.md +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/COPYRIGHT +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/LICENSE +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/MANIFEST.in +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/README.md +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/ci_requirements.txt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/functest_requirements.txt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/manage.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/migrations/0001_initial.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/migrations/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/models.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/serializers.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/viewsets.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/pytest_plugin.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/rhsm/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/conftest.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/constants.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/unit/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/unit/certdata.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0018_alter_filecontent_options.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0019_add_filegitremote.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0020_filerepository_last_sync_details.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/modelresource.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/models.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/replica.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/serializers.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/settings.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/tasks/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/tasks/publishing.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/tasks/synchronizing.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/viewsets.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/manifest.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/pytest_plugin.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_acs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_distributed_publication.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_domains.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_filesystem_export.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_git_sync.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_labels.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_overwrite_content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_publish.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_rbac.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_sync.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_sync_optimization.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/test_git_sync.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/test_safe_paths.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/test_serializers.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/test_sync_optimization.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/access_policy.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/authentication.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/checks.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/contexts.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/entrypoint.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/files.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/find_url.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/global_access_conditions.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/importexport.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/loggers.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/manage.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/add-signing-service.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/analyze-publication.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/datarepair.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/dump-permissions.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/list-signing-services.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/migrationstat.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/openapi.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/optimizemigration.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/remove-plugin.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/repository-size.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/shell.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0091_systemid.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0099_versions_field.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0101_add_domain.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0104_delete_label.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0108_task_versions.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0137_appstatus.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0139_task_app_lock.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0140_require_appstatus_zdu.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0141_alter_appstatus_name.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0142_task_result.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0143_require_app_lock_zdu.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0144_delete_old_appstatus.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0145_domainize_import_export.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0146_repository_retain_checkpoints.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0147_content_pulp_labels_gin.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0148_artifact_artifact_domain_size_index.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0149_distributedpublication.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0150_taskschedule_task_kwargs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0151_upstreampulp_connect_timeout_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0152_alter_repositoryversion_content_ids.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0153_taskschedule_pulp_domain_alter_taskschedule_name_and_more.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0154_task_api_version.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/mime_types.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/modelresource.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/access_policy.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/acs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/analytics.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/domain.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/exporter.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/fields.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/generic.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/importer.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/openpgp.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/progress.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/publication.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/replica.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/repository.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/role.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/status.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/storage.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/task.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/upload.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/vulnerability_report.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/netutil.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/openpgp.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/protobuf/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/pulp_hashlib.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/redis_connection.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/replica.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/response.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/role_util.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/access_policy.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/acs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/domain.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/exporter.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/fields.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/importer.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/openpgp.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/orphans.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/progress.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/publication.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/purge.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/reclaim.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/repair.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/replica.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/repository.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/status.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/task.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/upload.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/user.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/vulnerability_report.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/settings.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/analytics.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/datarepair.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/export.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/importer.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/migrate.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/orphan.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/purge.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/reclaim_space.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/replica.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/repository.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/telemetry.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/test.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/upload.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/vulnerability_report.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/templates/rest_framework/api.html +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/templatetags/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/templatetags/pulp_urls.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/urls.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/util.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/datarepair.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/importer.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/orphans.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/repair.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/status.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/access_policy.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/acs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/custom_filters.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/exporter.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/importer.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/openpgp.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/orphans.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/reclaim.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/replica.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/repository.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/task.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/upload.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/user.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/wsgi.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/backends.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/cache/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/cache/cache.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/constants.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/authentication.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/entrypoint.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/handler.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/instrumentation.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/factory.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/file.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/http.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/exceptions/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/exceptions/base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/exceptions/plugin.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/exceptions/validation.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/filters.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/metrics.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/middleware.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/migrations.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/openapi/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/openapi/hooks.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/access_policy.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/actions.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/apps.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/authentication/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/cache/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/constants.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/download/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/exceptions.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/files.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/find_url.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/importexport.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/migrations.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/modelresources.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/models/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/models/role.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/publication_utils.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/pulp_hashlib.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/replica.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/repo_version_utils.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/responses.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/serializers/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/serializers/content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/api.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/artifact_stages.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/content_stages.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/declarative_version.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/models.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/storage.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/sync.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/tasking.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/util.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/viewsets/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/viewsets/content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/pytest_plugin.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/responses.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/_util.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/entrypoint.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/kafka.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/redis_locks.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/redis_tasks.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/storage.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/tasks.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/worker.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_auth.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_filter.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_login.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_replication.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_repos.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_role.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_scoping.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_status.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_tasking.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_upload.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_v4_status.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_workers.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/assets/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/content_with_coverage.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/utils.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/performance/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/performance/test_performance.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/conftest.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/content/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/content/test_handler.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/content/test_heartbeat.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/download/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/metrics/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/metrics/conftest.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/migration/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_content.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_publication_retention.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_remote.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_repository.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_task.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/roles/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/roles/test_adjust_roles.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/roles/test_roles.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_user.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/stages/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/stages/test_resource_budget.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/stages/test_stages.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_cache.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_chunked_file.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_content_guard.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_files.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_import_checks.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_list_signing_services_command.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_middleware.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_settings.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_util.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_viewsets.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/dependency_links.txt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/entry_points.txt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/requires.txt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/top_level.txt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/setup.cfg +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/test_requirements.txt +0 -0
- {pulpcore-3.115.2 → pulpcore-3.115.4}/unittest_requirements.txt +0 -0
|
@@ -8,6 +8,56 @@
|
|
|
8
8
|
|
|
9
9
|
[//]: # (towncrier release notes start)
|
|
10
10
|
|
|
11
|
+
## 3.115.4 (2026-08-12) {: #3.115.4 }
|
|
12
|
+
|
|
13
|
+
### REST API {: #3.115.4-rest-api }
|
|
14
|
+
|
|
15
|
+
#### Bugfixes {: #3.115.4-rest-api-bugfix }
|
|
16
|
+
|
|
17
|
+
- Reduced lock contention for distribution updates that leave `base_path` unchanged.
|
|
18
|
+
[#3322](https://github.com/pulp/pulpcore/issues/3322),
|
|
19
|
+
[#7896](https://github.com/pulp/pulpcore/issues/7896)
|
|
20
|
+
- Fixed the `waiting_tasks` metric to count only tasks that can run in parallel under resource locks, matching worker FIFO scheduling.
|
|
21
|
+
[#7938](https://github.com/pulp/pulpcore/issues/7938)
|
|
22
|
+
- Fixed Redis workers polling the database at the single-worker rate during startup by learning the online worker count before the first heartbeat.
|
|
23
|
+
|
|
24
|
+
### Plugin API {: #3.115.4-plugin-api }
|
|
25
|
+
|
|
26
|
+
No significant changes.
|
|
27
|
+
|
|
28
|
+
### Pulp File {: #3.115.4-pulp-file }
|
|
29
|
+
|
|
30
|
+
No significant changes.
|
|
31
|
+
|
|
32
|
+
### Pulp Cert Guard {: #3.115.4-pulp-cert-guard }
|
|
33
|
+
|
|
34
|
+
No significant changes.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 3.115.3 (2026-07-28) {: #3.115.3 }
|
|
39
|
+
|
|
40
|
+
### REST API {: #3.115.3-rest-api }
|
|
41
|
+
|
|
42
|
+
#### Bugfixes {: #3.115.3-rest-api-bugfix }
|
|
43
|
+
|
|
44
|
+
- Fixed domain list returning all domains to authenticated users instead of only domains they can view.
|
|
45
|
+
[#7898](https://github.com/pulp/pulpcore/issues/7898)
|
|
46
|
+
|
|
47
|
+
### Plugin API {: #3.115.3-plugin-api }
|
|
48
|
+
|
|
49
|
+
No significant changes.
|
|
50
|
+
|
|
51
|
+
### Pulp File {: #3.115.3-pulp-file }
|
|
52
|
+
|
|
53
|
+
No significant changes.
|
|
54
|
+
|
|
55
|
+
### Pulp Cert Guard {: #3.115.3-pulp-cert-guard }
|
|
56
|
+
|
|
57
|
+
No significant changes.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
11
61
|
## 3.115.2 (2026-07-22) {: #3.115.2 }
|
|
12
62
|
|
|
13
63
|
### REST API {: #3.115.2-rest-api }
|
|
@@ -451,6 +451,14 @@ class AsyncReservedObjectMixin:
|
|
|
451
451
|
).format(self.__class__.__name__)
|
|
452
452
|
return [instance]
|
|
453
453
|
|
|
454
|
+
def async_shared_resources(self, instance, **kwargs):
|
|
455
|
+
"""
|
|
456
|
+
Return shared resources to reserve for the task created by the Async...Mixins.
|
|
457
|
+
|
|
458
|
+
This default implementation does not add any shared reservations.
|
|
459
|
+
"""
|
|
460
|
+
return []
|
|
461
|
+
|
|
454
462
|
|
|
455
463
|
class AsyncCreateMixin:
|
|
456
464
|
"""
|
|
@@ -472,6 +480,7 @@ class AsyncCreateMixin:
|
|
|
472
480
|
task = dispatch(
|
|
473
481
|
tasks.base.general_create,
|
|
474
482
|
exclusive_resources=self.async_reserved_resources(None),
|
|
483
|
+
shared_resources=self.async_shared_resources(None),
|
|
475
484
|
args=(app_label, serializer.__class__.__name__),
|
|
476
485
|
kwargs=task_kwargs,
|
|
477
486
|
)
|
|
@@ -506,6 +515,7 @@ class AsyncUpdateMixin(AsyncReservedObjectMixin):
|
|
|
506
515
|
task = dispatch(
|
|
507
516
|
tasks.base.ageneral_update,
|
|
508
517
|
exclusive_resources=self.async_reserved_resources(instance),
|
|
518
|
+
shared_resources=self.async_shared_resources(instance),
|
|
509
519
|
args=(pk, app_label, serializer.__class__.__name__),
|
|
510
520
|
kwargs=task_kwargs,
|
|
511
521
|
immediate=self.ALLOW_NON_BLOCKING_UPDATE,
|
|
@@ -542,6 +552,7 @@ class AsyncRemoveMixin(AsyncReservedObjectMixin):
|
|
|
542
552
|
task = dispatch(
|
|
543
553
|
tasks.base.ageneral_delete,
|
|
544
554
|
exclusive_resources=self.async_reserved_resources(instance),
|
|
555
|
+
shared_resources=self.async_shared_resources(instance),
|
|
545
556
|
args=(pk, app_label, serializer.__class__.__name__),
|
|
546
557
|
immediate=self.ALLOW_NON_BLOCKING_DELETE,
|
|
547
558
|
)
|
|
@@ -527,7 +527,31 @@ class BaseDistributionViewSet(NamedModelViewSet):
|
|
|
527
527
|
return qs
|
|
528
528
|
|
|
529
529
|
def async_reserved_resources(self, instance):
|
|
530
|
-
"""
|
|
530
|
+
"""
|
|
531
|
+
Reserve safe distribution locks for async operations.
|
|
532
|
+
|
|
533
|
+
The explicit distribution.base_path lock protects the domain-wide base_path invariant.
|
|
534
|
+
The older domain-scoped distributions lock remains shared so tasks queued before an upgrade
|
|
535
|
+
still overlap safely with new tasks.
|
|
536
|
+
"""
|
|
537
|
+
distribution_base_path = f"pdrn:{get_domain().pulp_id}:distribution.base_path"
|
|
538
|
+
if instance is None:
|
|
539
|
+
return [distribution_base_path]
|
|
540
|
+
|
|
541
|
+
if getattr(self, "action", "") == "destroy":
|
|
542
|
+
return [instance]
|
|
543
|
+
|
|
544
|
+
request_data = getattr(getattr(self, "request", None), "data", {})
|
|
545
|
+
requested_base_path = request_data.get("base_path", instance.base_path)
|
|
546
|
+
if requested_base_path == instance.base_path:
|
|
547
|
+
return [instance]
|
|
548
|
+
|
|
549
|
+
return [instance, distribution_base_path]
|
|
550
|
+
|
|
551
|
+
def async_shared_resources(self, instance):
|
|
552
|
+
"""
|
|
553
|
+
Keep the legacy domain-scoped distribution lock shared for upgrade compatibility.
|
|
554
|
+
"""
|
|
531
555
|
return [f"pdrn:{get_domain().pulp_id}:distributions"]
|
|
532
556
|
|
|
533
557
|
|
|
@@ -567,9 +591,9 @@ class DistributionViewSet(
|
|
|
567
591
|
LabelsMixin,
|
|
568
592
|
):
|
|
569
593
|
"""
|
|
570
|
-
Provides read and list methods
|
|
571
|
-
|
|
572
|
-
|
|
594
|
+
Provides read and list methods plus asynchronous CUD methods that reserve per-distribution
|
|
595
|
+
locks, an explicit base_path lock when needed, and the legacy domain-wide distributions lock in
|
|
596
|
+
shared mode for upgrade compatibility.
|
|
573
597
|
"""
|
|
574
598
|
|
|
575
599
|
|
|
@@ -93,6 +93,57 @@ def exclusive(lock):
|
|
|
93
93
|
return _decorator
|
|
94
94
|
|
|
95
95
|
|
|
96
|
+
def count_waiting_tasks_for_metric():
|
|
97
|
+
"""
|
|
98
|
+
Count WAITING/RUNNING tasks older than five seconds that can run at the same
|
|
99
|
+
time given exclusive/shared resource reservations (FIFO-aware).
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
int: Parallelizable unfinished-task count. Callers subtract online workers
|
|
103
|
+
when publishing the OpenTelemetry `waiting_tasks` gauge.
|
|
104
|
+
"""
|
|
105
|
+
cutoff_time = timezone.now() - timedelta(seconds=5)
|
|
106
|
+
|
|
107
|
+
incomplete_tasks = (
|
|
108
|
+
Task.objects.filter(
|
|
109
|
+
state__in=[TASK_STATES.RUNNING, TASK_STATES.WAITING],
|
|
110
|
+
pulp_created__lt=cutoff_time,
|
|
111
|
+
)
|
|
112
|
+
.order_by("pulp_created")
|
|
113
|
+
.only("reserved_resources_record")
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
taken_exclusive = set()
|
|
117
|
+
taken_shared = set()
|
|
118
|
+
parallel_count = 0
|
|
119
|
+
|
|
120
|
+
for task in incomplete_tasks:
|
|
121
|
+
exclusive_resources, shared_resources = extract_task_resources(task)
|
|
122
|
+
conflicts = False
|
|
123
|
+
|
|
124
|
+
for resource in exclusive_resources:
|
|
125
|
+
if resource in taken_exclusive or resource in taken_shared:
|
|
126
|
+
conflicts = True
|
|
127
|
+
break
|
|
128
|
+
|
|
129
|
+
if not conflicts:
|
|
130
|
+
for resource in shared_resources:
|
|
131
|
+
if resource in taken_exclusive:
|
|
132
|
+
conflicts = True
|
|
133
|
+
break
|
|
134
|
+
|
|
135
|
+
# Always reserve (even on conflict) so FIFO can't be bypassed; see fetch_task.
|
|
136
|
+
# e.g. T1(A,B), T2(B,C), T3(C): without reserving C for T2, T3 counts as +1.
|
|
137
|
+
taken_exclusive.update(exclusive_resources)
|
|
138
|
+
taken_shared.update(shared_resources)
|
|
139
|
+
if conflicts:
|
|
140
|
+
continue
|
|
141
|
+
|
|
142
|
+
parallel_count += 1
|
|
143
|
+
|
|
144
|
+
return parallel_count
|
|
145
|
+
|
|
146
|
+
|
|
96
147
|
class RedisWorker:
|
|
97
148
|
"""
|
|
98
149
|
Worker implementation using Redis distributed lock-based resource acquisition.
|
|
@@ -133,8 +184,10 @@ class RedisWorker:
|
|
|
133
184
|
# Metric recording interval
|
|
134
185
|
self.metric_heartbeat_countdown = METRIC_HEARTBEAT_INTERVAL
|
|
135
186
|
|
|
136
|
-
# Cache worker count for sleep calculation
|
|
137
|
-
|
|
187
|
+
# Cache worker count for sleep calculation. Learn the real fleet size at
|
|
188
|
+
# startup so new workers do not poll at the single-worker rate until the
|
|
189
|
+
# first heartbeat (~WORKER_TTL/3). Refreshed on each heartbeat in beat().
|
|
190
|
+
self.num_workers = max(1, AppStatus.objects.online().filter(app_type="worker").count())
|
|
138
191
|
|
|
139
192
|
# Redis connection for distributed locks
|
|
140
193
|
self.redis_conn = get_redis_connection()
|
|
@@ -157,7 +210,10 @@ class RedisWorker:
|
|
|
157
210
|
|
|
158
211
|
startup_hook()
|
|
159
212
|
|
|
160
|
-
_logger.info(
|
|
213
|
+
_logger.info(
|
|
214
|
+
"Initialized RedisWorker with Redis lock-based algorithm (online workers=%d)",
|
|
215
|
+
self.num_workers,
|
|
216
|
+
)
|
|
161
217
|
|
|
162
218
|
def _init_instrumentation(self):
|
|
163
219
|
"""Initialize OpenTelemetry instrumentation if enabled."""
|
|
@@ -210,7 +266,11 @@ class RedisWorker:
|
|
|
210
266
|
self.app_status.save_heartbeat()
|
|
211
267
|
_logger.debug(msg)
|
|
212
268
|
except (IntegrityError, DatabaseError):
|
|
213
|
-
_logger.error(
|
|
269
|
+
_logger.error(
|
|
270
|
+
"Updating the heartbeat of worker %s failed.",
|
|
271
|
+
self.name,
|
|
272
|
+
exc_info=True,
|
|
273
|
+
)
|
|
214
274
|
self.shutdown_requested = True
|
|
215
275
|
|
|
216
276
|
def handle_redis_heartbeat(self):
|
|
@@ -322,19 +382,10 @@ class RedisWorker:
|
|
|
322
382
|
"""
|
|
323
383
|
Record metrics for waiting tasks in the queue.
|
|
324
384
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
number of tasks waiting to be picked up by workers.
|
|
385
|
+
Publishes `count_waiting_tasks_for_metric() - num_workers` as the
|
|
386
|
+
OpenTelemetry `waiting_tasks` gauge.
|
|
328
387
|
"""
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
task_count = Task.objects.filter(
|
|
332
|
-
state__in=[TASK_STATES.RUNNING, TASK_STATES.WAITING], pulp_created__lt=cutoff_time
|
|
333
|
-
).count()
|
|
334
|
-
|
|
335
|
-
waiting_tasks = task_count - self.num_workers
|
|
336
|
-
|
|
337
|
-
self.waiting_tasks_meter.set(waiting_tasks)
|
|
388
|
+
self.waiting_tasks_meter.set(count_waiting_tasks_for_metric() - self.num_workers)
|
|
338
389
|
|
|
339
390
|
def beat(self):
|
|
340
391
|
"""Periodic worker maintenance tasks (heartbeat, cleanup, etc.)."""
|
|
@@ -363,7 +414,7 @@ class RedisWorker:
|
|
|
363
414
|
self.record_waiting_tasks_metric()
|
|
364
415
|
|
|
365
416
|
# Update cached worker count for sleep calculation
|
|
366
|
-
self.num_workers = AppStatus.objects.online().filter(app_type="worker").count()
|
|
417
|
+
self.num_workers = max(1, AppStatus.objects.online().filter(app_type="worker").count())
|
|
367
418
|
|
|
368
419
|
def _maybe_release_locks(self, task, mark_released=True):
|
|
369
420
|
"""
|
|
@@ -360,3 +360,41 @@ def test_set_label_on_domain(pulpcore_bindings, domain_factory, gen_user):
|
|
|
360
360
|
response = pulpcore_bindings.DomainsApi.unset_label(domain.pulp_href, {"key": "abc"})
|
|
361
361
|
assert response.key == "abc"
|
|
362
362
|
assert response.value == "def"
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
@pytest.mark.parallel
|
|
366
|
+
def test_domain_list_queryset_scoping(pulpcore_bindings, gen_user, gen_object_with_cleanup):
|
|
367
|
+
"""Test that domain list is scoped to domains the user can view."""
|
|
368
|
+
body = {
|
|
369
|
+
"name": str(uuid.uuid4()),
|
|
370
|
+
"storage_class": "pulpcore.app.models.storage.FileSystem",
|
|
371
|
+
"storage_settings": {"MEDIA_ROOT": ""},
|
|
372
|
+
}
|
|
373
|
+
domain = gen_object_with_cleanup(pulpcore_bindings.DomainsApi, body)
|
|
374
|
+
gen_object_with_cleanup(pulpcore_bindings.DomainsApi, {**body, "name": str(uuid.uuid4())})
|
|
375
|
+
|
|
376
|
+
# Authenticated users without view_domain see no domains
|
|
377
|
+
with gen_user():
|
|
378
|
+
assert pulpcore_bindings.DomainsApi.list().count == 0
|
|
379
|
+
|
|
380
|
+
# Object-level domain_viewer can see only that domain
|
|
381
|
+
with gen_user(object_roles=[("core.domain_viewer", domain.pulp_href)]):
|
|
382
|
+
domains = pulpcore_bindings.DomainsApi.list()
|
|
383
|
+
assert domains.count == 1
|
|
384
|
+
assert domains.results[0].pulp_href == domain.pulp_href
|
|
385
|
+
|
|
386
|
+
# Object-level domain_owner can see only that domain
|
|
387
|
+
with gen_user(object_roles=[("core.domain_owner", domain.pulp_href)]):
|
|
388
|
+
domains = pulpcore_bindings.DomainsApi.list()
|
|
389
|
+
assert domains.count == 1
|
|
390
|
+
assert domains.results[0].pulp_href == domain.pulp_href
|
|
391
|
+
|
|
392
|
+
# Domain creator sees domains they create (via creation_hooks), not others
|
|
393
|
+
creator = gen_user(model_roles=["core.domain_creator"])
|
|
394
|
+
with creator:
|
|
395
|
+
created = gen_object_with_cleanup(
|
|
396
|
+
pulpcore_bindings.DomainsApi, {**body, "name": str(uuid.uuid4())}
|
|
397
|
+
)
|
|
398
|
+
domains = pulpcore_bindings.DomainsApi.list()
|
|
399
|
+
assert domains.count == 1
|
|
400
|
+
assert domains.results[0].pulp_href == created.pulp_href
|
|
@@ -167,6 +167,81 @@ def test_distribution_base_path(
|
|
|
167
167
|
assert json.loads(exc.value.body)["base_path"] is not None
|
|
168
168
|
|
|
169
169
|
|
|
170
|
+
@pytest.mark.parallel
|
|
171
|
+
def test_distribution_update_task_reservations(
|
|
172
|
+
file_bindings,
|
|
173
|
+
monitor_task,
|
|
174
|
+
):
|
|
175
|
+
def has_shared_distributions_lock(task):
|
|
176
|
+
return any(
|
|
177
|
+
resource.startswith("shared:") and resource.endswith(":distributions")
|
|
178
|
+
for resource in task.reserved_resources_record
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
def has_exclusive_distributions_lock(task):
|
|
182
|
+
return any(
|
|
183
|
+
not resource.startswith("shared:") and resource.endswith(":distributions")
|
|
184
|
+
for resource in task.reserved_resources_record
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def has_base_path_lock(task):
|
|
188
|
+
return any(
|
|
189
|
+
not resource.startswith("shared:") and resource.endswith(":distribution.base_path")
|
|
190
|
+
for resource in task.reserved_resources_record
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
create_task = monitor_task(
|
|
194
|
+
file_bindings.DistributionsFileApi.create(
|
|
195
|
+
{"name": str(uuid4()), "base_path": str(uuid4())}
|
|
196
|
+
).task
|
|
197
|
+
)
|
|
198
|
+
assert has_base_path_lock(create_task)
|
|
199
|
+
assert has_shared_distributions_lock(create_task)
|
|
200
|
+
assert not has_exclusive_distributions_lock(create_task)
|
|
201
|
+
distribution = file_bindings.DistributionsFileApi.read(create_task.created_resources[0])
|
|
202
|
+
assert distribution.prn not in create_task.reserved_resources_record
|
|
203
|
+
|
|
204
|
+
no_base_path_update_task = monitor_task(
|
|
205
|
+
file_bindings.DistributionsFileApi.partial_update(
|
|
206
|
+
distribution.pulp_href,
|
|
207
|
+
{"name": str(uuid4())},
|
|
208
|
+
).task
|
|
209
|
+
)
|
|
210
|
+
assert distribution.prn in no_base_path_update_task.reserved_resources_record
|
|
211
|
+
assert not has_base_path_lock(no_base_path_update_task)
|
|
212
|
+
assert has_shared_distributions_lock(no_base_path_update_task)
|
|
213
|
+
assert not has_exclusive_distributions_lock(no_base_path_update_task)
|
|
214
|
+
|
|
215
|
+
unchanged_base_path_update_task = monitor_task(
|
|
216
|
+
file_bindings.DistributionsFileApi.partial_update(
|
|
217
|
+
distribution.pulp_href,
|
|
218
|
+
{"name": str(uuid4()), "base_path": distribution.base_path},
|
|
219
|
+
).task
|
|
220
|
+
)
|
|
221
|
+
assert distribution.prn in unchanged_base_path_update_task.reserved_resources_record
|
|
222
|
+
assert not has_base_path_lock(unchanged_base_path_update_task)
|
|
223
|
+
assert has_shared_distributions_lock(unchanged_base_path_update_task)
|
|
224
|
+
assert not has_exclusive_distributions_lock(unchanged_base_path_update_task)
|
|
225
|
+
|
|
226
|
+
base_path_update_task = monitor_task(
|
|
227
|
+
file_bindings.DistributionsFileApi.partial_update(
|
|
228
|
+
distribution.pulp_href, {"base_path": str(uuid4())}
|
|
229
|
+
).task
|
|
230
|
+
)
|
|
231
|
+
assert distribution.prn in base_path_update_task.reserved_resources_record
|
|
232
|
+
assert has_base_path_lock(base_path_update_task)
|
|
233
|
+
assert has_shared_distributions_lock(base_path_update_task)
|
|
234
|
+
assert not has_exclusive_distributions_lock(base_path_update_task)
|
|
235
|
+
|
|
236
|
+
delete_task = monitor_task(
|
|
237
|
+
file_bindings.DistributionsFileApi.delete(distribution.pulp_href).task
|
|
238
|
+
)
|
|
239
|
+
assert distribution.prn in delete_task.reserved_resources_record
|
|
240
|
+
assert not has_base_path_lock(delete_task)
|
|
241
|
+
assert has_shared_distributions_lock(delete_task)
|
|
242
|
+
assert not has_exclusive_distributions_lock(delete_task)
|
|
243
|
+
|
|
244
|
+
|
|
170
245
|
@pytest.mark.parallel
|
|
171
246
|
def test_distribution_filtering(
|
|
172
247
|
file_bindings,
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
from datetime import timedelta
|
|
2
|
+
from uuid import uuid4
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
from django.utils import timezone
|
|
6
|
+
|
|
7
|
+
from pulpcore.app.models import Task
|
|
8
|
+
from pulpcore.constants import TASK_STATES
|
|
9
|
+
from pulpcore.tasking.redis_worker import count_waiting_tasks_for_metric
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@pytest.fixture
|
|
13
|
+
def frozen_clock(monkeypatch):
|
|
14
|
+
"""Move timezone.now() forward so freshly inserted tasks pass the 5s age cutoff.
|
|
15
|
+
|
|
16
|
+
Task.pulp_created is set by a DB trigger (clock_timestamp) and cannot be updated,
|
|
17
|
+
so tests age tasks by advancing the metric's cutoff clock instead.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
class _Clock:
|
|
21
|
+
def __init__(self):
|
|
22
|
+
self.now = timezone.now()
|
|
23
|
+
|
|
24
|
+
def __call__(self):
|
|
25
|
+
return self.now
|
|
26
|
+
|
|
27
|
+
def advance(self, seconds):
|
|
28
|
+
self.now += timedelta(seconds=seconds)
|
|
29
|
+
|
|
30
|
+
clock = _Clock()
|
|
31
|
+
monkeypatch.setattr(timezone, "now", clock)
|
|
32
|
+
return clock
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _create_task(*, state, resources=None, name="test.waiting_tasks_metric"):
|
|
36
|
+
return Task.objects.create(
|
|
37
|
+
name=name,
|
|
38
|
+
state=state,
|
|
39
|
+
logging_cid="",
|
|
40
|
+
reserved_resources_record=resources,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@pytest.mark.django_db
|
|
45
|
+
def test_waiting_tasks_metric_resource_contention(frozen_clock):
|
|
46
|
+
"""Exclusive holder + exclusive/shared waiters on same resource → count 1."""
|
|
47
|
+
exclusive_resource = str(uuid4())
|
|
48
|
+
|
|
49
|
+
_create_task(state=TASK_STATES.RUNNING, resources=[exclusive_resource])
|
|
50
|
+
for _ in range(5):
|
|
51
|
+
_create_task(state=TASK_STATES.WAITING, resources=[exclusive_resource])
|
|
52
|
+
for _ in range(5):
|
|
53
|
+
_create_task(
|
|
54
|
+
state=TASK_STATES.WAITING,
|
|
55
|
+
resources=[f"shared:{exclusive_resource}"],
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
frozen_clock.advance(6)
|
|
59
|
+
assert count_waiting_tasks_for_metric() == 1
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@pytest.mark.django_db
|
|
63
|
+
def test_waiting_tasks_metric_two_exclusive_lanes(frozen_clock):
|
|
64
|
+
"""Two independent exclusive lanes with waiters → count 2."""
|
|
65
|
+
resource_a = str(uuid4())
|
|
66
|
+
resource_b = str(uuid4())
|
|
67
|
+
|
|
68
|
+
_create_task(state=TASK_STATES.RUNNING, resources=[resource_a])
|
|
69
|
+
for _ in range(5):
|
|
70
|
+
_create_task(state=TASK_STATES.WAITING, resources=[resource_a])
|
|
71
|
+
|
|
72
|
+
_create_task(state=TASK_STATES.WAITING, resources=[resource_b])
|
|
73
|
+
for _ in range(5):
|
|
74
|
+
_create_task(state=TASK_STATES.WAITING, resources=[resource_b])
|
|
75
|
+
|
|
76
|
+
frozen_clock.advance(6)
|
|
77
|
+
assert count_waiting_tasks_for_metric() == 2
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@pytest.mark.django_db
|
|
81
|
+
def test_waiting_tasks_metric_shared_resources_can_run_together(frozen_clock):
|
|
82
|
+
"""N shared-only tasks on same resource → count N (not 1)."""
|
|
83
|
+
shared_resource = str(uuid4())
|
|
84
|
+
shared_task_count = 5
|
|
85
|
+
|
|
86
|
+
for _ in range(shared_task_count):
|
|
87
|
+
_create_task(
|
|
88
|
+
state=TASK_STATES.WAITING,
|
|
89
|
+
resources=[f"shared:{shared_resource}"],
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
frozen_clock.advance(6)
|
|
93
|
+
assert count_waiting_tasks_for_metric() == shared_task_count
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@pytest.mark.django_db
|
|
97
|
+
def test_waiting_tasks_metric_fifo_blocks_indirect_resources(frozen_clock):
|
|
98
|
+
"""T1(A,B) running, T2(B,C) and T3(C) waiting → count 1 (FIFO), not 2."""
|
|
99
|
+
resource_a = str(uuid4())
|
|
100
|
+
resource_b = str(uuid4())
|
|
101
|
+
resource_c = str(uuid4())
|
|
102
|
+
|
|
103
|
+
# Insert order sets pulp_created via clock_timestamp(); keep create order FIFO.
|
|
104
|
+
_create_task(state=TASK_STATES.RUNNING, resources=[resource_a, resource_b])
|
|
105
|
+
_create_task(state=TASK_STATES.WAITING, resources=[resource_b, resource_c])
|
|
106
|
+
_create_task(state=TASK_STATES.WAITING, resources=[resource_c])
|
|
107
|
+
|
|
108
|
+
frozen_clock.advance(6)
|
|
109
|
+
assert count_waiting_tasks_for_metric() == 1
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@pytest.mark.django_db
|
|
113
|
+
def test_waiting_tasks_metric_ignores_young_tasks(frozen_clock):
|
|
114
|
+
"""Tasks newer than the five-second cutoff are not counted."""
|
|
115
|
+
resource = str(uuid4())
|
|
116
|
+
|
|
117
|
+
_create_task(state=TASK_STATES.WAITING, resources=[resource])
|
|
118
|
+
frozen_clock.advance(1)
|
|
119
|
+
|
|
120
|
+
assert count_waiting_tasks_for_metric() == 0
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
@pytest.mark.django_db
|
|
124
|
+
def test_waiting_tasks_metric_ignores_finished_tasks(frozen_clock):
|
|
125
|
+
"""Completed/canceled/failed tasks do not contribute to the count."""
|
|
126
|
+
resource = str(uuid4())
|
|
127
|
+
|
|
128
|
+
for state in (TASK_STATES.COMPLETED, TASK_STATES.CANCELED, TASK_STATES.FAILED):
|
|
129
|
+
_create_task(state=state, resources=[resource])
|
|
130
|
+
|
|
131
|
+
frozen_clock.advance(6)
|
|
132
|
+
assert count_waiting_tasks_for_metric() == 0
|
|
@@ -499,5 +499,6 @@ pulpcore/tests/unit/stages/__init__.py
|
|
|
499
499
|
pulpcore/tests/unit/stages/test_artifactdownloader.py
|
|
500
500
|
pulpcore/tests/unit/stages/test_resource_budget.py
|
|
501
501
|
pulpcore/tests/unit/stages/test_stages.py
|
|
502
|
+
pulpcore/tests/unit/tasking/test_waiting_tasks_metric.py
|
|
502
503
|
pulpcore/tests/unit/viewsets/__init__.py
|
|
503
504
|
pulpcore/tests/unit/viewsets/test_viewset_base.py
|
|
@@ -7,7 +7,7 @@ build-backend = 'setuptools.build_meta'
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "pulpcore"
|
|
10
|
-
version = "3.115.
|
|
10
|
+
version = "3.115.4"
|
|
11
11
|
description = "Pulp Django Application and Related Modules"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
authors = [
|
|
@@ -207,7 +207,7 @@ ignore = [
|
|
|
207
207
|
[tool.bumpversion]
|
|
208
208
|
# This section is managed by the plugin template. Do not edit manually.
|
|
209
209
|
|
|
210
|
-
current_version = "3.115.
|
|
210
|
+
current_version = "3.115.4"
|
|
211
211
|
commit = false
|
|
212
212
|
tag = false
|
|
213
213
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<alpha>0a)?(?P<patch>\\d+)(\\.(?P<release>[a-z]+))?"
|
|
@@ -278,6 +278,7 @@ extend-exclude = [
|
|
|
278
278
|
|
|
279
279
|
[tool.ruff.lint]
|
|
280
280
|
# This section is managed by the plugin template. Do not edit manually.
|
|
281
|
+
select = ["E4", "E7", "E9", "F"]
|
|
281
282
|
extend-select = [
|
|
282
283
|
"I",
|
|
283
284
|
"INT",
|
|
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
|
|
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
|