11package metadata
22
33import (
4+ "bytes"
45 "context"
56 "path/filepath"
67 "testing"
@@ -9,6 +10,11 @@ import (
910 "github.com/containerd/containerd/content"
1011 "github.com/containerd/containerd/content/local"
1112 "github.com/containerd/containerd/content/testsuite"
13+ "github.com/containerd/containerd/errdefs"
14+ "github.com/containerd/containerd/leases"
15+ "github.com/containerd/containerd/namespaces"
16+ digest "github.com/opencontainers/go-digest"
17+ "github.com/pkg/errors"
1218)
1319
1420func createContentStore (ctx context.Context , root string ) (content.Store , func () error , error ) {
@@ -31,3 +37,76 @@ func createContentStore(ctx context.Context, root string) (content.Store, func()
3137func TestContent (t * testing.T ) {
3238 testsuite .ContentSuite (t , "metadata" , createContentStore )
3339}
40+
41+ func TestContentLeased (t * testing.T ) {
42+ ctx , db , cancel := testDB (t )
43+ defer cancel ()
44+
45+ cs := db .ContentStore ()
46+
47+ blob := []byte ("any content" )
48+ expected := digest .FromBytes (blob )
49+
50+ lctx , _ , err := createLease (ctx , db , "lease-1" )
51+ if err != nil {
52+ t .Fatal (err )
53+ }
54+ if err := content .WriteBlob (lctx , cs , "test-1" , bytes .NewReader (blob ), int64 (len (blob )), expected ); err != nil {
55+ t .Fatal (err )
56+ }
57+ if err := checkContentLeased (lctx , db , expected ); err != nil {
58+ t .Fatal ("lease checked failed:" , err )
59+ }
60+
61+ lctx , _ , err = createLease (ctx , db , "lease-2" )
62+ if err != nil {
63+ t .Fatal (err )
64+ }
65+
66+ if _ , err := cs .Writer (lctx , "test-2" , int64 (len (blob )), expected ); err == nil {
67+ t .Fatal ("expected already exist error" )
68+ } else if ! errdefs .IsAlreadyExists (err ) {
69+ t .Fatal (err )
70+ }
71+ if err := checkContentLeased (lctx , db , expected ); err != nil {
72+ t .Fatal ("lease checked failed:" , err )
73+ }
74+ }
75+
76+ func createLease (ctx context.Context , db * DB , name string ) (context.Context , func () error , error ) {
77+ if err := db .Update (func (tx * bolt.Tx ) error {
78+ _ , err := NewLeaseManager (tx ).Create (ctx , name , nil )
79+ return err
80+ }); err != nil {
81+ return nil , nil , err
82+ }
83+ return leases .WithLease (ctx , name ), func () error {
84+ return db .Update (func (tx * bolt.Tx ) error {
85+ return NewLeaseManager (tx ).Delete (ctx , name )
86+ })
87+ }, nil
88+ }
89+
90+ func checkContentLeased (ctx context.Context , db * DB , dgst digest.Digest ) error {
91+ ns , ok := namespaces .Namespace (ctx )
92+ if ! ok {
93+ return errors .New ("no namespace in context" )
94+ }
95+ lease , ok := leases .Lease (ctx )
96+ if ! ok {
97+ return errors .New ("no lease in context" )
98+ }
99+
100+ return db .View (func (tx * bolt.Tx ) error {
101+ bkt := getBucket (tx , bucketKeyVersion , []byte (ns ), bucketKeyObjectLeases , []byte (lease ), bucketKeyObjectContent )
102+ if bkt == nil {
103+ return errors .Wrapf (errdefs .ErrNotFound , "bucket not found" , lease )
104+ }
105+ v := bkt .Get ([]byte (dgst .String ()))
106+ if v == nil {
107+ return errors .Wrap (errdefs .ErrNotFound , "object not leased" )
108+ }
109+
110+ return nil
111+ })
112+ }
0 commit comments