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 }