Skip to content

Commit d05fed1

Browse files
committed
Extend the call repository content modify to include DEB release components
This commit extends the repository content modify call to additional components such as package_release_components release_components and release_architectures, with the final goal of enabling batch uploading of DEB packages. This is done by: 1. Adding AptRepositoryAddRemoveContentSerializer for extending the parameters allowed in the repository content modify call to: - add_release_components - add_release_architectures - add_package_release_components - remove_release_components - remove_release_architectures - remove_package_release_components 2. Updating the viewset AptModifyRepositoryActionMixin to include also package_release_components, release_components and release_architectures as they also extend from Content.
1 parent 05d3216 commit d05fed1

File tree

4 files changed

+126
-7
lines changed

4 files changed

+126
-7
lines changed

CHANGES/1398.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Allow adding/removing package_release_components, release_components and release_architectures via the repository content modify API endpoint

pulp_deb/app/serializers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
AptRepositorySerializer,
3232
AptRepositorySyncURLSerializer,
3333
CopySerializer,
34+
AptRepositoryAddRemoveContentSerializer,
3435
)
3536

3637
from .acs_serializers import AptAlternateContentSourceSerializer

pulp_deb/app/serializers/repository_serializers.py

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
from gettext import gettext as _
22
from django.conf import settings
33
from django.db import transaction
4-
from pulpcore.plugin.models import SigningService
4+
from pulpcore.plugin.models import (
5+
SigningService,
6+
RepositoryVersion,
7+
)
58
from pulpcore.plugin.serializers import (
69
RelatedField,
710
RepositorySerializer,
811
RepositorySyncURLSerializer,
912
ValidateFieldsMixin,
13+
RepositoryAddRemoveContentSerializer,
1014
)
1115
from pulpcore.plugin.util import get_url, get_domain
16+
from pulpcore.app.util import extract_pk, raise_for_unknown_content_units
1217

1318
from pulp_deb.app.models import (
1419
AptRepositoryReleaseServiceOverride,
1520
AptReleaseSigningService,
1621
AptRepository,
22+
ReleaseComponent,
23+
ReleaseArchitecture,
24+
PackageReleaseComponent,
1725
)
1826

1927
from jsonschema import Draft7Validator
@@ -233,3 +241,96 @@ def check_cross_domain_config(cfg):
233241
check_cross_domain_config(data["config"])
234242

235243
return data
244+
245+
246+
class AptRepositoryAddRemoveContentSerializer(RepositoryAddRemoveContentSerializer):
247+
"""
248+
Extends RepositoryAddRemoveContentSerializer to support adding/removing
249+
- ReleaseComponents
250+
- ReleaseArchitectures
251+
- PackageReleaseComponents
252+
"""
253+
254+
add_release_components = serializers.ListField(
255+
help_text=_("A list of ReleaseComponents to associate with a repository."),
256+
child=serializers.CharField(error_messages={"invalid": "Not a valid URI of a resource."}),
257+
required=False,
258+
)
259+
260+
remove_release_components = serializers.ListField(
261+
help_text=_("A list of ReleaseComponents to disassociate with a repository."),
262+
child=serializers.CharField(error_messages={"invalid": "Not a valid URI of a resource."}),
263+
required=False,
264+
)
265+
266+
add_release_architectures = serializers.ListField(
267+
help_text=_("A list of ReleaseArchitectures to associate with a repository."),
268+
child=serializers.CharField(error_messages={"invalid": "Not a valid URI of a resource."}),
269+
required=False,
270+
)
271+
272+
remove_release_architectures = serializers.ListField(
273+
help_text=_("A list of ReleaseArchitectures to disassociate with a repository."),
274+
child=serializers.CharField(error_messages={"invalid": "Not a valid URI of a resource."}),
275+
required=False,
276+
)
277+
278+
add_package_release_components = serializers.ListField(
279+
help_text=_("A list of PackageReleaseComponents to associate with a repository."),
280+
child=serializers.CharField(error_messages={"invalid": "Not a valid URI of a resource."}),
281+
required=False,
282+
)
283+
284+
remove_package_release_components = serializers.ListField(
285+
help_text=_("A list of PackageReleaseComponents to disassociate with a repository."),
286+
child=serializers.CharField(error_messages={"invalid": "Not a valid URI of a resource."}),
287+
required=False,
288+
)
289+
290+
def validate_add_release_components(self, value):
291+
return self._validate_content_hrefs(value, ReleaseComponent)
292+
293+
def validate_remove_release_components(self, value):
294+
return self._validate_content_hrefs(value, ReleaseComponent)
295+
296+
def validate_add_release_architectures(self, value):
297+
return self._validate_content_hrefs(value, ReleaseArchitecture)
298+
299+
def validate_remove_release_architectures(self, value):
300+
return self._validate_content_hrefs(value, ReleaseArchitecture)
301+
302+
def validate_add_package_release_components(self, value):
303+
return self._validate_content_hrefs(value, PackageReleaseComponent)
304+
305+
def validate_remove_package_release_components(self, value):
306+
return self._validate_content_hrefs(value, PackageReleaseComponent)
307+
308+
def _validate_content_hrefs(self, value, model_class):
309+
"""
310+
Validates that the requested Content exists.
311+
Similar to the validation done in "pulpcore/app/serializers/repository.py"
312+
for adding/removing content units
313+
"""
314+
content_units = {}
315+
316+
for url in value:
317+
content_units[extract_pk(url)] = url
318+
319+
content_units_pks = set(content_units.keys())
320+
existing_content_units = model_class.objects.filter(pk__in=content_units_pks)
321+
existing_content_units.touch()
322+
323+
raise_for_unknown_content_units(existing_content_units, content_units)
324+
325+
return list(content_units.keys())
326+
327+
class Meta:
328+
model = RepositoryVersion
329+
fields = RepositoryAddRemoveContentSerializer.Meta.fields + [
330+
"add_release_components",
331+
"remove_release_components",
332+
"add_release_architectures",
333+
"remove_release_architectures",
334+
"add_package_release_components",
335+
"remove_package_release_components",
336+
]

