From 893bab4b42b9a11315e1f91b201ed868677743b5 Mon Sep 17 00:00:00 2001 From: Daniel Alley Date: Sat, 17 Apr 2021 10:14:51 -0400 Subject: [PATCH] Swap to the new distribution model in pulpcore 3.12 [noissue] --- CHANGES/360.misc | 1 + .../0004_DATA_swap_distribution_model.py | 77 +++++++++++++++++++ pulp_python/app/models.py | 4 +- pulp_python/app/serializers.py | 16 +++- pulp_python/app/tasks/sync.py | 2 +- pulp_python/app/viewsets.py | 14 ++-- requirements.txt | 2 +- 7 files changed, 101 insertions(+), 15 deletions(-) create mode 100644 CHANGES/360.misc create mode 100644 pulp_python/app/migrations/0004_DATA_swap_distribution_model.py diff --git a/CHANGES/360.misc b/CHANGES/360.misc new file mode 100644 index 000000000..3987ad567 --- /dev/null +++ b/CHANGES/360.misc @@ -0,0 +1 @@ +Replaced some uses of deprecated pulpcore functionality. diff --git a/pulp_python/app/migrations/0004_DATA_swap_distribution_model.py b/pulp_python/app/migrations/0004_DATA_swap_distribution_model.py new file mode 100644 index 000000000..9449de83d --- /dev/null +++ b/pulp_python/app/migrations/0004_DATA_swap_distribution_model.py @@ -0,0 +1,77 @@ +# Generated by Django 2.2.19 on 2021-03-19 17:42 + +from django.db import migrations, models, transaction +import django.db.models.deletion + + +def migrate_data_from_old_model_to_new_model_up(apps, schema_editor): + """ Move objects from PythonDistribution to NewPythonDistribution.""" + PythonDistribution = apps.get_model('python', 'PythonDistribution') + NewPythonDistribution = apps.get_model('python', 'NewPythonDistribution') + for python_distribution in PythonDistribution.objects.all(): + with transaction.atomic(): + NewPythonDistribution( + pulp_id=python_distribution.pulp_id, + pulp_created=python_distribution.pulp_created, + pulp_last_updated=python_distribution.pulp_last_updated, + pulp_type=python_distribution.pulp_type, + name=python_distribution.name, + base_path=python_distribution.base_path, + content_guard=python_distribution.content_guard, + remote=python_distribution.remote, + publication=python_distribution.publication + ).save() + python_distribution.delete() + + +def migrate_data_from_old_model_to_new_model_down(apps, schema_editor): + """ Move objects from NewPythonDistribution to PythonDistribution.""" + PythonDistribution = apps.get_model('python', 'PythonDistribution') + NewPythonDistribution = apps.get_model('python', 'NewPythonDistribution') + for python_distribution in NewPythonDistribution.objects.all(): + with transaction.atomic(): + PythonDistribution( + pulp_id=python_distribution.pulp_id, + pulp_created=python_distribution.pulp_created, + pulp_last_updated=python_distribution.pulp_last_updated, + pulp_type=python_distribution.pulp_type, + name=python_distribution.name, + base_path=python_distribution.base_path, + content_guard=python_distribution.content_guard, + remote=python_distribution.remote, + publication=python_distribution.publication + ).save() + python_distribution.delete() + + +class Migration(migrations.Migration): + atomic = False + + dependencies = [ + ('core', '0062_add_new_distribution_mastermodel'), + ('python', '0003_new_sync_filters'), + ] + + operations = [ + migrations.CreateModel( + name='NewPythonDistribution', + fields=[ + ('distribution_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, related_name='python_pythondistribution', serialize=False, to='core.Distribution')), + ], + options={ + 'default_related_name': '%(app_label)s_%(model_name)s', + }, + bases=('core.distribution',), + ), + migrations.RunPython( + code=migrate_data_from_old_model_to_new_model_up, + reverse_code=migrate_data_from_old_model_to_new_model_down, + ), + migrations.DeleteModel( + name='PythonDistribution', + ), + migrations.RenameModel( + old_name='NewPythonDistribution', + new_name='PythonDistribution', + ), + ] diff --git a/pulp_python/app/models.py b/pulp_python/app/models.py index b2c145609..7f19450f6 100644 --- a/pulp_python/app/models.py +++ b/pulp_python/app/models.py @@ -7,7 +7,7 @@ from pulpcore.plugin.models import ( Content, Publication, - PublicationDistribution, + Distribution, Remote, Repository ) @@ -35,7 +35,7 @@ ("linux", "linux")) -class PythonDistribution(PublicationDistribution): +class PythonDistribution(Distribution): """ Distribution for 'Python' Content. """ diff --git a/pulp_python/app/serializers.py b/pulp_python/app/serializers.py index dc934a19a..187ac4079 100644 --- a/pulp_python/app/serializers.py +++ b/pulp_python/app/serializers.py @@ -24,14 +24,22 @@ class Meta: model = python_models.PythonRepository -class PythonDistributionSerializer(core_serializers.PublicationDistributionSerializer): +class PythonDistributionSerializer(core_serializers.DistributionSerializer): """ Serializer for Pulp distributions for the Python type. """ + publication = core_serializers.DetailRelatedField( + required=False, + help_text=_("Publication to be served"), + view_name_pattern=r"publications(-.*/.*)?-detail", + queryset=core_models.Publication.objects.exclude(complete=False), + allow_null=True, + ) + class Meta: - fields = core_serializers.PublicationDistributionSerializer.Meta.fields + fields = core_serializers.DistributionSerializer.Meta.fields + ('publication', ) model = python_models.PythonDistribution @@ -359,8 +367,8 @@ class PythonPublicationSerializer(core_serializers.PublicationSerializer): distributions = core_serializers.DetailRelatedField( help_text=_('This publication is currently being hosted as configured by these ' 'distributions.'), - source="python_pythondistribution", - view_name="filedistributions-detail", + source="distribution_set", + view_name="pythondistributions-detail", many=True, read_only=True, ) diff --git a/pulp_python/app/tasks/sync.py b/pulp_python/app/tasks/sync.py index dd660756a..d23f36acf 100644 --- a/pulp_python/app/tasks/sync.py +++ b/pulp_python/app/tasks/sync.py @@ -116,7 +116,7 @@ async def run(self): environ.pop('http_proxy') deferred_download = self.remote.policy != Remote.IMMEDIATE with ProgressReport( - message="Fetching Project Metadata", code="fetching.project" + message="Fetching Project Metadata", code="sync.fetching.project" ) as p: pmirror = PulpMirror( serial=0, # Serial currently isn't supported by Pulp diff --git a/pulp_python/app/viewsets.py b/pulp_python/app/viewsets.py index c3a4535a3..9ac8783e5 100644 --- a/pulp_python/app/viewsets.py +++ b/pulp_python/app/viewsets.py @@ -11,7 +11,7 @@ AsyncOperationResponseSerializer, RepositorySyncURLSerializer, ) -from pulpcore.plugin.tasking import enqueue_with_reservation +from pulpcore.plugin.tasking import dispatch from pulp_python.app import models as python_models from pulp_python.app import serializers as python_serializers @@ -49,12 +49,12 @@ def sync(self, request, pk): remote = serializer.validated_data.get('remote', repository.remote) mirror = serializer.validated_data.get('mirror') - result = enqueue_with_reservation( + result = dispatch( tasks.sync, [repository, remote], kwargs={ - 'remote_pk': remote.pk, - 'repository_pk': repository.pk, + 'remote_pk': str(remote.pk), + 'repository_pk': str(repository.pk), 'mirror': mirror } ) @@ -69,7 +69,7 @@ class PythonRepositoryVersionViewSet(core_viewsets.RepositoryVersionViewSet): parent_viewset = PythonRepositoryViewSet -class PythonDistributionViewSet(core_viewsets.BaseDistributionViewSet): +class PythonDistributionViewSet(core_viewsets.DistributionViewSet): """ Pulp Python Distributions are used to distribute @@ -213,11 +213,11 @@ def create(self, request): repository = serializer.validated_data.get('repository') repository_version = RepositoryVersion.latest(repository) - result = enqueue_with_reservation( + result = dispatch( tasks.publish, [repository_version.repository], kwargs={ - 'repository_version_pk': repository_version.pk + 'repository_version_pk': str(repository_version.pk) } ) return core_viewsets.OperationPostponedResponse(result, request) diff --git a/requirements.txt b/requirements.txt index 57ffcdf48..5199fa95b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -pulpcore>=3.9 +pulpcore>=3.12 pkginfo packaging bandersnatch==4.4.0