pulpcore 3.90.0__tar.gz → 3.91.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 (470) hide show
  1. {pulpcore-3.90.0 → pulpcore-3.91.0}/CHANGES.md +30 -0
  2. {pulpcore-3.90.0 → pulpcore-3.91.0}/PKG-INFO +1 -1
  3. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/__init__.py +1 -1
  4. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/__init__.py +1 -1
  5. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/apps.py +16 -2
  6. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/util.py +1 -29
  7. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/constants.py +2 -3
  8. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/instrumentation.py +18 -15
  9. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/exceptions/__init__.py +0 -1
  10. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/exceptions/base.py +0 -4
  11. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/tasks.py +1 -1
  12. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/worker.py +116 -84
  13. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_filesystemexport.py +0 -3
  14. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_pulpimport.py +0 -1
  15. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/PKG-INFO +1 -1
  16. {pulpcore-3.90.0 → pulpcore-3.91.0}/pyproject.toml +2 -2
  17. {pulpcore-3.90.0 → pulpcore-3.91.0}/CODE_OF_CONDUCT.md +0 -0
  18. {pulpcore-3.90.0 → pulpcore-3.91.0}/COMMITMENT +0 -0
  19. {pulpcore-3.90.0 → pulpcore-3.91.0}/CONTRIBUTING.md +0 -0
  20. {pulpcore-3.90.0 → pulpcore-3.91.0}/COPYRIGHT +0 -0
  21. {pulpcore-3.90.0 → pulpcore-3.91.0}/LICENSE +0 -0
  22. {pulpcore-3.90.0 → pulpcore-3.91.0}/MANIFEST.in +0 -0
  23. {pulpcore-3.90.0 → pulpcore-3.91.0}/README.md +0 -0
  24. {pulpcore-3.90.0 → pulpcore-3.91.0}/ci_requirements.txt +0 -0
  25. {pulpcore-3.90.0 → pulpcore-3.91.0}/functest_requirements.txt +0 -0
  26. {pulpcore-3.90.0 → pulpcore-3.91.0}/manage.py +0 -0
  27. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/__init__.py +0 -0
  28. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/migrations/0001_initial.py +0 -0
  29. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/migrations/0002_alter_rhsmcertguard_contentguard_ptr_and_more.py +0 -0
  30. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/migrations/__init__.py +0 -0
  31. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/models.py +0 -0
  32. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/serializers.py +0 -0
  33. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/app/viewsets.py +0 -0
  34. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/pytest_plugin.py +0 -0
  35. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/rhsm/__init__.py +0 -0
  36. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/rhsm/rhsm_check_path.py +0 -0
  37. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/__init__.py +0 -0
  38. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/__init__.py +0 -0
  39. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/api/__init__.py +0 -0
  40. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/api/test_rhsm_certguard.py +0 -0
  41. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/api/test_x509_certguard.py +0 -0
  42. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.crt +0 -0
  43. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/katello-default-ca.key +0 -0
  44. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/trusted_but_expired.pem +0 -0
  45. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/uber.cert +0 -0
  46. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert-key.pem +0 -0
  47. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/untrusted_cert.pem +0 -0
  48. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713-key.pem +0 -0
  49. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/1514454871848760713.pem +0 -0
  50. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840-key.pem +0 -0
  51. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v1/159442575569388840.pem +0 -0
  52. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985-key.pem +0 -0
  53. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/4260035510644027985.pem +0 -0
  54. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172-key.pem +0 -0
  55. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/rhsm/v3/5527980418107729172.pem +0 -0
  56. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/certificates/ca.pem +0 -0
  57. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/genca.sh +0 -0
  58. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/thirdparty_ca/keys/ca.pem +0 -0
  59. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/ca.pem +0 -0
  60. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/client.pem +0 -0
  61. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/server.pem +0 -0
  62. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/un_urlencoded_cert.txt +0 -0
  63. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/certificates/untrusted_client.pem +0 -0
  64. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/genall.sh +0 -0
  65. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/genca.sh +0 -0
  66. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/genclient.sh +0 -0
  67. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/gensrv.sh +0 -0
  68. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/keys/ca.pem +0 -0
  69. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/keys/client.pem +0 -0
  70. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/artifacts/x509/keys/server.pem +0 -0
  71. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/conftest.py +0 -0
  72. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/functional/constants.py +0 -0
  73. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/unit/__init__.py +0 -0
  74. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/unit/certdata.py +0 -0
  75. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_certguard/tests/unit/test_rhsm_check_path.py +0 -0
  76. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/__init__.py +0 -0
  77. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/migrations/0001_initial_squashed_0016_add_domain.py +0 -0
  78. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/migrations/0017_alter_filealternatecontentsource_alternatecontentsource_ptr_and_more.py +0 -0
  79. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/migrations/__init__.py +0 -0
  80. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/modelresource.py +0 -0
  81. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/models.py +0 -0
  82. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/replica.py +0 -0
  83. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/serializers.py +0 -0
  84. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/tasks/__init__.py +0 -0
  85. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/tasks/publishing.py +0 -0
  86. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/tasks/synchronizing.py +0 -0
  87. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/app/viewsets.py +0 -0
  88. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/manifest.py +0 -0
  89. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/pytest_plugin.py +0 -0
  90. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/__init__.py +0 -0
  91. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/__init__.py +0 -0
  92. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/__init__.py +0 -0
  93. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_acs.py +0 -0
  94. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_auto_publish.py +0 -0
  95. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_bad_sync.py +0 -0
  96. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_content_labels.py +0 -0
  97. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_crud_content_unit.py +0 -0
  98. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_crud_remotes.py +0 -0
  99. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_domains.py +0 -0
  100. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_download_policies.py +0 -0
  101. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_filesystem_export.py +0 -0
  102. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_generic_list.py +0 -0
  103. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_labels.py +0 -0
  104. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_mime_types.py +0 -0
  105. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_publish.py +0 -0
  106. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_pulp_export.py +0 -0
  107. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_rbac.py +0 -0
  108. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_remote_settings.py +0 -0
  109. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/functional/api/test_sync.py +0 -0
  110. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/unit/__init__.py +0 -0
  111. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/unit/test_safe_paths.py +0 -0
  112. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulp_file/tests/unit/test_serializers.py +0 -0
  113. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/__init__.py +0 -0
  114. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/__init__.py +0 -0
  115. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/access_policy.py +0 -0
  116. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/authentication.py +0 -0
  117. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/checks.py +0 -0
  118. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/entrypoint.py +0 -0
  119. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/files.py +0 -0
  120. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/global_access_conditions.py +0 -0
  121. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/importexport.py +0 -0
  122. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/loggers.py +0 -0
  123. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/manage.py +0 -0
  124. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/__init__.py +0 -0
  125. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/__init__.py +0 -0
  126. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/add-signing-service.py +0 -0
  127. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/analyze-publication.py +0 -0
  128. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/clean-up-progress-reports.py +0 -0
  129. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/datarepair-2327.py +0 -0
  130. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/dump-permissions.py +0 -0
  131. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/dump-publications-to-fs.py +0 -0
  132. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/handle-artifact-checksums.py +0 -0
  133. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/migrationstat.py +0 -0
  134. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/openapi.py +0 -0
  135. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/optimizemigration.py +0 -0
  136. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/rebasemigrations.py +0 -0
  137. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/remove-plugin.py +0 -0
  138. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/remove-signing-service.py +0 -0
  139. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/repository-size.py +0 -0
  140. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/reset-admin-password.py +0 -0
  141. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/rotate-db-key.py +0 -0
  142. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/management/commands/shell.py +0 -0
  143. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0001_squashed_0090_char_to_text_field.py +0 -0
  144. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0091_systemid.py +0 -0
  145. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0092_alter_upload_options.py +0 -0
  146. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0093_add_info_field_repositoryversion.py +0 -0
  147. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0094_protect_repository_content.py +0 -0
  148. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0095_artifactdistribution.py +0 -0
  149. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0096_alter_task_logging_cid.py +0 -0
  150. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0097_remove_telemetry_task_schedule.py +0 -0
  151. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0098_pulp_labels.py +0 -0
  152. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0099_versions_field.py +0 -0
  153. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0100_upstreampulp.py +0 -0
  154. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0101_add_domain.py +0 -0
  155. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0102_add_domain_relations.py +0 -0
  156. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0103_alter_export_task.py +0 -0
  157. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0104_delete_label.py +0 -0
  158. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0105_abstract_uuid_gen.py +0 -0
  159. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0106_alter_artifactdistribution_distribution_ptr_and_more.py +0 -0
  160. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0107_distribution_hidden.py +0 -0
  161. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0108_task_versions.py +0 -0
  162. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0109_contentartifact_relative_path_index.py +0 -0
  163. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0110_apiappstatus.py +0 -0
  164. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0111_task_enc_args_task_enc_kwargs.py +0 -0
  165. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0112_alter_upstreampulp_options.py +0 -0
  166. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0113_headercontentguard.py +0 -0
  167. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0114_remove_task_args_remove_task_kwargs.py +0 -0
  168. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0115_compositecontentguard.py +0 -0
  169. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0116_alter_remoteartifact_md5_alter_remoteartifact_sha1_and_more.py +0 -0
  170. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0117_task_unblocked_at.py +0 -0
  171. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0118_task_core_task_unblock_2276a4_idx_and_more.py +0 -0
  172. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0119_grouprole_core_groupr_object__250e22_idx_and_more.py +0 -0
  173. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0120_get_url_removal.py +0 -0
  174. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0121_add_profile_artifacts_table.py +0 -0
  175. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0122_record_last_replication_timestamp.py +0 -0
  176. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0123_upstreampulp_q_select.py +0 -0
  177. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0124_task_deferred_task_immediate.py +0 -0
  178. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0125_openpgpdistribution_openpgpkeyring_openpgppublickey_and_more.py +0 -0
  179. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0126_remoteartifact_failed_at.py +0 -0
  180. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0127_remove_upstreampulp_pulp_label_select.py +0 -0
  181. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0128_domain_pulp_labels.py +0 -0
  182. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0129_content_pulp_labels.py +0 -0
  183. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0130_upstreampulp_policy.py +0 -0
  184. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0131_distribution_checkpoint_publication_checkpoint.py +0 -0
  185. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0132_alter_content_options.py +0 -0
  186. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0132_task_profile_options.py +0 -0
  187. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0133_repositoryversion_content_ids.py +0 -0
  188. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0134_task_insert_trigger.py +0 -0
  189. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0135_task_pulp_task_resources_index.py +0 -0
  190. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0136_delete_basedistribution.py +0 -0
  191. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0137_appstatus.py +0 -0
  192. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0138_vulnerabilityreport.py +0 -0
  193. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0139_task_app_lock.py +0 -0
  194. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0140_require_appstatus_zdu.py +0 -0
  195. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0141_alter_appstatus_name.py +0 -0
  196. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0142_task_result.py +0 -0
  197. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0143_require_app_lock_zdu.py +0 -0
  198. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0144_delete_old_appstatus.py +0 -0
  199. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/0145_domainize_import_export.py +0 -0
  200. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/migrations/__init__.py +0 -0
  201. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/mime_types.py +0 -0
  202. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/modelresource.py +0 -0
  203. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/__init__.py +0 -0
  204. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/access_policy.py +0 -0
  205. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/acs.py +0 -0
  206. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/analytics.py +0 -0
  207. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/base.py +0 -0
  208. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/content.py +0 -0
  209. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/domain.py +0 -0
  210. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/exporter.py +0 -0
  211. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/fields.py +0 -0
  212. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/generic.py +0 -0
  213. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/importer.py +0 -0
  214. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/openpgp.py +0 -0
  215. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/progress.py +0 -0
  216. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/publication.py +0 -0
  217. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/replica.py +0 -0
  218. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/repository.py +0 -0
  219. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/role.py +0 -0
  220. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/status.py +0 -0
  221. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/storage.py +0 -0
  222. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/task.py +0 -0
  223. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/upload.py +0 -0
  224. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/models/vulnerability_report.py +0 -0
  225. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/netutil.py +0 -0
  226. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/openpgp.py +0 -0
  227. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/protobuf/__init__.py +0 -0
  228. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/protobuf/analytics_pb2.py +0 -0
  229. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/pulp_hashlib.py +0 -0
  230. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/pulpcore_gunicorn_application.py +0 -0
  231. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/redis_connection.py +0 -0
  232. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/replica.py +0 -0
  233. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/response.py +0 -0
  234. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/role_util.py +0 -0
  235. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/__init__.py +0 -0
  236. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/access_policy.py +0 -0
  237. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/acs.py +0 -0
  238. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/base.py +0 -0
  239. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/content.py +0 -0
  240. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/domain.py +0 -0
  241. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/exporter.py +0 -0
  242. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/fields.py +0 -0
  243. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/importer.py +0 -0
  244. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/openpgp.py +0 -0
  245. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/orphans.py +0 -0
  246. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/progress.py +0 -0
  247. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/publication.py +0 -0
  248. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/purge.py +0 -0
  249. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/reclaim.py +0 -0
  250. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/repair.py +0 -0
  251. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/replica.py +0 -0
  252. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/repository.py +0 -0
  253. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/status.py +0 -0
  254. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/task.py +0 -0
  255. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/upload.py +0 -0
  256. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/user.py +0 -0
  257. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/serializers/vulnerability_report.py +0 -0
  258. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/settings.py +0 -0
  259. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/__init__.py +0 -0
  260. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/analytics.py +0 -0
  261. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/base.py +0 -0
  262. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/export.py +0 -0
  263. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/importer.py +0 -0
  264. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/migrate.py +0 -0
  265. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/orphan.py +0 -0
  266. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/purge.py +0 -0
  267. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/reclaim_space.py +0 -0
  268. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/replica.py +0 -0
  269. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/repository.py +0 -0
  270. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/telemetry.py +0 -0
  271. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/test.py +0 -0
  272. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/upload.py +0 -0
  273. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/tasks/vulnerability_report.py +0 -0
  274. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/templates/rest_framework/api.html +0 -0
  275. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/templatetags/__init__.py +0 -0
  276. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/templatetags/pulp_urls.py +0 -0
  277. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/urls.py +0 -0
  278. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/__init__.py +0 -0
  279. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/importer.py +0 -0
  280. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/orphans.py +0 -0
  281. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/repair.py +0 -0
  282. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/views/status.py +0 -0
  283. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/__init__.py +0 -0
  284. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/access_policy.py +0 -0
  285. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/acs.py +0 -0
  286. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/base.py +0 -0
  287. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/content.py +0 -0
  288. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/custom_filters.py +0 -0
  289. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/domain.py +0 -0
  290. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/exporter.py +0 -0
  291. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/importer.py +0 -0
  292. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/openpgp.py +0 -0
  293. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/orphans.py +0 -0
  294. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/publication.py +0 -0
  295. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/reclaim.py +0 -0
  296. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/replica.py +0 -0
  297. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/repository.py +0 -0
  298. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/task.py +0 -0
  299. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/upload.py +0 -0
  300. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/user.py +0 -0
  301. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/viewsets/vulnerability_report.py +0 -0
  302. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/app/wsgi.py +0 -0
  303. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/backends.py +0 -0
  304. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/cache/__init__.py +0 -0
  305. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/cache/cache.py +0 -0
  306. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/__init__.py +0 -0
  307. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/authentication.py +0 -0
  308. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/entrypoint.py +0 -0
  309. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/content/handler.py +0 -0
  310. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/__init__.py +0 -0
  311. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/base.py +0 -0
  312. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/factory.py +0 -0
  313. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/file.py +0 -0
  314. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/download/http.py +0 -0
  315. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/exceptions/plugin.py +0 -0
  316. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/exceptions/validation.py +0 -0
  317. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/filters.py +0 -0
  318. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/metrics.py +0 -0
  319. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/middleware.py +0 -0
  320. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/migrations.py +0 -0
  321. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/openapi/__init__.py +0 -0
  322. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/openapi/hooks.py +0 -0
  323. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/__init__.py +0 -0
  324. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/access_policy.py +0 -0
  325. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/actions.py +0 -0
  326. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/apps.py +0 -0
  327. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/authentication/__init__.py +0 -0
  328. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/cache/__init__.py +0 -0
  329. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/constants.py +0 -0
  330. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/content.py +0 -0
  331. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/download/__init__.py +0 -0
  332. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/exceptions.py +0 -0
  333. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/files.py +0 -0
  334. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/importexport.py +0 -0
  335. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/migrations.py +0 -0
  336. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/modelresources.py +0 -0
  337. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/models/__init__.py +0 -0
  338. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/models/role.py +0 -0
  339. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/publication_utils.py +0 -0
  340. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/pulp_hashlib.py +0 -0
  341. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/replica.py +0 -0
  342. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/repo_version_utils.py +0 -0
  343. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/responses.py +0 -0
  344. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/serializers/__init__.py +0 -0
  345. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/serializers/content.py +0 -0
  346. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/__init__.py +0 -0
  347. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/api.py +0 -0
  348. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/artifact_stages.py +0 -0
  349. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/content_stages.py +0 -0
  350. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/declarative_version.py +0 -0
  351. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/stages/models.py +0 -0
  352. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/storage.py +0 -0
  353. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/sync.py +0 -0
  354. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/tasking.py +0 -0
  355. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/util.py +0 -0
  356. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/viewsets/__init__.py +0 -0
  357. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/plugin/viewsets/content.py +0 -0
  358. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/pytest_plugin.py +0 -0
  359. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/responses.py +0 -0
  360. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/__init__.py +0 -0
  361. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/_util.py +0 -0
  362. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/entrypoint.py +0 -0
  363. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/kafka.py +0 -0
  364. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tasking/storage.py +0 -0
  365. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/__init__.py +0 -0
  366. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/__init__.py +0 -0
  367. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/__init__.py +0 -0
  368. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_access_policy.py +0 -0
  369. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_api_docs.py +0 -0
  370. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_api_root_rewrite.py +0 -0
  371. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_artifact_distribution.py +0 -0
  372. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_auth.py +0 -0
  373. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_correlation_id.py +0 -0
  374. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_crd_artifacts.py +0 -0
  375. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_crud_domains.py +0 -0
  376. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_filter.py +0 -0
  377. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_login.py +0 -0
  378. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_openapi_schema.py +0 -0
  379. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_openpgp.py +0 -0
  380. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_replication.py +0 -0
  381. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_repos.py +0 -0
  382. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_role.py +0 -0
  383. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_root_endpoint.py +0 -0
  384. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_scoping.py +0 -0
  385. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_signing_service.py +0 -0
  386. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_status.py +0 -0
  387. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_task_purge.py +0 -0
  388. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_tasking.py +0 -0
  389. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_upload.py +0 -0
  390. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_users_groups.py +0 -0
  391. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/test_workers.py +0 -0
  392. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/__init__.py +0 -0
  393. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_checkpoint.py +0 -0
  394. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_access.py +0 -0
  395. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_cache.py +0 -0
  396. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_delivery.py +0 -0
  397. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_directory.py +0 -0
  398. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_path.py +0 -0
  399. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_content_promotion.py +0 -0
  400. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_contentguard.py +0 -0
  401. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_crud_repos.py +0 -0
  402. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_distributions.py +0 -0
  403. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_labels.py +0 -0
  404. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_migrate.py +0 -0
  405. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_orphans.py +0 -0
  406. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_pagination.py +0 -0
  407. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_prn.py +0 -0
  408. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_proxy.py +0 -0
  409. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_reclaim_disk_space.py +0 -0
  410. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_repair.py +0 -0
  411. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_repo_versions.py +0 -0
  412. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_tasks.py +0 -0
  413. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/api/using_plugin/test_unlinking_repo.py +0 -0
  414. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/assets/__init__.py +0 -0
  415. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/content_with_coverage.py +0 -0
  416. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/functional/utils.py +0 -0
  417. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/performance/__init__.py +0 -0
  418. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/performance/test_performance.py +0 -0
  419. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/__init__.py +0 -0
  420. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/conftest.py +0 -0
  421. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/content/__init__.py +0 -0
  422. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/content/test_handler.py +0 -0
  423. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/content/test_heartbeat.py +0 -0
  424. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/download/__init__.py +0 -0
  425. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/download/test_downloader_base.py +0 -0
  426. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/download/test_downloader_factory.py +0 -0
  427. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/metrics/__init__.py +0 -0
  428. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/metrics/conftest.py +0 -0
  429. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/metrics/test_aiohttp_instrumentation.py +0 -0
  430. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/metrics/test_django_instrumentation.py +0 -0
  431. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/migration/__init__.py +0 -0
  432. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/__init__.py +0 -0
  433. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_base.py +0 -0
  434. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_content.py +0 -0
  435. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_remote.py +0 -0
  436. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_repository.py +0 -0
  437. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/models/test_task.py +0 -0
  438. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/roles/__init__.py +0 -0
  439. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/roles/test_roles.py +0 -0
  440. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/__init__.py +0 -0
  441. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_base.py +0 -0
  442. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_domain.py +0 -0
  443. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_fields.py +0 -0
  444. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_orphans_cleanup.py +0 -0
  445. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_pulpexport.py +0 -0
  446. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_repository.py +0 -0
  447. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/serializers/test_user.py +0 -0
  448. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/stages/__init__.py +0 -0
  449. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/stages/test_artifactdownloader.py +0 -0
  450. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/stages/test_stages.py +0 -0
  451. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_cache.py +0 -0
  452. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_chunked_file.py +0 -0
  453. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_content_guard.py +0 -0
  454. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_files.py +0 -0
  455. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_import_checks.py +0 -0
  456. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_pulp_urls.py +0 -0
  457. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_settings.py +0 -0
  458. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_util.py +0 -0
  459. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_viewsets.py +0 -0
  460. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/test_vulnerability_report.py +0 -0
  461. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/viewsets/__init__.py +0 -0
  462. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore/tests/unit/viewsets/test_viewset_base.py +0 -0
  463. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/SOURCES.txt +0 -0
  464. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/dependency_links.txt +0 -0
  465. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/entry_points.txt +0 -0
  466. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/requires.txt +0 -0
  467. {pulpcore-3.90.0 → pulpcore-3.91.0}/pulpcore.egg-info/top_level.txt +0 -0
  468. {pulpcore-3.90.0 → pulpcore-3.91.0}/setup.cfg +0 -0
  469. {pulpcore-3.90.0 → pulpcore-3.91.0}/test_requirements.txt +0 -0
  470. {pulpcore-3.90.0 → pulpcore-3.91.0}/unittest_requirements.txt +0 -0
