pulp-container 2.22.8__tar.gz → 2.22.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. {pulp_container-2.22.8 → pulp_container-2.22.10}/CHANGES.md +17 -0
  2. {pulp_container-2.22.8 → pulp_container-2.22.10}/MANIFEST.in +1 -0
  3. {pulp_container-2.22.8 → pulp_container-2.22.10}/PKG-INFO +2 -2
  4. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/__init__.py +4 -3
  5. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/authorization.py +5 -8
  6. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/cache.py +2 -2
  7. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/checks.py +2 -1
  8. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/content.py +1 -0
  9. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/json_schemas.py +1 -0
  10. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/management/commands/container-handle-image-data.py +2 -6
  11. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/management/commands/container-repair-media-type.py +1 -3
  12. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/modelresource.py +3 -2
  13. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/models.py +8 -7
  14. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/registry.py +10 -13
  15. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/registry_api.py +24 -27
  16. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/serializers.py +14 -26
  17. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/builder.py +8 -7
  18. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/recursive_remove.py +2 -1
  19. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/sign.py +0 -1
  20. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/sync_stages.py +19 -18
  21. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/synchronize.py +4 -3
  22. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/tag.py +1 -0
  23. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/untag.py +1 -0
  24. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/token_verification.py +3 -5
  25. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/urls.py +1 -0
  26. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/utils.py +14 -15
  27. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/viewsets.py +5 -8
  28. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_content_cache.py +4 -6
  29. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_crud_distributions.py +5 -6
  30. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_flatpak.py +2 -1
  31. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_pull_content.py +17 -18
  32. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_pull_through_cache.py +7 -8
  33. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_push_content.py +13 -16
  34. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_push_signatures.py +2 -1
  35. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_rbac_push_repositories.py +0 -2
  36. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_rbac_remotes.py +3 -4
  37. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_rbac_repo_content.py +4 -7
  38. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_rbac_repo_versions.py +4 -7
  39. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_rbac_sync_repositories.py +0 -2
  40. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_recursive_add.py +8 -9
  41. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_recursive_remove.py +9 -10
  42. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_remote_filter_pull_through.py +4 -3
  43. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_repositories_list.py +13 -15
  44. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_sign_manifests.py +0 -1
  45. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_sync.py +3 -2
  46. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_tagging_images.py +11 -12
  47. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_token_authentication.py +17 -18
  48. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/conftest.py +13 -14
  49. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/utils.py +24 -21
  50. pulp_container-2.22.10/pulp_container/tests/unit/fixtures/ryuk_0.13.0_manifest_list.json +154 -0
  51. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/unit/test_json_schemas.py +31 -3
  52. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container.egg-info/PKG-INFO +2 -2
  53. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container.egg-info/SOURCES.txt +2 -1
  54. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container.egg-info/requires.txt +1 -1
  55. {pulp_container-2.22.8 → pulp_container-2.22.10}/pyproject.toml +29 -1
  56. {pulp_container-2.22.8 → pulp_container-2.22.10}/requirements.txt +1 -1
  57. {pulp_container-2.22.8 → pulp_container-2.22.10}/setup.py +1 -1
  58. {pulp_container-2.22.8 → pulp_container-2.22.10}/COMMITMENT +0 -0
  59. {pulp_container-2.22.8 → pulp_container-2.22.10}/COPYRIGHT +0 -0
  60. {pulp_container-2.22.8 → pulp_container-2.22.10}/LICENSE +0 -0
  61. {pulp_container-2.22.8 → pulp_container-2.22.10}/README.rst +0 -0
  62. {pulp_container-2.22.8 → pulp_container-2.22.10}/functest_requirements.txt +0 -0
  63. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/__init__.py +0 -0
  64. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/access_policy.py +0 -0
  65. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/downloaders.py +3 -3
  66. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/exceptions.py +0 -0
  67. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/fields.py +1 -1
  68. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/global_access_conditions.py +0 -0
  69. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/management/__init__.py +0 -0
  70. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/management/commands/__init__.py +0 -0
  71. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0001_initial.py +0 -0
  72. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0002_containerrepository.py +0 -0
  73. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0003_oci_mediatype.py +0 -0
  74. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0004_upload.py +0 -0
  75. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0005_contentredirectcontentguard.py +0 -0
  76. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0006_containerpushrepository.py +0 -0
  77. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0007_clear_tags_artifacts_refs.py +0 -0
  78. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0008_include_exclude_tags.py +0 -0
  79. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0009_container_namespace.py +0 -0
  80. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0010_remove_uploadchunk.py +0 -0
  81. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0011_add_container_repository_permissions.py +0 -0
  82. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0012_add_container_namespace_permissions.py +0 -0
  83. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0013_add_pull_push_permissions.py +0 -0
  84. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0014_containerdistribution_private.py +0 -0
  85. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0015_manage_tags_push_repo.py +0 -0
  86. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0016_add_delete_versions_permission.py +0 -0
  87. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0017_add_granular_perms.py +0 -0
  88. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0018_containerdistribution_description.py +0 -0
  89. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0019_DATA_distribution_model_swap.py +0 -0
  90. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0020_update_push_repo_perms.py +0 -0
  91. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0021_data_move_redirect_content_guard_to_core.py +0 -0
  92. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0022_delete_contentredirectcontentguard.py +0 -0
  93. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0023_manifestsignature.py +0 -0
  94. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0024_containerremote_sigstore.py +0 -0
  95. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0025_signature_stored_in_textfield.py +0 -0
  96. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0026_manifest_signing_service.py +0 -0
  97. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0027_data_translate_perms_to_roles.py +0 -0
  98. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0028_add_role_manage_permissions.py +0 -0
  99. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0029_remove_blob_media_type.py +0 -0
  100. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0030_enforce_tagged_manifest_reference.py +0 -0
  101. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0031_replace_charf_with_textf.py +0 -0
  102. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0032_upload_artifact.py +0 -0
  103. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0033_raise_warning_for_repair.py +0 -0
  104. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0034_translate_signed_schema.py +0 -0
  105. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0035_alter_blob_content_ptr_and_more.py +0 -0
  106. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0036_containerpushrepository_pending_blobs_manifests.py +0 -0
  107. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0037_create_pull_through_cache_models.py +0 -0
  108. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0038_add_manifest_metadata_fields.py +0 -0
  109. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0039_manifest_data.py +0 -0
  110. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0040_add_remote_repo_filter.py +0 -0
  111. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0041_add_pull_through_pull_permissions.py +0 -0
  112. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0042_add_manifest_nature_field.py +0 -0
  113. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/0043_add_os_arch_image_size_manifest_fields.py +0 -0
  114. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/migrations/__init__.py +0 -0
  115. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/redirects.py +1 -1
  116. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/replica.py +3 -3
  117. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/settings.py +0 -0
  118. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/__init__.py +0 -0
  119. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/download_image_data.py +1 -1
  120. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/tasks/recursive_add.py +1 -1
  121. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/webserver_snippets/__init__.py +0 -0
  122. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/webserver_snippets/apache.conf +0 -0
  123. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/app/webserver_snippets/nginx.conf +0 -0
  124. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/constants.py +0 -0
  125. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/__init__.py +0 -0
  126. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/__init__.py +0 -0
  127. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/__init__.py +0 -0
  128. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/rbac_base.py +0 -0
  129. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_build_images.py +4 -4
  130. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_crud_remotes.py +4 -4
  131. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_pulpimportexport.py +2 -2
  132. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/api/test_sync_signatures.py +1 -1
  133. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/functional/constants.py +1 -1
  134. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/unit/__init__.py +0 -0
  135. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/unit/test_models.py +0 -0
  136. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container/tests/unit/test_serializers.py +2 -2
  137. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container.egg-info/dependency_links.txt +0 -0
  138. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container.egg-info/entry_points.txt +0 -0
  139. {pulp_container-2.22.8 → pulp_container-2.22.10}/pulp_container.egg-info/top_level.txt +0 -0
  140. {pulp_container-2.22.8 → pulp_container-2.22.10}/setup.cfg +0 -0
  141. {pulp_container-2.22.8 → pulp_container-2.22.10}/test_requirements.txt +0 -0
  142. {pulp_container-2.22.8 → pulp_container-2.22.10}/unittest_requirements.txt +0 -0
