From 590f8f65a3372eb10de8a1189a888272f231e98a Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 9 Aug 2018 16:05:10 -0400 Subject: [PATCH] Allow lookup of "dead" manifests so manifest links can be clicked in the tag history Fixes https://jira.coreos.com/browse/QUAY-1021 --- data/model/tag.py | 24 ++++++++++++++---------- endpoints/api/manifest_models_pre_oci.py | 3 ++- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/data/model/tag.py b/data/model/tag.py index cd86e3dc4..4f5818088 100644 --- a/data/model/tag.py +++ b/data/model/tag.py @@ -649,9 +649,9 @@ def delete_manifest_by_digest(namespace, repo_name, digest): return [tag_manifest.tag for tag_manifest in tag_manifests] -def load_manifest_by_digest(namespace, repo_name, digest): +def load_manifest_by_digest(namespace, repo_name, digest, allow_dead=False): try: - return (_load_repo_manifests(namespace, repo_name) + return (_load_repo_manifests(namespace, repo_name, allow_dead=allow_dead) .where(TagManifest.digest == digest) .get()) except TagManifest.DoesNotExist: @@ -659,15 +659,19 @@ def load_manifest_by_digest(namespace, repo_name, digest): raise InvalidManifestException(msg) -def _load_repo_manifests(namespace, repo_name): - return _tag_alive(TagManifest - .select(TagManifest, RepositoryTag) - .join(RepositoryTag) - .join(Image) - .join(Repository) - .join(Namespace, on=(Namespace.id == Repository.namespace_user)) - .where(Repository.name == repo_name, Namespace.username == namespace)) +def _load_repo_manifests(namespace, repo_name, allow_dead=False): + query = (TagManifest + .select(TagManifest, RepositoryTag) + .join(RepositoryTag) + .join(Image) + .join(Repository) + .join(Namespace, on=(Namespace.id == Repository.namespace_user)) + .where(Repository.name == repo_name, Namespace.username == namespace)) + if not allow_dead: + query = _tag_alive(query) + + return query def change_repository_tag_expiration(namespace_name, repo_name, tag_name, expiration_date): """ Changes the expiration of the tag with the given name to the given expiration datetime. If diff --git a/endpoints/api/manifest_models_pre_oci.py b/endpoints/api/manifest_models_pre_oci.py index b7abd45e2..a5d3d78af 100644 --- a/endpoints/api/manifest_models_pre_oci.py +++ b/endpoints/api/manifest_models_pre_oci.py @@ -41,7 +41,8 @@ class ManifestLabelPreOCI(ManifestLabelInterface): def get_repository_manifest(self, namespace_name, repository_name, digest): try: - tag_manifest = model.tag.load_manifest_by_digest(namespace_name, repository_name, digest) + tag_manifest = model.tag.load_manifest_by_digest(namespace_name, repository_name, digest, + allow_dead=True) except model.DataModelException: return None