github.com/jdolitsky/cnab-go@v0.7.1-beta1/imagestore/ocilayout/ocilayout.go (about)

     1  package ocilayout
     2  
     3  import (
     4  	"io"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"github.com/pivotal/image-relocation/pkg/image"
    10  	"github.com/pivotal/image-relocation/pkg/registry"
    11  	"github.com/pivotal/image-relocation/pkg/registry/ggcr"
    12  
    13  	"github.com/deislabs/cnab-go/imagestore"
    14  )
    15  
    16  // ociLayout is an image store which stores images as an OCI image layout.
    17  type ociLayout struct {
    18  	layout registry.Layout
    19  	logs   io.Writer
    20  }
    21  
    22  func Create(options ...imagestore.Option) (imagestore.Store, error) {
    23  	parms := imagestore.Create(options...)
    24  
    25  	layoutDir := filepath.Join(parms.ArchiveDir, "artifacts", "layout")
    26  	if err := os.MkdirAll(layoutDir, 0755); err != nil {
    27  		return nil, err
    28  	}
    29  
    30  	layout, err := ggcr.NewRegistryClient().NewLayout(layoutDir)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  
    35  	return &ociLayout{
    36  		layout: layout,
    37  		logs:   parms.Logs,
    38  	}, nil
    39  }
    40  
    41  func LocateOciLayout(archiveDir string) (imagestore.Store, error) {
    42  	layoutDir := filepath.Join(archiveDir, "artifacts", "layout")
    43  	if _, err := os.Stat(layoutDir); os.IsNotExist(err) {
    44  		return nil, err
    45  	}
    46  	layout, err := ggcr.NewRegistryClient().ReadLayout(layoutDir)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	return &ociLayout{
    52  		layout: layout,
    53  		logs:   ioutil.Discard,
    54  	}, nil
    55  }
    56  
    57  func (o *ociLayout) Add(im string) (string, error) {
    58  	n, err := image.NewName(im)
    59  	if err != nil {
    60  		return "", err
    61  	}
    62  
    63  	dig, err := o.layout.Add(n)
    64  	if err != nil {
    65  		return "", err
    66  	}
    67  
    68  	return dig.String(), nil
    69  }
    70  
    71  func (o *ociLayout) Push(dig image.Digest, src image.Name, dst image.Name) error {
    72  	if dig == image.EmptyDigest {
    73  		var err error
    74  		dig, err = o.layout.Find(src)
    75  		if err != nil {
    76  			return err
    77  		}
    78  	}
    79  	return o.layout.Push(dig, dst)
    80  }