pulpcore 3.85.1__tar.gz → 3.87.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 (464) hide show
  1. {pulpcore-3.85.1 → pulpcore-3.87.0}/CHANGES.md +61 -0
  2. {pulpcore-3.85.1 → pulpcore-3.87.0}/PKG-INFO +3 -3
  3. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/app/__init__.py +1 -1
  4. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/__init__.py +1 -1
  5. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/apps.py +1 -1
  6. pulpcore-3.87.0/pulpcore/app/management/commands/optimizemigration.py +84 -0
  7. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/remove-plugin.py +2 -5
  8. pulpcore-3.87.0/pulpcore/app/migrations/0139_task_app_lock.py +19 -0
  9. pulpcore-3.87.0/pulpcore/app/migrations/0140_require_appstatus_zdu.py +15 -0
  10. pulpcore-3.87.0/pulpcore/app/migrations/0141_alter_appstatus_name.py +18 -0
  11. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/status.py +20 -25
  12. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/task.py +6 -1
  13. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/status.py +18 -8
  14. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/task.py +1 -29
  15. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/settings.py +12 -0
  16. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/analytics.py +3 -4
  17. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/importer.py +2 -2
  18. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/views/status.py +5 -6
  19. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/task.py +14 -5
  20. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/middleware.py +37 -10
  21. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/openapi/__init__.py +1 -1
  22. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/repo_version_utils.py +8 -2
  23. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/pytest_plugin.py +6 -4
  24. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tasking/tasks.py +16 -15
  25. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tasking/worker.py +59 -41
  26. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_tasking.py +14 -51
  27. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_workers.py +1 -2
  28. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/content/test_heartbeat.py +2 -1
  29. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/models/test_repository.py +84 -1
  30. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore.egg-info/PKG-INFO +3 -3
  31. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore.egg-info/SOURCES.txt +4 -0
  32. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore.egg-info/requires.txt +2 -2
  33. {pulpcore-3.85.1 → pulpcore-3.87.0}/pyproject.toml +4 -4
  34. {pulpcore-3.85.1 → pulpcore-3.87.0}/CODE_OF_CONDUCT.md +0 -0
  35. {pulpcore-3.85.1 → pulpcore-3.87.0}/COMMITMENT +0 -0
  36. {pulpcore-3.85.1 → pulpcore-3.87.0}/CONTRIBUTING.md +0 -0
  37. {pulpcore-3.85.1 → pulpcore-3.87.0}/COPYRIGHT +0 -0
  38. {pulpcore-3.85.1 → pulpcore-3.87.0}/LICENSE +0 -0
  39. {pulpcore-3.85.1 → pulpcore-3.87.0}/MANIFEST.in +0 -0
  40. {pulpcore-3.85.1 → pulpcore-3.87.0}/README.md +0 -0
  41. {pulpcore-3.85.1 → pulpcore-3.87.0}/ci_requirements.txt +0 -0
  42. {pulpcore-3.85.1 → pulpcore-3.87.0}/functest_requirements.txt +0 -0
  43. {pulpcore-3.85.1 → pulpcore-3.87.0}/manage.py +0 -0
  44. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/__init__.py +0 -0
  45. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/app/migrations/0001_initial.py +0 -0
  46. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
  47. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/app/migrations/__init__.py +0 -0
  48. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/app/models.py +0 -0
  49. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/app/serializers.py +0 -0
  50. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/app/viewsets.py +0 -0
  51. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/pytest_plugin.py +0 -0
  52. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/rhsm/__init__.py +0 -0
  53. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
  54. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/__init__.py +0 -0
  55. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/__init__.py +0 -0
  56. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/api/__init__.py +0 -0
  57. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
  58. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
  59. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
  60. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
  61. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
  62. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
  63. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
  64. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
  65. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
  66. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
  67. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
  68. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
  69. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
  70. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
  71. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
  72. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
  73. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
  74. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
  75. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
  76. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
  77. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
  78. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
  79. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
  80. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
  81. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
  82. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
  83. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
  84. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
  85. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
  86. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
  87. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
  88. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/conftest.py +0 -0
  89. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/functional/constants.py +0 -0
  90. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/unit/__init__.py +0 -0
  91. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/unit/certdata.py +0 -0
  92. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
  93. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/__init__.py +0 -0
  94. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
  95. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
  96. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/migrations/__init__.py +0 -0
  97. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/modelresource.py +0 -0
  98. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/models.py +0 -0
  99. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/replica.py +0 -0
  100. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/serializers.py +0 -0
  101. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/tasks/__init__.py +0 -0
  102. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/tasks/publishing.py +0 -0
  103. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/tasks/synchronizing.py +0 -0
  104. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/app/viewsets.py +0 -0
  105. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/manifest.py +0 -0
  106. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/pytest_plugin.py +0 -0
  107. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/__init__.py +0 -0
  108. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/__init__.py +0 -0
  109. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/__init__.py +0 -0
  110. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_acs.py +0 -0
  111. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
  112. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
  113. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
  114. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
  115. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
  116. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_domains.py +0 -0
  117. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
  118. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
  119. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_labels.py +0 -0
  120. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
  121. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_publish.py +0 -0
  122. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
  123. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_rbac.py +0 -0
  124. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
  125. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/functional/api/test_sync.py +0 -0
  126. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/unit/__init__.py +0 -0
  127. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/unit/test_safe_paths.py +0 -0
  128. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulp_file/tests/unit/test_serializers.py +0 -0
  129. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/__init__.py +0 -0
  130. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/__init__.py +0 -0
  131. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/access_policy.py +0 -0
  132. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/authentication.py +0 -0
  133. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/checks.py +0 -0
  134. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/entrypoint.py +0 -0
  135. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/files.py +0 -0
  136. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/global_access_conditions.py +0 -0
  137. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/importexport.py +0 -0
  138. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/loggers.py +0 -0
  139. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/manage.py +0 -0
  140. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/__init__.py +0 -0
  141. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/__init__.py +0 -0
  142. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/add-signing-service.py +0 -0
  143. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/analyze-publication.py +0 -0
  144. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
  145. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
  146. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/dump-permissions.py +0 -0
  147. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
  148. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
  149. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/migrationstat.py +0 -0
  150. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/openapi.py +0 -0
  151. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
  152. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
  153. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/repository-size.py +0 -0
  154. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
  155. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
  156. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
  157. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0091_systemid.py +0 -0
  158. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
  159. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
  160. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
  161. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
  162. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
  163. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
  164. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
  165. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0099_versions_field.py +0 -0
  166. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
  167. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0101_add_domain.py +0 -0
  168. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
  169. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
  170. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0104_delete_label.py +0 -0
  171. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
  172. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
  173. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
  174. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0108_task_versions.py +0 -0
  175. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
  176. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
  177. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
  178. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
  179. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
  180. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
  181. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
  182. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
  183. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
  184. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
  185. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
  186. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
  187. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
  188. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
  189. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
  190. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
  191. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
  192. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
  193. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
  194. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
  195. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
  196. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
  197. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
  198. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
  199. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
  200. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
  201. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
  202. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
  203. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
  204. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0137_appstatus.py +0 -0
  205. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
  206. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/migrations/__init__.py +0 -0
  207. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/mime_types.py +0 -0
  208. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/modelresource.py +0 -0
  209. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/__init__.py +0 -0
  210. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/access_policy.py +0 -0
  211. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/acs.py +0 -0
  212. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/analytics.py +0 -0
  213. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/base.py +0 -0
  214. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/content.py +0 -0
  215. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/domain.py +0 -0
  216. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/exporter.py +0 -0
  217. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/fields.py +0 -0
  218. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/generic.py +0 -0
  219. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/importer.py +0 -0
  220. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/openpgp.py +0 -0
  221. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/progress.py +0 -0
  222. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/publication.py +0 -0
  223. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/replica.py +0 -0
  224. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/repository.py +0 -0
  225. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/role.py +0 -0
  226. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/storage.py +0 -0
  227. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/upload.py +0 -0
  228. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/models/vulnerability_report.py +0 -0
  229. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/netutil.py +0 -0
  230. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/openpgp.py +0 -0
  231. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/protobuf/__init__.py +0 -0
  232. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
  233. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/pulp_hashlib.py +0 -0
  234. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
  235. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/redis_connection.py +0 -0
  236. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/replica.py +0 -0
  237. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/response.py +0 -0
  238. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/role_util.py +0 -0
  239. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/__init__.py +0 -0
  240. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/access_policy.py +0 -0
  241. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/acs.py +0 -0
  242. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/base.py +0 -0
  243. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/content.py +0 -0
  244. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/domain.py +0 -0
  245. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/exporter.py +0 -0
  246. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/fields.py +0 -0
  247. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/importer.py +0 -0
  248. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/openpgp.py +0 -0
  249. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/orphans.py +0 -0
  250. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/progress.py +0 -0
  251. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/publication.py +0 -0
  252. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/purge.py +0 -0
  253. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/reclaim.py +0 -0
  254. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/repair.py +0 -0
  255. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/replica.py +0 -0
  256. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/repository.py +0 -0
  257. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/upload.py +0 -0
  258. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/user.py +0 -0
  259. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/serializers/vulnerability_report.py +0 -0
  260. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/__init__.py +0 -0
  261. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/base.py +0 -0
  262. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/export.py +0 -0
  263. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/migrate.py +0 -0
  264. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/orphan.py +0 -0
  265. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/purge.py +0 -0
  266. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/reclaim_space.py +0 -0
  267. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/replica.py +0 -0
  268. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/repository.py +0 -0
  269. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/telemetry.py +0 -0
  270. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/test.py +0 -0
  271. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/upload.py +0 -0
  272. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/tasks/vulnerability_report.py +0 -0
  273. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/templates/rest_framework/api.html +0 -0
  274. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/templatetags/__init__.py +0 -0
  275. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/templatetags/pulp_urls.py +0 -0
  276. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/urls.py +0 -0
  277. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/util.py +0 -0
  278. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/views/__init__.py +0 -0
  279. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/views/importer.py +0 -0
  280. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/views/orphans.py +0 -0
  281. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/views/repair.py +0 -0
  282. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/__init__.py +0 -0
  283. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/access_policy.py +0 -0
  284. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/acs.py +0 -0
  285. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/base.py +0 -0
  286. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/content.py +0 -0
  287. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/custom_filters.py +0 -0
  288. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/domain.py +0 -0
  289. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/exporter.py +0 -0
  290. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/importer.py +0 -0
  291. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/openpgp.py +0 -0
  292. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/orphans.py +0 -0
  293. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/publication.py +0 -0
  294. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/reclaim.py +0 -0
  295. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/replica.py +0 -0
  296. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/repository.py +0 -0
  297. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/upload.py +0 -0
  298. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/user.py +0 -0
  299. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
  300. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/app/wsgi.py +0 -0
  301. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/backends.py +0 -0
  302. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/cache/__init__.py +0 -0
  303. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/cache/cache.py +0 -0
  304. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/constants.py +0 -0
  305. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/content/__init__.py +0 -0
  306. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/content/authentication.py +0 -0
  307. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/content/entrypoint.py +0 -0
  308. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/content/handler.py +0 -0
  309. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/content/instrumentation.py +0 -0
  310. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/download/__init__.py +0 -0
  311. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/download/base.py +0 -0
  312. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/download/factory.py +0 -0
  313. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/download/file.py +0 -0
  314. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/download/http.py +0 -0
  315. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/exceptions/__init__.py +0 -0
  316. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/exceptions/base.py +0 -0
  317. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/exceptions/plugin.py +0 -0
  318. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/exceptions/validation.py +0 -0
  319. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/filters.py +0 -0
  320. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/metrics.py +0 -0
  321. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/migrations.py +0 -0
  322. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/openapi/hooks.py +0 -0
  323. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/__init__.py +0 -0
  324. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/access_policy.py +0 -0
  325. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/actions.py +0 -0
  326. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/apps.py +0 -0
  327. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/authentication/__init__.py +0 -0
  328. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/cache/__init__.py +0 -0
  329. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/constants.py +0 -0
  330. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/content.py +0 -0
  331. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/download/__init__.py +0 -0
  332. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/exceptions.py +0 -0
  333. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/files.py +0 -0
  334. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/importexport.py +0 -0
  335. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/migrations.py +0 -0
  336. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/modelresources.py +0 -0
  337. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/models/__init__.py +0 -0
  338. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/models/role.py +0 -0
  339. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/publication_utils.py +0 -0
  340. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/pulp_hashlib.py +0 -0
  341. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/replica.py +0 -0
  342. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/responses.py +0 -0
  343. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/serializers/__init__.py +0 -0
  344. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/serializers/content.py +0 -0
  345. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/stages/__init__.py +0 -0
  346. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/stages/api.py +0 -0
  347. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/stages/artifact_stages.py +0 -0
  348. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/stages/content_stages.py +0 -0
  349. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/stages/declarative_version.py +0 -0
  350. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/stages/models.py +0 -0
  351. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/storage.py +0 -0
  352. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/sync.py +0 -0
  353. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/tasking.py +0 -0
  354. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/util.py +0 -0
  355. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/viewsets/__init__.py +0 -0
  356. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/plugin/viewsets/content.py +0 -0
  357. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/responses.py +0 -0
  358. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tasking/__init__.py +0 -0
  359. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tasking/_util.py +0 -0
  360. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tasking/entrypoint.py +0 -0
  361. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tasking/kafka.py +0 -0
  362. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tasking/storage.py +0 -0
  363. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/__init__.py +0 -0
  364. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/__init__.py +0 -0
  365. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/__init__.py +0 -0
  366. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
  367. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
  368. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
  369. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
  370. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_auth.py +0 -0
  371. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
  372. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
  373. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
  374. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_filter.py +0 -0
  375. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_login.py +0 -0
  376. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
  377. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
  378. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_replication.py +0 -0
  379. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_repos.py +0 -0
  380. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_role.py +0 -0
  381. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
  382. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_scoping.py +0 -0
  383. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
  384. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_status.py +0 -0
  385. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
  386. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_upload.py +0 -0
  387. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
  388. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
  389. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
  390. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
  391. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
  392. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
  393. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
  394. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
  395. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
  396. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
  397. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
  398. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
  399. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
  400. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
  401. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
  402. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
  403. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
  404. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
  405. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
  406. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
  407. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
  408. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
  409. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
  410. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
  411. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
  412. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/assets/__init__.py +0 -0
  413. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/content_with_coverage.py +0 -0
  414. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/functional/utils.py +0 -0
  415. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/performance/__init__.py +0 -0
  416. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/performance/test_performance.py +0 -0
  417. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/__init__.py +0 -0
  418. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/conftest.py +0 -0
  419. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/content/__init__.py +0 -0
  420. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/content/test_handler.py +0 -0
  421. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/download/__init__.py +0 -0
  422. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
  423. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
  424. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/metrics/__init__.py +0 -0
  425. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/metrics/conftest.py +0 -0
  426. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
  427. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
  428. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/migration/__init__.py +0 -0
  429. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/models/__init__.py +0 -0
  430. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/models/test_base.py +0 -0
  431. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/models/test_content.py +0 -0
  432. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/models/test_remote.py +0 -0
  433. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/models/test_task.py +0 -0
  434. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/roles/__init__.py +0 -0
  435. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/roles/test_roles.py +0 -0
  436. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/serializers/__init__.py +0 -0
  437. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/serializers/test_base.py +0 -0
  438. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
  439. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
  440. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
  441. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
  442. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
  443. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/serializers/test_user.py +0 -0
  444. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/stages/__init__.py +0 -0
  445. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
  446. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/stages/test_stages.py +0 -0
  447. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_cache.py +0 -0
  448. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_chunked_file.py +0 -0
  449. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_content_guard.py +0 -0
  450. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_files.py +0 -0
  451. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_import_checks.py +0 -0
  452. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
  453. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_settings.py +0 -0
  454. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_util.py +0 -0
  455. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_viewsets.py +0 -0
  456. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
  457. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
  458. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
  459. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore.egg-info/dependency_links.txt +0 -0
  460. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore.egg-info/entry_points.txt +0 -0
  461. {pulpcore-3.85.1 → pulpcore-3.87.0}/pulpcore.egg-info/top_level.txt +0 -0
  462. {pulpcore-3.85.1 → pulpcore-3.87.0}/setup.cfg +0 -0
  463. {pulpcore-3.85.1 → pulpcore-3.87.0}/test_requirements.txt +0 -0
  464. {pulpcore-3.85.1 → pulpcore-3.87.0}/unittest_requirements.txt +0 -0
@@ -8,6 +8,67 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
+ ## 3.87.0 (2025-08-29) {: #3.87.0 }
12
+
13
+ ### REST API {: #3.87.0-rest-api }
14
+
15
+ #### Bugfixes {: #3.87.0-rest-api-bugfix }
16
+
17
+ - Fixed apps crashing in a loop on restart with the same name.
18
+ [#6880](https://github.com/pulp/pulpcore/issues/6880)
19
+
20
+ ### Plugin API {: #3.87.0-plugin-api }
21
+
22
+ No significant changes.
23
+
24
+ ### Pulp File {: #3.87.0-pulp-file }
25
+
26
+ No significant changes.
27
+
28
+ ### Pulp Cert Guard {: #3.87.0-pulp-cert-guard }
29
+
30
+ No significant changes.
31
+
32
+ ---
33
+
34
+ ## 3.86.0 (2025-08-21) {: #3.86.0 }
35
+
36
+ ### REST API {: #3.86.0-rest-api }
37
+
38
+ #### Features {: #3.86.0-rest-api-feature }
39
+
40
+ - Added a configurable bucket boundary for API request duration metric using the OTEL_PULP_API_HISTOGRAM_BUCKETS setting.
41
+ [#6845](https://github.com/pulp/pulpcore/issues/6845)
42
+
43
+ #### Bugfixes {: #3.86.0-rest-api-bugfix }
44
+
45
+ - Made DjangoMetricsMiddleware aware of OTEL urls exclusion envvars.
46
+ [#6843](https://github.com/pulp/pulpcore/issues/6843)
47
+ - Fixed repository version validation to allow legitimate shared artifacts between content units.
48
+ [#6868](https://github.com/pulp/pulpcore/issues/6868)
49
+ - Fixed a bug that prevents migrations from running.
50
+
51
+ #### Improved Documentation {: #3.86.0-rest-api-doc }
52
+
53
+ - Updated documentation for the TASK_DIAGNOSTICS setting.
54
+ [#6854](https://github.com/pulp/pulpcore/issues/6854)
55
+
56
+ ### Plugin API {: #3.86.0-plugin-api }
57
+
58
+ #### Removals {: #3.86.0-plugin-api-removal }
59
+
60
+ - Removed support for synchronous immediate tasks.
61
+
62
+ ### Pulp File {: #3.86.0-pulp-file }
63
+
64
+ No significant changes.
65
+
66
+ ### Pulp Cert Guard {: #3.86.0-pulp-cert-guard }
67
+
68
+ No significant changes.
69
+
70
+ ---
71
+
11
72
  ## 3.85.1 (2025-08-12) {: #3.85.1 }
12
73
 
13
74
  ### REST API {: #3.85.1-rest-api }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulpcore
3
- Version: 3.85.1
3
+ Version: 3.87.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,12 +45,12 @@ 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
52
52
  Requires-Dist: pyparsing<3.3,>=3.1.0
53
- Requires-Dist: python-gnupg<=0.5.4,>=0.5
53
+ Requires-Dist: python-gnupg<0.6,>=0.5.0
54
54
  Requires-Dist: PyYAML<6.1,>=5.1.1
55
55
  Requires-Dist: redis<6.5,>=4.3.0
56
56
  Requires-Dist: tablib<3.6,>=3.5.0
@@ -6,6 +6,6 @@ class PulpCertGuardPluginAppConfig(PulpPluginAppConfig):
6
6
 
7
7
  name = "pulp_certguard.app"
8
8
  label = "certguard"
9
- version = "3.85.1"
9
+ version = "3.87.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.1"
11
+ version = "3.87.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.1"
242
+ version = "3.87.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."))
@@ -11,7 +11,7 @@ from django.contrib.contenttypes.models import ContentType
11
11
  from django.core.management import BaseCommand, call_command, CommandError
12
12
 
13
13
  from pulpcore.app.apps import pulp_plugin_configs
14
- from pulpcore.app.models import AccessPolicy, ContentAppStatus, Worker
14
+ from pulpcore.app.models import AccessPolicy, AppStatus
15
15
  from pulpcore.app.models.role import Role
16
16
  from pulpcore.app.util import get_view_urlpattern
17
17
 
@@ -53,10 +53,7 @@ class Command(BaseCommand):
53
53
  "Checking if Pulp services are running, it can take up to {}s...".format(waiting_time)
54
54
  )
55
55
  while is_pulp_running and (time.time() - check_started) < waiting_time:
56
- is_pulp_running = (
57
- ContentAppStatus.objects.online().exists()
58
- or Worker.objects.online_workers().exists()
59
- )
56
+ is_pulp_running = AppStatus.objects.online().exists()
60
57
  time.sleep(2)
61
58
 
62
59
  if is_pulp_running:
@@ -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
+ ]
@@ -0,0 +1,15 @@
1
+ # Generated by Django 4.2.23 on 2025-08-12 15:20
2
+
3
+ from django.db import migrations
4
+ from pulpcore.migrations import RequireVersion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('core', '0139_task_app_lock'),
11
+ ]
12
+
13
+ operations = [
14
+ RequireVersion("core", "3.85"),
15
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 4.2.23 on 2025-08-27 10:56
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('core', '0140_require_appstatus_zdu'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='appstatus',
15
+ name='name',
16
+ field=models.TextField(),
17
+ ),
18
+ ]
@@ -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,29 +52,32 @@ 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):
56
- if app_type == "api":
57
- old_obj = ApiAppStatus.objects.create(**kwargs)
58
- elif app_type == "worker":
59
- from pulpcore.app.models import Worker
60
-
61
- old_obj = Worker.objects.create(**kwargs)
62
- else:
63
- raise NotImplementedError(f"Invalid app_type: {app_type}")
61
+ if self._current_app_status is not None:
62
+ raise RuntimeError("There is already an app status in this process.")
63
+
64
64
  obj = super().create(app_type=app_type, **kwargs)