pulp_deb/app/viewsets/repository.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77

88
from pulp_deb.app.models.content.content import Package
99
from pulp_deb.app.models.content.structure_content import PackageReleaseComponent
10-
from pulp_deb.app.serializers import AptRepositorySyncURLSerializer
11-
10+
from pulp_deb.app.serializers import (
11+
AptRepositorySyncURLSerializer,
12+
AptRepositoryAddRemoveContentSerializer,
13+
)
1214
from pulpcore.plugin.util import extract_pk, get_url
1315
from pulpcore.plugin.actions import ModifyRepositoryActionMixin
1416
from pulpcore.plugin.serializers import (
1517
AsyncOperationResponseSerializer,
16-
RepositoryAddRemoveContentSerializer,
1718
)
1819
from pulpcore.plugin.models import RepositoryVersion
1920
from pulpcore.plugin.tasking import dispatch
@@ -34,15 +35,30 @@ class AptModifyRepositoryActionMixin(ModifyRepositoryActionMixin):
3435
summary="Modify Repository Content",
3536
responses={202: AsyncOperationResponseSerializer},
3637
)
37-
@action(detail=True, methods=["post"], serializer_class=RepositoryAddRemoveContentSerializer)
38+
@action(detail=True, methods=["post"], serializer_class=AptRepositoryAddRemoveContentSerializer)
3839
def modify(self, request, pk):
39-
remove_content_units = request.data.get("remove_content_units", [])
40+
data = request.data
41+
remove_content_units = data.get("remove_content_units", [])
4042
package_hrefs = [href for href in remove_content_units if "/packages/" in href]
4143

4244
if package_hrefs:
4345
prc_hrefs = self._get_matching_prc_hrefs(package_hrefs)
4446
remove_content_units.extend(prc_hrefs)
45-
request.data["remove_content_units"] = remove_content_units
47+
48+
# Merge also add/remove RC, RA and PRCs into add/remove content units
49+
data["add_content_units"] = (
50+
data.get("add_content_units", [])
51+
+ data.get("add_release_components", [])
52+
+ data.get("add_release_architectures", [])
53+
+ data.get("add_package_release_components", [])
54+
)
55+
56+
data["remove_content_units"] = (
57+
remove_content_units
58+
+ data.get("remove_release_components", [])
59+
+ data.get("remove_release_architectures", [])
60+
+ data.get("remove_package_release_components", [])
61+
)
4662

4763
return super().modify(request, pk)
4864

0 commit comments

Comments
 (0)