Skip to content

Commit 00edbff

Browse files
committed
Fix pull-through not saving metadata artifact
fixes: #1087
1 parent 3764b48 commit 00edbff

File tree

3 files changed

+53
-1
lines changed

3 files changed

+53
-1
lines changed

CHANGES/1087.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed pull-through PEP 658 metadata not being saved correctly with the package.

pulp_python/app/models.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from .provenance import Provenance
2626
from .utils import (
2727
artifact_to_python_content_data,
28+
artifact_to_metadata_artifact,
2829
canonicalize_name,
2930
python_content_to_json,
3031
PYPI_LAST_SERIAL,
@@ -215,7 +216,10 @@ def init_from_artifact_and_relative_path(artifact, relative_path):
215216
"""Used when downloading package from pull-through cache."""
216217
path = PurePath(relative_path)
217218
data = artifact_to_python_content_data(path.name, artifact, domain=get_domain())
218-
return PythonPackageContent(**data)
219+
artifacts = {path.name: artifact}
220+
if metadata_artifact := artifact_to_metadata_artifact(path.name, artifact):
221+
artifacts[f"{path.name}.metadata"] = metadata_artifact
222+
return PythonPackageContent(**data), artifacts
219223

220224
def __str__(self):
221225
"""

pulp_python/tests/functional/api/test_full_mirror.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,3 +218,50 @@ def test_pull_through_metadata(python_remote_factory, python_distribution_factor
218218
r = requests.get(url2)
219219
assert r.status_code == 200
220220
assert sha256(r.content).hexdigest() == package2.metadata_digests["sha256"]
221+
222+
223+
@pytest.mark.parallel
224+
def test_pull_through_metadata_with_repo(
225+
python_repo_factory,
226+
python_remote_factory,
227+
python_distribution_factory,
228+
pulpcore_bindings,
229+
):
230+
"""Tests that metadata is correctly saved when using pull-through with a repository."""
231+
remote = python_remote_factory(url=PYPI_URL, includes=["pip"])
232+
repo = python_repo_factory()
233+
distro = python_distribution_factory(repository=repo.pulp_href, remote=remote.pulp_href)
234+
235+
pip_url = f"{distro.base_url}simple/pip/"
236+
project_page = ProjectPage.from_response(requests.get(pip_url), "pip")
237+
filename = "pip-26.0.1-py3-none-any.whl"
238+
package = next(p for p in project_page.packages if p.filename == filename)
239+
assert package.has_metadata
240+
assert "?redirect=" in package.url
241+
242+
# Retrieve the metadata and assert the content was not saved to the repository
243+
parts = urlsplit(package.url)
244+
url = urlunsplit((parts[0], parts[1], parts[2] + ".metadata", parts[3], parts[4]))
245+
r = requests.get(url)
246+
assert r.status_code == 200
247+
assert sha256(r.content).hexdigest() == package.metadata_digests["sha256"]
248+
project_page = ProjectPage.from_response(requests.get(pip_url), "pip")
249+
package = next(p for p in project_page.packages if p.filename == filename)
250+
assert package.has_metadata
251+
assert "?redirect=" in package.url
252+
253+
# Now retrieve the package and assert the content was saved with metadata
254+
r = requests.get(package.url)
255+
assert r.status_code == 200
256+
pa = pulpcore_bindings.ArtifactsApi.list(sha256=package.digests["sha256"])
257+
assert pa.count == 1
258+
ma = pulpcore_bindings.ArtifactsApi.list(sha256=package.metadata_digests["sha256"])
259+
assert ma.count == 1
260+
261+
# Check the simple page is updated to point to the local repository
262+
project_page = ProjectPage.from_response(requests.get(pip_url), "pip")
263+
package = next(p for p in project_page.packages if p.filename == filename)
264+
assert "?redirect=" not in package.url
265+
r = requests.get(package.metadata_url)
266+
assert r.status_code == 200
267+
assert sha256(r.content).hexdigest() == package.metadata_digests["sha256"]

0 commit comments

Comments
 (0)