diff --git a/CHANGES/6442.feature b/CHANGES/6442.feature new file mode 100644 index 0000000000..ce20a319de --- /dev/null +++ b/CHANGES/6442.feature @@ -0,0 +1 @@ +Save advisory packages' sum_type as integer as createrepo_c uses. Still showed to user as a string. diff --git a/pulp_rpm/app/constants.py b/pulp_rpm/app/constants.py index 3ca8e0a0e0..6c7da35eb0 100644 --- a/pulp_rpm/app/constants.py +++ b/pulp_rpm/app/constants.py @@ -236,3 +236,18 @@ ) PACKAGES_DIRECTORY = "Packages" + +# Mappings of the possible integer values of "sum_type" on Advisory packages to their user-facing +# string representation. Should mirror the createrepo_c source code: +# https://github.com/rpm-software-management/createrepo_c/blob/master/src/checksum.h#L43-L54 +# Please keep dict consistent with createrepo_c mapping mentioned above. +ADVISORY_SUM_TYPE_TO_NAME = { + 0: "UNKNOWN", + 1: "MD5", + 2: "SHA", + 3: "SHA1", + 4: "SHA224", + 5: "SHA256", + 6: "SHA384", + 7: "SHA512" +} diff --git a/pulp_rpm/app/fields.py b/pulp_rpm/app/fields.py index dfb0f01b98..d7ff3fa2e5 100644 --- a/pulp_rpm/app/fields.py +++ b/pulp_rpm/app/fields.py @@ -1,4 +1,5 @@ from rest_framework import serializers +from pulp_rpm.app.constants import ADVISORY_SUM_TYPE_TO_NAME from pulp_rpm.app.models import UpdateReference @@ -33,7 +34,7 @@ def to_representation(self, obj): 'release': pkg['release'], 'src': pkg['src'], 'sum': pkg['sum'], - 'sum_type': pkg['sum_type'], + 'sum_type': ADVISORY_SUM_TYPE_TO_NAME.get(pkg['sum_type'], ""), 'version': pkg['version'], }) diff --git a/pulp_rpm/app/migrations/0007_advisory_pkg_sumtype_as_int.py b/pulp_rpm/app/migrations/0007_advisory_pkg_sumtype_as_int.py new file mode 100644 index 0000000000..10e4422e3c --- /dev/null +++ b/pulp_rpm/app/migrations/0007_advisory_pkg_sumtype_as_int.py @@ -0,0 +1,44 @@ +# Generated by Django 2.2.11 on 2020-04-06 16:05 + +from django.db import migrations, models, transaction + + +def translate_sum_type(apps, schema_editor): + # use sum_type as int as createrepo_c uses + with transaction.atomic(): + UpdateCollectionPackage = apps.get_model('rpm', 'UpdateCollectionPackage') + update_collection_package_to_save = [] + for package in UpdateCollectionPackage.objects.all(): + package.sum_type_temp = int(package.sum_type) if package.sum_type else None + update_collection_package_to_save.append(package) + UpdateCollectionPackage.objects.bulk_update( + update_collection_package_to_save, + ['sum_type_temp'] + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('rpm', '0006_opensuse_support'), + ] + + operations = [ + migrations.AddField( + model_name='updatecollectionpackage', + name='sum_type_temp', + field=models.PositiveIntegerField( + null=True, default=None + ) + ), + migrations.RunPython(translate_sum_type), + migrations.RemoveField( + model_name='updatecollectionpackage', + name='sum_type' + ), + migrations.RenameField( + model_name='updatecollectionpackage', + old_name='sum_type_temp', + new_name='sum_type' + ) + ] diff --git a/pulp_rpm/app/migrations/0007_checksum_types.py b/pulp_rpm/app/migrations/0007_checksum_types.py deleted file mode 100644 index 300593c36b..0000000000 --- a/pulp_rpm/app/migrations/0007_checksum_types.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 2.2.12 on 2020-04-08 17:09 - -import django.contrib.postgres.fields.jsonb -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rpm', '0006_opensuse_support'), - ] - - operations = [ - migrations.AddField( - model_name='rpmpublication', - name='metadata_checksum_type', - field=models.CharField(choices=[('unknown', 'unknown'), ('md5', 'md5'), ('sha1', 'sha1'), ('sha1', 'sha1'), ('sha224', 'sha224'), ('sha256', 'sha256'), ('sha384', 'sha384'), ('sha512', 'sha512')], default='sha256', max_length=10), - preserve_default=False, - ), - migrations.AddField( - model_name='rpmpublication', - name='package_checksum_type', - field=models.CharField(choices=[('unknown', 'unknown'), ('md5', 'md5'), ('sha1', 'sha1'), ('sha1', 'sha1'), ('sha224', 'sha224'), ('sha256', 'sha256'), ('sha384', 'sha384'), ('sha512', 'sha512')], default='sha256', max_length=10), - preserve_default=False, - ), - migrations.AddField( - model_name='rpmrepository', - name='original_checksum_types', - field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), - ), - ] diff --git a/pulp_rpm/app/models/advisory.py b/pulp_rpm/app/models/advisory.py index a148c7be9e..88160d6b18 100644 --- a/pulp_rpm/app/models/advisory.py +++ b/pulp_rpm/app/models/advisory.py @@ -22,6 +22,7 @@ PULP_UPDATE_COLLECTION_PACKAGE_ATTRS, PULP_UPDATE_RECORD_ATTRS, PULP_UPDATE_REFERENCE_ATTRS, + ADVISORY_SUM_TYPE_TO_NAME ) log = getLogger(__name__) @@ -358,7 +359,12 @@ class UpdateCollectionPackage(BaseModel): release = models.TextField() src = models.TextField() sum = models.TextField() - sum_type = models.TextField() + sum_type = models.PositiveIntegerField( + null=True, + choices=[ + (sum_type, sum_type) for sum_type in ADVISORY_SUM_TYPE_TO_NAME.keys() + ] + ) version = models.TextField() update_collection = models.ForeignKey(UpdateCollection, related_name='packages', @@ -398,7 +404,7 @@ def createrepo_to_dict(cls, package): PULP_UPDATE_COLLECTION_PACKAGE_ATTRS.SUM: getattr( package, CR_UPDATE_COLLECTION_PACKAGE_ATTRS.SUM) or '', PULP_UPDATE_COLLECTION_PACKAGE_ATTRS.SUM_TYPE: getattr( - package, CR_UPDATE_COLLECTION_PACKAGE_ATTRS.SUM_TYPE) or '', + package, CR_UPDATE_COLLECTION_PACKAGE_ATTRS.SUM_TYPE) or None, PULP_UPDATE_COLLECTION_PACKAGE_ATTRS.VERSION: getattr( package, CR_UPDATE_COLLECTION_PACKAGE_ATTRS.VERSION) or '' } @@ -427,7 +433,7 @@ def to_createrepo_c(self): pkg.restart_suggested = self.restart_suggested if self.sum: pkg.sum = self.sum - pkg.sum_type = int(self.sum_type or 0) + pkg.sum_type = self.sum_type return pkg diff --git a/pulp_rpm/app/serializers.py b/pulp_rpm/app/serializers.py index ee12c0ec50..17082abad0 100644 --- a/pulp_rpm/app/serializers.py +++ b/pulp_rpm/app/serializers.py @@ -1,4 +1,5 @@ import copy +import createrepo_c import json from gettext import gettext as _ @@ -504,6 +505,10 @@ def create(self, validated_data): coll.update_record.add(update_record) for package in packages: pkg = UpdateCollectionPackage(**package) + try: + pkg.sum_type = createrepo_c.checksum_type(pkg.sum_type) + except TypeError: + raise TypeError(f'"{pkg.sum_type}" is not supported.') pkg.update_collection = coll update_collection_packages_to_save.append(pkg) for reference in references: