pulpcore 3.86.0__tar.gz → 3.87.1__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.86.0 → pulpcore-3.87.1}/CHANGES.md +46 -0
  2. {pulpcore-3.86.0 → pulpcore-3.87.1}/PKG-INFO +2 -2
  3. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/app/__init__.py +1 -1
  4. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/__init__.py +1 -1
  5. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/apps.py +1 -1
  6. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/remove-plugin.py +2 -5
  7. pulpcore-3.87.1/pulpcore/app/migrations/0140_require_appstatus_zdu.py +15 -0
  8. pulpcore-3.87.1/pulpcore/app/migrations/0141_alter_appstatus_name.py +18 -0
  9. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/status.py +1 -24
  10. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/status.py +18 -8
  11. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/task.py +1 -29
  12. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/analytics.py +3 -4
  13. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/importer.py +2 -2
  14. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/views/status.py +5 -6
  15. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/task.py +14 -5
  16. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/openapi/__init__.py +1 -1
  17. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tasking/worker.py +19 -17
  18. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_tasking.py +4 -40
  19. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore.egg-info/PKG-INFO +2 -2
  20. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore.egg-info/SOURCES.txt +2 -0
  21. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore.egg-info/requires.txt +1 -1
  22. {pulpcore-3.86.0 → pulpcore-3.87.1}/pyproject.toml +3 -3
  23. {pulpcore-3.86.0 → pulpcore-3.87.1}/CODE_OF_CONDUCT.md +0 -0
  24. {pulpcore-3.86.0 → pulpcore-3.87.1}/COMMITMENT +0 -0
  25. {pulpcore-3.86.0 → pulpcore-3.87.1}/CONTRIBUTING.md +0 -0
  26. {pulpcore-3.86.0 → pulpcore-3.87.1}/COPYRIGHT +0 -0
  27. {pulpcore-3.86.0 → pulpcore-3.87.1}/LICENSE +0 -0
  28. {pulpcore-3.86.0 → pulpcore-3.87.1}/MANIFEST.in +0 -0
  29. {pulpcore-3.86.0 → pulpcore-3.87.1}/README.md +0 -0
  30. {pulpcore-3.86.0 → pulpcore-3.87.1}/ci_requirements.txt +0 -0
  31. {pulpcore-3.86.0 → pulpcore-3.87.1}/functest_requirements.txt +0 -0
  32. {pulpcore-3.86.0 → pulpcore-3.87.1}/manage.py +0 -0
  33. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/__init__.py +0 -0
  34. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/app/migrations/0001_initial.py +0 -0
  35. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
  36. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/app/migrations/__init__.py +0 -0
  37. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/app/models.py +0 -0
  38. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/app/serializers.py +0 -0
  39. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/app/viewsets.py +0 -0
  40. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/pytest_plugin.py +0 -0
  41. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/rhsm/__init__.py +0 -0
  42. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
  43. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/__init__.py +0 -0
  44. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/__init__.py +0 -0
  45. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/api/__init__.py +0 -0
  46. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
  47. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
  48. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
  49. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
  50. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
  51. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
  52. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
  53. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
  54. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
  55. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
  56. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
  57. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
  58. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
  59. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
  60. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
  61. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
  62. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
  63. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
  64. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
  65. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
  66. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
  67. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
  68. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
  69. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
  70. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
  71. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
  72. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
  73. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
  74. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
  75. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
  76. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
  77. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/conftest.py +0 -0
  78. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/functional/constants.py +0 -0
  79. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/unit/__init__.py +0 -0
  80. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/unit/certdata.py +0 -0
  81. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
  82. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/__init__.py +0 -0
  83. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
  84. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
  85. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/migrations/__init__.py +0 -0
  86. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/modelresource.py +0 -0
  87. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/models.py +0 -0
  88. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/replica.py +0 -0
  89. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/serializers.py +0 -0
  90. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/tasks/__init__.py +0 -0
  91. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/tasks/publishing.py +0 -0
  92. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/tasks/synchronizing.py +0 -0
  93. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/app/viewsets.py +0 -0
  94. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/manifest.py +0 -0
  95. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/pytest_plugin.py +0 -0
  96. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/__init__.py +0 -0
  97. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/__init__.py +0 -0
  98. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/__init__.py +0 -0
  99. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_acs.py +0 -0
  100. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
  101. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
  102. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
  103. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
  104. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
  105. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_domains.py +0 -0
  106. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
  107. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
  108. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_labels.py +0 -0
  109. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
  110. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_publish.py +0 -0
  111. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
  112. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_rbac.py +0 -0
  113. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
  114. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/functional/api/test_sync.py +0 -0
  115. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/unit/__init__.py +0 -0
  116. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/unit/test_safe_paths.py +0 -0
  117. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulp_file/tests/unit/test_serializers.py +0 -0
  118. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/__init__.py +0 -0
  119. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/__init__.py +0 -0
  120. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/access_policy.py +0 -0
  121. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/authentication.py +0 -0
  122. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/checks.py +0 -0
  123. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/entrypoint.py +0 -0
  124. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/files.py +0 -0
  125. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/global_access_conditions.py +0 -0
  126. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/importexport.py +0 -0
  127. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/loggers.py +0 -0
  128. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/manage.py +0 -0
  129. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/__init__.py +0 -0
  130. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/__init__.py +0 -0
  131. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/add-signing-service.py +0 -0
  132. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/analyze-publication.py +0 -0
  133. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
  134. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
  135. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/dump-permissions.py +0 -0
  136. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
  137. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
  138. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/migrationstat.py +0 -0
  139. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/openapi.py +0 -0
  140. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/optimizemigration.py +0 -0
  141. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
  142. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
  143. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/repository-size.py +0 -0
  144. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
  145. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
  146. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
  147. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0091_systemid.py +0 -0
  148. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
  149. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
  150. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
  151. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
  152. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
  153. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
  154. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
  155. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0099_versions_field.py +0 -0
  156. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
  157. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0101_add_domain.py +0 -0
  158. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
  159. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
  160. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0104_delete_label.py +0 -0
  161. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
  162. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
  163. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
  164. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0108_task_versions.py +0 -0
  165. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
  166. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
  167. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
  168. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
  169. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
  170. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
  171. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
  172. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
  173. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
  174. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
  175. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
  176. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
  177. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
  178. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
  179. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
  180. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
  181. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
  182. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
  183. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
  184. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
  185. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
  186. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
  187. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
  188. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
  189. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
  190. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
  191. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
  192. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
  193. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
  194. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0137_appstatus.py +0 -0
  195. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
  196. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/0139_task_app_lock.py +0 -0
  197. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/migrations/__init__.py +0 -0
  198. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/mime_types.py +0 -0
  199. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/modelresource.py +0 -0
  200. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/__init__.py +0 -0
  201. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/access_policy.py +0 -0
  202. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/acs.py +0 -0
  203. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/analytics.py +0 -0
  204. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/base.py +0 -0
  205. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/content.py +0 -0
  206. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/domain.py +0 -0
  207. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/exporter.py +0 -0
  208. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/fields.py +0 -0
  209. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/generic.py +0 -0
  210. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/importer.py +0 -0
  211. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/openpgp.py +0 -0
  212. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/progress.py +0 -0
  213. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/publication.py +0 -0
  214. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/replica.py +0 -0
  215. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/repository.py +0 -0
  216. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/role.py +0 -0
  217. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/storage.py +0 -0
  218. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/task.py +0 -0
  219. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/upload.py +0 -0
  220. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/models/vulnerability_report.py +0 -0
  221. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/netutil.py +0 -0
  222. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/openpgp.py +0 -0
  223. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/protobuf/__init__.py +0 -0
  224. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
  225. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/pulp_hashlib.py +0 -0
  226. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
  227. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/redis_connection.py +0 -0
  228. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/replica.py +0 -0
  229. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/response.py +0 -0
  230. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/role_util.py +0 -0
  231. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/__init__.py +0 -0
  232. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/access_policy.py +0 -0
  233. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/acs.py +0 -0
  234. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/base.py +0 -0
  235. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/content.py +0 -0
  236. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/domain.py +0 -0
  237. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/exporter.py +0 -0
  238. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/fields.py +0 -0
  239. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/importer.py +0 -0
  240. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/openpgp.py +0 -0
  241. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/orphans.py +0 -0
  242. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/progress.py +0 -0
  243. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/publication.py +0 -0
  244. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/purge.py +0 -0
  245. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/reclaim.py +0 -0
  246. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/repair.py +0 -0
  247. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/replica.py +0 -0
  248. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/repository.py +0 -0
  249. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/upload.py +0 -0
  250. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/user.py +0 -0
  251. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/serializers/vulnerability_report.py +0 -0
  252. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/settings.py +0 -0
  253. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/__init__.py +0 -0
  254. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/base.py +0 -0
  255. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/export.py +0 -0
  256. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/migrate.py +0 -0
  257. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/orphan.py +0 -0
  258. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/purge.py +0 -0
  259. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/reclaim_space.py +0 -0
  260. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/replica.py +0 -0
  261. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/repository.py +0 -0
  262. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/telemetry.py +0 -0
  263. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/test.py +0 -0
  264. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/upload.py +0 -0
  265. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/tasks/vulnerability_report.py +0 -0
  266. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/templates/rest_framework/api.html +0 -0
  267. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/templatetags/__init__.py +0 -0
  268. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/templatetags/pulp_urls.py +0 -0
  269. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/urls.py +0 -0
  270. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/util.py +0 -0
  271. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/views/__init__.py +0 -0
  272. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/views/importer.py +0 -0
  273. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/views/orphans.py +0 -0
  274. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/views/repair.py +0 -0
  275. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/__init__.py +0 -0
  276. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/access_policy.py +0 -0
  277. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/acs.py +0 -0
  278. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/base.py +0 -0
  279. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/content.py +0 -0
  280. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/custom_filters.py +0 -0
  281. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/domain.py +0 -0
  282. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/exporter.py +0 -0
  283. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/importer.py +0 -0
  284. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/openpgp.py +0 -0
  285. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/orphans.py +0 -0
  286. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/publication.py +0 -0
  287. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/reclaim.py +0 -0
  288. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/replica.py +0 -0
  289. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/repository.py +0 -0
  290. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/upload.py +0 -0
  291. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/user.py +0 -0
  292. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
  293. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/app/wsgi.py +0 -0
  294. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/backends.py +0 -0
  295. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/cache/__init__.py +0 -0
  296. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/cache/cache.py +0 -0
  297. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/constants.py +0 -0
  298. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/content/__init__.py +0 -0
  299. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/content/authentication.py +0 -0
  300. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/content/entrypoint.py +0 -0
  301. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/content/handler.py +0 -0
  302. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/content/instrumentation.py +0 -0
  303. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/download/__init__.py +0 -0
  304. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/download/base.py +0 -0
  305. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/download/factory.py +0 -0
  306. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/download/file.py +0 -0
  307. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/download/http.py +0 -0
  308. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/exceptions/__init__.py +0 -0
  309. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/exceptions/base.py +0 -0
  310. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/exceptions/plugin.py +0 -0
  311. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/exceptions/validation.py +0 -0
  312. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/filters.py +0 -0
  313. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/metrics.py +0 -0
  314. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/middleware.py +0 -0
  315. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/migrations.py +0 -0
  316. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/openapi/hooks.py +0 -0
  317. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/__init__.py +0 -0
  318. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/access_policy.py +0 -0
  319. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/actions.py +0 -0
  320. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/apps.py +0 -0
  321. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/authentication/__init__.py +0 -0
  322. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/cache/__init__.py +0 -0
  323. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/constants.py +0 -0
  324. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/content.py +0 -0
  325. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/download/__init__.py +0 -0
  326. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/exceptions.py +0 -0
  327. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/files.py +0 -0
  328. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/importexport.py +0 -0
  329. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/migrations.py +0 -0
  330. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/modelresources.py +0 -0
  331. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/models/__init__.py +0 -0
  332. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/models/role.py +0 -0
  333. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/publication_utils.py +0 -0
  334. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/pulp_hashlib.py +0 -0
  335. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/replica.py +0 -0
  336. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/repo_version_utils.py +0 -0
  337. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/responses.py +0 -0
  338. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/serializers/__init__.py +0 -0
  339. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/serializers/content.py +0 -0
  340. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/stages/__init__.py +0 -0
  341. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/stages/api.py +0 -0
  342. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/stages/artifact_stages.py +0 -0
  343. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/stages/content_stages.py +0 -0
  344. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/stages/declarative_version.py +0 -0
  345. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/stages/models.py +0 -0
  346. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/storage.py +0 -0
  347. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/sync.py +0 -0
  348. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/tasking.py +0 -0
  349. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/util.py +0 -0
  350. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/viewsets/__init__.py +0 -0
  351. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/plugin/viewsets/content.py +0 -0
  352. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/pytest_plugin.py +0 -0
  353. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/responses.py +0 -0
  354. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tasking/__init__.py +0 -0
  355. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tasking/_util.py +0 -0
  356. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tasking/entrypoint.py +0 -0
  357. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tasking/kafka.py +0 -0
  358. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tasking/storage.py +0 -0
  359. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tasking/tasks.py +0 -0
  360. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/__init__.py +0 -0
  361. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/__init__.py +0 -0
  362. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/__init__.py +0 -0
  363. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
  364. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
  365. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
  366. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
  367. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_auth.py +0 -0
  368. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
  369. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
  370. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
  371. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_filter.py +0 -0
  372. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_login.py +0 -0
  373. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
  374. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
  375. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_replication.py +0 -0
  376. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_repos.py +0 -0
  377. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_role.py +0 -0
  378. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
  379. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_scoping.py +0 -0
  380. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
  381. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_status.py +0 -0
  382. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
  383. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_upload.py +0 -0
  384. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
  385. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/test_workers.py +0 -0
  386. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
  387. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
  388. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
  389. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
  390. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
  391. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
  392. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
  393. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
  394. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
  395. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
  396. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
  397. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -0
  398. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
  399. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
  400. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
  401. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
  402. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
  403. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
  404. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -0
  405. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
  406. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
  407. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
  408. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
  409. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
  410. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/assets/__init__.py +0 -0
  411. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/content_with_coverage.py +0 -0
  412. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/functional/utils.py +0 -0
  413. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/performance/__init__.py +0 -0
  414. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/performance/test_performance.py +0 -0
  415. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/__init__.py +0 -0
  416. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/conftest.py +0 -0
  417. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/content/__init__.py +0 -0
  418. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/content/test_handler.py +0 -0
  419. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/content/test_heartbeat.py +0 -0
  420. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/download/__init__.py +0 -0
  421. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
  422. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
  423. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/metrics/__init__.py +0 -0
  424. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/metrics/conftest.py +0 -0
  425. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
  426. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
  427. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/migration/__init__.py +0 -0
  428. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/models/__init__.py +0 -0
  429. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/models/test_base.py +0 -0
  430. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/models/test_content.py +0 -0
  431. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/models/test_remote.py +0 -0
  432. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/models/test_repository.py +0 -0
  433. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/models/test_task.py +0 -0
  434. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/roles/__init__.py +0 -0
  435. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/roles/test_roles.py +0 -0
  436. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/serializers/__init__.py +0 -0
  437. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/serializers/test_base.py +0 -0
  438. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
  439. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
  440. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
  441. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
  442. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
  443. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/serializers/test_user.py +0 -0
  444. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/stages/__init__.py +0 -0
  445. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
  446. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/stages/test_stages.py +0 -0
  447. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_cache.py +0 -0
  448. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_chunked_file.py +0 -0
  449. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_content_guard.py +0 -0
  450. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_files.py +0 -0
  451. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_import_checks.py +0 -0
  452. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
  453. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_settings.py +0 -0
  454. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_util.py +0 -0
  455. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_viewsets.py +0 -0
  456. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
  457. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
  458. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
  459. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore.egg-info/dependency_links.txt +0 -0
  460. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore.egg-info/entry_points.txt +0 -0
  461. {pulpcore-3.86.0 → pulpcore-3.87.1}/pulpcore.egg-info/top_level.txt +0 -0
  462. {pulpcore-3.86.0 → pulpcore-3.87.1}/setup.cfg +0 -0
  463. {pulpcore-3.86.0 → pulpcore-3.87.1}/test_requirements.txt +0 -0
  464. {pulpcore-3.86.0 → pulpcore-3.87.1}/unittest_requirements.txt +0 -0
