pulpcore 3.85.0__tar.gz → 3.86.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pulpcore might be problematic. Click here for more details.

Files changed (462) hide show
  1. {pulpcore-3.85.0 → pulpcore-3.86.0}/CHANGES.md +60 -0
  2. {pulpcore-3.85.0 → pulpcore-3.86.0}/PKG-INFO +2 -2
  3. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/app/__init__.py +1 -1
  4. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/__init__.py +1 -1
  5. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/apps.py +1 -1
  6. pulpcore-3.86.0/pulpcore/app/management/commands/optimizemigration.py +84 -0
  7. pulpcore-3.86.0/pulpcore/app/migrations/0139_task_app_lock.py +19 -0
  8. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/status.py +19 -1
  9. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/task.py +6 -1
  10. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/settings.py +12 -0
  11. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/middleware.py +37 -10
  12. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/migrations.py +4 -5
  13. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/repo_version_utils.py +8 -2
  14. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/pytest_plugin.py +6 -4
  15. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tasking/tasks.py +16 -15
  16. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tasking/worker.py +48 -29
  17. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_tasking.py +10 -11
  18. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_workers.py +1 -2
  19. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/content/test_heartbeat.py +2 -1
  20. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_repository.py +84 -1
  21. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore.egg-info/PKG-INFO +2 -2
  22. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore.egg-info/SOURCES.txt +2 -0
  23. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore.egg-info/requires.txt +1 -1
  24. {pulpcore-3.85.0 → pulpcore-3.86.0}/pyproject.toml +3 -3
  25. {pulpcore-3.85.0 → pulpcore-3.86.0}/CODE_OF_CONDUCT.md +0 -0
  26. {pulpcore-3.85.0 → pulpcore-3.86.0}/COMMITMENT +0 -0
  27. {pulpcore-3.85.0 → pulpcore-3.86.0}/CONTRIBUTING.md +0 -0
  28. {pulpcore-3.85.0 → pulpcore-3.86.0}/COPYRIGHT +0 -0
  29. {pulpcore-3.85.0 → pulpcore-3.86.0}/LICENSE +0 -0
  30. {pulpcore-3.85.0 → pulpcore-3.86.0}/MANIFEST.in +0 -0
  31. {pulpcore-3.85.0 → pulpcore-3.86.0}/README.md +0 -0
  32. {pulpcore-3.85.0 → pulpcore-3.86.0}/ci_requirements.txt +0 -0
  33. {pulpcore-3.85.0 → pulpcore-3.86.0}/functest_requirements.txt +0 -0
  34. {pulpcore-3.85.0 → pulpcore-3.86.0}/manage.py +0 -0
  35. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/__init__.py +0 -0
  36. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/app/migrations/0001_initial.py +0 -0
  37. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
  38. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/app/migrations/__init__.py +0 -0
  39. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/app/models.py +0 -0
  40. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/app/serializers.py +0 -0
  41. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/app/viewsets.py +0 -0
  42. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/pytest_plugin.py +0 -0
  43. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/rhsm/__init__.py +0 -0
  44. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
  45. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/__init__.py +0 -0
  46. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/__init__.py +0 -0
  47. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/api/__init__.py +0 -0
  48. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
  49. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
  50. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
  51. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
  52. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
  53. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
  54. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
  55. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
  56. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
  57. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
  58. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
  59. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
  60. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
  61. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
  62. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
  63. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
  64. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
  65. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
  66. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
  67. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
  68. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
  69. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
  70. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
  71. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
  72. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
  73. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
  74. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
  75. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
  76. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
  77. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
  78. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
  79. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/conftest.py +0 -0
  80. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/functional/constants.py +0 -0
  81. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/unit/__init__.py +0 -0
  82. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/unit/certdata.py +0 -0
  83. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
  84. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/__init__.py +0 -0
  85. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
  86. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
  87. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/migrations/__init__.py +0 -0
  88. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/modelresource.py +0 -0
  89. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/models.py +0 -0
  90. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/replica.py +0 -0
  91. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/serializers.py +0 -0
  92. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/tasks/__init__.py +0 -0
  93. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/tasks/publishing.py +0 -0
  94. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/tasks/synchronizing.py +0 -0
  95. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/app/viewsets.py +0 -0
  96. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/manifest.py +0 -0
  97. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/pytest_plugin.py +0 -0
  98. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/__init__.py +0 -0
  99. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/__init__.py +0 -0
  100. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/__init__.py +0 -0
  101. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_acs.py +0 -0
  102. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
  103. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
  104. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
  105. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
  106. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
  107. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_domains.py +0 -0
  108. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
  109. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
  110. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_labels.py +0 -0
  111. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
  112. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_publish.py +0 -0
  113. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
  114. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_rbac.py +0 -0
  115. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
  116. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/functional/api/test_sync.py +0 -0
  117. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/unit/__init__.py +0 -0
  118. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/unit/test_safe_paths.py +0 -0
  119. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulp_file/tests/unit/test_serializers.py +0 -0
  120. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/__init__.py +0 -0
  121. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/__init__.py +0 -0
  122. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/access_policy.py +0 -0
  123. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/authentication.py +0 -0
  124. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/checks.py +0 -0
  125. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/entrypoint.py +0 -0
  126. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/files.py +0 -0
  127. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/global_access_conditions.py +0 -0
  128. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/importexport.py +0 -0
  129. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/loggers.py +0 -0
  130. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/manage.py +0 -0
  131. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/__init__.py +0 -0
  132. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/__init__.py +0 -0
  133. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/add-signing-service.py +0 -0
  134. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/analyze-publication.py +0 -0
  135. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
  136. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
  137. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/dump-permissions.py +0 -0
  138. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
  139. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
  140. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/migrationstat.py +0 -0
  141. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/openapi.py +0 -0
  142. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
  143. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/remove-plugin.py +0 -0
  144. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
  145. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/repository-size.py +0 -0
  146. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
  147. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
  148. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
  149. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0091_systemid.py +0 -0
  150. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
  151. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
  152. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
  153. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
  154. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
  155. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
  156. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
  157. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0099_versions_field.py +0 -0
  158. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
  159. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0101_add_domain.py +0 -0
  160. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
  161. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
  162. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0104_delete_label.py +0 -0
  163. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
  164. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
  165. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
  166. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0108_task_versions.py +0 -0
  167. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
  168. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
  169. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
  170. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
  171. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
  172. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
  173. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
  174. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
  175. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
  176. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
  177. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
  178. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
  179. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
  180. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
  181. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
  182. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
  183. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
  184. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
  185. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
  186. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
  187. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
  188. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
  189. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
  190. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
  191. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
  192. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
  193. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
  194. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
  195. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
  196. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0137_appstatus.py +0 -0
  197. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
  198. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/migrations/__init__.py +0 -0
  199. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/mime_types.py +0 -0
  200. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/modelresource.py +0 -0
  201. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/__init__.py +0 -0
  202. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/access_policy.py +0 -0
  203. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/acs.py +0 -0
  204. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/analytics.py +0 -0
  205. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/base.py +0 -0
  206. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/content.py +0 -0
  207. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/domain.py +0 -0
  208. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/exporter.py +0 -0
  209. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/fields.py +0 -0
  210. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/generic.py +0 -0
  211. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/importer.py +0 -0
  212. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/openpgp.py +0 -0
  213. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/progress.py +0 -0
  214. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/publication.py +0 -0
  215. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/replica.py +0 -0
  216. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/repository.py +0 -0
  217. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/role.py +0 -0
  218. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/storage.py +0 -0
  219. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/upload.py +0 -0
  220. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/models/vulnerability_report.py +0 -0
  221. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/netutil.py +0 -0
  222. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/openpgp.py +0 -0
  223. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/protobuf/__init__.py +0 -0
  224. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
  225. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/pulp_hashlib.py +0 -0
  226. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
  227. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/redis_connection.py +0 -0
  228. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/replica.py +0 -0
  229. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/response.py +0 -0
  230. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/role_util.py +0 -0
  231. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/__init__.py +0 -0
  232. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/access_policy.py +0 -0
  233. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/acs.py +0 -0
  234. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/base.py +0 -0
  235. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/content.py +0 -0
  236. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/domain.py +0 -0
  237. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/exporter.py +0 -0
  238. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/fields.py +0 -0
  239. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/importer.py +0 -0
  240. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/openpgp.py +0 -0
  241. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/orphans.py +0 -0
  242. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/progress.py +0 -0
  243. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/publication.py +0 -0
  244. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/purge.py +0 -0
  245. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/reclaim.py +0 -0
  246. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/repair.py +0 -0
  247. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/replica.py +0 -0
  248. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/repository.py +0 -0
  249. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/status.py +0 -0
  250. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/task.py +0 -0
  251. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/upload.py +0 -0
  252. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/user.py +0 -0
  253. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/serializers/vulnerability_report.py +0 -0
  254. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/__init__.py +0 -0
  255. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/analytics.py +0 -0
  256. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/base.py +0 -0
  257. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/export.py +0 -0
  258. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/importer.py +0 -0
  259. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/migrate.py +0 -0
  260. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/orphan.py +0 -0
  261. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/purge.py +0 -0
  262. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/reclaim_space.py +0 -0
  263. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/replica.py +0 -0
  264. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/repository.py +0 -0
  265. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/telemetry.py +0 -0
  266. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/test.py +0 -0
  267. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/upload.py +0 -0
  268. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/tasks/vulnerability_report.py +0 -0
  269. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/templates/rest_framework/api.html +0 -0
  270. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/templatetags/__init__.py +0 -0
  271. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/templatetags/pulp_urls.py +0 -0
  272. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/urls.py +0 -0
  273. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/util.py +0 -0
  274. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/views/__init__.py +0 -0
  275. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/views/importer.py +0 -0
  276. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/views/orphans.py +0 -0
  277. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/views/repair.py +0 -0
  278. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/views/status.py +0 -0
  279. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/__init__.py +0 -0
  280. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/access_policy.py +0 -0
  281. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/acs.py +0 -0
  282. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/base.py +0 -0
  283. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/content.py +0 -0
  284. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/custom_filters.py +0 -0
  285. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/domain.py +0 -0
  286. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/exporter.py +0 -0
  287. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/importer.py +0 -0
  288. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/openpgp.py +0 -0
  289. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/orphans.py +0 -0
  290. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/publication.py +0 -0
  291. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/reclaim.py +0 -0
  292. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/replica.py +0 -0
  293. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/repository.py +0 -0
  294. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/task.py +0 -0
  295. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/upload.py +0 -0
  296. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/user.py +0 -0
  297. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
  298. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/app/wsgi.py +0 -0
  299. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/backends.py +0 -0
  300. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/cache/__init__.py +0 -0
  301. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/cache/cache.py +0 -0
  302. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/constants.py +0 -0
  303. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/content/__init__.py +0 -0
  304. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/content/authentication.py +0 -0
  305. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/content/entrypoint.py +0 -0
  306. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/content/handler.py +0 -0
  307. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/content/instrumentation.py +0 -0
  308. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/download/__init__.py +0 -0
  309. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/download/base.py +0 -0
  310. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/download/factory.py +0 -0
  311. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/download/file.py +0 -0
  312. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/download/http.py +0 -0
  313. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/exceptions/__init__.py +0 -0
  314. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/exceptions/base.py +0 -0
  315. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/exceptions/plugin.py +0 -0
  316. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/exceptions/validation.py +0 -0
  317. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/filters.py +0 -0
  318. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/metrics.py +0 -0
  319. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/openapi/__init__.py +0 -0
  320. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/openapi/hooks.py +0 -0
  321. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/__init__.py +0 -0
  322. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/access_policy.py +0 -0
  323. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/actions.py +0 -0
  324. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/apps.py +0 -0
  325. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/authentication/__init__.py +0 -0
  326. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/cache/__init__.py +0 -0
  327. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/constants.py +0 -0
  328. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/content.py +0 -0
  329. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/download/__init__.py +0 -0
  330. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/exceptions.py +0 -0
  331. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/files.py +0 -0
  332. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/importexport.py +0 -0
  333. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/migrations.py +0 -0
  334. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/modelresources.py +0 -0
  335. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/models/__init__.py +0 -0
  336. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/models/role.py +0 -0
  337. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/publication_utils.py +0 -0
  338. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/pulp_hashlib.py +0 -0
  339. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/replica.py +0 -0
  340. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/responses.py +0 -0
  341. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/serializers/__init__.py +0 -0
  342. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/serializers/content.py +0 -0
  343. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/stages/__init__.py +0 -0
  344. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/stages/api.py +0 -0
  345. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/stages/artifact_stages.py +0 -0
  346. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/stages/content_stages.py +0 -0
  347. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/stages/declarative_version.py +0 -0
  348. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/stages/models.py +0 -0
  349. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/storage.py +0 -0
  350. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/sync.py +0 -0
  351. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/tasking.py +0 -0
  352. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/util.py +0 -0
  353. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/viewsets/__init__.py +0 -0
  354. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/plugin/viewsets/content.py +0 -0
  355. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/responses.py +0 -0
  356. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tasking/__init__.py +0 -0
  357. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tasking/_util.py +0 -0
  358. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tasking/entrypoint.py +0 -0
  359. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tasking/kafka.py +0 -0
  360. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tasking/storage.py +0 -0
  361. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/__init__.py +0 -0
  362. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/__init__.py +0 -0
  363. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/__init__.py +0 -0
  364. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
  365. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
  366. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
  367. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
  368. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_auth.py +0 -0
  369. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
  370. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
  371. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
  372. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_filter.py +0 -0
  373. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_login.py +0 -0
  374. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
  375. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
  376. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_replication.py +0 -0
  377. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_repos.py +0 -0
  378. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_role.py +0 -0
  379. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
  380. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_scoping.py +0 -0
  381. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
  382. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_status.py +0 -0
  383. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
  384. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_upload.py +0 -0
  385. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
  386. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
  387. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
  388. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
  389. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
  390. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
  391. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
  392. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
  393. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
  394. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
  395. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
  396. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
  397. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
  398. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
  399. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
  400. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
  401. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
  402. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
  403. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
  404. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
  405. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
  406. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
  407. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
  408. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
  409. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
  410. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/assets/__init__.py +0 -0
  411. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/content_with_coverage.py +0 -0
  412. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/functional/utils.py +0 -0
  413. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/performance/__init__.py +0 -0
  414. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/performance/test_performance.py +0 -0
  415. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/__init__.py +0 -0
  416. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/conftest.py +0 -0
  417. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/content/__init__.py +0 -0
  418. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/content/test_handler.py +0 -0
  419. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/download/__init__.py +0 -0
  420. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
  421. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
  422. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/metrics/__init__.py +0 -0
  423. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/metrics/conftest.py +0 -0
  424. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
  425. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
  426. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/migration/__init__.py +0 -0
  427. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/models/__init__.py +0 -0
  428. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_base.py +0 -0
  429. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_content.py +0 -0
  430. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_remote.py +0 -0
  431. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/models/test_task.py +0 -0
  432. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/roles/__init__.py +0 -0
  433. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/roles/test_roles.py +0 -0
  434. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/__init__.py +0 -0
  435. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_base.py +0 -0
  436. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
  437. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
  438. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
  439. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
  440. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
  441. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/serializers/test_user.py +0 -0
  442. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/stages/__init__.py +0 -0
  443. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
  444. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/stages/test_stages.py +0 -0
  445. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_cache.py +0 -0
  446. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_chunked_file.py +0 -0
  447. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_content_guard.py +0 -0
  448. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_files.py +0 -0
  449. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_import_checks.py +0 -0
  450. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
  451. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_settings.py +0 -0
  452. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_util.py +0 -0
  453. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_viewsets.py +0 -0
  454. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
  455. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
  456. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
  457. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore.egg-info/dependency_links.txt +0 -0
  458. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore.egg-info/entry_points.txt +0 -0
  459. {pulpcore-3.85.0 → pulpcore-3.86.0}/pulpcore.egg-info/top_level.txt +0 -0
  460. {pulpcore-3.85.0 → pulpcore-3.86.0}/setup.cfg +0 -0
  461. {pulpcore-3.85.0 → pulpcore-3.86.0}/test_requirements.txt +0 -0
  462. {pulpcore-3.85.0 → pulpcore-3.86.0}/unittest_requirements.txt +0 -0
