diff --git a/pkg/tarfs/tarfs.go b/pkg/tarfs/tarfs.go index 90382c1f68..87256e80be 100755 --- a/pkg/tarfs/tarfs.go +++ b/pkg/tarfs/tarfs.go @@ -179,6 +179,7 @@ func (t *Manager) fetchImageConfig(ctx context.Context, remote *remote.Remote, r return config, nil } +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< func (t *Manager) getBlobDiffID(ctx context.Context, remote *remote.Remote, ref string, manifestDigest, layerDigest digest.Digest) (digest.Digest, error) { if diffid, ok := t.diffIDCache.Get(layerDigest); ok { return diffid.(digest.Digest), nil @@ -444,6 +445,8 @@ func (t *Manager) retryPrepareLayer(snapshotID, upperDirPath string, labels map[ return nil } +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + func (t *Manager) PrepareLayer(snapshotID, ref string, manifestDigest, layerDigest digest.Digest, upperDirPath string) error { t.mutex.Lock() if _, ok := t.snapshotMap[snapshotID]; ok { @@ -465,6 +468,7 @@ func (t *Manager) PrepareLayer(snapshotID, ref string, manifestDigest, layerDige return t.blobProcess(ctx, snapshotID, ref, manifestDigest, layerDigest, upperDirPath, false) } +// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< func (t *Manager) MergeLayers(ctx context.Context, s storage.Snapshot, storageLocater func(string) string, infoGetter func(ctx context.Context, id string) (string, snapshots.Info, error)) error { mergedBootstrap := t.imageMetaFilePath(storageLocater(s.ParentIDs[0])) @@ -939,6 +943,8 @@ func (t *Manager) RecoverRafsInstance(r *rafs.Rafs) error { return nil } +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + func (t *Manager) getSnapshotStatusWithLock(snapshotID string) (*snapshotStatus, error) { t.mutex.Lock() defer t.mutex.Unlock() diff --git a/pkg/tarfs/tarfs_test.go b/pkg/tarfs/tarfs_test.go new file mode 100644 index 0000000000..cad6fcb68e --- /dev/null +++ b/pkg/tarfs/tarfs_test.go @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2023. Nydus Developers. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package tarfs + +import ( + "context" + "testing" + + "github.com/containerd/continuity/testutil" + "github.com/containerd/nydus-snapshotter/pkg/label" + "github.com/containerd/nydus-snapshotter/pkg/rafs" + "github.com/opencontainers/go-digest" + "gotest.tools/assert" +) + +const ( + BusyboxRef = "quay.io/quay/busybox@sha256:92f3298bf80a1ba949140d77987f5de081f010337880cd771f7e7fc928f8c74d" + BusyboxManifestDigest = "sha256:92f3298bf80a1ba949140d77987f5de081f010337880cd771f7e7fc928f8c74d" + BusyboxLayerDigest = "sha256:ee780d08a5b4de5192a526d422987f451d9a065e6da42aefe8c3b20023a250c7" +) + +func TestPrepareLayer(t *testing.T) { + manager := NewManager(true, true, "/tmp/tarfs", "/usr/bin/nydus-image", 4) + manifestDigest, err := digest.Parse(BusyboxManifestDigest) + assert.Assert(t, err) + layerDigest, err := digest.Parse(BusyboxLayerDigest) + assert.Assert(t, err) + + err = manager.PrepareLayer("snapshot1", BusyboxRef, manifestDigest, layerDigest, t.TempDir()) + assert.Assert(t, err) + + // snapshot, err := manager.waitLayerReady("snapshot1", true) + // assert.Assert(t, err) + // assert.Equal(t, snapshot.blobID, "ee780d08a5b4de5192a526d422987f451d9a065e6da42aefe8c3b20023a250c7") + + err = manager.PrepareLayer("snapshot1", BusyboxRef, manifestDigest, layerDigest, t.TempDir()) + assert.Assert(t, err != nil) +} + +func TestCheckTarfsHintAnnotation(t *testing.T) { + manager := NewManager(true, true, "/tmp/tarfs", "/usr/bin/nydus-image", 4) + ctx := context.Background() + hint, err := manager.CheckTarfsHintAnnotation(ctx, BusyboxRef, BusyboxManifestDigest) + assert.Assert(t, err) + assert.Equal(t, hint, false) +} + +func TestGetConcurrentLimiter(t *testing.T) { + manager := NewManager(false, false, "/tmp/tarfs", "/usr/bin/nydus-image", 4) + limiter := manager.GetConcurrentLimiter("busybox") + assert.Assert(t, limiter != nil) + assert.Equal(t, manager.GetConcurrentLimiter("busybox"), limiter) + +} + +func TestCopyTarfsAnnotations(t *testing.T) { + manager := NewManager(false, false, "/tmp/tarfs", "/usr/bin/nydus-image", 4) + rafs := &rafs.Rafs{ + Annotations: make(map[string]string), + } + + annotations := map[string]string{} + annotations[label.CRIImageRef] = "cri_image_ref" + annotations[label.CRILayerDigest] = "cri_layer_digest" + annotations[label.CRIManifestDigest] = "cri_manigest_digest" + annotations[label.NydusTarfsLayer] = "nydus_tarfs_layer" + annotations[label.NydusImageBlockInfo] = "nydus_image_block_info" + annotations[label.NydusLayerBlockInfo] = "nydus_layer_block_info" + annotations["unsupported_key"] = "error" + + manager.copyTarfsAnnotations(annotations, rafs) + assert.Equal(t, len(rafs.Annotations), 6) + assert.Equal(t, rafs.Annotations[label.CRIImageRef], annotations[label.CRIImageRef]) + assert.Equal(t, rafs.Annotations[label.CRILayerDigest], annotations[label.CRILayerDigest]) +} + +func TestTarfsFilePath(t *testing.T) { + manager := NewManager(false, false, "/tmp/tarfs", "/usr/bin/nydus-image", 4) + + assert.Equal(t, manager.layerTarFilePath("blob1"), "/tmp/tarfs/blob1") + assert.Equal(t, manager.layerDiskFilePath("blob1"), "/tmp/tarfs/blob1.layer.disk") + assert.Equal(t, manager.ImageDiskFilePath("blob1"), "/tmp/tarfs/blob1.image.disk") + assert.Equal(t, manager.layerMetaFilePath("/tarfs/fs"), "/tarfs/fs/image/layer.boot") + assert.Equal(t, manager.imageMetaFilePath("/tarfs/fs"), "/tarfs/fs/image/image.boot") +} + +func TestTarfsStatusString(t *testing.T) { + assert.Equal(t, tarfsStatusString(TarfsStatusReady), "Ready") + assert.Equal(t, tarfsStatusString(TarfsStatusPrepare), "Prepare") + assert.Equal(t, tarfsStatusString(TarfsStatusFailed), "Failed") + assert.Equal(t, tarfsStatusString(4), "Unknown") +} + +func TestAttachBlob(t *testing.T) { + testutil.RequiresRoot(t) + + manager := NewManager(false, false, "/tmp/tarfs", "/usr/bin/nydus-image", 4) + blobFile := createTempFile(t) + loopdev, err := manager.attachLoopdev(blobFile) + assert.Assert(t, err) + err = deleteLoop(loopdev) + assert.Assert(t, err) + err = deleteLoop(loopdev) + assert.Assert(t, err != nil) +}