Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 86 additions & 47 deletions common/pkg/libartifact/store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,28 @@

const ManifestSchemaVersion = 2

type EventStatus string

const (
EventStatusAdd EventStatus = "add"
EventStatusExtract EventStatus = "extract"
EventStatusPull EventStatus = "pull"
EventStatusPush EventStatus = "push"
EventStatusRemove EventStatus = "remove"
)

type EventCallback func(status EventStatus, name, digest string)

type ArtifactStore struct {
SystemContext *types.SystemContext
storePath string
lock *lockfile.LockFile
eventCallback EventCallback
}

// NewArtifactStore is a constructor for artifact stores. Most artifact dealings depend on this. Store path is
// the filesystem location.
func NewArtifactStore(storePath string, sc *types.SystemContext) (*ArtifactStore, error) {
func NewArtifactStore(storePath string, sc *types.SystemContext, eventCallback EventCallback) (*ArtifactStore, error) {
if storePath == "" {
return nil, errors.New("store path cannot be empty")
}
Expand All @@ -60,6 +73,7 @@
artifactStore := &ArtifactStore{
storePath: storePath,
SystemContext: sc,
eventCallback: eventCallback,
}

// if the storage dir does not exist, we need to create it.
Expand Down Expand Up @@ -113,7 +127,13 @@
if err != nil {
return nil, err
}
return artifactDigest, ir.DeleteImage(ctx, as.SystemContext)
if err := ir.DeleteImage(ctx, as.SystemContext); err != nil {
return artifactDigest, err
}
if as.eventCallback != nil {
as.eventCallback(EventStatusRemove, name, artifactDigest.String())
}
return artifactDigest, nil
}

// Inspect an artifact in a local store.
Expand Down Expand Up @@ -170,7 +190,11 @@
if err != nil {
return "", err
}
return digest.FromBytes(artifactBytes), nil
artifactDigest := digest.FromBytes(artifactBytes)
if as.eventCallback != nil {
as.eventCallback(EventStatusPull, name, artifactDigest.String())
}
return artifactDigest, nil
}

// Push an artifact to an image registry.
Expand Down Expand Up @@ -204,6 +228,9 @@
return "", err
}
artifactDigest := digest.FromBytes(artifactBytes)
if as.eventCallback != nil {
as.eventCallback(EventStatusPush, src, artifactDigest.String())
}
return artifactDigest, nil
}

Expand Down Expand Up @@ -400,6 +427,9 @@
}
}
}
if as.eventCallback != nil {
as.eventCallback(EventStatusAdd, dest, artifactManifestDigest.String())
}
return &artifactManifestDigest, nil
}

Expand Down Expand Up @@ -511,7 +541,7 @@
return err
}

if destIsFile {

Check failure on line 544 in common/pkg/libartifact/store/store.go

View workflow job for this annotation

GitHub Actions / lint

ifElseChain: rewrite if-else to switch statement (gocritic)
var digest digest.Digest
if len(arty.Manifest.Layers) > 1 {
if len(options.Digest) == 0 && len(options.Title) == 0 {
Expand All @@ -525,10 +555,10 @@
digest = arty.Manifest.Layers[0].Digest
}

return copyTrustedImageBlobToFile(ctx, imgSrc, digest, target)
}

if len(options.Digest) > 0 || len(options.Title) > 0 {
if err := copyTrustedImageBlobToFile(ctx, imgSrc, digest, target); err != nil {
return err
}
} else if len(options.Digest) > 0 || len(options.Title) > 0 {
digest, err := findDigest(arty, &options.FilterBlobOptions)
if err != nil {
return err
Expand All @@ -542,22 +572,28 @@
return err
}

return copyTrustedImageBlobToFile(ctx, imgSrc, digest, filepath.Join(target, filename))
}

for _, l := range arty.Manifest.Layers {
title := l.Annotations[specV1.AnnotationTitle]
filename, err := generateArtifactBlobName(title, l.Digest)
if err != nil {
if err := copyTrustedImageBlobToFile(ctx, imgSrc, digest, filepath.Join(target, filename)); err != nil {
return err
}
} else {
for _, l := range arty.Manifest.Layers {
title := l.Annotations[specV1.AnnotationTitle]
filename, err := generateArtifactBlobName(title, l.Digest)
if err != nil {
return err
}

err = copyTrustedImageBlobToFile(ctx, imgSrc, l.Digest, filepath.Join(target, filename))
if err != nil {
return err
err = copyTrustedImageBlobToFile(ctx, imgSrc, l.Digest, filepath.Join(target, filename))
if err != nil {
return err
}
}
}

if as.eventCallback != nil {
as.eventCallback(EventStatusExtract, arty.Name, options.Digest)
}

return nil
}

Expand Down Expand Up @@ -599,47 +635,50 @@
if err != nil {
return err
}
} else {

Check failure on line 638 in common/pkg/libartifact/store/store.go

View workflow job for this annotation

GitHub Actions / lint

unnecessary leading newline (whitespace)

return nil
}
artifactBlobCount := len(arty.Manifest.Layers)

artifactBlobCount := len(arty.Manifest.Layers)
type blob struct {
name string
digest digest.Digest
}
blobs := make([]blob, 0, artifactBlobCount)

type blob struct {
name string
digest digest.Digest
}
blobs := make([]blob, 0, artifactBlobCount)
// Gather blob details and return error on any illegal names
for _, l := range arty.Manifest.Layers {
title := l.Annotations[specV1.AnnotationTitle]
digest := l.Digest
var name string

// Gather blob details and return error on any illegal names
for _, l := range arty.Manifest.Layers {
title := l.Annotations[specV1.AnnotationTitle]
digest := l.Digest
var name string
if artifactBlobCount != 1 || !options.ExcludeTitle {
name, err = generateArtifactBlobName(title, digest)
if err != nil {
return err
}
}

blobs = append(blobs, blob{
name: name,
digest: digest,
})
}

// Wrap io.Writer in a tar.Writer
tw := tar.NewWriter(w)
defer tw.Close()

if artifactBlobCount != 1 || !options.ExcludeTitle {
name, err = generateArtifactBlobName(title, digest)
// Write each blob to tar.Writer then close
for _, b := range blobs {
err := copyTrustedImageBlobToTarStream(ctx, imgSrc, b.digest, b.name, tw)
if err != nil {
return err
}
}

blobs = append(blobs, blob{
name: name,
digest: digest,
})
}

// Wrap io.Writer in a tar.Writer
tw := tar.NewWriter(w)
defer tw.Close()

// Write each blob to tar.Writer then close
for _, b := range blobs {
err := copyTrustedImageBlobToTarStream(ctx, imgSrc, b.digest, b.name, tw)
if err != nil {
return err
}
if as.eventCallback != nil {
as.eventCallback(EventStatusExtract, arty.Name, options.Digest)
}

return nil
Expand Down
Loading