From 803a9831264baa17b6ebbbf4d666ef04a0c89cf1 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Wed, 21 Oct 2015 14:07:25 -0400 Subject: [PATCH] Fix deletion of repos and users with V2 stuff Fixes #674 --- data/model/repository.py | 10 ++++++++-- data/model/user.py | 7 +++++-- initdb.py | 2 ++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/data/model/repository.py b/data/model/repository.py index c518fc5f7..eb5419560 100644 --- a/data/model/repository.py +++ b/data/model/repository.py @@ -7,8 +7,8 @@ from data.model import (DataModelException, tag, db_transaction, storage, image, _basequery, config) from data.database import (Repository, Namespace, RepositoryTag, Star, Image, ImageStorage, User, Visibility, RepositoryPermission, TupleSelector, RepositoryActionCount, - Role, RepositoryAuthorizedEmail, db_for_update, get_epoch_timestamp, - db_random_func) + Role, RepositoryAuthorizedEmail, TagManifest, db_for_update, + get_epoch_timestamp, db_random_func) logger = logging.getLogger(__name__) @@ -43,6 +43,12 @@ def _purge_all_repository_tags(namespace_name, repository_name): except Repository.DoesNotExist: raise DataModelException('Invalid repository \'%s/%s\'' % (namespace_name, repository_name)) + + # Delete all manifests. + repo_tags = RepositoryTag.select().where(RepositoryTag.repository == repo.id) + TagManifest.delete().where(TagManifest.tag << repo_tags).execute() + + # Delete all tags. RepositoryTag.delete().where(RepositoryTag.repository == repo.id).execute() diff --git a/data/model/user.py b/data/model/user.py index 1a7709ec7..877ebb4c3 100644 --- a/data/model/user.py +++ b/data/model/user.py @@ -650,9 +650,12 @@ def detach_external_login(user, service_name): def delete_user(user): - user.delete_instance(recursive=True, delete_nullable=True) + # Delete any repositories under the user's namespace. + for repo in list(Repository.select().where(Repository.namespace_user == user)): + repository.purge_repository(user.username, repo.name) - # TODO: also delete any repository data associated + # Delete the user itself. + user.delete_instance(recursive=True, delete_nullable=True) def get_pull_credentials(robotname): diff --git a/initdb.py b/initdb.py index 50c2f4784..93b2e655d 100644 --- a/initdb.py +++ b/initdb.py @@ -21,6 +21,7 @@ from data.database import (db, all_models, Role, TeamRole, Visibility, LoginServ from data import model from app import app, storage as store from storage.basestorage import StoragePaths +from endpoints.v2.manifest import _generate_and_store_manifest from workers import repositoryactioncounter @@ -132,6 +133,7 @@ def __create_subtree(repo, structure, creator_username, parent, tag_map): new_tag = model.tag.create_or_update_tag(repo.namespace_user.username, repo.name, tag_name, new_image.docker_image_id) + _generate_and_store_manifest(repo.namespace_user.username, repo.name, tag_name) tag_map[tag_name] = new_tag for tag_name in last_node_tags: