Skip to content

Commit 3d9ba43

Browse files
authored
Merge pull request #387 from gerrod3/twine-upload-fix
Simplified twine upload to create one task per distribution uploaded
2 parents 921d67c + 2be476f commit 3d9ba43

File tree

5 files changed

+43
-42
lines changed

5 files changed

+43
-42
lines changed

pulp_python/app/pypi/views.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,18 +124,25 @@ def upload(self, request, path):
124124
if repo_content.filter(filename=filename).exists():
125125
return HttpResponseBadRequest(reason=f"Package {filename} already exists in index")
126126

127-
return self.upload_package(repo, artifact, filename, request.session)
127+
if settings.PYTHON_GROUP_UPLOADS:
128+
return self.upload_package_group(repo, artifact, filename, request.session)
128129

129-
def upload_package(self, repo, artifact, filename, session):
130+
result = dispatch(tasks.upload, [artifact, repo],
131+
kwargs={"artifact_sha256": artifact.sha256,
132+
"filename": filename,
133+
"repository_pk": str(repo.pk)})
134+
return Response(data={"task": reverse('tasks-detail', args=[result.pk], request=None)})
135+
136+
def upload_package_group(self, repo, artifact, filename, session):
130137
"""Steps 4 & 5, spawns tasks to add packages to index."""
131138
start_time = datetime.now(tz=timezone.utc) + timedelta(seconds=5)
132139
task = "updated"
133140
if not session.get("start"):
134-
task = self.create_upload_task(session, repo, artifact, filename, start_time)
141+
task = self.create_group_upload_task(session, repo, artifact, filename, start_time)
135142
else:
136143
sq = Session.objects.select_for_update(nowait=True).filter(pk=session.session_key)
137-
with transaction.atomic():
138-
try:
144+
try:
145+
with transaction.atomic():
139146
sq.first()
140147
try:
141148
current_start = datetime.fromisoformat(session['start'])
@@ -149,19 +156,19 @@ def upload_package(self, repo, artifact, filename, session):
149156
session.save()
150157
else:
151158
raise DatabaseError
152-
except DatabaseError:
153-
session.cycle_key()
154-
task = self.create_upload_task(session, repo, artifact, filename, start_time)
159+
except DatabaseError:
160+
session.cycle_key()
161+
task = self.create_group_upload_task(session, repo, artifact, filename, start_time)
155162
data = {"session": session.session_key, "task": task, "task_start_time": start_time}
156163
return Response(data=data)
157164

158-
def create_upload_task(self, cur_session, repository, artifact, filename, start_time):
165+
def create_group_upload_task(self, cur_session, repository, artifact, filename, start_time):
159166
"""Creates the actual task that adds the packages to the index."""
160167
cur_session['start'] = str(start_time)
161168
cur_session['artifacts'] = [(str(artifact.sha256), filename)]
162169
cur_session.modified = False
163170
cur_session.save()
164-
result = dispatch(tasks.upload, [artifact, repository],
171+
result = dispatch(tasks.upload_group, [artifact, repository],
165172
kwargs={"session_pk": str(cur_session.session_key),
166173
"repository_pk": str(repository.pk)})
167174
return reverse('tasks-detail', args=[result.pk], request=None)

pulp_python/app/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
PYTHON_GROUP_UPLOADS = False

pulp_python/app/tasks/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44

55
from .publish import publish # noqa:F401
66
from .sync import sync # noqa:F401
7-
from .upload import upload # noqa:F401
7+
from .upload import upload, upload_group # noqa:F401

pulp_python/app/tasks/upload.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,24 @@
3030
}
3131

3232

33-
def upload(session_pk, repository_pk=None):
33+
def upload(artifact_sha256, filename, repository_pk=None):
34+
"""
35+
Uploads a Python Package to Pulp
36+
37+
Args:
38+
artifact_sha256: the sha256 of the artifact in Pulp to create a package from
39+
filename: the full filename of the package to create
40+
repository_pk: the optional pk of the repository to add the content to
41+
"""
42+
pre_check = PythonPackageContent.objects.filter(sha256=artifact_sha256)
43+
content_to_add = pre_check or create_content(artifact_sha256, filename)
44+
if repository_pk:
45+
repository = PythonRepository.objects.get(pk=repository_pk)
46+
with repository.new_version() as new_version:
47+
new_version.add_content(content_to_add)
48+
49+
50+
def upload_group(session_pk, repository_pk=None):
3451
"""
3552
Uploads a Python Package to Pulp
3653

pulp_python/tests/functional/api/test_pypi_apis.py

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -123,31 +123,7 @@ def test_package_upload(self):
123123
)
124124

125125
def test_package_upload_session(self):
126-
"""Tests that multiple packages can be uploaded in one session."""
127-
repo, distro = self._create_empty_repo_and_distribution()
128-
url = urljoin(PYPI_HOST, distro.base_path + "/legacy/")
129-
session = requests.Session()
130-
response = session.post(
131-
url,
132-
data={"sha256_digest": PYTHON_EGG_SHA256},
133-
files={"content": open(self.egg, "rb")},
134-
)
135-
response2 = session.post(
136-
url,
137-
data={"sha256_digest": PYTHON_WHEEL_SHA256},
138-
files={"content": open(self.wheel, "rb")},
139-
)
140-
self.assertEqual(response.status_code, 200)
141-
self.assertEqual(response2.status_code, 200)
142-
response, response2 = response.json(), response2.json()
143-
self.assertEqual(response["session"], response2["session"])
144-
self.assertEqual(response2["task"], "updated")
145-
monitor_task(response["task"])
146-
content = get_added_content_summary(repo, f"{repo.versions_href}1/")
147-
self.assertDictEqual({PYTHON_CONTENT_NAME: 2}, content)
148-
149-
def test_package_upload_session_long(self):
150-
"""Tests that long uploads will be broken up into multiple tasks."""
126+
"""Tests that multiple uploads will be broken up into multiple tasks."""
151127
repo, distro = self._create_empty_repo_and_distribution()
152128
url = urljoin(PYPI_HOST, distro.base_path + "/legacy/")
153129
session = requests.Session()
@@ -166,8 +142,6 @@ def test_package_upload_session_long(self):
166142
)
167143
self.assertEqual(response2.status_code, 200)
168144
response2 = response2.json()
169-
self.assertNotEqual("updated", response2["task"])
170-
self.assertNotEqual(response["session"], response2["session"])
171145
self.assertNotEqual(response["task"], response2["task"])
172146
monitor_task(response2["task"])
173147
content = get_content_summary(repo, f"{repo.versions_href}2/")
@@ -208,9 +182,11 @@ def test_twine_upload(self):
208182
capture_output=True,
209183
check=True,
210184
)
211-
task = task_api.list(reserved_resources_record=repo.pulp_href).results[0]
212-
monitor_task(task.pulp_href)
213-
content = get_added_content_summary(repo, f"{repo.versions_href}1/")
185+
tasks = task_api.list(reserved_resources_record=[repo.pulp_href]).results
186+
for task in reversed(tasks):
187+
t = monitor_task(task.pulp_href)
188+
repo_ver_href = t.created_resources[-1]
189+
content = get_content_summary(repo, f"{repo_ver_href}")
214190
self.assertDictEqual({PYTHON_CONTENT_NAME: 2}, content)
215191

216192
# Test re-uploading same packages gives error

0 commit comments

Comments
 (0)