@@ -8,6 +8,23 @@
8
8
 
9
9
  [//]: # (towncrier release notes start)
10
10
 
11
+ ## 2.22.10 (2026-07-23) {: #2.22.10 }
12
+
13
+ #### Bugfixes {: #2.22.10-bugfix }
14
+
15
+ - Fixed OS and architecture filters being silently ignored when filtering manifest lists in the flatpak index.
16
+ - Fixed a serialization issue with the FlatpakIndex cache.
17
+
18
+ ---
19
+
20
+ ## 2.22.9 (2026-07-21) {: #2.22.9 }
21
+
22
+ #### Bugfixes {: #2.22.9-bugfix }
23
+
24
+ - Added OCI manifest as an allowed media type in the Docker manifest list schema.
25
+
26
+ ---
27
+
11
28
  ## 2.22.8 (2026-04-24) {: #2.22.8 }
12
29
 
13
30
  No significant changes.
@@ -9,3 +9,4 @@ include functest_requirements.txt
9
9
  include test_requirements.txt
10
10
  include unittest_requirements.txt
11
11
  exclude releasing.md
12
+ include pulp_container/tests/unit/fixtures/*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pulp-container
3
- Version: 2.22.8
3
+ Version: 2.22.10
4
4
  Summary: Container plugin for the Pulp Project
5
5
  Home-page: https://pulpproject.org/
6
6
  Author: Pulp Team
@@ -18,7 +18,7 @@ Requires-Python: >=3.8
18
18
  License-File: LICENSE
19
19
  Requires-Dist: jsonschema<4.24,>=4.4
20
20
  Requires-Dist: pulpcore<3.70,>=3.49.0
21
- Requires-Dist: pyjwt[crypto]<2.10,>=2.4
21
+ Requires-Dist: pyjwt[crypto]<2.14,>=2.4
22
22
  Requires-Dist: pycares<4.9
23
23
  Requires-Dist: pysequoia<0.2.0,>=0.1.33
24
24
  Dynamic: author
@@ -1,7 +1,8 @@
1
- from pulpcore.plugin import PulpPluginAppConfig
2
1
  from django.db import connection
3
2
  from django.db.models.signals import post_migrate
4
3
 
4
+ from pulpcore.plugin import PulpPluginAppConfig
5
+
5
6
  update_sequences_to_bigint = """
6
7
  ALTER TABLE container_blobmanifest ALTER COLUMN id TYPE bigint;
7
8
  ALTER TABLE container_manifestlistmanifest ALTER COLUMN id TYPE bigint;
@@ -23,7 +24,7 @@ class PulpContainerPluginAppConfig(PulpPluginAppConfig):
23
24
 
24
25
  name = "pulp_container.app"
25
26
  label = "container"
26
- version = "2.22.8"
27
+ version = "2.22.10"
27
28
  python_package_name = "pulp-container"
28
29
 
29
30
  @staticmethod
@@ -34,6 +35,6 @@ class PulpContainerPluginAppConfig(PulpPluginAppConfig):
34
35
 
35
36
  def ready(self):
36
37
  super().ready()
37
- from . import checks
38
+ from . import checks # noqa: F401
38
39
 
39
40
  post_migrate.connect(PulpContainerPluginAppConfig.update_sequences, sender=self)
@@ -2,27 +2,24 @@ import base64
2
2
  import hashlib
3
3
  import random
4
4
  import uuid
5
-
6
- import jwt
7
-
8
5
  from collections import defaultdict, namedtuple
9
6
  from datetime import datetime
10
7
  from functools import partial
11
8
 
9
+ import jwt
10
+ from cryptography.hazmat.backends import default_backend
11
+ from cryptography.hazmat.primitives import serialization
12
12
  from django.conf import settings
13
- from django.http import HttpRequest
14
13
  from django.db.models import F, Value
14
+ from django.http import HttpRequest
15
15
  from rest_framework.request import Request
16
16
 
17
- from cryptography.hazmat.backends import default_backend
18
- from cryptography.hazmat.primitives import serialization
19
-
17
+ from pulp_container.app.access_policy import RegistryAccessPolicy
20
18
  from pulp_container.app.models import (
21
19
  ContainerDistribution,
22
20
  ContainerNamespace,
23
21
  ContainerPullThroughDistribution,
24
22
  )
25
- from pulp_container.app.access_policy import RegistryAccessPolicy
26
23
 
27
24
  TOKEN_EXPIRATION_TIME = settings.get("TOKEN_EXPIRATION_TIME", 300)
28
25
 
@@ -1,10 +1,10 @@
1
1
  from django.core.exceptions import ObjectDoesNotExist
2
2
  from django.db.models import F, Value
3
3
 
4
- from pulpcore.plugin.cache import CacheKeys, AsyncContentCache, SyncContentCache
4
+ from pulpcore.plugin.cache import AsyncContentCache, CacheKeys, SyncContentCache
5
5
 
6
- from pulp_container.app.models import ContainerDistribution, ContainerPullThroughDistribution
7
6
  from pulp_container.app.exceptions import RepositoryNotFound
7
+ from pulp_container.app.models import ContainerDistribution, ContainerPullThroughDistribution
8
8
 
9
9
  ACCEPT_HEADER_KEY = "accept_header"
10
10
  QUERY_KEY = "query"
@@ -1,5 +1,6 @@
1
1
  from django.conf import settings
2
- from django.core.checks import Error as CheckError, register
2
+ from django.core.checks import Error as CheckError
3
+ from django.core.checks import register
3
4
 
4
5
 
5
6
  @register(deploy=True)
@@ -1,6 +1,7 @@
1
1
  from aiohttp import web
2
2
 
3
3
  from pulpcore.plugin.content import app
4
+
4
5
  from pulp_container.app.registry import Registry
5
6
 
6
7
  registry = Registry()
@@ -124,6 +124,7 @@ DOCKER_MANIFEST_LIST_V2_SCHEMA = {
124
124
  "enum": [
125
125
  MEDIA_TYPE.MANIFEST_V2,
126
126
  MEDIA_TYPE.MANIFEST_V1,
127
+ MEDIA_TYPE.MANIFEST_OCI,
127
128
  ],
128
129
  },
129
130
  "size": {"type": "number"},
@@ -1,8 +1,6 @@
1
- from json.decoder import JSONDecodeError
2
-
3
- from gettext import gettext as _
4
-
5
1
  from contextlib import suppress
2
+ from gettext import gettext as _
3
+ from json.decoder import JSONDecodeError
6
4
 
7
5
  from django.conf import settings
8
6
  from django.core.exceptions import ObjectDoesNotExist
@@ -12,9 +10,7 @@ from django.db.models import Q
12
10
  from pulpcore.plugin.cache import SyncContentCache
13
11
 
14
12
  from pulp_container.app.models import ContainerDistribution, Manifest
15
-
16
13
  from pulp_container.app.utils import get_content_data
17
-
18
14
  from pulp_container.constants import MEDIA_TYPE
19
15
 
20
16
 
@@ -1,5 +1,4 @@
1
1
  import json
2
-
3
2
  from gettext import gettext as _
4
3
 
5
4
  from django.conf import settings
@@ -7,9 +6,8 @@ from django.core.management import BaseCommand
7
6
 
8
7
  from pulpcore.plugin.cache import SyncContentCache
9
8
 
10
- from pulp_container.app.models import Manifest, ContainerDistribution
9
+ from pulp_container.app.models import ContainerDistribution, Manifest
11
10
  from pulp_container.app.utils import determine_media_type_from_json
12
-
13
11
  from pulp_container.constants import MEDIA_TYPE
14
12
 
15
13
 
@@ -1,11 +1,12 @@
1
1
  from import_export import fields, widgets
2
- from pulpcore.plugin.importexport import QueryModelResource, BaseContentResource
2
+
3
+ from pulpcore.plugin.importexport import BaseContentResource, QueryModelResource
3
4
  from pulpcore.plugin.modelresources import RepositoryResource
4
5
 
5
6
  from pulp_container.app.models import (
6
7
  Blob,
7
- ContainerRepository,
8
8
  ContainerPushRepository,
9
+ ContainerRepository,
9
10
  Manifest,
10
11
  ManifestListManifest,
11
12
  ManifestSignature,
@@ -1,17 +1,16 @@
1
- from gettext import gettext as _
2
-
3
1
  import json
4
2
  import os
5
3
  import re
6
4
  import tempfile
7
5
  import time
6
+ from gettext import gettext as _
8
7
  from logging import getLogger
9
8
 
10
- from django.db import models
11
9
  from django.conf import settings
12
10
  from django.contrib.postgres import fields
11
+ from django.db import models
13
12
  from django.shortcuts import redirect
14
- from django_lifecycle import hook, AFTER_CREATE, AFTER_DELETE, AFTER_UPDATE
13
+ from django_lifecycle import AFTER_CREATE, AFTER_DELETE, AFTER_UPDATE, hook
15
14
 
16
15
  from pulpcore.plugin.cache import SyncContentCache
17
16
  from pulpcore.plugin.download import DownloaderFactory
@@ -20,17 +19,17 @@ from pulpcore.plugin.models import (
20
19
  AutoAddObjPermsMixin,
21
20
  BaseModel,
22
21
  Content,
22
+ Distribution,
23
23
  Remote,
24
24
  Repository,
25
- Distribution,
26
25
  SigningService,
26
+ )
27
+ from pulpcore.plugin.models import (
27
28
  Upload as CoreUpload,
28
29
  )
29
30
  from pulpcore.plugin.repo_version_utils import remove_duplicates, validate_repo_version
30
31
  from pulpcore.plugin.util import gpg_verify
31
32
 
32
-
33
- from . import downloaders
34
33
  from pulp_container.app.utils import get_content_data, integer_overflow_safe
35
34
  from pulp_container.constants import (
36
35
  COSIGN_MEDIA_TYPES,
@@ -41,6 +40,8 @@ from pulp_container.constants import (
41
40
  SIGNATURE_TYPE,
42
41
  )
43
42
 
43
+ from . import downloaders
44
+
44
45
  logger = getLogger(__name__)
45
46
 
46
47
 
@@ -1,35 +1,32 @@
1
1
  import json
2
2
  import logging
3
3
  import os
4
-
5
- from asgiref.sync import sync_to_async
6
-
7
4
  from contextlib import suppress
8
5
  from urllib.parse import urljoin
9
6
 
10
7
  from aiohttp import web
11
- from aiohttp.client_exceptions import ClientResponseError, ClientConnectionError
8
+ from aiohttp.client_exceptions import ClientConnectionError, ClientResponseError
12
9
  from aiohttp.web_exceptions import HTTPTooManyRequests
13
- from django_guid import set_guid
14
- from django_guid.utils import generate_guid
10
+ from asgiref.sync import sync_to_async
15
11
  from django.core.exceptions import ObjectDoesNotExist
16
12
  from django.db import IntegrityError
13
+ from django_guid import set_guid
14
+ from django_guid.utils import generate_guid
17
15
  from multidict import MultiDict
18
16
 
19
- from pulpcore.plugin.content import Handler, PathNotResolved
20
- from pulpcore.plugin.util import get_domain
21
- from pulpcore.plugin.models import RemoteArtifact, Content, ContentArtifact
22
- from pulpcore.plugin.content import ArtifactResponse
23
- from pulpcore.plugin.tasking import dispatch
17
+ from pulpcore.plugin.content import ArtifactResponse, Handler, PathNotResolved
24
18
  from pulpcore.plugin.exceptions import TimeoutException
19
+ from pulpcore.plugin.models import Content, ContentArtifact, RemoteArtifact
20
+ from pulpcore.plugin.tasking import dispatch
21
+ from pulpcore.plugin.util import get_domain
25
22
 
26
23
  from pulp_container.app.cache import RegistryContentCache
27
- from pulp_container.app.models import ContainerDistribution, Tag, Blob, Manifest, BlobManifest
24
+ from pulp_container.app.models import Blob, BlobManifest, ContainerDistribution, Manifest, Tag
28
25
  from pulp_container.app.tasks import download_image_data
29
26
  from pulp_container.app.utils import (
30
27
  calculate_digest,
31
- get_accepted_media_types,
32
28
  determine_media_type,
29
+ get_accepted_media_types,
33
30
  save_artifact,
34
31
  )
35
32
  from pulp_container.constants import BLOB_CONTENT_TYPE, EMPTY_BLOB, MEDIA_TYPE, V2_ACCEPT_HEADERS
@@ -7,36 +7,27 @@ Check `Plugin Writer's Guide`_ for more details.
7
7
 
8
8
  import base64
9
9
  import binascii
10
+ import hashlib
10
11
  import json
11
12
  import logging
12
- import hashlib
13
13
  import re
14
-
15
- from aiohttp.client_exceptions import ClientResponseError, ClientConnectionError
16
14
  from itertools import chain
17
- from urllib.parse import urljoin, urlparse, urlunparse, parse_qs, urlencode
18
15
  from tempfile import NamedTemporaryFile
16
+ from urllib.parse import parse_qs, urlencode, urljoin, urlparse, urlunparse
19
17
 
18
+ from aiohttp.client_exceptions import ClientConnectionError, ClientResponseError
19
+ from django.conf import settings
20
20
  from django.core.exceptions import ObjectDoesNotExist
21
21
  from django.core.files.base import ContentFile, File
22
22
  from django.db import IntegrityError, transaction
23
23
  from django.db.models import F, Value
24
24
  from django.forms.models import model_to_dict
25
25
  from django.shortcuts import get_object_or_404
26
-
27
- from django.conf import settings
28
-
29
- from pulpcore.plugin.models import Artifact, ContentArtifact, UploadChunk
30
- from pulpcore.plugin.files import PulpTemporaryUploadedFile
31
- from pulpcore.plugin.tasking import add_and_remove, dispatch
32
- from pulpcore.plugin.util import get_objects_for_user, get_url, get_domain
33
- from pulpcore.plugin.exceptions import TimeoutException
34
-
35
26
  from rest_framework.exceptions import (
36
27
  AuthenticationFailed,
37
28
  NotAuthenticated,
38
- PermissionDenied,
39
29
  ParseError,
30
+ PermissionDenied,
40
31
  Throttled,
41
32
  )
42
33
  from rest_framework.generics import ListAPIView
@@ -46,38 +37,44 @@ from rest_framework.renderers import BaseRenderer, JSONRenderer
46
37
  from rest_framework.response import Response
47
38
  from rest_framework.serializers import ModelSerializer
48
39
  from rest_framework.settings import api_settings
49
- from rest_framework.viewsets import ViewSet
50
- from rest_framework.views import APIView, exception_handler
51
40
  from rest_framework.status import HTTP_401_UNAUTHORIZED
41
+ from rest_framework.views import APIView, exception_handler
42
+ from rest_framework.viewsets import ViewSet
43
+
44
+ from pulpcore.plugin.exceptions import TimeoutException
45
+ from pulpcore.plugin.files import PulpTemporaryUploadedFile
46
+ from pulpcore.plugin.models import Artifact, ContentArtifact, UploadChunk
47
+ from pulpcore.plugin.tasking import add_and_remove, dispatch
48
+ from pulpcore.plugin.util import get_domain, get_objects_for_user, get_url
52
49
 
53
50
  from pulp_container.app import models, serializers
54
51
  from pulp_container.app.authorization import AuthorizationService, PermissionChecker
55
52
  from pulp_container.app.cache import (
56
- find_base_path_cached,
57
53
  FlatpakIndexStaticCache,
58
54
  RegistryApiCache,
55
+ find_base_path_cached,
59
56
  )
60
57
  from pulp_container.app.exceptions import (
61
58
  BadGateway,
59
+ BlobInvalid,
60
+ BlobNotFound,
62
61
  GatewayTimeout,
63
62
  InvalidRequest,
64
- RepositoryNotFound,
65
- RepositoryInvalid,
66
- BlobNotFound,
67
- BlobInvalid,
68
- ManifestNotFound,
69
63
  ManifestInvalid,
64
+ ManifestNotFound,
70
65
  ManifestSignatureInvalid,
66
+ RepositoryInvalid,
67
+ RepositoryNotFound,
71
68
  )
72
69
  from pulp_container.app.redirects import (
70
+ AzureStorageRedirects,
73
71
  FileStorageRedirects,
74
72
  S3StorageRedirects,
75
- AzureStorageRedirects,
76
73
  )
77
74
  from pulp_container.app.token_verification import (
78
75
  RegistryAuthentication,
79
- TokenAuthentication,
80
76
  RegistryPermission,
77
+ TokenAuthentication,
81
78
  TokenPermission,
82
79
  )
83
80
  from pulp_container.app.utils import (
@@ -571,9 +568,9 @@ class FlatpakIndexDynamicView(APIView):
571
568
  elif manifest.media_type in (models.MEDIA_TYPE.MANIFEST_LIST, models.MEDIA_TYPE.INDEX_OCI):
572
569
  mlms = manifest.listed_manifests.through.objects.filter(image_manifest__pk=manifest.pk)
573
570
  if oss:
574
- mlms.filter(os__in=oss)
571
+ mlms = mlms.filter(os__in=oss)
575
572
  if architectures:
576
- mlms.filter(architecture__in=architectures)
573
+ mlms = mlms.filter(architecture__in=architectures)
577
574
  for mlm in mlms:
578
575
  self.recurse_through_manifest_lists(
579
576
  tag, mlm.manifest_list, oss, architectures, manifests
@@ -679,7 +676,7 @@ class FlatpakIndexDynamicView(APIView):
679
676
  continue
680
677
  images.append(
681
678
  {
682
- "Tags": tagged,
679
+ "Tags": list(tagged),
683
680
  "Digest": manifest.digest,
684
681
  "MediaType": manifest.media_type,
685
682
  "OS": os,
@@ -1,7 +1,8 @@
1
- from gettext import gettext as _
2
1
  import re
2
+ from gettext import gettext as _
3
3
 
4
4
  from django.core.validators import URLValidator
5
+ from pulp_file.app.models import FileContent
5
6
  from rest_framework import serializers
6
7
 
7
8
  from pulpcore.plugin.models import (
@@ -13,8 +14,8 @@ from pulpcore.plugin.models import (
13
14
  from pulpcore.plugin.serializers import (
14
15
  ContentRedirectContentGuardSerializer,
15
16
  DetailRelatedField,
16
- GetOrCreateSerializerMixin,
17
17
  DistributionSerializer,
18
+ GetOrCreateSerializerMixin,
18
19
  IdentityField,
19
20
  ModelSerializer,
20
21
  NestedRelatedField,
@@ -28,8 +29,7 @@ from pulpcore.plugin.serializers import (
28
29
  ValidateFieldsMixin,
29
30
  )
30
31
 
31
- from pulp_file.app.models import FileContent
32
- from pulp_container.app import models, fields
32
+ from pulp_container.app import fields, models
33
33
  from pulp_container.constants import SIGNATURE_TYPE
34
34
 
35
35
  VALID_SIGNATURE_NAME_REGEX = r"^sha256:[0-9a-f]{64}@[0-9a-f]{32}$"
@@ -564,10 +564,8 @@ class TagImageSerializer(TagOperationSerializer):
564
564
  raise serializers.ValidationError(
565
565
  _(
566
566
  "A manifest with the digest '{}' does not "
567
- "exist in the latest repository version '{}'".format(
568
- new_data["digest"], latest_version
569
- )
570
- )
567
+ "exist in the latest repository version '{}'"
568
+ ).format(new_data["digest"], latest_version)
571
569
  )
572
570
 
573
571
  new_data["manifest"] = manifest
@@ -592,10 +590,8 @@ class UnTagImageSerializer(TagOperationSerializer):
592
590
  models.Tag.objects.get(pk__in=latest_version.content.all(), name=new_data["tag"])
593
591
  except models.Tag.DoesNotExist:
594
592
  raise serializers.ValidationError(
595
- _(
596
- "The tag '{}' does not exist in the latest repository version '{}'".format(
597
- new_data["tag"], latest_version
598
- )
593
+ _("The tag '{}' does not exist in the latest repository version '{}'").format(
594
+ new_data["tag"], latest_version
599
595
  )
600
596
  )
601
597
 
@@ -621,7 +617,7 @@ class RecursiveManageSerializer(ValidateFieldsMixin, serializers.Serializer):
621
617
  if content_units:
622
618
  if "*" in content_units and len(content_units) > 1:
623
619
  raise serializers.ValidationError(
624
- _("'*' should be the only item present in the {}".format(content_units))
620
+ _("'*' should be the only item present in the {}").format(content_units)
625
621
  )
626
622
  return data
627
623
 
@@ -664,10 +660,7 @@ class CopySerializer(ValidateFieldsMixin, serializers.Serializer):
664
660
  new_data.update(data)
665
661
  return new_data
666
662
  raise serializers.ValidationError(
667
- _(
668
- "Either the 'repository' or 'repository_version' need to be specified "
669
- "but not both."
670
- )
663
+ _("Either the 'repository' or 'repository_version' need to be specified but not both.")
671
664
  )
672
665
 
673
666
 
@@ -719,10 +712,8 @@ class RemoveImageSerializer(ValidateFieldsMixin, serializers.Serializer):
719
712
  raise serializers.ValidationError(
720
713
  _(
721
714
  "A manifest with the digest '{}' does not "
722
- "exist in the latest repository version '{}'".format(
723
- new_data["digest"], latest_version
724
- )
725
- )
715
+ "exist in the latest repository version '{}'"
716
+ ).format(new_data["digest"], latest_version)
726
717
  )
727
718
 
728
719
  new_data["manifest"] = manifest
@@ -762,10 +753,8 @@ class RemoveSignaturesSerializer(ValidateFieldsMixin, serializers.Serializer):
762
753
  raise serializers.ValidationError(
763
754
  _(
764
755
  "There are no signatures in the latest repository version '{}' "
765
- "produced with the specified key_id '{}'".format(
766
- latest_version, new_data["signed_with_key_id"]
767
- )
768
- )
756
+ "produced with the specified key_id '{}'"
757
+ ).format(latest_version, new_data["signed_with_key_id"])
769
758
  )
770
759
 
771
760
  new_data["sigs_pks"] = sigs_pks
@@ -829,7 +818,6 @@ class OCIBuildImageSerializer(ValidateFieldsMixin, serializers.Serializer):
829
818
  unnecessary database queries when checking permissions (DRF Access Policy).
830
819
  """
831
820
  if build_context := data.get("build_context", None):
832
-
833
821
  # check if the on_demand_artifacts exist
834
822
  for on_demand_artifact in build_context.on_demand_artifacts.iterator():
835
823
  if not on_demand_artifact.content_artifact.artifact:
@@ -5,6 +5,13 @@ import subprocess
5
5
  import tempfile
6
6
  from uuid import uuid4
7
7
 
8
+ from pulpcore.plugin.models import (
9
+ Artifact,
10
+ Content,
11
+ ContentArtifact,
12
+ PulpTemporaryFile,
13
+ )
14
+
8
15
  from pulp_container.app.models import (
9
16
  Blob,
10
17
  BlobManifest,
@@ -12,14 +19,8 @@ from pulp_container.app.models import (
12
19
  Manifest,
13
20
  Tag,
14
21
  )
15
- from pulp_container.constants import MEDIA_TYPE
16
22
  from pulp_container.app.utils import calculate_digest
17
- from pulpcore.plugin.models import (
18
- Artifact,
19
- ContentArtifact,
20
- Content,
21
- PulpTemporaryFile,
22
- )
23
+ from pulp_container.constants import MEDIA_TYPE
23
24
 
24
25
 
25
26
  def get_or_create_blob(layer_json, manifest, path):
@@ -1,11 +1,12 @@
1
1
  from django.db.models import Q
2
+
2
3
  from pulpcore.plugin.models import Content, Repository
3
4
 
4
5
  from pulp_container.app.models import (
6
+ MEDIA_TYPE,
5
7
  Blob,
6
8
  Manifest,
7
9
  ManifestSignature,
8
- MEDIA_TYPE,
9
10
  Tag,
10
11
  )
11
12
 
@@ -15,7 +15,6 @@ from pulp_container.app.models import (
15
15
  ManifestSigningService,
16
16
  Tag,
17
17
  )
18
-
19
18
  from pulp_container.app.utils import extract_data_from_signature
20
19
  from pulp_container.constants import (
21
20
  MANIFEST_MEDIA_TYPES,
@@ -1,25 +1,16 @@
1
- import aiohttp
2
1
  import asyncio
3
2
  import base64
4
3
  import hashlib
5
4
  import json
6
5
  import logging
7
-
8
6
  from urllib.parse import urljoin, urlparse, urlunparse
9
7
 
8
+ import aiohttp
10
9
  from asgiref.sync import sync_to_async
10
+
11
11
  from pulpcore.plugin.models import Artifact, ProgressReport, Remote
12
- from pulpcore.plugin.stages import DeclarativeArtifact, DeclarativeContent, Stage, ContentSaver
12
+ from pulpcore.plugin.stages import ContentSaver, DeclarativeArtifact, DeclarativeContent, Stage
13
13
 
14
- from pulp_container.constants import (
15
- MANIFEST_TYPE,
16
- MEDIA_TYPE,
17
- SIGNATURE_API_EXTENSION_VERSION,
18
- SIGNATURE_HEADER,
19
- SIGNATURE_SOURCE,
20
- SIGNATURE_TYPE,
21
- V2_ACCEPT_HEADERS,
22
- )
23
14
  from pulp_container.app.models import (
24
15
  Blob,
25
16
  BlobManifest,
@@ -29,14 +20,23 @@ from pulp_container.app.models import (
29
20
  Tag,
30
21
  )
31
22
  from pulp_container.app.utils import (
32
- extract_data_from_signature,
33
- urlpath_sanitize,
34
- determine_media_type,
35
- validate_manifest,
36
23
  calculate_digest,
24
+ determine_media_type,
25
+ extract_data_from_signature,
37
26
  filter_resources,
38
27
  get_content_data,
39
28
  integer_overflow_safe,
29
+ urlpath_sanitize,
30
+ validate_manifest,
31
+ )
32
+ from pulp_container.constants import (
33
+ MANIFEST_TYPE,
34
+ MEDIA_TYPE,
35
+ SIGNATURE_API_EXTENSION_VERSION,
36
+ SIGNATURE_HEADER,
37
+ SIGNATURE_SOURCE,
38
+ SIGNATURE_TYPE,
39
+ V2_ACCEPT_HEADERS,
40
40
  )
41
41
 
42
42
  log = logging.getLogger(__name__)
@@ -556,8 +556,9 @@ class ContainerFirstStage(Stage):
556
556
  break
557
557
  except aiohttp.client_exceptions.ClientResponseError as exc:
558
558
  log.info(
559
- "{} is not accessible, can't sync an image signature. "
560
- "Error: {} {}".format(signature_url, exc.status, exc.message)
559
+ "{} is not accessible, can't sync an image signature. Error: {} {}".format(
560
+ signature_url, exc.status, exc.message
561
+ )
561
562
  )
562
563
 
563
564
  with open(signature_download_result.path, "rb") as f:
@@ -4,15 +4,16 @@ from pulpcore.plugin.stages import (
4
4
  ArtifactDownloader,
5
5
  ArtifactSaver,
6
6
  DeclarativeVersion,
7
- RemoteArtifactSaver,
8
- ResolveContentFutures,
9
7
  QueryExistingArtifacts,
10
8
  QueryExistingContents,
9
+ RemoteArtifactSaver,
10
+ ResolveContentFutures,
11
11
  )
12
12
 
13
- from .sync_stages import ContainerFirstStage, ContainerContentSaver
14
13
  from pulp_container.app.models import ContainerRemote, ContainerRepository
15
14
 
15
+ from .sync_stages import ContainerContentSaver, ContainerFirstStage
16
+
16
17
  log = logging.getLogger(__name__)
17
18
 
18
19
 
@@ -1,4 +1,5 @@
1
1
  from pulpcore.plugin.models import CreatedResource, Repository
2
+
2
3
  from pulp_container.app.models import Manifest, Tag
3
4
 
4
5