@@ -8,6 +8,36 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
+ ## 3.91.0 (2025-10-01) {: #3.91.0 }
12
+
13
+ ### REST API {: #3.91.0-rest-api }
14
+
15
+ #### Features {: #3.91.0-rest-api-feature }
16
+
17
+ - Changed orphan cleanup to run as a scheduled task.
18
+ - Removed the use of session scoped advisory locks from workers janitorial work.
19
+
20
+ #### Bugfixes {: #3.91.0-rest-api-bugfix }
21
+
22
+ - Fix situations with a single worker per installation failing to unblock all tasks that come in quick succession.
23
+ [#6873](https://github.com/pulp/pulpcore/issues/6873)
24
+ - Fixed exception propagation in the pulp-content instrumentation middleware.
25
+ [#6925](https://github.com/pulp/pulpcore/issues/6925)
26
+
27
+ ### Plugin API {: #3.91.0-plugin-api }
28
+
29
+ No significant changes.
30
+
31
+ ### Pulp File {: #3.91.0-pulp-file }
32
+
33
+ No significant changes.
34
+
35
+ ### Pulp Cert Guard {: #3.91.0-pulp-cert-guard }
36
+
37
+ No significant changes.
38
+
39
+ ---
40
+
11
41
  ## 3.90.0 (2025-09-23) {: #3.90.0 }
12
42
 
13
43
  ### REST API {: #3.90.0-rest-api }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulpcore
3
- Version: 3.90.0
3
+ Version: 3.91.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
@@ -6,6 +6,6 @@ class PulpCertGuardPluginAppConfig(PulpPluginAppConfig):
6
6
 
7
7
  name = "pulp_certguard.app"
8
8
  label = "certguard"
9
- version = "3.90.0"
9
+ version = "3.91.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.90.0"
11
+ version = "3.91.0"
12
12
  python_package_name = "pulpcore"
13
13
  domain_compatible = True
@@ -8,7 +8,7 @@ from django import apps
8
8
  from django.conf import settings
9
9
  from django.core.exceptions import ImproperlyConfigured
10
10
  from django.db import connection, transaction
11
- from django.db.models.signals import post_migrate
11
+ from django.db.models.signals import post_migrate, pre_migrate
12
12
  from django.utils.module_loading import module_has_submodule
13
13
 
14
14
  from pulpcore.exceptions.plugin import MissingPlugin
@@ -239,7 +239,7 @@ class PulpAppConfig(PulpPluginAppConfig):
239
239
  label = "core"
240
240
 
241
241
  # The version of this app
242
- version = "3.90.0"
242
+ version = "3.91.0"
243
243
 
244
244
  # The python package name providing this app
245
245
  python_package_name = "pulpcore"
@@ -250,6 +250,7 @@ class PulpAppConfig(PulpPluginAppConfig):
250
250
  super().ready()
251
251
  from . import checks # noqa
252
252
 
253
+ pre_migrate.connect(_clean_app_status, sender=self, dispatch_uid="clean_app_status")
253
254
  post_migrate.connect(
254
255
  _ensure_default_domain, sender=self, dispatch_uid="ensure_default_domain"
255
256
  )
@@ -263,6 +264,19 @@ class PulpAppConfig(PulpPluginAppConfig):
263
264
  )
264
265
 
265
266
 
267
+ def _clean_app_status(sender, apps, verbosity, **kwargs):
268
+ from django.contrib.postgres.functions import TransactionNow
269
+ from django.db.models import F
270
+
271
+ try:
272
+ AppStatus = apps.get_model("core", "AppStatus")
273
+ except LookupError:
274
+ if verbosity >= 1:
275
+ print(_("AppStatus model does not exist. Skipping pre migrate cleanup."))
276
+ else:
277
+ AppStatus.objects.filter(last_heartbeat__lt=TransactionNow() - F("ttl")).delete()
278
+
279
+
266
280
  def _populate_access_policies(sender, apps, verbosity, **kwargs):
267
281
  from pulpcore.app.util import get_view_urlpattern
268
282
  from pulpcore.app.viewsets import LoginViewSet
@@ -25,7 +25,6 @@ from rest_framework.reverse import reverse as drf_reverse
25
25
  from pulpcore.app.loggers import deprecation_logger
26
26
  from pulpcore.app.apps import pulp_plugin_configs
27
27
  from pulpcore.app import models
28
- from pulpcore.exceptions import AdvisoryLockError
29
28
  from pulpcore.exceptions.validation import InvalidSignatureError
30
29
 
31
30
 
@@ -468,6 +467,7 @@ def configure_cleanup():
468
467
  settings.TMPFILE_PROTECTION_TIME,
469
468
  ),
470
469
  ("tasks", "pulpcore.app.tasks.purge.purge", settings.TASK_PROTECTION_TIME),
470
+ ("content", "pulpcore.app.tasks.orphan.orphan_cleanup", settings.ORPHAN_PROTECTION_TIME),
471
471
  ]:
472
472
  if protection_time > 0:
473
473
  dispatch_interval = timedelta(minutes=protection_time)
@@ -636,34 +636,6 @@ def get_worker_name():
636
636
  return f"{os.getpid()}@{socket.gethostname()}"
637
637
 
638
638
 
639
- class PGAdvisoryLock:
640
- """
641
- A context manager that will hold a postgres advisory lock non-blocking.
642
-
643
- The locks can be chosen from a lock group to avoid collisions. They will never collide with the
644
- locks used for tasks.
645
- """
646
-
647
- def __init__(self, lock, lock_group=0):
648
- self.lock_group = lock_group
649
- self.lock = lock
650
-
651
- def __enter__(self):
652
- with connection.cursor() as cursor:
653
- cursor.execute("SELECT pg_try_advisory_lock(%s, %s)", [self.lock_group, self.lock])
654
- acquired = cursor.fetchone()[0]
655
- if not acquired:
656
- raise AdvisoryLockError("Could not acquire lock.")
657
- return self
658
-
659
- def __exit__(self, exc_type, exc_value, traceback):
660
- with connection.cursor() as cursor:
661
- cursor.execute("SELECT pg_advisory_unlock(%s, %s)", [self.lock_group, self.lock])
662
- released = cursor.fetchone()[0]
663
- if not released:
664
- raise RuntimeError("Lock not held.")
665
-
666
-
667
639
  def normalize_http_status(status):