65
- obj._old_status = old_obj
65
+ self._current_app_status = obj
66
66
  return obj
67
67
 
68
68
  async def acreate(self, app_type, **kwargs):
69
- if app_type == "content":
70
- old_obj = await ContentAppStatus.objects.acreate(**kwargs)
71
- else:
72
- raise NotImplementedError(f"Invalid app_type: {app_type}")
69
+ if self._current_app_status is not None:
70
+ raise RuntimeError("There is already an app status in this process.")
71
+
73
72
  obj = await super().acreate(app_type=app_type, **kwargs)
74
- obj._old_status = old_obj
73
+ self._current_app_status = obj
75
74
  return obj
76
75
 
76
+ def current(self):
77
+ if self._current_app_status is None:
78
+ raise RuntimeError("There is no current app status.")
79
+ return self._current_app_status
80
+
77
81
  def online(self):
78
82
  """
79
83
  Returns a queryset of objects that are online.
@@ -107,7 +111,7 @@ class AppStatus(BaseModel):
107
111
  objects = _AppStatusManager()
108
112
 
109
113
  app_type = models.CharField(max_length=10, choices=APP_TYPES)
110
- name = models.TextField(db_index=True, unique=True)
114
+ name = models.TextField()
111
115
  versions = HStoreField(default=dict)
112
116
  ttl = models.DurationField(null=False)
113
117
  last_heartbeat = models.DateTimeField(auto_now=True)
@@ -115,13 +119,6 @@ class AppStatus(BaseModel):
115
119
  def __init__(self, *args, **kwargs):
116
120
  super().__init__(*args, **kwargs)
117
121
  self.ttl = timedelta(seconds=self._APP_TTL[self.app_type])
118
- self._old_status = None
119
-
120
- def delete(self, *args, **kwargs):
121
- # adelete will call into this, so we should not replicate that one here.
122
- if self._old_status is not None:
123
- self._old_status.delete(*args, **kwargs)
124
- super().delete(*args, **kwargs)
125
122
 
126
123
  @property
127
124
  def online(self) -> bool:
@@ -153,7 +150,6 @@ class AppStatus(BaseModel):
153
150
  ValueError: When the model instance has never been saved before. This method can
154
151
  only update an existing database record.
155
152
  """
