@@ -40,17 +40,20 @@ var (
4040 ErrEmptyArtifactName = errors .New ("artifact name cannot be empty" )
4141)
4242
43+ type EventCallback func (eventType , name , digest string , attrs map [string ]string )
44+
4345const ManifestSchemaVersion = 2
4446
4547type ArtifactStore struct {
4648 SystemContext * types.SystemContext
4749 storePath string
4850 lock * lockfile.LockFile
51+ eventCallBack EventCallback
4952}
5053
5154// NewArtifactStore is a constructor for artifact stores. Most artifact dealings depend on this. Store path is
5255// the filesystem location.
53- func NewArtifactStore (storePath string , sc * types.SystemContext ) (* ArtifactStore , error ) {
56+ func NewArtifactStore (storePath string , sc * types.SystemContext , eventCallBack EventCallback ) (* ArtifactStore , error ) {
5457 if storePath == "" {
5558 return nil , errors .New ("store path cannot be empty" )
5659 }
@@ -63,6 +66,7 @@ func NewArtifactStore(storePath string, sc *types.SystemContext) (*ArtifactStore
6366 artifactStore := & ArtifactStore {
6467 storePath : storePath ,
6568 SystemContext : sc ,
69+ eventCallBack : eventCallBack ,
6670 }
6771
6872 // if the storage dir does not exist, we need to create it.
@@ -116,7 +120,12 @@ func (as ArtifactStore) Remove(ctx context.Context, name string) (*digest.Digest
116120 if err != nil {
117121 return nil , err
118122 }
119- return artifactDigest , ir .DeleteImage (ctx , as .SystemContext )
123+ err = ir .DeleteImage (ctx , as .SystemContext )
124+ if err != nil {
125+ return nil , err
126+ }
127+ as .eventCallBack ("remove" , name , artifactDigest .String (), nil )
128+ return artifactDigest , nil
120129}
121130
122131// Inspect an artifact in a local store
@@ -173,7 +182,9 @@ func (as ArtifactStore) Pull(ctx context.Context, name string, opts libimage.Cop
173182 if err != nil {
174183 return "" , err
175184 }
176- return digest .FromBytes (artifactBytes ), nil
185+ artifactDigest := digest .FromBytes (artifactBytes )
186+ as .eventCallBack ("pull" , name , artifactDigest .String (), nil )
187+ return artifactDigest , nil
177188}
178189
179190// Push an artifact to an image registry
@@ -207,6 +218,7 @@ func (as ArtifactStore) Push(ctx context.Context, src, dest string, opts libimag
207218 return "" , err
208219 }
209220 artifactDigest := digest .FromBytes (artifactBytes )
221+ as .eventCallBack ("push" , src , artifactDigest .String (), nil )
210222 return artifactDigest , nil
211223}
212224
@@ -400,6 +412,9 @@ func (as ArtifactStore) Add(ctx context.Context, dest string, artifactBlobs []en
400412 }
401413 }
402414 }
415+ as .eventCallBack ("add" , dest , artifactManifestDigest .String (), map [string ]string {
416+ "files" : fmt .Sprintf ("%d" , len (artifactBlobs )),
417+ })
403418 return & artifactManifestDigest , nil
404419}
405420
@@ -519,11 +534,10 @@ func (as ArtifactStore) Extract(ctx context.Context, nameOrDigest string, target
519534 } else {
520535 digest = arty .Manifest .Layers [0 ].Digest
521536 }
522-
523- return copyTrustedImageBlobToFile (ctx , imgSrc , digest , target )
524- }
525-
526- if len (options .Digest ) > 0 || len (options .Title ) > 0 {
537+ if err := copyTrustedImageBlobToFile (ctx , imgSrc , digest , target ); err != nil {
538+ return err
539+ }
540+ } else if len (options .Digest ) > 0 || len (options .Title ) > 0 {
527541 digest , err := findDigest (arty , & options .FilterBlobOptions )
528542 if err != nil {
529543 return err
@@ -536,23 +550,26 @@ func (as ArtifactStore) Extract(ctx context.Context, nameOrDigest string, target
536550 if err != nil {
537551 return err
538552 }
539-
540- return copyTrustedImageBlobToFile (ctx , imgSrc , digest , filepath .Join (target , filename ))
541- }
542-
543- for _ , l := range arty .Manifest .Layers {
544- title := l .Annotations [specV1 .AnnotationTitle ]
545- filename , err := generateArtifactBlobName (title , l .Digest )
546- if err != nil {
553+ if err := copyTrustedImageBlobToFile (ctx , imgSrc , digest , filepath .Join (target , filename )); err != nil {
547554 return err
548555 }
556+ } else {
557+ for _ , l := range arty .Manifest .Layers {
558+ title := l .Annotations [specV1 .AnnotationTitle ]
559+ filename , err := generateArtifactBlobName (title , l .Digest )
560+ if err != nil {
561+ return err
562+ }
549563
550- err = copyTrustedImageBlobToFile (ctx , imgSrc , l .Digest , filepath .Join (target , filename ))
551- if err != nil {
552- return err
564+ err = copyTrustedImageBlobToFile (ctx , imgSrc , l .Digest , filepath .Join (target , filename ))
565+ if err != nil {
566+ return err
567+ }
553568 }
554569 }
555570
571+ attrs := map [string ]string {"target" : target }
572+ as .eventCallBack ("extract" , arty .Name , options .Digest , attrs )
556573 return nil
557574}
558575
@@ -594,49 +611,49 @@ func (as ArtifactStore) ExtractTarStream(ctx context.Context, w io.Writer, nameO
594611 if err != nil {
595612 return err
596613 }
614+ } else {
615+ artifactBlobCount := len (arty .Manifest .Layers )
597616
598- return nil
599- }
617+ type blob struct {
618+ name string
619+ digest digest.Digest
620+ }
621+ blobs := make ([]blob , 0 , artifactBlobCount )
600622
601- artifactBlobCount := len (arty .Manifest .Layers )
623+ // Gather blob details and return error on any illegal names
624+ for _ , l := range arty .Manifest .Layers {
625+ title := l .Annotations [specV1 .AnnotationTitle ]
626+ digest := l .Digest
627+ var name string
602628
603- type blob struct {
604- name string
605- digest digest.Digest
606- }
607- blobs := make ([]blob , 0 , artifactBlobCount )
629+ if artifactBlobCount != 1 || ! options .ExcludeTitle {
630+ name , err = generateArtifactBlobName (title , digest )
631+ if err != nil {
632+ return err
633+ }
634+ }
608635
609- // Gather blob details and return error on any illegal names
610- for _ , l := range arty .Manifest .Layers {
611- title := l .Annotations [specV1 .AnnotationTitle ]
612- digest := l .Digest
613- var name string
636+ blobs = append (blobs , blob {
637+ name : name ,
638+ digest : digest ,
639+ })
640+ }
641+
642+ // Wrap io.Writer in a tar.Writer
643+ tw := tar .NewWriter (w )
644+ defer tw .Close ()
614645
615- if artifactBlobCount != 1 || ! options .ExcludeTitle {
616- name , err = generateArtifactBlobName (title , digest )
646+ // Write each blob to tar.Writer then close
647+ for _ , b := range blobs {
648+ err := copyTrustedImageBlobToTarStream (ctx , imgSrc , b .digest , b .name , tw )
617649 if err != nil {
618650 return err
619651 }
620652 }
621-
622- blobs = append (blobs , blob {
623- name : name ,
624- digest : digest ,
625- })
626- }
627-
628- // Wrap io.Writer in a tar.Writer
629- tw := tar .NewWriter (w )
630- defer tw .Close ()
631-
632- // Write each blob to tar.Writer then close
633- for _ , b := range blobs {
634- err := copyTrustedImageBlobToTarStream (ctx , imgSrc , b .digest , b .name , tw )
635- if err != nil {
636- return err
637- }
638653 }
639654
655+ attrs := map [string ]string {"format" : "tar-stream" }
656+ as .eventCallBack ("extract" , arty .Name , options .Digest , attrs )
640657 return nil
641658}
642659
0 commit comments