668
640
  """Convert the HTTP status code to 2xx, 3xx, etc., normalizing the last two digits."""
669
641
  if 100 <= status < 200:
@@ -6,11 +6,10 @@ from types import SimpleNamespace
6
6
  # The group will be 0.
7
7
  # The numbers are randomly chosen.
8
8
  # !!! Never change these values !!!
9
- TASK_DISPATCH_LOCK = 21
10
9
  TASK_SCHEDULING_LOCK = 42
11
10
  TASK_UNBLOCKING_LOCK = 84
12
- TASK_METRICS_HEARTBEAT_LOCK = 74
13
- STORAGE_METRICS_LOCK = 72
11
+ TASK_METRICS_LOCK = 74
12
+ WORKER_CLEANUP_LOCK = 11
14
13
 
15
14
  # Reasons to send along a task worker wakeup call.
16
15
  TASK_WAKEUP_UNBLOCK = "unblock"
@@ -21,23 +21,26 @@ def instrumentation(exporter=None, reader=None, provider=None):
21
21
  try:
22
22
  response = await handler(request)
23
23
  status_code = response.status
24
+
25
+ return response
24
26
  except web.HTTPException as exc:
25
27
  status_code = exc.status
26
- response = exc
27
-
28
- duration_ms = (time.time() - start_time) * 1000
29
-
30
- request_duration_histogram.record(
31
- duration_ms,
32
- attributes={
33
- "http.method": request.method,
34
- "http.status_code": normalize_http_status(status_code),
35
- "http.route": _get_view_request_handler_func(request),
36
- "worker.name": get_worker_name(),
37
- },
38
- )
39
-
40
- return response
28
+ raise exc
29
+ except Exception as exc:
30
+ status_code = exc.status if hasattr(exc, "status") else 500
31
+ raise exc
32
+ finally:
33
+ duration_ms = (time.time() - start_time) * 1000
34
+
35
+ request_duration_histogram.record(
36
+ duration_ms,
37
+ attributes={
38
+ "http.method": request.method,
39
+ "http.status_code": normalize_http_status(status_code),
40
+ "http.route": _get_view_request_handler_func(request),
41
+ "worker.name": get_worker_name(),
42
+ },
43
+ )
41
44
 