156
- self._old_status.save_heartbeat()
157
153
  self.save(update_fields=["last_heartbeat"])
158
154
 
159
155
  async def asave_heartbeat(self):
@@ -166,7 +162,6 @@ class AppStatus(BaseModel):
166
162
  ValueError: When the model instance has never been saved before. This method can
167
163
  only update an existing database record.
168
164
  """
169
- await self._old_status.asave_heartbeat()
170
165
  await self.asave(update_fields=["last_heartbeat"])
171
166
 
172
167
  @property
@@ -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
@@ -2,11 +2,21 @@ from gettext import gettext as _
2
2
 
3
3
  from rest_framework import serializers
4
4
 
5
- from pulpcore.app.serializers.task import (
6
- ApiAppStatusSerializer,
7
- ContentAppStatusSerializer,
8
- WorkerSerializer,
9
- )
5
+ from pulpcore.app.models import AppStatus
6
+
7
+
8
+ class AppStatusSerializer(serializers.ModelSerializer):
9
+ name = serializers.CharField(help_text=_("The name of the worker."), read_only=True)
10
+ last_heartbeat = serializers.DateTimeField(
11
+ help_text=_("Timestamp of the last time the worker talked to the service."), read_only=True
12
+ )
13
+ versions = serializers.HStoreField(
14
+ help_text=_("Versions of the components installed."), read_only=True
15
+ )
16
+
17
+ class Meta:
18
+ model = AppStatus
19
+ fields = ("name", "last_heartbeat", "versions")
10
20
 
11
21
 
12
22
  class VersionSerializer(serializers.Serializer):
@@ -88,7 +98,7 @@ class StatusSerializer(serializers.Serializer):
88
98
 
89
99
  versions = VersionSerializer(help_text=_("Version information of Pulp components"), many=True)
90
100
 
91
- online_workers = WorkerSerializer(
101
+ online_workers = AppStatusSerializer(
92
102
  help_text=_(
93
103
  "List of online workers known to the application. An online worker is actively "
94
104
  "heartbeating and can respond to new work."
@@ -96,7 +106,7 @@ class StatusSerializer(serializers.Serializer):
96
106
  many=True,
97
107
  )
98
108
 
99
- online_api_apps = ApiAppStatusSerializer(
109
+ online_api_apps = AppStatusSerializer(
100
110
  help_text=_(
101
111
  "List of online api apps known to the application. An online api app "
102
112
  "is actively heartbeating and can serve the rest api to clients."
@@ -104,7 +114,7 @@ class StatusSerializer(serializers.Serializer):
104
114
  many=True,
105
115
  )
106
116
 
107
- online_content_apps = ContentAppStatusSerializer(
117
+ online_content_apps = AppStatusSerializer(
108
118
  help_text=_(
109
119
  "List of online content apps known to the application. An online content app "
110
120
  "is actively heartbeating and can serve data to clients."
@@ -198,34 +198,6 @@ class TaskCancelSerializer(serializers.Serializer):
198
198
  fields = ("state",)
199
199
 
200
200
 
201
- class ApiAppStatusSerializer(ModelSerializer):
202
- name = serializers.CharField(help_text=_("The name of the worker."), read_only=True)
203
- last_heartbeat = serializers.DateTimeField(
204
- help_text=_("Timestamp of the last time the worker talked to the service."), read_only=True
205
- )
206
- versions = serializers.HStoreField(
207
- help_text=_("Versions of the components installed."), read_only=True
208
- )
209
-
210
- class Meta:
211
- model = models.ApiAppStatus
212
- fields = ("name", "last_heartbeat", "versions")
213
-
214
-
215
- class ContentAppStatusSerializer(ModelSerializer):
216
- name = serializers.CharField(help_text=_("The name of the worker."), read_only=True)
217
- last_heartbeat = serializers.DateTimeField(
218
- help_text=_("Timestamp of the last time the worker talked to the service."), read_only=True
219
- )
220
- versions = serializers.HStoreField(
221
- help_text=_("Versions of the components installed."), read_only=True
222
- )
223
-
224
- class Meta:
225
- model = models.ContentAppStatus
226
- fields = ("name", "last_heartbeat", "versions")
227
-
228
-
229
201
  class WorkerSerializer(ModelSerializer):
230
202
  pulp_href = IdentityField(view_name="workers-detail")
231
203
 
@@ -246,7 +218,7 @@ class WorkerSerializer(ModelSerializer):
246
218
  )
247
219
 
248
220
  class Meta:
249
- model = models.Worker
221
+ model = models.AppStatus
250
222
  fields = ModelSerializer.Meta.fields + (
251
223
  "name",
252
224
  "last_heartbeat",
@@ -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
  )
@@ -19,8 +19,7 @@ from google.protobuf.json_format import MessageToJson
19
19
  from pulpcore.app.apps import pulp_plugin_configs
20
20
  from pulpcore.app.models import SystemID, Group, Domain, AccessPolicy
21
21
  from pulpcore.app.models.role import Role
22
- from pulpcore.app.models.status import ContentAppStatus
23
- from pulpcore.app.models.task import Worker
22
+ from pulpcore.app.models.status import AppStatus
24
23
  from pulpcore.app.protobuf.analytics_pb2 import Analytics
25
24
 
26
25
 
@@ -79,13 +78,13 @@ async def _versions_data(analytics):
79
78
 
80
79
 
81
80
  async def _online_content_apps_data(analytics):
82
- online_content_apps_qs = ContentAppStatus.objects.online()
81
+ online_content_apps_qs = AppStatus.objects.online().filter(app_type="content")
83
82
  analytics.online_content_apps.processes = await online_content_apps_qs.acount()
84
83
  analytics.online_content_apps.hosts = await _num_hosts(online_content_apps_qs)
85
84
 
86
85
 
87
86
  async def _online_workers_data(analytics):
88
- online_workers_qs = Worker.objects.online()
87
+ online_workers_qs = AppStatus.objects.online().filter(app_type="worker")
89
88
  analytics.online_workers.processes = await online_workers_qs.acount()
90
89
  analytics.online_workers.hosts = await _num_hosts(online_workers_qs)
91
90
 
@@ -18,6 +18,7 @@ from tablib import Dataset
18
18
  from pulpcore.exceptions.plugin import MissingPlugin
19
19
  from pulpcore.app.apps import get_plugin_config
20
20
  from pulpcore.app.models import (
21
+ AppStatus,
21
22
  Artifact,
22
23
  Content,
23
24
  CreatedResource,
@@ -28,7 +29,6 @@ from pulpcore.app.models import (
28
29
  Repository,
29
30
  Task,
30
31
  TaskGroup,
31
- Worker,
32
32
  )
33
33
  from pulpcore.app.modelresource import (
34
34
  ArtifactResource,
@@ -508,7 +508,7 @@ def pulp_import(importer_pk, path, toc, create_repositories):
508
508
  # By default (setting is not-set), import will continue to use 100% of the available
509
509
  # workers.
510
510
  import_workers_percent = int(settings.get("IMPORT_WORKERS_PERCENT", 100))
511
- total_workers = Worker.objects.online().count()
511
+ total_workers = AppStatus.objects.online().filter(app_type="worker").count()
512
512
  import_workers = max(1, int(total_workers * (import_workers_percent / 100.0)))
513
513
 
514
514
  with open(os.path.join(temp_dir, REPO_FILE), "r") as repo_data_file:
@@ -11,8 +11,7 @@ from collections import namedtuple
11
11
 
12
12
  from pulpcore.app.apps import pulp_plugin_configs
13
13
  from pulpcore.app.models.content import Artifact
14
- from pulpcore.app.models.status import ApiAppStatus, ContentAppStatus
15
- from pulpcore.app.models.task import Worker
14
+ from pulpcore.app.models.status import AppStatus
16
15
  from pulpcore.app.serializers.status import StatusSerializer
17
16
  from pulpcore.app.redis_connection import get_redis_connection
18
17
  from pulpcore.app.util import get_domain
@@ -79,9 +78,9 @@ class StatusView(APIView):
79
78
 
80
79
  db_status = {"connected": self._get_db_conn_status()}
81
80
 
82
- online_workers = Worker.objects.online()
83
- online_api_apps = ApiAppStatus.objects.online()
84
- online_content_apps = ContentAppStatus.objects.online()
81
+ online_workers = AppStatus.objects.online().filter(app_type="worker")
82
+ online_api_apps = AppStatus.objects.online().filter(app_type="api")
83
+ online_content_apps = AppStatus.objects.online().filter(app_type="content")
85
84
 
86
85
  content_settings = {
87
86
  "content_origin": settings.CONTENT_ORIGIN,
@@ -113,7 +112,7 @@ class StatusView(APIView):
113
112
  bool: True if there's a db connection. False otherwise.
114
113
  """
115
114
  try:
116
- Worker.objects.count()
115
+ AppStatus.objects.count()
117
116
  except Exception:
118
117
  _logger.exception(_("Cannot connect to database during status check."))
119
118
  return False