Convert V2's manifest endpoints to use the new data model interface
This commit is contained in:
parent
a172de4fdc
commit
6b5064aba4
10 changed files with 197 additions and 200 deletions
|
@ -106,7 +106,7 @@ class PreOCIModel(RegistryDataInterface):
|
|||
# Ensure all the blobs in the manifest exist.
|
||||
digests = manifest_interface_instance.checksums
|
||||
query = model.storage.lookup_repo_storages_by_content_checksum(repository_ref._db_id, digests)
|
||||
blob_map = {s.content_checksum: s.id for s in query}
|
||||
blob_map = {s.content_checksum: s for s in query}
|
||||
for layer in manifest_interface_instance.layers:
|
||||
digest_str = str(layer.digest)
|
||||
if digest_str not in blob_map:
|
||||
|
@ -116,23 +116,38 @@ class PreOCIModel(RegistryDataInterface):
|
|||
# This will let us know which v1 images we need to synthesize and which ones are invalid.
|
||||
docker_image_ids = list(manifest_interface_instance.legacy_image_ids)
|
||||
images_query = model.image.lookup_repository_images(repository_ref._db_id, docker_image_ids)
|
||||
images_map = {i.docker_image_id: i.storage for i in images_query}
|
||||
image_storage_map = {i.docker_image_id: i.storage for i in images_query}
|
||||
|
||||
# Rewrite any v1 image IDs that do not match the checksum in the database.
|
||||
try:
|
||||
rewritten_images = list(manifest_interface_instance.rewrite_invalid_image_ids(images_map))
|
||||
rewritten_images = manifest_interface_instance.rewrite_invalid_image_ids(image_storage_map)
|
||||
rewritten_images = list(rewritten_images)
|
||||
parent_image_map = {}
|
||||
|
||||
for rewritten_image in rewritten_images:
|
||||
if not rewritten_image.image_id in images_map:
|
||||
model.image.synthesize_v1_image(
|
||||
if not rewritten_image.image_id in image_storage_map:
|
||||
parent_image = None
|
||||
if rewritten_image.parent_image_id:
|
||||
parent_image = parent_image_map.get(rewritten_image.parent_image_id)
|
||||
if parent_image is None:
|
||||
parent_image = model.image.get_image(repository_ref._db_id,
|
||||
rewritten_image.parent_image_id)
|
||||
if parent_image is None:
|
||||
return None, None
|
||||
|
||||
synthesized = model.image.synthesize_v1_image(
|
||||
repository_ref._db_id,
|
||||
blob_map[rewritten_image.content_checksum],
|
||||
blob_map[rewritten_image.content_checksum].id,
|
||||
blob_map[rewritten_image.content_checksum].image_size,
|
||||
rewritten_image.image_id,
|
||||
rewritten_image.created,
|
||||
rewritten_image.comment,
|
||||
rewritten_image.command,
|
||||
rewritten_image.compat_json,
|
||||
rewritten_image.parent_image_id,
|
||||
parent_image,
|
||||
)
|
||||
|
||||
parent_image_map[rewritten_image.image_id] = synthesized
|
||||
except ManifestException:
|
||||
logger.exception("exception when rewriting v1 metadata")
|
||||
return None, None
|
||||
|
@ -150,7 +165,7 @@ class PreOCIModel(RegistryDataInterface):
|
|||
# Save the labels on the manifest.
|
||||
if newly_created:
|
||||
with self.batch_create_manifest_labels(manifest) as add_label:
|
||||
for key, value in manifest.layers[-1].v1_metadata.labels.iteritems():
|
||||
for key, value in manifest_interface_instance.layers[-1].v1_metadata.labels.iteritems():
|
||||
media_type = 'application/json' if is_json(value) else 'text/plain'
|
||||
add_label(key, value, 'manifest', media_type)
|
||||
|
||||
|
@ -289,7 +304,8 @@ class PreOCIModel(RegistryDataInterface):
|
|||
else None))
|
||||
for tag in tags]
|
||||
|
||||
def list_repository_tag_history(self, repository_ref, page=1, size=100, specific_tag_name=None, active_tags_only=False):
|
||||
def list_repository_tag_history(self, repository_ref, page=1, size=100, specific_tag_name=None,
|
||||
active_tags_only=False):
|
||||
"""
|
||||
Returns the history of all tags in the repository (unless filtered). This includes tags that
|
||||
have been made in-active due to newer versions of those tags coming into service.
|
||||
|
@ -302,6 +318,16 @@ class PreOCIModel(RegistryDataInterface):
|
|||
legacy_image=LegacyImage.for_image(tag.image))
|
||||
for tag in tags], has_more
|
||||
|
||||
def has_expired_tag(self, repository_ref, tag_name):
|
||||
"""
|
||||
Returns true if and only if the repository contains a tag with the given name that is expired.
|
||||
"""
|
||||
try:
|
||||
model.tag.get_expired_tag_in_repo(repository_ref._db_id, tag_name)
|
||||
return True
|
||||
except database.RepositoryTag.DoesNotExist:
|
||||
return False
|
||||
|
||||
def get_repo_tag(self, repository_ref, tag_name, include_legacy_image=False):
|
||||
"""
|
||||
Returns the latest, *active* tag found in the repository, with the matching name
|
||||
|
@ -706,7 +732,7 @@ class PreOCIModel(RegistryDataInterface):
|
|||
|
||||
blob_cache_key = cache_key.for_repository_blob(namespace_name, repo_name, blob_digest)
|
||||
blob_dict = model_cache.retrieve(blob_cache_key, load_blob)
|
||||
|
||||
|
||||
try:
|
||||
return Blob.from_dict(blob_dict) if blob_dict is not None else None
|
||||
except FromDictionaryException:
|
||||
|
|
Reference in a new issue