42
45
  return middleware
43
46
 
@@ -1,5 +1,4 @@
1
1
  from .base import (
2
- AdvisoryLockError,
3
2
  PulpException,
4
3
  ResourceImmutableError,
5
4
  TimeoutException,
@@ -64,10 +64,6 @@ class ResourceImmutableError(PulpException):
64
64
  return msg
65
65
 
66
66
 
67
- class AdvisoryLockError(Exception):
68
- """Exception to signal that a lock could not be acquired."""
69
-
70
-
71
67
  class TimeoutException(PulpException):
72
68
  """
73
69
  Exception to signal timeout error.
@@ -297,7 +297,7 @@ async def adispatch(
297
297
  task.set_canceling()
298
298
  task.set_canceled(TASK_STATES.CANCELED, "Resources temporarily unavailable.")
299
299
  if send_wakeup_signal:
300
- wakeup_worker(TASK_WAKEUP_UNBLOCK)
300
+ await sync_to_async(wakeup_worker)(TASK_WAKEUP_UNBLOCK)
301
301
  return task
302
302
 
303
303
 
@@ -1,19 +1,19 @@
1
1
  from gettext import gettext as _
2
2
 
3
+ import functools
3
4
  import logging
4
5
  import os
5
6
  import random
6
7
  import select
7
8
  import signal
8
9
  import socket
9
- import contextlib
10
10
  from datetime import datetime, timedelta
11
11
  from multiprocessing import Process
12
12
  from tempfile import TemporaryDirectory
13
13
  from packaging.version import parse as parse_version
14
14
 
15
15
  from django.conf import settings
16
- from django.db import connection, DatabaseError, IntegrityError
16
+ from django.db import connection, transaction, DatabaseError, IntegrityError
17
17
  from django.db.models import Case, Count, F, Max, Value, When
18
18
  from django.utils import timezone
19
19
 
@@ -22,15 +22,14 @@ from pulpcore.constants import (
22
22
  TASK_INCOMPLETE_STATES,
23
23
  TASK_SCHEDULING_LOCK,
24
24
  TASK_UNBLOCKING_LOCK,
25
- TASK_METRICS_HEARTBEAT_LOCK,
25
+ TASK_METRICS_LOCK,
26
+ WORKER_CLEANUP_LOCK,
26
27
  TASK_WAKEUP_UNBLOCK,
27
28
  TASK_WAKEUP_HANDLE,
28
29
  )
29
30
  from pulpcore.metrics import init_otel_meter
30
31
  from pulpcore.app.apps import pulp_plugin_configs
31
32
  from pulpcore.app.models import Task, AppStatus
32
- from pulpcore.app.util import PGAdvisoryLock
33
- from pulpcore.exceptions import AdvisoryLockError
34
33
 
35
34
  from pulpcore.tasking.storage import WorkerDirectory
36
35
  from pulpcore.tasking._util import (
@@ -59,6 +58,30 @@ IGNORED_TASKS_CLEANUP_INTERVAL = 100
59
58
  THRESHOLD_UNBLOCKED_WAITING_TIME = 5
60
59
 
61
60
 
61
+ def exclusive(lock):
62
+ """
63
+ Runs function in a transaction holding the specified lock.
64
+ Returns None if the lock could not be acquired.
65
+ It should be used for actions that only need to be performed by a single worker.
66
+ """
67
+
68
+ def _decorator(f):
69
+ @functools.wraps(f)
70
+ def _f(self, *args, **kwargs):
71
+ with transaction.atomic():
72
+ with connection.cursor() as cursor:
73
+ cursor.execute("SELECT pg_try_advisory_xact_lock(%s, %s)", [0, lock])
74
+ acquired = cursor.fetchone()[0]
75
+ if acquired:
76
+ return f(self, *args, **kwargs)
77
+ else:
78
+ return None
79
+
80
+ return _f
81
+
82
+ return _decorator
83
+
84
+
62
85
  class PulpcoreWorker:
63
86
  def __init__(self, auxiliary=False):
64
87
  # Notification states from several signal handlers
@@ -112,9 +135,9 @@ class PulpcoreWorker:
112
135
  description="The age of the longest waiting task.",
113
136
  unit="seconds",
114
137
  )
115
- self.record_unblocked_waiting_tasks_metric = self._record_unblocked_waiting_tasks_metric
138
+ self.otel_enabled = True
116
139
  else:
117
- self.record_unblocked_waiting_tasks_metric = lambda *args, **kwargs: None
140
+ self.otel_enabled = False
118
141
 
119
142
  def _signal_handler(self, thesignal, frame):
120
143
  if thesignal in (signal.SIGHUP, signal.SIGTERM):
@@ -187,16 +210,57 @@ class PulpcoreWorker:
187
210
  ):
188
211
  self.ignored_task_ids.remove(pk)
189
212
 
190
- def worker_cleanup(self):
213
+ @exclusive(WORKER_CLEANUP_LOCK)
214
+ def app_worker_cleanup(self):
191
215
  qs = AppStatus.objects.missing()
192
216
  for app_worker in qs:
193
217
  _logger.warning(
194
218
  "Cleanup record of missing %s process %s.", app_worker.app_type, app_worker.name
195
219
  )
196
220
  qs.delete()
221
+ # This will also serve as a pacemaker because it will be triggered regularly.
222
+ # Don't bother the others.
223
+ self.wakeup_unblock = True
224
+
225
+ @exclusive(TASK_SCHEDULING_LOCK)
226
+ def dispatch_scheduled_tasks(self):
227
+ dispatch_scheduled_tasks()
228
+
229
+ @exclusive(TASK_METRICS_LOCK)
230
+ def record_unblocked_waiting_tasks_metric(self, now):
231
+ # This "reporting code" must not me moved inside a task, because it is supposed
232
+ # to be able to report on a congested tasking system to produce reliable results.
233
+ # For performance reasons we aggregate these statistics on a single database call.
234
+ unblocked_tasks_stats = (
235
+ Task.objects.filter(unblocked_at__isnull=False, state=TASK_STATES.WAITING)
236
+ .annotate(unblocked_for=Value(timezone.now()) - F("unblocked_at"))
237
+ .aggregate(
238
+ longest_unblocked_waiting_time=Max("unblocked_for", default=timezone.timedelta(0)),
239
+ unblocked_tasks_count_gte_threshold=Count(
240
+ Case(
241
+ When(
242
+ unblocked_for__gte=Value(
243
+ timezone.timedelta(seconds=THRESHOLD_UNBLOCKED_WAITING_TIME)
244
+ ),
245
+ then=1,
246
+ )
247
+ )
248
+ ),
249
+ )
250
+ )
251
+
252
+ self.tasks_unblocked_queue_meter.set(
253
+ unblocked_tasks_stats["unblocked_tasks_count_gte_threshold"]
254
+ )
255
+ self.tasks_longest_unblocked_time_meter.set(
256
+ unblocked_tasks_stats["longest_unblocked_waiting_time"].seconds
257
+ )
258
+
259
+ self.cursor.execute(f"NOTIFY pulp_worker_metrics_heartbeat, '{str(now)}'")
197
260
 
198
261
  def beat(self):
199
- if self.app_status.last_heartbeat < timezone.now() - self.heartbeat_period:
262
+ now = timezone.now()
263
+ if self.app_status.last_heartbeat < now - self.heartbeat_period:
200
264
  self.handle_worker_heartbeat()
201
265
  if self.ignored_task_ids:
202
266
  self.ignored_task_countdown -= 1
@@ -207,14 +271,14 @@ class PulpcoreWorker:
207
271
  self.worker_cleanup_countdown -= 1
208
272
  if self.worker_cleanup_countdown <= 0:
209
273
  self.worker_cleanup_countdown = WORKER_CLEANUP_INTERVAL
210
- self.worker_cleanup()
211
- with contextlib.suppress(AdvisoryLockError), PGAdvisoryLock(TASK_SCHEDULING_LOCK):
212
- dispatch_scheduled_tasks()
213
- # This "reporting code" must not me moved inside a task, because it is supposed
214
- # to be able to report on a congested tasking system to produce reliable results.
215
- self.record_unblocked_waiting_tasks_metric()
216
-
217
- def notify_workers(self, reason="unknown"):
274
+ self.app_worker_cleanup()
275
+
276
+ self.dispatch_scheduled_tasks()
277
+
278
+ if self.otel_enabled and now > self.last_metric_heartbeat + self.heartbeat_period:
279
+ self.record_unblocked_waiting_tasks_metric(now)
280
+
281
+ def notify_workers(self, reason):
218
282
  self.cursor.execute("SELECT pg_notify('pulp_worker_wakeup', %s)", (reason,))
219
283
 
220
284
  def cancel_abandoned_task(self, task, final_state, reason=None):
@@ -274,25 +338,29 @@ class PulpcoreWorker:
274
338
  Also it clears the notification about tasks to be unblocked and sends the notification that
275
339
  new unblocked tasks are made available.
276
340
 
277
- Returns the number of new unblocked tasks.
341
+ Returns None if another worker held the lock, True if unblocked tasks exist, else False.
278
342
  """
279
343
 
280
344
  assert not self.auxiliary
281
345
 
282
- count = 0
283
- self.wakeup_unblock_tasks = False
284
- with contextlib.suppress(AdvisoryLockError), PGAdvisoryLock(TASK_UNBLOCKING_LOCK):
285
- if count := self._unblock_tasks():
286
- self.notify_workers(TASK_WAKEUP_HANDLE)
287
- return count
346
+ self.wakeup_unblock = False
347
+ result = self._unblock_tasks()
348
+ if result is not None and (
349
+ Task.objects.filter(
350
+ state__in=[TASK_STATES.WAITING, TASK_STATES.CANCELING], app_lock=None
351
+ )
352
+ .exclude(unblocked_at=None)
353
+ .exists()
354
+ ):
355
+ self.notify_workers(TASK_WAKEUP_HANDLE)
356
+ return True
288
357
 
289
- def _unblock_tasks(self):
290
- """Iterate over waiting tasks and mark them unblocked accordingly.
358
+ return result
291
359
 
292
- Returns the number of new unblocked tasks.
293
- """
360
+ @exclusive(TASK_UNBLOCKING_LOCK)
361
+ def _unblock_tasks(self):
362
+ """Iterate over waiting tasks and mark them unblocked accordingly."""
294
363
 
295
- count = 0
296
364
  taken_exclusive_resources = set()
297
365
  taken_shared_resources = set()
298
366
  # When batching this query, be sure to use "pulp_created" as a cursor
@@ -320,7 +388,6 @@ class PulpcoreWorker:
320
388
  task.pulp_domain.name,
321
389
  )
322
390
  task.unblock()
323
- count += 1
324
391
 
325
392
  elif (
326
393
  task.state == TASK_STATES.WAITING
@@ -339,7 +406,6 @@ class PulpcoreWorker:
339
406
  task.pulp_domain.name,
340
407
  )
341
408
  task.unblock()
342
- count += 1
343
409
  elif task.state == TASK_STATES.RUNNING and task.unblocked_at is None:
344
410
  # This should not happen in normal operation.
345
411
  # And it is only an issue if the worker running that task died, because it will
@@ -355,8 +421,7 @@ class PulpcoreWorker:
355
421
  # Record the resources of the pending task
356
422
  taken_exclusive_resources.update(exclusive_resources)
357
423
  taken_shared_resources.update(shared_resources)
358
-
359
- return count
424
+ return False
360
425
 
361
426
  def sleep(self):
362
427
  """Wait for signals on the wakeup channel while heart beating."""
@@ -364,13 +429,16 @@ class PulpcoreWorker:
364
429
  _logger.debug(_("Worker %s entering sleep state."), self.name)
365
430
  while not self.shutdown_requested and not self.wakeup_handle:
366
431
  r, w, x = select.select(
367
- [self.sentinel, connection.connection], [], [], self.heartbeat_period.seconds
432
+ [self.sentinel, connection.connection],
433
+ [],
434
+ [],
435
+ 0 if self.wakeup_unblock else self.heartbeat_period.seconds,
368
436
  )