@@ -8,6 +8,66 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
+ ## 3.86.0 (2025-08-21) {: #3.86.0 }
12
+
13
+ ### REST API {: #3.86.0-rest-api }
14
+
15
+ #### Features {: #3.86.0-rest-api-feature }
16
+
17
+ - Added a configurable bucket boundary for API request duration metric using the OTEL_PULP_API_HISTOGRAM_BUCKETS setting.
18
+ [#6845](https://github.com/pulp/pulpcore/issues/6845)
19
+
20
+ #### Bugfixes {: #3.86.0-rest-api-bugfix }
21
+
22
+ - Made DjangoMetricsMiddleware aware of OTEL urls exclusion envvars.
23
+ [#6843](https://github.com/pulp/pulpcore/issues/6843)
24
+ - Fixed repository version validation to allow legitimate shared artifacts between content units.
25
+ [#6868](https://github.com/pulp/pulpcore/issues/6868)
26
+ - Fixed a bug that prevents migrations from running.
27
+
28
+ #### Improved Documentation {: #3.86.0-rest-api-doc }
29
+
30
+ - Updated documentation for the TASK_DIAGNOSTICS setting.
31
+ [#6854](https://github.com/pulp/pulpcore/issues/6854)
32
+
33
+ ### Plugin API {: #3.86.0-plugin-api }
34
+
35
+ #### Removals {: #3.86.0-plugin-api-removal }
36
+
37
+ - Removed support for synchronous immediate tasks.
38
+
39
+ ### Pulp File {: #3.86.0-pulp-file }
40
+
41
+ No significant changes.
42
+
43
+ ### Pulp Cert Guard {: #3.86.0-pulp-cert-guard }
44
+
45
+ No significant changes.
46
+
47
+ ---
48
+
49
+ ## 3.85.1 (2025-08-12) {: #3.85.1 }
50
+
51
+ ### REST API {: #3.85.1-rest-api }
52
+
53
+ #### Bugfixes {: #3.85.1-rest-api-bugfix }
54
+
55
+ - Fixed a bug that prevents migrations from running.
56
+
57
+ ### Plugin API {: #3.85.1-plugin-api }
58
+
59
+ No significant changes.
60
+
61
+ ### Pulp File {: #3.85.1-pulp-file }
62
+
63
+ No significant changes.
64
+
65
+ ### Pulp Cert Guard {: #3.85.1-pulp-cert-guard }
66
+
67
+ No significant changes.
68
+
69
+ ---
70
+
11
71
  ## 3.85.0 (2025-08-12) {: #3.85.0 }
12
72
 
13
73
  ### REST API {: #3.85.0-rest-api }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulpcore
3
- Version: 3.85.0
3
+ Version: 3.86.0
4
4
  Summary: Pulp Django Application and Related Modules
5
5
  Author-email: Pulp Team <pulp-list@redhat.com>
6
6
  Project-URL: Homepage, https://pulpproject.org
@@ -45,7 +45,7 @@ Requires-Dist: PyOpenSSL<26.0
45
45
  Requires-Dist: opentelemetry-api<1.37,>=1.27.0
46
46
  Requires-Dist: opentelemetry-sdk<1.37,>=1.27.0
47
47
  Requires-Dist: opentelemetry-exporter-otlp-proto-http<1.37,>=1.27.0
48
- Requires-Dist: protobuf<6.0,>=4.21.1
48
+ Requires-Dist: protobuf<7.0,>=4.21.1
49
49
  Requires-Dist: pulp-glue<0.36,>=0.28.0
50
50
  Requires-Dist: pygtrie<=2.5.0,>=2.5
51
51
  Requires-Dist: psycopg[binary]<3.3,>=3.1.8
@@ -6,6 +6,6 @@ class PulpCertGuardPluginAppConfig(PulpPluginAppConfig):
6
6
 
7
7
  name = "pulp_certguard.app"
8
8
  label = "certguard"
9
- version = "3.85.0"
9
+ version = "3.86.0"
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.85.0"
11
+ version = "3.86.0"
12
12
  python_package_name = "pulpcore"
13
13
  domain_compatible = True
@@ -239,7 +239,7 @@ class PulpAppConfig(PulpPluginAppConfig):
239
239
  label = "core"
240
240
 
241
241
  # The version of this app
242
- version = "3.85.0"
242
+ version = "3.86.0"
243
243
 
244
244
  # The python package name providing this app
245
245
  python_package_name = "pulpcore"
@@ -0,0 +1,84 @@
1
+ from collections import defaultdict
2
+ from gettext import gettext as _
3
+
4
+ from django.db import connection
5
+ from django.db.migrations.loader import MigrationLoader
6
+ from django.db.migrations.migration import SwappableTuple
7
+ from django.db.migrations.optimizer import MigrationOptimizer
8
+ from django.db.migrations.writer import MigrationWriter
9
+ from django.conf import settings
10
+ from django.core.management import BaseCommand
11
+
12
+
13
+ def print_stats(migration):
14
+ operations = migration.operations
15
+ migration_types = defaultdict(int)
16
+ for operation in operations:
17
+ migration_types[operation.__class__.__name__] += 1
18
+ for key, value in migration_types.items():
19
+ print(f"{value: 4} {key}")
20
+ print("---")
21
+ print(_("Total: {count}").format(count=len(operations)))
22
+
23
+
24
+ class Command(BaseCommand):
25
+ """
26
+ Django management command to optimize a migration.
27
+ """
28
+
29
+ help = _("Optimize a migration.")
30
+
31
+ def add_arguments(self, parser):
32
+ parser.add_argument("--dry-run", action="store_true", help=_("Don't change anything."))
33
+ parser.add_argument(
34
+ "--stat", action="store_true", help=_("Print statistics about operations.")
35
+ )
36
+ parser.add_argument("app-label", help=_("App label of the migrations to optimize."))
37
+ parser.add_argument("migration", help=_("Prefix of the migration to optimize."))
38
+
39
+ def handle(self, *args, **options):
40
+ dry_run = options.get("dry_run", False)
41
+ stat = options.get("stat", False)
42
+ app_label = options["app-label"]
43
+ migration_prefix = options["migration"]
44
+
45
+ loader = MigrationLoader(connection)
46
+
47
+ migration = loader.get_migration_by_prefix(app_label, migration_prefix)
48
+
49
+ print(_("Optimizing migration {}").format((migration.app_label, migration.name)))
50
+ if stat:
51
+ print(_("=== Old Migration Summary ==="))
52
+ print_stats(migration)
53
+
54
+ new_dependencies = []
55
+ for dependency in migration.dependencies:
56
+ if (
57
+ isinstance(dependency, SwappableTuple)
58
+ and settings.AUTH_USER_MODEL == dependency.setting
59
+ ):
60
+ new_dependencies.append(("__setting__", "AUTH_USER_MODEL"))
61
+ else:
62
+ new_dependencies.append(dependency)
63
+
64
+ optimizer = MigrationOptimizer()
65
+ new_operations = optimizer.optimize(migration.operations, app_label)
66
+
67
+ if new_operations != migration.operations:
68
+ print(
69
+ _("Changed from {old_count} to {new_count} operations.").format(
70
+ old_count=len(migration.operations), new_count=len(new_operations)
71
+ )
72
+ )
73
+ if stat:
74
+ print(_("=== New Migration Summary ==="))
75
+ print_stats(migration)
76
+
77
+ migration.operations = new_operations
78
+ migration.dependencies = new_dependencies
79
+ if not dry_run:
80
+ writer = MigrationWriter(migration)
81
+ with open(writer.path, "w") as output_file:
82
+ output_file.write(writer.as_string())
83
+ else:
84
+ print(_("No optimizations found."))
@@ -0,0 +1,19 @@
1
+ # Generated by Django 4.2.23 on 2025-08-07 11:43
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('core', '0138_vulnerabilityreport'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='task',
16
+ name='app_lock',
17
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tasks', to='core.appstatus'),
18
+ ),
19
+ ]
@@ -15,6 +15,7 @@ from pulpcore.app.models import BaseModel
15
15
 
16
16
 
17
17
  class AppStatusManager(models.Manager):
18
+ # This should be replaced with 3.87.
18
19
  def online(self):
19
20
  """
20
21
  Returns a queryset of objects that are online.
@@ -51,8 +52,15 @@ class AppStatusManager(models.Manager):
51
52
 
52
53
  class _AppStatusManager(AppStatusManager):
53
54
  # This is an intermediate class in order to allow a ZDU.
54
- # It should be removed from the chain with 3.87.
55
+ # It should be made the real thing with 3.87.
56
+ def __init__(self):
57
+ super().__init__()
58
+ self._current_app_status = None
59
+
55
60
  def create(self, app_type, **kwargs):
61
+ if self._current_app_status is not None:
62
+ raise RuntimeError("There is already an app status in this process.")
63
+
56
64
  if app_type == "api":
57
65
  old_obj = ApiAppStatus.objects.create(**kwargs)
58
66
  elif app_type == "worker":
@@ -63,17 +71,27 @@ class _AppStatusManager(AppStatusManager):
63
71
  raise NotImplementedError(f"Invalid app_type: {app_type}")
64
72
  obj = super().create(app_type=app_type, **kwargs)
65
73
  obj._old_status = old_obj
74
+ self._current_app_status = obj
66
75
  return obj
67
76
 
68
77
  async def acreate(self, app_type, **kwargs):
78
+ if self._current_app_status is not None:
79
+ raise RuntimeError("There is already an app status in this process.")
80
+
69
81
  if app_type == "content":
70
82
  old_obj = await ContentAppStatus.objects.acreate(**kwargs)
71
83
  else:
72
84
  raise NotImplementedError(f"Invalid app_type: {app_type}")
73
85
  obj = await super().acreate(app_type=app_type, **kwargs)
74
86
  obj._old_status = old_obj
87
+ self._current_app_status = obj
75
88
  return obj
76
89
 
90
+ def current(self):
91
+ if self._current_app_status is None:
92
+ raise RuntimeError("There is no current app status.")
93
+ return self._current_app_status
94
+
77
95
  def online(self):
78
96
  """
79
97
  Returns a queryset of objects that are online.
@@ -116,7 +116,8 @@ class Task(BaseModel, AutoAddObjPermsMixin):
116
116
  Defaults to `True`.
117
117
 
118
118
  Relations:
119
-
119
+ app_lock (AppStatus): The app holding the lock on this task.
120
+ Warning: This is not yet implemented/enforced.
120
121
  parent (models.ForeignKey): Task that spawned this task (if any)
121
122
  worker (models.ForeignKey): The worker that this task is in
122
123
  pulp_domain (models.ForeignKey): The domain the Task is a part of
@@ -138,6 +139,10 @@ class Task(BaseModel, AutoAddObjPermsMixin):
138
139
  enc_kwargs = EncryptedJSONField(null=True, encoder=DjangoJSONEncoder)
139
140
 
140
141
  worker = models.ForeignKey("Worker", null=True, related_name="tasks", on_delete=models.SET_NULL)
142
+ # This field is supposed to replace the session advisory locks to protect tasks.
143
+ app_lock = models.ForeignKey(
144
+ "AppStatus", null=True, related_name="tasks", on_delete=models.SET_NULL
145
+ )
141
146
 
142
147
  parent_task = models.ForeignKey(
143
148
  "Task", null=True, related_name="child_tasks", on_delete=models.SET_NULL
@@ -405,6 +405,7 @@ KAFKA_SASL_PASSWORD = None
405
405
 
406
406
  # opentelemetry settings
407
407
  OTEL_ENABLED = False
408
+ OTEL_PULP_API_HISTOGRAM_BUCKETS = []
408
409
 
409
410
  # VulnerabilityReport settings
410
411
  VULN_REPORT_TASK_LIMITER = 10
@@ -504,6 +505,16 @@ authentication_json_header_openapi_security_scheme_validator = Validator(
504
505
  messages={"is_type_of": "{name} must be a dictionary."},
505
506
  )
506
507
 
508
+ otel_pulp_api_histogram_buckets_validator = Validator(
509
+ "OTEL_PULP_API_HISTOGRAM_BUCKETS",
510
+ is_type_of=list,
511
+ condition=lambda v: all([isinstance(value, float) for value in v]),
512
+ messages={
513
+ "is_type_of": "{name} must be a list.",
514
+ "condition": "All buckets must be declared as a float value",
515
+ },
516
+ )
517
+
507
518
 
508
519
  def otel_middleware_hook(settings):
509
520
  data = {"dynaconf_merge": True}
@@ -530,6 +541,7 @@ settings = DjangoDynaconf(
530
541
  unknown_algs_validator,
531
542
  json_header_auth_validator,
532
543
  authentication_json_header_openapi_security_scheme_validator,
544
+ otel_pulp_api_histogram_buckets_validator,
533
545
  ],
534
546
  post_hooks=(otel_middleware_hook,),
535
547
  )
@@ -1,5 +1,8 @@
1
1
  import time
2
+ import re
3
+
2
4
  from contextvars import ContextVar
5
+ from os import environ
3
6
 
4
7
  from django.http.response import Http404
5
8
  from django.conf import settings
@@ -101,15 +104,32 @@ class APIRootRewriteMiddleware:
101
104
  class DjangoMetricsMiddleware:
102
105
  def __init__(self, get_response):
103
106
  self.meter = init_otel_meter("pulp-api")
104
- self.request_duration_histogram = self.meter.create_histogram(
105
- name="api.request_duration",
106
- description="Tracks the duration of HTTP requests",
107
- unit="ms",
108
- )
107
+ self._set_histogram(self.meter)
109
108
 
110
109
  self.get_response = get_response
111
110
 
111
+ def _excluded_urls(self, url):
112
+
113
+ excluded_urls = environ.get(
114
+ "OTEL_PYTHON_EXCLUDED_URLS", environ.get("OTEL_PYTHON_DJANGO_EXCLUDED_URLS", "")
115
+ )
116
+
117
+ if excluded_urls:
118
+ excluded_urls_list = [excluded_url.strip() for excluded_url in excluded_urls.split(",")]
119
+ else:
120
+ return False
121
+
122
+ exclusion_pattern = "|".join(excluded_urls_list)
123
+
124
+ if re.search(exclusion_pattern, url):
125
+ return True
126
+
127
+ return False
128
+
112
129
  def __call__(self, request):
130
+ if self._excluded_urls(request.build_absolute_uri("?")):
131
+ return self.get_response(request)
132
+
113
133
  start_time = time.time()
114
134
  response = self.get_response(request)
115
135
  end_time = time.time()
@@ -122,11 +142,18 @@ class DjangoMetricsMiddleware:
122
142
  return response
123
143
 
124
144
  def _set_histogram(self, meter):
125
- self.request_duration_histogram = meter.create_histogram(
126
- name="api.request_duration",
127
- description="Tracks the duration of HTTP requests",
128
- unit="ms",
129
- )
145
+ create_histogram_kwargs = {
146
+ "name": "api.request_duration",
147
+ "description": "Tracks the duration of HTTP requests",
148
+ "unit": "ms",
149
+ }
150
+
151
+ if settings.OTEL_PULP_API_HISTOGRAM_BUCKETS:
152
+ create_histogram_kwargs["explicit_bucket_boundaries_advisory"] = (
153
+ settings.OTEL_PULP_API_HISTOGRAM_BUCKETS
154
+ )
155
+
156
+ self.request_duration_histogram = meter.create_histogram(**create_histogram_kwargs)
130
157
 
131
158
  def _process_attributes(self, request, response):
132
159
  return {
@@ -3,8 +3,6 @@ from packaging.version import parse as parse_version
3
3
  from django.conf import settings
4
4
  from django.utils import timezone
5
5
  from django.db.migrations.operations.base import Operation
6
- from django.db.models import F
7
- from django.db.models.functions import Now
8
6
 
9
7
 
10
8
  class RequireVersion(Operation):
@@ -58,7 +56,10 @@ class RequireVersion(Operation):
58
56
 
59
57
  try:
60
58
  AppStatus = from_state.apps.get_model("core", "AppStatus")
61
- for worker in AppStatus.objects.filter(F("last_heartbeat") + F("ttl") >= Now()):
59
+ except LookupError:
60
+ pass
61
+ else:
62
+ for worker in AppStatus.objects.all():
62
63
  present_version = worker.versions.get(self.plugin)
63
64
  if present_version is not None and parse_version(present_version) < needed_version:
64
65
  errors.append(
@@ -67,8 +68,6 @@ class RequireVersion(Operation):
67
68
  )
68
69
 
69
70
  found_either_table = True
70
- except LookupError:
71
- pass
72
71
 
73
72
  assert found_either_table
74
73
  if errors:
@@ -116,9 +116,15 @@ def validate_version_paths(version):
116
116
  Raises:
117
117
  ValueError: If two artifact relative paths overlap
118
118
  """
119
- paths = ContentArtifact.objects.filter(content__pk__in=version.content).values_list(
120
- "relative_path", flat=True
119
+ # Get unique (path, artifact) pairs to allow artifacts shared across content
120
+ content_artifacts = (
121
+ ContentArtifact.objects.filter(content__pk__in=version.content)
122
+ .values_list("relative_path", "artifact")
123
+ .distinct()
121
124
  )
125
+
126
+ paths = [path for path, artifact_id in content_artifacts]
127
+
122
128
  try:
123
129
  validate_file_paths(paths)
124
130
  except ValueError as e:
@@ -1013,23 +1013,25 @@ def dispatch_task(pulpcore_bindings):
1013
1013
  commands = (
1014
1014
  "from django_guid import set_guid; "
1015
1015
  "from pulpcore.tasking.tasks import dispatch; "
1016
- "from pulpcore.app.models import TaskGroup; "
1016
+ "from pulpcore.app.models import TaskGroup, AppStatus; "
1017
1017
  "from pulpcore.app.util import get_url, set_current_user; "
1018
1018
  "from django.contrib.auth import get_user_model; "
1019
+ f"app_status=AppStatus.objects.create(name='test-' + {cid!r},app_type='worker'); "
1019
1020
  "User = get_user_model(); "
1020
1021
  f"user = User.objects.filter(username='{username}').first(); "
1021
1022
  "set_current_user(user); "
1022
1023
  f"set_guid({cid!r}); "
1023
1024
  f"tg = {task_group_id!r} and TaskGroup.objects.filter(pk={task_group_id!r}).first(); "
1024
1025
  f"task = dispatch(*{args!r}, task_group=tg, **{kwargs!r}); "
1026
+ "app_status.delete(); "
1025
1027
  "print(get_url(task))"
1026
1028
  )
1027
1029
 
1028
1030
  process = subprocess.run(["pulpcore-manager", "shell", "-c", commands], capture_output=True)
1029
-
1030
- assert process.returncode == 0
1031
+ err_log = process.stderr.decode()
1032
+ assert process.returncode == 0, err_log
1031
1033
  task_href = process.stdout.decode().strip()
1032
- print(process.stderr.decode(), file=sys.stderr)
1034
+ print(err_log, file=sys.stderr)
1033
1035
  return task_href
1034
1036
 
1035
1037
  return _dispatch_task
@@ -8,7 +8,6 @@ import sys
8
8
  import traceback
9
9
  import tempfile
10
10
  import threading
11
- from asgiref.sync import sync_to_async
12
11
  from gettext import gettext as _
13
12
 
14
13
  from django.conf import settings
@@ -16,8 +15,12 @@ from django.db import connection, transaction
16
15
  from django.db.models import Model
17
16
  from django_guid import get_guid
18
17
  from pulpcore.app.apps import MODULE_PLUGIN_VERSIONS
19
- from pulpcore.app.models import Task, TaskGroup
20
- from pulpcore.app.util import current_task, get_domain, get_prn, deprecation_logger
18
+ from pulpcore.app.models import Task, TaskGroup, AppStatus
19
+ from pulpcore.app.util import (
20
+ current_task,
21
+ get_domain,
22
+ get_prn,
23
+ )
21
24
  from pulpcore.constants import (
22
25
  TASK_FINAL_STATES,
23
26
  TASK_INCOMPLETE_STATES,
@@ -81,19 +84,11 @@ def _execute_task(task):
81
84
  immediate = task.immediate
82
85
  is_coroutine_fn = asyncio.iscoroutinefunction(func)
83
86
 
84
- if not is_coroutine_fn:
85
- if immediate:
86
- deprecation_logger.warning(
87
- "Immediate tasks must be coroutine functions. "
88
- "Support for non-coroutine immediate tasks will be dropped "
89
- "in pulpcore 3.85."
90
- )
91
- func = sync_to_async(func)
92
- is_coroutine_fn = True
93
- else:
94
- func(*args, **kwargs)
87
+ if immediate and not is_coroutine_fn:
88
+ raise ValueError("Immediate tasks must be async functions.")
95
89
 
96
90
  if is_coroutine_fn:
91
+ # both regular and immediate tasks can be coroutines, but only immediate must timeout
97
92
  _logger.debug("Task is coroutine %s", task.pk)
98
93
  coro = func(*args, **kwargs)
99
94
  if immediate:
@@ -110,6 +105,8 @@ def _execute_task(task):
110
105
  timeout=IMMEDIATE_TIMEOUT,
111
106
  )
112
107
  )
108
+ else:
109
+ func(*args, **kwargs)
113
110
 
114
111
  except Exception:
115
112
  exc_type, exc, tb = sys.exc_info()
@@ -240,6 +237,7 @@ def dispatch(
240
237
  immediate=immediate,
241
238
  deferred=deferred,
242
239
  profile_options=x_task_diagnostics_var.get(None),
240
+ app_lock=(immediate and AppStatus.objects.current()) or None,
243
241
  )
244
242
  task.refresh_from_db() # The database may have assigned a timestamp for us.
245
243
  if immediate:
@@ -272,13 +270,16 @@ def dispatch(
272
270
  try:
273
271
  execute_task(task)
274
272
  finally:
275
- # whether the task fails or not, we should always restore the workdir
273
+ # Whether the task fails or not, we should always restore the workdir.
276
274
  os.chdir(cur_dir)
277
275
 
278
276
  if resources:
279
277
  notify_workers = True
280
278
  elif deferred:
279
+ # Resources are blocked. Let the others handle it.
281
280
  notify_workers = True
281
+ task.app_lock = None
282
+ task.save()
282
283
  else:
283
284
  task.set_canceling()
284
285
  task.set_canceled(TASK_STATES.CANCELED, "Resources temporarily unavailable.")
@@ -363,41 +363,60 @@ class PulpcoreWorker:
363
363
  def iter_tasks(self):
364
364
  """Iterate over ready tasks and yield each task while holding the lock."""
365
365
  while not self.shutdown_requested:
366
- # When batching this query, be sure to use "pulp_created" as a cursor
366
+ # When batching this query, be sure to use "pulp_created" as a cursor.
367
367
  for task in Task.objects.filter(
368
368
  state__in=TASK_INCOMPLETE_STATES,
369
369
  unblocked_at__isnull=False,
370
370
  ).order_by("-immediate", F("pulp_created") + Value(timedelta(seconds=8)) * Random()):
371
- # This code will only be called if we acquired the lock successfully
372
- # The lock will be automatically be released at the end of the block
371
+ # This code will only be called if we acquired the lock successfully.
372
+ # The lock will be automatically be released at the end of the block.
373
373
  with contextlib.suppress(AdvisoryLockError), task:
374
- # Check if someone else changed the task before we got the lock
375
- task.refresh_from_db()
376
-
377
- if task.state == TASK_STATES.CANCELING and task.worker is None:
378
- # No worker picked this task up before being canceled
379
- if self.cancel_abandoned_task(task, TASK_STATES.CANCELED):
380
- # Continue looking for the next task without considering this
381
- # tasks resources, as we just released them
382
- continue
383
- if task.state in [TASK_STATES.RUNNING, TASK_STATES.CANCELING]:
384
- # A running task without a lock must be abandoned
385
- if self.cancel_abandoned_task(
386
- task, TASK_STATES.FAILED, "Worker has gone missing."
374
+ # We got the advisory lock (OLD) now try to get the app_lock (NEW).
375
+ rows = Task.objects.filter(pk=task.pk, app_lock=None).update(
376
+ app_lock=AppStatus.objects.current()
377
+ )
378
+ if rows == 0:
379
+ _logger.error(
380
+ "Acquired advisory lock but missed the app_lock for the task. "
381
+ "This should only happen during the upgrade phase to the new app_lock."
382
+ )
383
+ continue
384
+ try:
385
+ # Check if someone else changed the task before we got the lock.
386
+ task.refresh_from_db()
387
+
388
+ if task.state == TASK_STATES.CANCELING and task.worker is None:
389
+ # No worker picked this task up before being canceled.
390
+ if self.cancel_abandoned_task(task, TASK_STATES.CANCELED):
391
+ # Continue looking for the next task without considering this
392
+ # tasks resources, as we just released them.
393
+ continue
394
+ if task.state in [TASK_STATES.RUNNING, TASK_STATES.CANCELING]:
395
+ # A running task without a lock must be abandoned.
396
+ if self.cancel_abandoned_task(
397
+ task, TASK_STATES.FAILED, "Worker has gone missing."
398
+ ):
399
+ # Continue looking for the next task without considering this
400
+ # tasks resources, as we just released them.
401
+ continue
402
+
403
+ # This statement is using lazy evaluation.
404
+ if (
405
+ task.state == TASK_STATES.WAITING
406
+ and task.unblocked_at is not None
407
+ and self.is_compatible(task)
387
408
  ):
388
- # Continue looking for the next task without considering this
389
- # tasks resources, as we just released them
390
- continue
391
-
392
- # This statement is using lazy evaluation
393
- if (
394
- task.state == TASK_STATES.WAITING
395
- and task.unblocked_at is not None
396
- and self.is_compatible(task)
397
- ):
398
- yield task
399
- # Start from the top of the Task list
400
- break
409
+ yield task
410
+ # Start from the top of the Task list.
411
+ break
412
+ finally:
413
+ rows = Task.objects.filter(
414
+ pk=task.pk, app_lock=AppStatus.objects.current()
415
+ ).update(app_lock=None)
416
+ if rows != 1:
417
+ raise RuntimeError(
418
+ "Something other than us is messing around with locks."
419
+ )
401
420
  else:
402
421
  # No task found in the for-loop
403
422
  break