Reimplement cache support for blobs in the registry data model
This commit is contained in:
parent
7a68c41f1c
commit
a172de4fdc
7 changed files with 109 additions and 16 deletions
|
@ -5,14 +5,15 @@ from datetime import datetime, timedelta
|
|||
|
||||
import pytest
|
||||
|
||||
from mock import patch
|
||||
from playhouse.test_utils import assert_query_count
|
||||
|
||||
from app import docker_v2_signing_key
|
||||
from data import model
|
||||
from data.database import (TagManifestLabelMap, TagManifestToManifest, Manifest, ManifestBlob,
|
||||
ManifestLegacyImage, ManifestLabel, TagManifest, RepositoryTag, Image,
|
||||
TagManifestLabel, TagManifest, TagManifestLabel, DerivedStorageForImage,
|
||||
TorrentInfo)
|
||||
TorrentInfo, close_db_filter)
|
||||
from data.cache.impl import InMemoryDataModelCache
|
||||
from data.registry_model.registry_pre_oci_model import PreOCIModel
|
||||
from data.registry_model.datatypes import RepositoryReference
|
||||
|
||||
|
@ -638,3 +639,49 @@ def test_mount_blob_into_repository(pre_oci_model):
|
|||
# Ensure it now exists.
|
||||
found = pre_oci_model.get_repo_blob_by_digest(target_repository_ref, layer.blob.digest)
|
||||
assert found == layer.blob
|
||||
|
||||
|
||||
class SomeException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def test_get_cached_repo_blob(pre_oci_model):
|
||||
model_cache = InMemoryDataModelCache()
|
||||
|
||||
repository_ref = pre_oci_model.lookup_repository('devtable', 'simple')
|
||||
latest_tag = pre_oci_model.get_repo_tag(repository_ref, 'latest')
|
||||
manifest = pre_oci_model.get_manifest_for_tag(latest_tag)
|
||||
|
||||
layers = pre_oci_model.list_manifest_layers(manifest, include_placements=True)
|
||||
assert layers
|
||||
|
||||
blob = layers[0].blob
|
||||
|
||||
# Load a blob to add it to the cache.
|
||||
found = pre_oci_model.get_cached_repo_blob(model_cache, 'devtable', 'simple', blob.digest)
|
||||
assert found.digest == blob.digest
|
||||
assert found.uuid == blob.uuid
|
||||
assert found.compressed_size == blob.compressed_size
|
||||
assert found.uncompressed_size == blob.uncompressed_size
|
||||
assert found.uploading == blob.uploading
|
||||
assert found.placements == blob.placements
|
||||
|
||||
# Disconnect from the database by overwriting the connection.
|
||||
def fail(x, y):
|
||||
raise SomeException('Not connected!')
|
||||
|
||||
with patch('data.registry_model.registry_pre_oci_model.model.blob.get_repository_blob_by_digest',
|
||||
fail):
|
||||
# Make sure we can load again, which should hit the cache.
|
||||
cached = pre_oci_model.get_cached_repo_blob(model_cache, 'devtable', 'simple', blob.digest)
|
||||
assert cached.digest == blob.digest
|
||||
assert cached.uuid == blob.uuid
|
||||
assert cached.compressed_size == blob.compressed_size
|
||||
assert cached.uncompressed_size == blob.uncompressed_size
|
||||
assert cached.uploading == blob.uploading
|
||||
assert cached.placements == blob.placements
|
||||
|
||||
# Try another blob, which should fail since the DB is not connected and the cache
|
||||
# does not contain the blob.
|
||||
with pytest.raises(SomeException):
|
||||
pre_oci_model.get_cached_repo_blob(model_cache, 'devtable', 'simple', 'some other digest')
|
||||
|
|
Reference in a new issue