store_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package images
  2. import (
  3. "context"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "github.com/containerd/containerd/content"
  8. "github.com/containerd/containerd/content/local"
  9. cerrdefs "github.com/containerd/containerd/errdefs"
  10. "github.com/containerd/containerd/leases"
  11. "github.com/containerd/containerd/metadata"
  12. "github.com/containerd/containerd/namespaces"
  13. "github.com/docker/docker/image"
  14. "github.com/opencontainers/go-digest"
  15. ocispec "github.com/opencontainers/image-spec/specs-go/v1"
  16. "go.etcd.io/bbolt"
  17. "gotest.tools/v3/assert"
  18. is "gotest.tools/v3/assert/cmp"
  19. )
  20. func setupTestStores(t *testing.T) (context.Context, content.Store, *imageStoreWithLease, func(t *testing.T)) {
  21. dir, err := os.MkdirTemp("", t.Name())
  22. assert.NilError(t, err)
  23. backend, err := image.NewFSStoreBackend(filepath.Join(dir, "images"))
  24. assert.NilError(t, err)
  25. is, err := image.NewImageStore(backend, nil)
  26. assert.NilError(t, err)
  27. db, err := bbolt.Open(filepath.Join(dir, "metadata.db"), 0o600, nil)
  28. assert.NilError(t, err)
  29. cs, err := local.NewStore(filepath.Join(dir, "content"))
  30. assert.NilError(t, err)
  31. mdb := metadata.NewDB(db, cs, nil)
  32. cleanup := func(t *testing.T) {
  33. assert.Check(t, db.Close())
  34. assert.Check(t, os.RemoveAll(dir))
  35. }
  36. ctx := namespaces.WithNamespace(context.Background(), t.Name())
  37. images := &imageStoreWithLease{Store: is, ns: t.Name(), leases: metadata.NewLeaseManager(mdb)}
  38. return ctx, cs, images, cleanup
  39. }
  40. func TestImageDelete(t *testing.T) {
  41. ctx, _, images, cleanup := setupTestStores(t)
  42. defer cleanup(t)
  43. t.Run("no lease", func(t *testing.T) {
  44. id, err := images.Create([]byte(`{"rootFS": {}}`))
  45. assert.NilError(t, err)
  46. defer images.Delete(id)
  47. ls, err := images.leases.List(ctx)
  48. assert.NilError(t, err)
  49. assert.Equal(t, len(ls), 0, ls)
  50. _, err = images.Delete(id)
  51. assert.NilError(t, err, "should not error when there is no lease")
  52. })
  53. t.Run("lease exists", func(t *testing.T) {
  54. id, err := images.Create([]byte(`{"rootFS": {}}`))
  55. assert.NilError(t, err)
  56. defer images.Delete(id)
  57. leaseID := imageKey(id.String())
  58. _, err = images.leases.Create(ctx, leases.WithID(leaseID))
  59. assert.NilError(t, err)
  60. defer images.leases.Delete(ctx, leases.Lease{ID: leaseID})
  61. ls, err := images.leases.List(ctx)
  62. assert.NilError(t, err)
  63. assert.Check(t, is.Equal(len(ls), 1), ls)
  64. _, err = images.Delete(id)
  65. assert.NilError(t, err)
  66. ls, err = images.leases.List(ctx)
  67. assert.NilError(t, err)
  68. assert.Check(t, is.Equal(len(ls), 0), ls)
  69. })
  70. }
  71. func TestContentStoreForPull(t *testing.T) {
  72. ctx, cs, imgStore, cleanup := setupTestStores(t)
  73. defer cleanup(t)
  74. csP := &contentStoreForPull{
  75. ContentStore: cs,
  76. leases: imgStore.leases,
  77. }
  78. data := []byte(`{}`)
  79. desc := ocispec.Descriptor{
  80. Digest: digest.Canonical.FromBytes(data),
  81. Size: int64(len(data)),
  82. }
  83. w, err := csP.Writer(ctx, content.WithRef(t.Name()), content.WithDescriptor(desc))
  84. assert.NilError(t, err)
  85. _, err = w.Write(data)
  86. assert.NilError(t, err)
  87. defer w.Close()
  88. err = w.Commit(ctx, desc.Size, desc.Digest)
  89. assert.NilError(t, err)
  90. assert.Equal(t, len(csP.digested), 1)
  91. assert.Check(t, is.Equal(csP.digested[0], desc.Digest))
  92. // Test already exists
  93. csP.digested = nil
  94. _, err = csP.Writer(ctx, content.WithRef(t.Name()), content.WithDescriptor(desc))
  95. assert.Check(t, cerrdefs.IsAlreadyExists(err))
  96. assert.Equal(t, len(csP.digested), 1)
  97. assert.Check(t, is.Equal(csP.digested[0], desc.Digest))
  98. }