@@ -8,6 +8,52 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
+ ## 3.87.1 (2025-09-03) {: #3.87.1 }
12
+
13
+ ### REST API {: #3.87.1-rest-api }
14
+
15
+ #### Bugfixes {: #3.87.1-rest-api-bugfix }
16
+
17
+ - Fixed error case where worker tried to aquire the app_lock for a Task that was already finished.
18
+ [#6899](https://github.com/pulp/pulpcore/issues/6899)
19
+
20
+ ### Plugin API {: #3.87.1-plugin-api }
21
+
22
+ No significant changes.
23
+
24
+ ### Pulp File {: #3.87.1-pulp-file }
25
+
26
+ No significant changes.
27
+
28
+ ### Pulp Cert Guard {: #3.87.1-pulp-cert-guard }
29
+
30
+ No significant changes.
31
+
32
+ ---
33
+
34
+ ## 3.87.0 (2025-08-29) {: #3.87.0 }
35
+
36
+ ### REST API {: #3.87.0-rest-api }
37
+
38
+ #### Bugfixes {: #3.87.0-rest-api-bugfix }
39
+
40
+ - Fixed apps crashing in a loop on restart with the same name.
41
+ [#6880](https://github.com/pulp/pulpcore/issues/6880)
42
+
43
+ ### Plugin API {: #3.87.0-plugin-api }
44
+
45
+ No significant changes.
46
+
47
+ ### Pulp File {: #3.87.0-pulp-file }
48
+
49
+ No significant changes.
50
+
51
+ ### Pulp Cert Guard {: #3.87.0-pulp-cert-guard }
52
+
53
+ No significant changes.
54
+
55
+ ---
56
+
11
57
  ## 3.86.0 (2025-08-21) {: #3.86.0 }
12
58
 
13
59
  ### REST API {: #3.86.0-rest-api }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulpcore
3
- Version: 3.86.0
3
+ Version: 3.87.1
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
@@ -50,7 +50,7 @@ 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.86.0"
9
+ version = "3.87.1"
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.86.0"
11
+ version = "3.87.1"
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.86.0"
242
+ version = "3.87.1"
243
243
 
244
244
  # The python package name providing this app
245
245
  python_package_name = "pulpcore"
@@ -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,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
+ ]
@@ -61,16 +61,7 @@ class _AppStatusManager(AppStatusManager):
61
61
  if self._current_app_status is not None:
62
62
  raise RuntimeError("There is already an app status in this process.")
63
63
 
64
- if app_type == "api":
65
- old_obj = ApiAppStatus.objects.create(**kwargs)
66
- elif app_type == "worker":
67
- from pulpcore.app.models import Worker
68
-
69
- old_obj = Worker.objects.create(**kwargs)
70
- else:
71
- raise NotImplementedError(f"Invalid app_type: {app_type}")
72
64
  obj = super().create(app_type=app_type, **kwargs)
73
- obj._old_status = old_obj
74
65
  self._current_app_status = obj
75
66
  return obj
76
67
 
@@ -78,12 +69,7 @@ class _AppStatusManager(AppStatusManager):
78
69
  if self._current_app_status is not None:
79
70
  raise RuntimeError("There is already an app status in this process.")
80
71
 
81
- if app_type == "content":
82
- old_obj = await ContentAppStatus.objects.acreate(**kwargs)
83
- else:
84
- raise NotImplementedError(f"Invalid app_type: {app_type}")
85
72
  obj = await super().acreate(app_type=app_type, **kwargs)
86
- obj._old_status = old_obj
87
73
  self._current_app_status = obj
88
74
  return obj
89
75
 
@@ -125,7 +111,7 @@ class AppStatus(BaseModel):
125
111
  objects = _AppStatusManager()
126
112
 
127
113
  app_type = models.CharField(max_length=10, choices=APP_TYPES)
128
- name = models.TextField(db_index=True, unique=True)
114
+ name = models.TextField()
129
115
  versions = HStoreField(default=dict)
130
116
  ttl = models.DurationField(null=False)
131
117
  last_heartbeat = models.DateTimeField(auto_now=True)
@@ -133,13 +119,6 @@ class AppStatus(BaseModel):
133
119
  def __init__(self, *args, **kwargs):
134
120
  super().__init__(*args, **kwargs)
135
121
  self.ttl = timedelta(seconds=self._APP_TTL[self.app_type])
136
- self._old_status = None
137
-
138
- def delete(self, *args, **kwargs):
139
- # adelete will call into this, so we should not replicate that one here.
140
- if self._old_status is not None:
141
- self._old_status.delete(*args, **kwargs)
142
- super().delete(*args, **kwargs)
143
122
 
144
123
  @property
145
124
  def online(self) -> bool:
@@ -171,7 +150,6 @@ class AppStatus(BaseModel):
171
150
  ValueError: When the model instance has never been saved before. This method can
172
151
  only update an existing database record.
173
152
  """
174
- self._old_status.save_heartbeat()
175
153
  self.save(update_fields=["last_heartbeat"])
176
154
 
177
155
  async def asave_heartbeat(self):
@@ -184,7 +162,6 @@ class AppStatus(BaseModel):
184
162
  ValueError: When the model instance has never been saved before. This method can
185
163
  only update an existing database record.
186
164
  """
187
- await self._old_status.asave_heartbeat()
188
165
  await self.asave(update_fields=["last_heartbeat"])
189
166
 
190
167
  @property
@@ -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",
@@ -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
@@ -12,11 +12,11 @@ from rest_framework.serializers import DictField, URLField, ValidationError
12
12
 
13
13
  from pulpcore.filters import BaseFilterSet
14
14
  from pulpcore.app.models import (
15
+ AppStatus,
15
16
  ProfileArtifact,
16
17
  Task,
17
18
  TaskGroup,
18
19
  TaskSchedule,
19
- Worker,
20
20
  CreatedResource,
21
21
  RepositoryVersion,
22
22
  )
@@ -48,6 +48,7 @@ from pulpcore.app.role_util import get_objects_for_user
48
48
 
49
49
  class TaskFilter(BaseFilterSet):
50
50
  created_resources = CreatedResourcesFilter()
51
+ worker = filters.CharFilter(method="worker_filter")
51
52
  # Non model field filters
52
53
  reserved_resources = ReservedResourcesFilter(exclusive=True, shared=True)
53
54
  reserved_resources__in = ReservedResourcesInFilter(exclusive=True, shared=True)
@@ -56,6 +57,13 @@ class TaskFilter(BaseFilterSet):
56
57
  shared_resources = ReservedResourcesFilter(exclusive=False, shared=True)
57
58
  shared_resources__in = ReservedResourcesInFilter(exclusive=False, shared=True)
58
59
 
60
+ def worker_filter(self, queryset, name, value):
61
+ # The worker field on tasks is no longer used.
62
+ if value is None:
63
+ return queryset
64
+ else:
65
+ return queryset.none()
66
+
59
67
  class Meta:
60
68
  model = Task
61
69
  fields = {
@@ -354,14 +362,14 @@ class WorkerFilter(BaseFilterSet):
354
362
  missing = filters.BooleanFilter(method="filter_missing")
355
363
 
356
364
  class Meta:
357
- model = Worker
365
+ model = AppStatus
358
366
  fields = {
359
367
  "name": NAME_FILTER_OPTIONS,
360
368
  "last_heartbeat": DATETIME_FILTER_OPTIONS,
361
369
  }
362
370
 
363
371
  def filter_online(self, queryset, name, value):
364
- online_workers = Worker.objects.online()
372
+ online_workers = AppStatus.objects.online()
365
373
 
366
374
  if value:
367
375
  return queryset.filter(pk__in=online_workers)
@@ -369,7 +377,7 @@ class WorkerFilter(BaseFilterSet):
369
377
  return queryset.exclude(pk__in=online_workers)
370
378
 
371
379
  def filter_missing(self, queryset, name, value):
372
- missing_workers = Worker.objects.missing()
380
+ missing_workers = AppStatus.objects.missing()
373
381
 
374
382
  if value:
375
383
  return queryset.filter(pk__in=missing_workers)
@@ -378,7 +386,8 @@ class WorkerFilter(BaseFilterSet):
378
386
 
379
387
 
380
388
  class WorkerViewSet(NamedModelViewSet, mixins.RetrieveModelMixin, mixins.ListModelMixin):
381
- queryset = Worker.objects.all()
389
+ queryset = AppStatus.objects.filter(app_type="worker")
390
+ pulp_model_alias = "Worker"
382
391
  serializer_class = WorkerSerializer
383
392
  endpoint_name = "workers"
384
393
  http_method_names = ["get", "options"]
@@ -260,7 +260,7 @@ class PulpSchemaGenerator(SchemaGenerator):
260
260
  prefix (str): Optional prefix to add to the slug
261
261
  pulp_model_alias (str): Optional model name to use instead of model.__name__
262
262
  Returns:
263
- str: *pulp_href where * is the model name in all lower case letters
263
+ str: '{model_name_snake_case}_href'
264
264
  """
265
265
  app_label = model._meta.app_label
266
266
  model_name = pulp_model_alias or model.__name__
@@ -77,7 +77,6 @@ class PulpcoreWorker:
77
77
  self.app_status = AppStatus.objects.create(
78
78
  name=self.name, app_type="worker", versions=self.versions
79
79
  )
80
- self.worker = self.app_status._old_status
81
80
  except IntegrityError:
82
81
  _logger.error(f"A worker with name {self.name} already exists in the database.")
83
82
  exit(1)
@@ -184,15 +183,17 @@ class PulpcoreWorker:
184
183
  for app_worker in qs:
185
184
  _logger.info(_("Clean missing %s worker %s."), app_worker.app_type, app_worker.name)
186
185
  qs.delete()
187
- for cls, cls_name in (
188
- (Worker, "pulp"),
189
- (ApiAppStatus, "api"),
190
- (ContentAppStatus, "content"),
191
- ):
192
- qs = cls.objects.missing(age=timedelta(days=7))
193
- for app_worker in qs:
194
- _logger.info(_("Clean missing %s worker %s."), cls_name, app_worker.name)
195
- qs.delete()
186
+ with contextlib.suppress(DatabaseError):
187
+ # By now a migration on a newer release may have deleted these tables already.
188
+ for cls, cls_name in (
189
+ (Worker, "pulp"),
190
+ (ApiAppStatus, "api"),
191
+ (ContentAppStatus, "content"),
192
+ ):
193
+ qs = cls.objects.missing(age=timedelta(days=7))
194
+ for app_worker in qs:
195
+ _logger.info(_("Clean missing %s worker %s."), cls_name, app_worker.name)
196
+ qs.delete()
196
197
 
197
198
  def beat(self):
198
199
  if self.app_status.last_heartbeat < timezone.now() - self.heartbeat_period:
@@ -367,10 +368,15 @@ class PulpcoreWorker:
367
368
  for task in Task.objects.filter(
368
369
  state__in=TASK_INCOMPLETE_STATES,
369
370
  unblocked_at__isnull=False,
371
+ app_lock__isnull=True,
370
372
  ).order_by("-immediate", F("pulp_created") + Value(timedelta(seconds=8)) * Random()):
371
373
  # This code will only be called if we acquired the lock successfully.
372
374
  # The lock will be automatically be released at the end of the block.
373
375
  with contextlib.suppress(AdvisoryLockError), task:
376
+ # Check if someone else changed the task before we got the lock.
377
+ task.refresh_from_db()
378
+ if task.state not in TASK_INCOMPLETE_STATES:
379
+ continue
374
380
  # We got the advisory lock (OLD) now try to get the app_lock (NEW).
375
381
  rows = Task.objects.filter(pk=task.pk, app_lock=None).update(
376
382
  app_lock=AppStatus.objects.current()
@@ -379,19 +385,17 @@ class PulpcoreWorker:
379
385
  _logger.error(
380
386
  "Acquired advisory lock but missed the app_lock for the task. "
381
387
  "This should only happen during the upgrade phase to the new app_lock."
388
+ f"Task: {task.pk=}, {task.state=}, {task.app_lock=}."
382
389
  )
383
390
  continue
384
391
  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:
392
+ if task.state == TASK_STATES.CANCELING:
389
393
  # No worker picked this task up before being canceled.
390
394
  if self.cancel_abandoned_task(task, TASK_STATES.CANCELED):
391
395
  # Continue looking for the next task without considering this
392
396
  # tasks resources, as we just released them.
393
397
  continue
394
- if task.state in [TASK_STATES.RUNNING, TASK_STATES.CANCELING]:
398
+ if task.state == TASK_STATES.RUNNING:
395
399
  # A running task without a lock must be abandoned.
396
400
  if self.cancel_abandoned_task(
397
401
  task, TASK_STATES.FAILED, "Worker has gone missing."
@@ -445,8 +449,6 @@ class PulpcoreWorker:
445
449
 
446
450
  self.cancel_task = False
447
451
  self.task = task
448
- task.worker = self.worker
449
- task.save(update_fields=["worker"])
450
452
  cancel_state = None
451
453
  cancel_reason = None
452
454
  domain = task.pulp_domain
@@ -230,25 +230,6 @@ def test_retrieve_task_with_minimal_fields(task, bindings_cfg):
230
230
  assert unexpected_fields.isdisjoint(returned_fields)
231
231
 
232
232
 
233
- @pytest.mark.parallel
234
- def test_retrieve_task_using_invalid_worker(pulpcore_bindings):
235
- """Expects to raise an exception when using invalid worker value as filter."""
236
-
237
- with pytest.raises(ApiException) as ctx:
238
- pulpcore_bindings.TasksApi.list(worker=str(uuid4()))
239
-
240
- assert ctx.value.status == 400
241
-
242
-
243
- @pytest.mark.parallel
244
- def test_retrieve_task_using_valid_worker(task, pulpcore_bindings):
245
- """Expects to retrieve a task using a valid worker URI as filter."""
246
-
247
- response = pulpcore_bindings.TasksApi.list(worker=task.worker)
248
-
249
- assert response.results and response.count
250
-
251
-
252
233
  @pytest.mark.parallel
253
234
  def test_retrieve_task_using_valid_date(task, pulpcore_bindings):
254
235
  """Expects to retrieve a task using a valid date."""
@@ -278,22 +259,6 @@ def test_search_task_using_an_invalid_name(pulpcore_bindings):
278
259
  assert not search_results.results and not search_results.count
279
260
 
280
261
 
281
- @pytest.mark.parallel
282
- def test_filter_tasks_using_worker__in_filter(pulpcore_bindings, dispatch_task, monitor_task):
283
- task1_href = dispatch_task("pulpcore.app.tasks.test.sleep", args=(0,))
284
- task2_href = dispatch_task("pulpcore.app.tasks.test.sleep", args=(0,))
285
-
286
- task1 = monitor_task(task1_href)
287
- task2 = monitor_task(task2_href)
288
-
289
- search_results = pulpcore_bindings.TasksApi.list(worker__in=(task1.worker, task2.worker))
290
-
291
- tasks_hrefs = [task.pulp_href for task in search_results.results]
292
-
293
- assert task1_href in tasks_hrefs
294
- assert task2_href in tasks_hrefs
295
-
296
-
297
262
  @pytest.mark.parallel
298
263
  def test_filter_tasks_using_pulp_created_filter(pulpcore_bindings, dispatch_task):
299
264
 
@@ -487,7 +452,6 @@ class TestImmediateTaskWithNoResource:
487
452
  )
488
453
  task = pulpcore_bindings.TasksApi.read(task_href)
489
454
  assert task.state == "completed"
490
- assert task.worker is None
491
455
 
492
456
  @pytest.mark.parallel
493
457
  def test_executes_on_api_worker_when_no_async(
@@ -519,7 +483,7 @@ class TestImmediateTaskWithNoResource:
519
483
  "pulpcore.app.tasks.test.asleep", args=(GT_TIMEOUT,), immediate=True
520
484
  )
521
485
  task = pulpcore_bindings.TasksApi.read(task_href)
522
- assert task.worker is None
486
+ assert task.state == "failed"
523
487
  assert "task timed out after" in task.error["description"]
524
488
 
525
489
 
@@ -555,7 +519,7 @@ class TestImmediateTaskWithBlockedResource:
555
519
  """
556
520
  GIVEN an async task requiring busy resources
557
521
  WHEN dispatching a task as immediate
558
- THEN the task completes with a worker
522
+ THEN the task returns as waiting first
559
523
  """
560
524
  COMMON_RESOURCE = str(uuid4())
561
525
  with resource_blocker(exclusive_resources=[COMMON_RESOURCE]):
@@ -565,9 +529,10 @@ class TestImmediateTaskWithBlockedResource:
565
529
  immediate=True,
566
530
  exclusive_resources=[COMMON_RESOURCE],
567
531
  )
532
+ task = pulpcore_bindings.TasksApi.read(task_href)
533
+ assert task.state == "waiting"
568
534
  task = monitor_task(task_href)
569
535
  assert task.state == "completed"
570
- assert task.worker is not None
571
536
 
572
537
  @pytest.mark.parallel
573
538
  def test_throws_when_non_deferrable(
@@ -589,7 +554,6 @@ class TestImmediateTaskWithBlockedResource:
589
554
  )
590
555
  task = pulpcore_bindings.TasksApi.read(task_href)
591
556
  assert task.state == "canceled"
592
- assert task.worker is None
593
557
  assert "Resources temporarily unavailable." in task.error["reason"]
594
558
 
595
559
  @pytest.mark.parallel