|
|
|
|
@@ -91,6 +91,10 @@ func makeTest(name string, snapshotterFn func(ctx context.Context, root string)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var opt = snapshot.WithLabels(map[string]string{
|
|
|
|
|
"containerd.io/gc.root": time.Now().UTC().Format(time.RFC3339),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// checkSnapshotterBasic tests the basic workflow of a snapshot snapshotter.
|
|
|
|
|
func checkSnapshotterBasic(ctx context.Context, t *testing.T, snapshotter snapshot.Snapshotter, work string) {
|
|
|
|
|
initialApplier := fstest.Apply(
|
|
|
|
|
@@ -112,7 +116,7 @@ func checkSnapshotterBasic(ctx context.Context, t *testing.T, snapshotter snapsh
|
|
|
|
|
t.Fatalf("failure reason: %+v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mounts, err := snapshotter.Prepare(ctx, preparing, "")
|
|
|
|
|
mounts, err := snapshotter.Prepare(ctx, preparing, "", opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failure reason: %+v", err)
|
|
|
|
|
}
|
|
|
|
|
@@ -131,7 +135,7 @@ func checkSnapshotterBasic(ctx context.Context, t *testing.T, snapshotter snapsh
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
committed := filepath.Join(work, "committed")
|
|
|
|
|
if err := snapshotter.Commit(ctx, committed, preparing); err != nil {
|
|
|
|
|
if err := snapshotter.Commit(ctx, committed, preparing, opt); err != nil {
|
|
|
|
|
t.Fatalf("failure reason: %+v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -153,7 +157,7 @@ func checkSnapshotterBasic(ctx context.Context, t *testing.T, snapshotter snapsh
|
|
|
|
|
t.Fatalf("failure reason: %+v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mounts, err = snapshotter.Prepare(ctx, next, committed)
|
|
|
|
|
mounts, err = snapshotter.Prepare(ctx, next, committed, opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failure reason: %+v", err)
|
|
|
|
|
}
|
|
|
|
|
@@ -179,7 +183,7 @@ func checkSnapshotterBasic(ctx context.Context, t *testing.T, snapshotter snapsh
|
|
|
|
|
assert.Equal(t, snapshot.KindActive, ni.Kind)
|
|
|
|
|
|
|
|
|
|
nextCommitted := filepath.Join(work, "committed-next")
|
|
|
|
|
if err := snapshotter.Commit(ctx, nextCommitted, next); err != nil {
|
|
|
|
|
if err := snapshotter.Commit(ctx, nextCommitted, next, opt); err != nil {
|
|
|
|
|
t.Fatalf("failure reason: %+v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -220,7 +224,7 @@ func checkSnapshotterBasic(ctx context.Context, t *testing.T, snapshotter snapsh
|
|
|
|
|
t.Fatalf("failure reason: %+v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mounts, err = snapshotter.View(ctx, nextnext, nextCommitted)
|
|
|
|
|
mounts, err = snapshotter.View(ctx, nextnext, nextCommitted, opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("failure reason: %+v", err)
|
|
|
|
|
}
|
|
|
|
|
@@ -248,7 +252,7 @@ func checkSnapshotterStatActive(ctx context.Context, t *testing.T, snapshotter s
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mounts, err := snapshotter.Prepare(ctx, preparing, "")
|
|
|
|
|
mounts, err := snapshotter.Prepare(ctx, preparing, "", opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
@@ -282,7 +286,7 @@ func checkSnapshotterStatCommitted(ctx context.Context, t *testing.T, snapshotte
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mounts, err := snapshotter.Prepare(ctx, preparing, "")
|
|
|
|
|
mounts, err := snapshotter.Prepare(ctx, preparing, "", opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
@@ -301,7 +305,7 @@ func checkSnapshotterStatCommitted(ctx context.Context, t *testing.T, snapshotte
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
committed := filepath.Join(work, "committed")
|
|
|
|
|
if err = snapshotter.Commit(ctx, committed, preparing); err != nil {
|
|
|
|
|
if err = snapshotter.Commit(ctx, committed, preparing, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -321,7 +325,7 @@ func snapshotterPrepareMount(ctx context.Context, snapshotter snapshot.Snapshott
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mounts, err := snapshotter.Prepare(ctx, preparing, parent)
|
|
|
|
|
mounts, err := snapshotter.Prepare(ctx, preparing, parent, opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
@@ -349,7 +353,7 @@ func checkSnapshotterTransitivity(ctx context.Context, t *testing.T, snapshotter
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
snapA := filepath.Join(work, "snapA")
|
|
|
|
|
if err = snapshotter.Commit(ctx, snapA, preparing); err != nil {
|
|
|
|
|
if err = snapshotter.Commit(ctx, snapA, preparing, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -364,7 +368,7 @@ func checkSnapshotterTransitivity(ctx context.Context, t *testing.T, snapshotter
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
snapB := filepath.Join(work, "snapB")
|
|
|
|
|
if err = snapshotter.Commit(ctx, snapB, next); err != nil {
|
|
|
|
|
if err = snapshotter.Commit(ctx, snapB, next, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -399,7 +403,7 @@ func checkSnapshotterPrepareView(ctx context.Context, t *testing.T, snapshotter
|
|
|
|
|
defer testutil.Unmount(t, preparing)
|
|
|
|
|
|
|
|
|
|
snapA := filepath.Join(work, "snapA")
|
|
|
|
|
if err = snapshotter.Commit(ctx, snapA, preparing); err != nil {
|
|
|
|
|
if err = snapshotter.Commit(ctx, snapA, preparing, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -410,12 +414,12 @@ func checkSnapshotterPrepareView(ctx context.Context, t *testing.T, snapshotter
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Prepare & View with same key
|
|
|
|
|
_, err = snapshotter.Prepare(ctx, newLayer, snapA)
|
|
|
|
|
_, err = snapshotter.Prepare(ctx, newLayer, snapA, opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = snapshotter.View(ctx, newLayer, snapA)
|
|
|
|
|
_, err = snapshotter.View(ctx, newLayer, snapA, opt)
|
|
|
|
|
//must be err != nil
|
|
|
|
|
assert.NotNil(t, err)
|
|
|
|
|
|
|
|
|
|
@@ -425,12 +429,12 @@ func checkSnapshotterPrepareView(ctx context.Context, t *testing.T, snapshotter
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = snapshotter.Prepare(ctx, prepLayer, snapA)
|
|
|
|
|
_, err = snapshotter.Prepare(ctx, prepLayer, snapA, opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = snapshotter.Prepare(ctx, prepLayer, snapA)
|
|
|
|
|
_, err = snapshotter.Prepare(ctx, prepLayer, snapA, opt)
|
|
|
|
|
//must be err != nil
|
|
|
|
|
assert.NotNil(t, err)
|
|
|
|
|
|
|
|
|
|
@@ -440,12 +444,12 @@ func checkSnapshotterPrepareView(ctx context.Context, t *testing.T, snapshotter
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = snapshotter.View(ctx, viewLayer, snapA)
|
|
|
|
|
_, err = snapshotter.View(ctx, viewLayer, snapA, opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_, err = snapshotter.View(ctx, viewLayer, snapA)
|
|
|
|
|
_, err = snapshotter.View(ctx, viewLayer, snapA, opt)
|
|
|
|
|
//must be err != nil
|
|
|
|
|
assert.NotNil(t, err)
|
|
|
|
|
|
|
|
|
|
@@ -479,24 +483,24 @@ func checkRemoveIntermediateSnapshot(ctx context.Context, t *testing.T, snapshot
|
|
|
|
|
defer testutil.Unmount(t, base)
|
|
|
|
|
|
|
|
|
|
committedBase := filepath.Join(work, "committed-base")
|
|
|
|
|
if err = snapshotter.Commit(ctx, committedBase, base); err != nil {
|
|
|
|
|
if err = snapshotter.Commit(ctx, committedBase, base, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create intermediate layer
|
|
|
|
|
intermediate := filepath.Join(work, "intermediate")
|
|
|
|
|
if _, err = snapshotter.Prepare(ctx, intermediate, committedBase); err != nil {
|
|
|
|
|
if _, err = snapshotter.Prepare(ctx, intermediate, committedBase, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
committedInter := filepath.Join(work, "committed-inter")
|
|
|
|
|
if err = snapshotter.Commit(ctx, committedInter, intermediate); err != nil {
|
|
|
|
|
if err = snapshotter.Commit(ctx, committedInter, intermediate, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create top layer
|
|
|
|
|
topLayer := filepath.Join(work, "toplayer")
|
|
|
|
|
if _, err = snapshotter.Prepare(ctx, topLayer, committedInter); err != nil {
|
|
|
|
|
if _, err = snapshotter.Prepare(ctx, topLayer, committedInter, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -530,28 +534,28 @@ func checkRemoveIntermediateSnapshot(ctx context.Context, t *testing.T, snapshot
|
|
|
|
|
// v1 - view snapshot, v1 is parent
|
|
|
|
|
// v2 - view snapshot, no parent
|
|
|
|
|
func baseTestSnapshots(ctx context.Context, snapshotter snapshot.Snapshotter) error {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "c1-a", ""); err != nil {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "c1-a", "", opt); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if err := snapshotter.Commit(ctx, "c1", "c1-a"); err != nil {
|
|
|
|
|
if err := snapshotter.Commit(ctx, "c1", "c1-a", opt); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "c2-a", "c1"); err != nil {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "c2-a", "c1", opt); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if err := snapshotter.Commit(ctx, "c2", "c2-a"); err != nil {
|
|
|
|
|
if err := snapshotter.Commit(ctx, "c2", "c2-a", opt); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "a1", "c2"); err != nil {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "a1", "c2", opt); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "a2", ""); err != nil {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "a2", "", opt); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if _, err := snapshotter.View(ctx, "v1", "c2"); err != nil {
|
|
|
|
|
if _, err := snapshotter.View(ctx, "v1", "c2", opt); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if _, err := snapshotter.View(ctx, "v2", ""); err != nil {
|
|
|
|
|
if _, err := snapshotter.View(ctx, "v2", "", opt); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
@@ -623,10 +627,13 @@ func checkUpdate(ctx context.Context, t *testing.T, snapshotter snapshot.Snapsho
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
createdAt := st.Created
|
|
|
|
|
rootTime := time.Now().UTC().Format(time.RFC3339)
|
|
|
|
|
expected := map[string]string{
|
|
|
|
|
"l1": "v1",
|
|
|
|
|
"l2": "v2",
|
|
|
|
|
"l3": "v3",
|
|
|
|
|
// Keep root label
|
|
|
|
|
"containerd.io/gc.root": rootTime,
|
|
|
|
|
}
|
|
|
|
|
st.Parent = "doesnotexist"
|
|
|
|
|
st.Labels = expected
|
|
|
|
|
@@ -662,6 +669,7 @@ func checkUpdate(ctx context.Context, t *testing.T, snapshotter snapshot.Snapsho
|
|
|
|
|
expected = map[string]string{
|
|
|
|
|
"l1": "updated",
|
|
|
|
|
"l3": "v3",
|
|
|
|
|
"containerd.io/gc.root": rootTime,
|
|
|
|
|
}
|
|
|
|
|
st.Labels = map[string]string{
|
|
|
|
|
"l1": "updated",
|
|
|
|
|
@@ -675,6 +683,7 @@ func checkUpdate(ctx context.Context, t *testing.T, snapshotter snapshot.Snapsho
|
|
|
|
|
|
|
|
|
|
expected = map[string]string{
|
|
|
|
|
"l4": "v4",
|
|
|
|
|
"containerd.io/gc.root": rootTime,
|
|
|
|
|
}
|
|
|
|
|
st.Labels = expected
|
|
|
|
|
st, err = snapshotter.Update(ctx, st, "labels")
|
|
|
|
|
@@ -709,31 +718,31 @@ func assertLabels(t *testing.T, actual, expected map[string]string) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func checkRemove(ctx context.Context, t *testing.T, snapshotter snapshot.Snapshotter, work string) {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "committed-a", ""); err != nil {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "committed-a", "", opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if err := snapshotter.Commit(ctx, "committed-1", "committed-a"); err != nil {
|
|
|
|
|
if err := snapshotter.Commit(ctx, "committed-1", "committed-a", opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "reuse-1", "committed-1"); err != nil {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "reuse-1", "committed-1", opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if err := snapshotter.Remove(ctx, "reuse-1"); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := snapshotter.View(ctx, "reuse-1", "committed-1"); err != nil {
|
|
|
|
|
if _, err := snapshotter.View(ctx, "reuse-1", "committed-1", opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if err := snapshotter.Remove(ctx, "reuse-1"); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "reuse-1", ""); err != nil {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, "reuse-1", "", opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if err := snapshotter.Remove(ctx, "committed-1"); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if err := snapshotter.Commit(ctx, "commited-1", "reuse-1"); err != nil {
|
|
|
|
|
if err := snapshotter.Commit(ctx, "commited-1", "reuse-1", opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -742,15 +751,15 @@ func checkRemove(ctx context.Context, t *testing.T, snapshotter snapshot.Snapsho
|
|
|
|
|
// This function is called only when WithTestViewReadonly is true.
|
|
|
|
|
func checkSnapshotterViewReadonly(ctx context.Context, t *testing.T, snapshotter snapshot.Snapshotter, work string) {
|
|
|
|
|
preparing := filepath.Join(work, "preparing")
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, preparing, ""); err != nil {
|
|
|
|
|
if _, err := snapshotter.Prepare(ctx, preparing, "", opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
committed := filepath.Join(work, "commited")
|
|
|
|
|
if err := snapshotter.Commit(ctx, committed, preparing); err != nil {
|
|
|
|
|
if err := snapshotter.Commit(ctx, committed, preparing, opt); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
view := filepath.Join(work, "view")
|
|
|
|
|
m, err := snapshotter.View(ctx, view, committed)
|
|
|
|
|
m, err := snapshotter.View(ctx, view, committed, opt)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
|