Skip to content

Commit

Permalink
Deleted versions update Repository.last_version
Browse files Browse the repository at this point in the history
  • Loading branch information
fao89 committed Feb 21, 2020
1 parent 019cf36 commit d038c1f
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGES/6147.bugfix
@@ -0,0 +1 @@
Repository.latest_version() considering deleted versions
1 change: 1 addition & 0 deletions CHANGES/6147.removal
@@ -0,0 +1 @@
Renaming Repository.last_version to Repository.next_version
27 changes: 27 additions & 0 deletions pulpcore/app/migrations/0022_rename_last_version.py
@@ -0,0 +1,27 @@
# Generated by Django 2.2.10 on 2020-02-19 20:40

from django.db import migrations, transaction
from django.db.models import F


def plus_one(apps, schema_editor):
# re: https://pulp.plan.io/issues/6147
with transaction.atomic():
Repository = apps.get_model('core', 'Repository')
Repository.objects.all().update(last_version=F('last_version') + 1)


class Migration(migrations.Migration):

dependencies = [
('core', '0021_add_signing_service_foreign_key'),
]

operations = [
migrations.RunPython(plus_one),
migrations.RenameField(
model_name='repository',
old_name='last_version',
new_name='next_version',
),
]
21 changes: 10 additions & 11 deletions pulpcore/app/models/repository.py
Expand Up @@ -30,9 +30,8 @@ class Repository(MasterModel):
name (models.TextField): The repository name.
description (models.TextField): An optional description.
last_version (models.PositiveIntegerField): A record of the last created version number.
Used when a repository version is deleted so as not to create a new vesrion with the
same version number.
next_version (models.PositiveIntegerField): A record of the next version number to be
created.
Relations:
Expand All @@ -43,7 +42,7 @@ class Repository(MasterModel):

name = models.TextField(db_index=True, unique=True)
description = models.TextField(null=True)
last_version = models.PositiveIntegerField(default=0)
next_version = models.PositiveIntegerField(default=0)
content = models.ManyToManyField('Content', through='RepositoryContent',
related_name='repositories')

Expand Down Expand Up @@ -72,8 +71,10 @@ def create_initial_version(self):
"""
version = RepositoryVersion(
repository=self,
number=self.last_version,
number=self.next_version,
complete=True)
self.next_version += 1
self.save()
version.save()

def new_version(self, base_version=None):
Expand All @@ -93,10 +94,8 @@ def new_version(self, base_version=None):
with transaction.atomic():
version = RepositoryVersion(
repository=self,
number=int(self.last_version) + 1,
number=int(self.next_version),
base_version=base_version)
self.last_version = version.number
self.save()
version.save()

if base_version:
Expand Down Expand Up @@ -143,7 +142,7 @@ def latest_version(self):
"""
with suppress(RepositoryVersion.DoesNotExist):
model = self.versions.get(number=self.last_version)
model = self.versions.exclude(complete=False).latest()
return model

def natural_key(self):
Expand Down Expand Up @@ -733,8 +732,6 @@ def delete(self, **kwargs):
RepositoryContent.objects.filter(version_removed=self) \
.update(version_removed=None)
CreatedResource.objects.filter(object_id=self.pk).delete()
self.repository.last_version = self.number - 1
self.repository.save()
super().delete(**kwargs)

def _compute_counts(self):
Expand Down Expand Up @@ -803,6 +800,8 @@ def __exit__(self, exc_type, exc_value, traceback):
)

self.complete = True
self.repository.next_version = self.number + 1
self.repository.save()
self.save()
self._compute_counts()
except Exception:
Expand Down
2 changes: 1 addition & 1 deletion pulpcore/app/viewsets/repository.py
Expand Up @@ -147,7 +147,7 @@ def filter(self, qs, value):
# repository version +1 (the +1 is to the current version gets included when we
# calculate range)
version_tuples = itertools.zip_longest(version_added, version_removed,
fillvalue=repository.last_version + 1)
fillvalue=repository.next_version)

# Get the ranges between paired version_added and version_removed to get all
# the versions the content is present in.
Expand Down
61 changes: 61 additions & 0 deletions pulpcore/tests/unit/models/test_repository.py
Expand Up @@ -254,3 +254,64 @@ def test_content_batch_qs_using_filter(self):
self.assertListEqual(self.pks_of_next_qs(qs_generator), sorted_pks[2:])
with self.assertRaises(StopIteration):
self.pks_of_next_qs(qs_generator)


class RepositoryTestCase(TestCase):

def setUp(self):
self.repository = Repository.objects.create()
self.repository.CONTENT_TYPES = [Content]
self.repository.save()

def test_next_version_with_one_version(self):
self.assertEqual(self.repository.next_version, 1, self.repository.next_version)
self.assertEqual(
self.repository.latest_version().number, 0, self.repository.latest_version().number
)
content = Content(pulp_type="core.content")
content.save()

with self.repository.new_version() as version:
version.add_content(Content.objects.filter(pk=content.pk))

self.assertEqual(self.repository.next_version, 2, self.repository.next_version)
self.assertEqual(
self.repository.latest_version().number, 1, self.repository.latest_version().number
)

version.delete()

self.assertEqual(self.repository.next_version, 2, self.repository.next_version)
self.assertEqual(
self.repository.latest_version().number, 0, self.repository.latest_version().number
)

def test_next_version_with_multiple_versions(self):
self.assertEqual(self.repository.next_version, 1, self.repository.next_version)
self.assertEqual(
self.repository.latest_version().number, 0, self.repository.latest_version().number
)
contents = []
for _ in range(0, 3):
contents.append(Content(pulp_type="core.content"))

Content.objects.bulk_create(contents)

versions = [self.repository.latest_version()]
for content in contents:
with self.repository.new_version() as version:
version.add_content(Content.objects.filter(pk=content.pk))
versions.append(version)

self.assertEqual(self.repository.next_version, 4, self.repository.next_version)
self.assertEqual(
self.repository.latest_version().number, 3, self.repository.latest_version().number
)

versions[2].delete()
versions[3].delete()

self.assertEqual(self.repository.next_version, 4, self.repository.next_version)
self.assertEqual(
self.repository.latest_version().number, 1, self.repository.latest_version().number
)

0 comments on commit d038c1f

Please sign in to comment.