369
437
  self.beat()
370
438
  if connection.connection in r:
371
439
  connection.connection.execute("SELECT 1")
372
- if self.wakeup_unblock:
373
- self.unblock_tasks()
440
+ if self.wakeup_unblock:
441
+ self.unblock_tasks()
374
442
  if self.sentinel in r:
375
443
  os.read(self.sentinel, 256)
376
444
  _logger.debug(_("Worker %s leaving sleep state."), self.name)
@@ -407,21 +475,21 @@ class PulpcoreWorker:
407
475
  [self.sentinel, connection.connection, task_process.sentinel],
408
476
  [],
409
477
  [],
410
- self.heartbeat_period.seconds,
478
+ 0 if self.wakeup_unblock or self.cancel_task else self.heartbeat_period.seconds,
411
479
  )
412
480
  self.beat()
413
481
  if connection.connection in r:
414
482
  connection.connection.execute("SELECT 1")
415
- if self.cancel_task:
416
- _logger.info(
417
- _("Received signal to cancel current task %s in domain: %s."),
418
- task.pk,
419
- domain.name,
420
- )
421
- cancel_state = TASK_STATES.CANCELED
422
- self.cancel_task = False
423
- if self.wakeup_unblock:
424
- self.unblock_tasks()
483
+ if self.cancel_task:
484
+ _logger.info(
485
+ _("Received signal to cancel current task %s in domain: %s."),
486
+ task.pk,
487
+ domain.name,
488
+ )
489
+ cancel_state = TASK_STATES.CANCELED
490
+ self.cancel_task = False
491
+ if self.wakeup_unblock:
492
+ self.unblock_tasks()
425
493
  if task_process.sentinel in r:
426
494
  if not task_process.is_alive():
427
495
  break
@@ -540,42 +608,6 @@ class PulpcoreWorker:
540
608
  if rows != 1:
541
609
  raise RuntimeError("Something other than us is messing around with locks.")
542
610
 
543
- def _record_unblocked_waiting_tasks_metric(self):
544
- now = timezone.now()
545
- if now > self.last_metric_heartbeat + self.heartbeat_period:
546
- with contextlib.suppress(AdvisoryLockError), PGAdvisoryLock(
547
- TASK_METRICS_HEARTBEAT_LOCK
548
- ):
549
- # For performance reasons we aggregate these statistics on a single database call.
550
- unblocked_tasks_stats = (
551
- Task.objects.filter(unblocked_at__isnull=False, state=TASK_STATES.WAITING)
552
- .annotate(unblocked_for=Value(timezone.now()) - F("unblocked_at"))
553
- .aggregate(
554
- longest_unblocked_waiting_time=Max(
555
- "unblocked_for", default=timezone.timedelta(0)
556
- ),
557
- unblocked_tasks_count_gte_threshold=Count(
558
- Case(
559
- When(
560
- unblocked_for__gte=Value(
561
- timezone.timedelta(seconds=THRESHOLD_UNBLOCKED_WAITING_TIME)
562
- ),
563
- then=1,
564
- )
565
- )
566
- ),
567
- )
568
- )
569
-
570
- self.tasks_unblocked_queue_meter.set(
571
- unblocked_tasks_stats["unblocked_tasks_count_gte_threshold"]
572
- )
573
- self.tasks_longest_unblocked_time_meter.set(
574
- unblocked_tasks_stats["longest_unblocked_waiting_time"].seconds
575
- )
576
-
577
- self.cursor.execute(f"NOTIFY pulp_worker_metrics_heartbeat, '{str(now)}'")
578
-
579
611
  def run(self, burst=False):
580
612
  with WorkerDirectory(self.name):
581
613
  signal.signal(signal.SIGINT, self._signal_handler)
@@ -589,7 +621,7 @@ class PulpcoreWorker:
589
621
  if not self.auxiliary:
590
622
  # Attempt to flush the task queue completely.
591
623
  # Stop iteration if no new tasks were found to unblock.
592
- while self.unblock_tasks():
624
+ while self.unblock_tasks() is not False:
593
625
  self.handle_unblocked_tasks()
594
626
  self.handle_unblocked_tasks()
595
627
  else:
@@ -8,7 +8,6 @@ the case.
8
8
  import pytest
9
9
  import uuid
10
10
 
11
- from pulpcore.app import settings
12
11
  from pulpcore.client.pulpcore.exceptions import ApiException
13
12
 
14
13
  from pulpcore.client.pulp_file import RepositorySyncURL
@@ -16,8 +15,6 @@ from pulpcore.client.pulp_file import RepositorySyncURL
16
15
  NUM_REPOS = 1
17
16
  NUM_EXPORTERS = 4
18
17
 
19
- pytestmark = pytest.mark.skipif(settings.DOMAIN_ENABLED, reason="Domains do not support export.")
20
-
21
18
 
22
19
  @pytest.fixture
23
20
  def create_exporter(pulpcore_bindings, gen_object_with_cleanup, add_to_filesystem_cleanup):
@@ -21,7 +21,6 @@ NUM_REPOS = 2
21
21
 
22
22
 
23
23
  pytestmark = [
24
- pytest.mark.skipif(settings.DOMAIN_ENABLED, reason="Domains do not support import."),
25
24
  pytest.mark.skipif(
26
25
  "/tmp" not in settings.ALLOWED_IMPORT_PATHS,
27
26
  reason="Cannot run import-tests unless /tmp is in ALLOWED_IMPORT_PATHS ({}).".format(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulpcore
3
- Version: 3.90.0
3
+ Version: 3.91.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
@@ -7,7 +7,7 @@ build-backend = 'setuptools.build_meta'
7
7
 
8
8
  [project]
9
9
  name = "pulpcore"
10
- version = "3.90.0"
10
+ version = "3.91.0"
11
11
  description = "Pulp Django Application and Related Modules"
12
12
  readme = "README.md"
13
13
  authors = [
@@ -204,7 +204,7 @@ ignore = [
204
204
  [tool.bumpversion]
205
205
  # This section is managed by the plugin template. Do not edit manually.
206
206
 
207
- current_version = "3.90.0"
207
+ current_version = "3.91.0"
208
208
  commit = false
209
209
  tag = false
210
210
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<alpha>0a)?(?P<patch>\\d+)(\\.(?P<release>[a-z]+))?"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes