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.
Files changed (506) hide show
  1. {pulpcore-3.115.2 → pulpcore-3.115.4}/CHANGES.md +50 -0
  2. {pulpcore-3.115.2 → pulpcore-3.115.4}/PKG-INFO +1 -1
  3. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/__init__.py +1 -1
  4. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/__init__.py +1 -1
  5. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/apps.py +1 -1
  6. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/base.py +11 -0
  7. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/domain.py +1 -0
  8. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/publication.py +28 -4
  9. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/redis_worker.py +68 -17
  10. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_crud_domains.py +38 -0
  11. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +75 -0
  12. pulpcore-3.115.4/pulpcore/tests/unit/tasking/test_waiting_tasks_metric.py +132 -0
  13. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/PKG-INFO +1 -1
  14. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/SOURCES.txt +1 -0
  15. {pulpcore-3.115.2 → pulpcore-3.115.4}/pyproject.toml +3 -2
  16. {pulpcore-3.115.2 → pulpcore-3.115.4}/CODE_OF_CONDUCT.md +0 -0
  17. {pulpcore-3.115.2 → pulpcore-3.115.4}/COMMITMENT +0 -0
  18. {pulpcore-3.115.2 → pulpcore-3.115.4}/CONTRIBUTING.md +0 -0
  19. {pulpcore-3.115.2 → pulpcore-3.115.4}/COPYRIGHT +0 -0
  20. {pulpcore-3.115.2 → pulpcore-3.115.4}/LICENSE +0 -0
  21. {pulpcore-3.115.2 → pulpcore-3.115.4}/MANIFEST.in +0 -0
  22. {pulpcore-3.115.2 → pulpcore-3.115.4}/README.md +0 -0
  23. {pulpcore-3.115.2 → pulpcore-3.115.4}/ci_requirements.txt +0 -0
  24. {pulpcore-3.115.2 → pulpcore-3.115.4}/functest_requirements.txt +0 -0
  25. {pulpcore-3.115.2 → pulpcore-3.115.4}/manage.py +0 -0
  26. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/__init__.py +0 -0
  27. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/migrations/0001_initial.py +0 -0
  28. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
  29. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/migrations/__init__.py +0 -0
  30. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/models.py +0 -0
  31. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/serializers.py +0 -0
  32. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/app/viewsets.py +0 -0
  33. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/pytest_plugin.py +0 -0
  34. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/rhsm/__init__.py +0 -0
  35. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
  36. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/__init__.py +0 -0
  37. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/__init__.py +0 -0
  38. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/api/__init__.py +0 -0
  39. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
  40. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
  41. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
  42. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
  43. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
  44. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
  45. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
  46. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
  47. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
  48. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
  49. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
  50. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
  51. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
  52. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
  53. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
  54. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
  55. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
  56. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
  57. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
  58. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
  59. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
  60. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
  61. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
  62. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
  63. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
  64. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
  65. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
  66. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
  67. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
  68. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
  69. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
  70. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/conftest.py +0 -0
  71. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/functional/constants.py +0 -0
  72. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/unit/__init__.py +0 -0
  73. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/unit/certdata.py +0 -0
  74. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
  75. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/__init__.py +0 -0
  76. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
  77. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
  78. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0018_alter_filecontent_options.py +0 -0
  79. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0019_add_filegitremote.py +0 -0
  80. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/0020_filerepository_last_sync_details.py +0 -0
  81. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/migrations/__init__.py +0 -0
  82. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/modelresource.py +0 -0
  83. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/models.py +0 -0
  84. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/replica.py +0 -0
  85. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/serializers.py +0 -0
  86. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/settings.py +0 -0
  87. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/tasks/__init__.py +0 -0
  88. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/tasks/publishing.py +0 -0
  89. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/tasks/synchronizing.py +0 -0
  90. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/app/viewsets.py +0 -0
  91. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/manifest.py +0 -0
  92. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/pytest_plugin.py +0 -0
  93. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/__init__.py +0 -0
  94. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/__init__.py +0 -0
  95. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/__init__.py +0 -0
  96. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_acs.py +0 -0
  97. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
  98. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
  99. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
  100. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
  101. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
  102. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_distributed_publication.py +0 -0
  103. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_domains.py +0 -0
  104. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
  105. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_filesystem_export.py +0 -0
  106. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
  107. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_git_sync.py +0 -0
  108. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_labels.py +0 -0
  109. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
  110. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_overwrite_content.py +0 -0
  111. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_publish.py +0 -0
  112. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
  113. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_rbac.py +0 -0
  114. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
  115. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_sync.py +0 -0
  116. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/functional/api/test_sync_optimization.py +0 -0
  117. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/__init__.py +0 -0
  118. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/test_git_sync.py +0 -0
  119. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/test_safe_paths.py +0 -0
  120. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/test_serializers.py +0 -0
  121. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulp_file/tests/unit/test_sync_optimization.py +0 -0
  122. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/__init__.py +0 -0
  123. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/__init__.py +0 -0
  124. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/access_policy.py +0 -0
  125. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/authentication.py +0 -0
  126. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/checks.py +0 -0
  127. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/contexts.py +0 -0
  128. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/entrypoint.py +0 -0
  129. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/files.py +0 -0
  130. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/find_url.py +0 -0
  131. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/global_access_conditions.py +0 -0
  132. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/importexport.py +0 -0
  133. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/loggers.py +0 -0
  134. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/manage.py +0 -0
  135. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/__init__.py +0 -0
  136. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/__init__.py +0 -0
  137. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/add-signing-service.py +0 -0
  138. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/analyze-publication.py +0 -0
  139. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
  140. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
  141. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/datarepair.py +0 -0
  142. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/dump-permissions.py +0 -0
  143. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
  144. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
  145. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/list-signing-services.py +0 -0
  146. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/migrationstat.py +0 -0
  147. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/openapi.py +0 -0
  148. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/optimizemigration.py +0 -0
  149. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
  150. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/remove-plugin.py +0 -0
  151. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
  152. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/repository-size.py +0 -0
  153. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
  154. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
  155. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/management/commands/shell.py +0 -0
  156. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
  157. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0091_systemid.py +0 -0
  158. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
  159. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
  160. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
  161. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
  162. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
  163. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
  164. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
  165. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0099_versions_field.py +0 -0
  166. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
  167. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0101_add_domain.py +0 -0
  168. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
  169. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
  170. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0104_delete_label.py +0 -0
  171. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
  172. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
  173. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
  174. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0108_task_versions.py +0 -0
  175. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
  176. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
  177. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
  178. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
  179. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
  180. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
  181. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
  182. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
  183. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
  184. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
  185. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
  186. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
  187. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
  188. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
  189. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
  190. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
  191. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
  192. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
  193. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
  194. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
  195. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
  196. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
  197. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
  198. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
  199. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
  200. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
  201. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
  202. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
  203. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
  204. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0137_appstatus.py +0 -0
  205. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
  206. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0139_task_app_lock.py +0 -0
  207. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0140_require_appstatus_zdu.py +0 -0
  208. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0141_alter_appstatus_name.py +0 -0
  209. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0142_task_result.py +0 -0
  210. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0143_require_app_lock_zdu.py +0 -0
  211. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0144_delete_old_appstatus.py +0 -0
  212. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0145_domainize_import_export.py +0 -0
  213. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0146_repository_retain_checkpoints.py +0 -0
  214. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0147_content_pulp_labels_gin.py +0 -0
  215. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0148_artifact_artifact_domain_size_index.py +0 -0
  216. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0149_distributedpublication.py +0 -0
  217. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0150_taskschedule_task_kwargs.py +0 -0
  218. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0151_upstreampulp_connect_timeout_and_more.py +0 -0
  219. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0152_alter_repositoryversion_content_ids.py +0 -0
  220. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0153_taskschedule_pulp_domain_alter_taskschedule_name_and_more.py +0 -0
  221. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/0154_task_api_version.py +0 -0
  222. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/migrations/__init__.py +0 -0
  223. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/mime_types.py +0 -0
  224. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/modelresource.py +0 -0
  225. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/__init__.py +0 -0
  226. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/access_policy.py +0 -0
  227. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/acs.py +0 -0
  228. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/analytics.py +0 -0
  229. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/base.py +0 -0
  230. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/content.py +0 -0
  231. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/domain.py +0 -0
  232. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/exporter.py +0 -0
  233. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/fields.py +0 -0
  234. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/generic.py +0 -0
  235. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/importer.py +0 -0
  236. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/openpgp.py +0 -0
  237. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/progress.py +0 -0
  238. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/publication.py +0 -0
  239. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/replica.py +0 -0
  240. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/repository.py +0 -0
  241. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/role.py +0 -0
  242. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/status.py +0 -0
  243. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/storage.py +0 -0
  244. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/task.py +0 -0
  245. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/upload.py +0 -0
  246. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/models/vulnerability_report.py +0 -0
  247. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/netutil.py +0 -0
  248. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/openpgp.py +0 -0
  249. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/protobuf/__init__.py +0 -0
  250. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
  251. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/pulp_hashlib.py +0 -0
  252. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
  253. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/redis_connection.py +0 -0
  254. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/replica.py +0 -0
  255. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/response.py +0 -0
  256. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/role_util.py +0 -0
  257. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/__init__.py +0 -0
  258. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/access_policy.py +0 -0
  259. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/acs.py +0 -0
  260. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/base.py +0 -0
  261. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/content.py +0 -0
  262. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/domain.py +0 -0
  263. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/exporter.py +0 -0
  264. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/fields.py +0 -0
  265. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/importer.py +0 -0
  266. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/openpgp.py +0 -0
  267. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/orphans.py +0 -0
  268. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/progress.py +0 -0
  269. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/publication.py +0 -0
  270. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/purge.py +0 -0
  271. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/reclaim.py +0 -0
  272. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/repair.py +0 -0
  273. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/replica.py +0 -0
  274. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/repository.py +0 -0
  275. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/status.py +0 -0
  276. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/task.py +0 -0
  277. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/upload.py +0 -0
  278. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/user.py +0 -0
  279. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/serializers/vulnerability_report.py +0 -0
  280. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/settings.py +0 -0
  281. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/__init__.py +0 -0
  282. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/analytics.py +0 -0
  283. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/base.py +0 -0
  284. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/datarepair.py +0 -0
  285. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/export.py +0 -0
  286. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/importer.py +0 -0
  287. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/migrate.py +0 -0
  288. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/orphan.py +0 -0
  289. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/purge.py +0 -0
  290. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/reclaim_space.py +0 -0
  291. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/replica.py +0 -0
  292. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/repository.py +0 -0
  293. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/telemetry.py +0 -0
  294. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/test.py +0 -0
  295. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/upload.py +0 -0
  296. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/tasks/vulnerability_report.py +0 -0
  297. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/templates/rest_framework/api.html +0 -0
  298. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/templatetags/__init__.py +0 -0
  299. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/templatetags/pulp_urls.py +0 -0
  300. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/urls.py +0 -0
  301. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/util.py +0 -0
  302. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/__init__.py +0 -0
  303. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/datarepair.py +0 -0
  304. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/importer.py +0 -0
  305. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/orphans.py +0 -0
  306. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/repair.py +0 -0
  307. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/views/status.py +0 -0
  308. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/__init__.py +0 -0
  309. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/access_policy.py +0 -0
  310. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/acs.py +0 -0
  311. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/content.py +0 -0
  312. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/custom_filters.py +0 -0
  313. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/exporter.py +0 -0
  314. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/importer.py +0 -0
  315. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/openpgp.py +0 -0
  316. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/orphans.py +0 -0
  317. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/reclaim.py +0 -0
  318. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/replica.py +0 -0
  319. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/repository.py +0 -0
  320. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/task.py +0 -0
  321. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/upload.py +0 -0
  322. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/user.py +0 -0
  323. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
  324. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/app/wsgi.py +0 -0
  325. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/backends.py +0 -0
  326. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/cache/__init__.py +0 -0
  327. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/cache/cache.py +0 -0
  328. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/constants.py +0 -0
  329. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/__init__.py +0 -0
  330. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/authentication.py +0 -0
  331. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/entrypoint.py +0 -0
  332. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/handler.py +0 -0
  333. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/content/instrumentation.py +0 -0
  334. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/__init__.py +0 -0
  335. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/base.py +0 -0
  336. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/factory.py +0 -0
  337. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/file.py +0 -0
  338. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/download/http.py +0 -0
  339. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/exceptions/__init__.py +0 -0
  340. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/exceptions/base.py +0 -0
  341. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/exceptions/plugin.py +0 -0
  342. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/exceptions/validation.py +0 -0
  343. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/filters.py +0 -0
  344. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/metrics.py +0 -0
  345. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/middleware.py +0 -0
  346. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/migrations.py +0 -0
  347. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/openapi/__init__.py +0 -0
  348. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/openapi/hooks.py +0 -0
  349. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/__init__.py +0 -0
  350. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/access_policy.py +0 -0
  351. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/actions.py +0 -0
  352. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/apps.py +0 -0
  353. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/authentication/__init__.py +0 -0
  354. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/cache/__init__.py +0 -0
  355. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/constants.py +0 -0
  356. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/content.py +0 -0
  357. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/download/__init__.py +0 -0
  358. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/exceptions.py +0 -0
  359. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/files.py +0 -0
  360. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/find_url.py +0 -0
  361. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/importexport.py +0 -0
  362. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/migrations.py +0 -0
  363. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/modelresources.py +0 -0
  364. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/models/__init__.py +0 -0
  365. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/models/role.py +0 -0
  366. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/publication_utils.py +0 -0
  367. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/pulp_hashlib.py +0 -0
  368. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/replica.py +0 -0
  369. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/repo_version_utils.py +0 -0
  370. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/responses.py +0 -0
  371. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/serializers/__init__.py +0 -0
  372. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/serializers/content.py +0 -0
  373. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/__init__.py +0 -0
  374. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/api.py +0 -0
  375. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/artifact_stages.py +0 -0
  376. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/content_stages.py +0 -0
  377. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/declarative_version.py +0 -0
  378. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/stages/models.py +0 -0
  379. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/storage.py +0 -0
  380. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/sync.py +0 -0
  381. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/tasking.py +0 -0
  382. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/util.py +0 -0
  383. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/viewsets/__init__.py +0 -0
  384. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/plugin/viewsets/content.py +0 -0
  385. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/pytest_plugin.py +0 -0
  386. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/responses.py +0 -0
  387. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/__init__.py +0 -0
  388. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/_util.py +0 -0
  389. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/entrypoint.py +0 -0
  390. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/kafka.py +0 -0
  391. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/redis_locks.py +0 -0
  392. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/redis_tasks.py +0 -0
  393. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/storage.py +0 -0
  394. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/tasks.py +0 -0
  395. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tasking/worker.py +0 -0
  396. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/__init__.py +0 -0
  397. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/__init__.py +0 -0
  398. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/__init__.py +0 -0
  399. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
  400. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
  401. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
  402. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
  403. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_auth.py +0 -0
  404. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
  405. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
  406. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_filter.py +0 -0
  407. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_login.py +0 -0
  408. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
  409. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
  410. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_replication.py +0 -0
  411. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_repos.py +0 -0
  412. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_role.py +0 -0
  413. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
  414. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_scoping.py +0 -0
  415. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
  416. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_status.py +0 -0
  417. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
  418. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_tasking.py +0 -0
  419. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_upload.py +0 -0
  420. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
  421. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_v4_status.py +0 -0
  422. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/test_workers.py +0 -0
  423. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
  424. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
  425. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
  426. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
  427. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
  428. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
  429. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
  430. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
  431. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
  432. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
  433. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
  434. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
  435. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
  436. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
  437. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
  438. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
  439. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
  440. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
  441. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
  442. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
  443. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
  444. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
  445. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
  446. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/assets/__init__.py +0 -0
  447. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/content_with_coverage.py +0 -0
  448. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/functional/utils.py +0 -0
  449. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/performance/__init__.py +0 -0
  450. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/performance/test_performance.py +0 -0
  451. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/__init__.py +0 -0
  452. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/conftest.py +0 -0
  453. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/content/__init__.py +0 -0
  454. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/content/test_handler.py +0 -0
  455. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/content/test_heartbeat.py +0 -0
  456. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/download/__init__.py +0 -0
  457. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
  458. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
  459. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/metrics/__init__.py +0 -0
  460. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/metrics/conftest.py +0 -0
  461. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
  462. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
  463. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/migration/__init__.py +0 -0
  464. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/__init__.py +0 -0
  465. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_base.py +0 -0
  466. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_content.py +0 -0
  467. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_publication_retention.py +0 -0
  468. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_remote.py +0 -0
  469. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_repository.py +0 -0
  470. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/models/test_task.py +0 -0
  471. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/roles/__init__.py +0 -0
  472. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/roles/test_adjust_roles.py +0 -0
  473. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/roles/test_roles.py +0 -0
  474. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/__init__.py +0 -0
  475. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_base.py +0 -0
  476. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
  477. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
  478. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
  479. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
  480. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
  481. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/serializers/test_user.py +0 -0
  482. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/stages/__init__.py +0 -0
  483. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
  484. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/stages/test_resource_budget.py +0 -0
  485. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/stages/test_stages.py +0 -0
  486. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_cache.py +0 -0
  487. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_chunked_file.py +0 -0
  488. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_content_guard.py +0 -0
  489. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_files.py +0 -0
  490. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_import_checks.py +0 -0
  491. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_list_signing_services_command.py +0 -0
  492. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_middleware.py +0 -0
  493. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
  494. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_settings.py +0 -0
  495. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_util.py +0 -0
  496. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_viewsets.py +0 -0
  497. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
  498. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
  499. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
  500. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/dependency_links.txt +0 -0
  501. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/entry_points.txt +0 -0
  502. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/requires.txt +0 -0
  503. {pulpcore-3.115.2 → pulpcore-3.115.4}/pulpcore.egg-info/top_level.txt +0 -0
  504. {pulpcore-3.115.2 → pulpcore-3.115.4}/setup.cfg +0 -0
  505. {pulpcore-3.115.2 → pulpcore-3.115.4}/test_requirements.txt +0 -0
  506. {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 }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulpcore
3
- Version: 3.115.2
3
+ Version: 3.115.4
4
4
  Summary: Pulp Django Application and Related Modules
5
5
  Author-email: Pulp Team <pulp-list@redhat.com>
6
6
  License-Expression: GPL-2.0-or-later
@@ -6,6 +6,6 @@ class PulpCertGuardPluginAppConfig(PulpPluginAppConfig):
6
6
 
7
7
  name = "pulp_certguard.app"
8
8
  label = "certguard"
9
- version = "3.115.2"
9
+ version = "3.115.4"
10
10
  python_package_name = "pulpcore"
11
11
  domain_compatible = True
@@ -8,6 +8,6 @@ class PulpFilePluginAppConfig(PulpPluginAppConfig):
8
8
 
9
9
  name = "pulp_file.app"
10
10
  label = "file"
11
- version = "3.115.2"
11
+ version = "3.115.4"
12
12
  python_package_name = "pulpcore"
13
13
  domain_compatible = True
@@ -237,7 +237,7 @@ class PulpAppConfig(PulpPluginAppConfig):
237
237
  label = "core"
238
238
 
239
239
  # The version of this app
240
- version = "3.115.2"
240
+ version = "3.115.4"
241
241
 
242
242
  # The python package name providing this app
243
243
  python_package_name = "pulpcore"
@@ -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
  )
@@ -49,6 +49,7 @@ class DomainViewSet(
49
49
  serializer_class = DomainSerializer
50
50
  endpoint_name = "domains"
51
51
  filterset_class = DomainFilter
52
+ queryset_filtering_required_permission = "core.view_domain"
52
53
  DEFAULT_ACCESS_POLICY = {
53
54
  "statements": [
54
55
  {
@@ -527,7 +527,31 @@ class BaseDistributionViewSet(NamedModelViewSet):
527
527
  return qs
528
528
 
529
529
  def async_reserved_resources(self, instance):
530
- """Return resource that locks all Distributions."""
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 and also provides asynchronous CUD methods to dispatch tasks
571
- with reservation that lock all Distributions preventing race conditions during base_path
572
- checking.
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 (updated during beat)
137
- self.num_workers = 1
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("Initialized RedisWorker with Redis lock-based algorithm")
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(f"Updating the heartbeat of worker {self.name} failed.")
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
- This method counts all tasks in RUNNING or WAITING state that are older
326
- than 5 seconds, then subtracts the number of active workers to get the
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
- cutoff_time = timezone.now() - timedelta(seconds=5)
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulpcore
3
- Version: 3.115.2
3
+ Version: 3.115.4
4
4
  Summary: Pulp Django Application and Related Modules
5
5
  Author-email: Pulp Team <pulp-list@redhat.com>
6
6
  License-Expression: GPL-2.0-or-later
@@ -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.2"
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.2"
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