Make GC of repositories fully async for whitelisted namespaces
This change adds a worker to conduct GC on repositories with garbage every 10s. Fixes #144
This commit is contained in:
parent
acd86008c8
commit
70de107268
6 changed files with 111 additions and 10 deletions
|
@ -10,7 +10,7 @@ PUBLIC_USER = 'public'
|
|||
|
||||
REPO = 'somerepo'
|
||||
|
||||
class TestGarbageColection(unittest.TestCase):
|
||||
class TestGarbageCollection(unittest.TestCase):
|
||||
@staticmethod
|
||||
def _set_tag_expiration_policy(namespace, expiration_s):
|
||||
namespace_user = model.user.get_user(namespace)
|
||||
|
@ -80,9 +80,11 @@ class TestGarbageColection(unittest.TestCase):
|
|||
def gcNow(self, repository):
|
||||
model.repository.garbage_collect_repository(repository.namespace_user.username, repository.name)
|
||||
|
||||
def deleteTag(self, repository, tag):
|
||||
def deleteTag(self, repository, tag, perform_gc=True):
|
||||
model.tag.delete_tag(repository.namespace_user.username, repository.name, tag)
|
||||
model.repository.garbage_collect_repository(repository.namespace_user.username, repository.name)
|
||||
if perform_gc:
|
||||
model.repository.garbage_collect_repository(repository.namespace_user.username,
|
||||
repository.name)
|
||||
|
||||
def moveTag(self, repository, tag, docker_image_id):
|
||||
model.tag.create_or_update_tag(repository.namespace_user.username, repository.name, tag,
|
||||
|
@ -105,6 +107,47 @@ class TestGarbageColection(unittest.TestCase):
|
|||
|
||||
self.fail('Expected image %s to be deleted' % docker_image_id)
|
||||
|
||||
def test_has_garbage(self):
|
||||
""" Remove all existing repositories, then add one without garbage, check, then add one with
|
||||
garbage, and check again.
|
||||
"""
|
||||
# Delete all existing repos.
|
||||
for repo in database.Repository.select():
|
||||
repo.delete_instance(recursive=True)
|
||||
|
||||
# Change the time machine expiration on the namespace.
|
||||
(database.User.update(removed_tag_expiration_s=1000000000)
|
||||
.where(database.User.username == ADMIN_ACCESS_USER)
|
||||
.execute())
|
||||
|
||||
# Create a repository without any garbage.
|
||||
repository = self.createRepository(latest=['i1', 'i2', 'i3'])
|
||||
|
||||
# Ensure that no repositories are returned by the has garbage check.
|
||||
self.assertIsNone(model.repository.find_repository_with_garbage())
|
||||
|
||||
# Delete a tag.
|
||||
self.deleteTag(repository, 'latest', perform_gc=False)
|
||||
|
||||
# There should still not be any repositories with garbage, due to time machine.
|
||||
self.assertIsNone(model.repository.find_repository_with_garbage())
|
||||
|
||||
# Change the time machine expiration on the namespace.
|
||||
(database.User.update(removed_tag_expiration_s=0)
|
||||
.where(database.User.username == ADMIN_ACCESS_USER)
|
||||
.execute())
|
||||
|
||||
# Now we should find the repository for GC.
|
||||
repository = model.repository.find_repository_with_garbage()
|
||||
self.assertIsNotNone(repository)
|
||||
self.assertEquals(REPO, repository.name)
|
||||
|
||||
# GC the repository.
|
||||
model.repository.garbage_collect_repository(repository.namespace_user.username, repository.name)
|
||||
|
||||
# There should now be no repositories with garbage.
|
||||
self.assertIsNone(model.repository.find_repository_with_garbage())
|
||||
|
||||
|
||||
def test_one_tag(self):
|
||||
""" Create a repository with a single tag, then remove that tag and verify that the repository
|
||||
|
|
Reference in a new issue