github.com/YousefHaggyHeroku/pack@v1.5.5/internal/fakes/fake_package.go (about)

     1  package fakes
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  	"os"
     7  
     8  	"github.com/google/go-containerregistry/pkg/v1/tarball"
     9  
    10  	"github.com/YousefHaggyHeroku/pack/internal/dist"
    11  )
    12  
    13  type Package interface {
    14  	Name() string
    15  	BuildpackLayers() dist.BuildpackLayers
    16  	GetLayer(diffID string) (io.ReadCloser, error)
    17  }
    18  
    19  var _ Package = (*fakePackage)(nil)
    20  
    21  type fakePackage struct {
    22  	name       string
    23  	bpTarFiles map[string]string
    24  	bpLayers   dist.BuildpackLayers
    25  }
    26  
    27  func NewPackage(tmpDir string, name string, buildpacks []dist.Buildpack) (Package, error) {
    28  	processBuildpack := func(bp dist.Buildpack) (tarFile string, diffID string, err error) {
    29  		tarFile, err = dist.BuildpackToLayerTar(tmpDir, bp)
    30  		if err != nil {
    31  			return "", "", err
    32  		}
    33  
    34  		layer, err := tarball.LayerFromFile(tarFile)
    35  		if err != nil {
    36  			return "", "", err
    37  		}
    38  
    39  		hash, err := layer.DiffID()
    40  		if err != nil {
    41  			return "", "", err
    42  		}
    43  
    44  		return tarFile, hash.String(), nil
    45  	}
    46  
    47  	bpLayers := dist.BuildpackLayers{}
    48  	bpTarFiles := map[string]string{}
    49  	for _, bp := range buildpacks {
    50  		tarFile, diffID, err := processBuildpack(bp)
    51  		if err != nil {
    52  			return nil, err
    53  		}
    54  		bpTarFiles[diffID] = tarFile
    55  		dist.AddBuildpackToLayersMD(bpLayers, bp.Descriptor(), diffID)
    56  	}
    57  
    58  	return &fakePackage{
    59  		name:       name,
    60  		bpTarFiles: bpTarFiles,
    61  		bpLayers:   bpLayers,
    62  	}, nil
    63  }
    64  
    65  func (f *fakePackage) Name() string {
    66  	return f.name
    67  }
    68  
    69  func (f *fakePackage) BuildpackLayers() dist.BuildpackLayers {
    70  	return f.bpLayers
    71  }
    72  
    73  func (f *fakePackage) GetLayer(diffID string) (io.ReadCloser, error) {
    74  	tarFile, ok := f.bpTarFiles[diffID]
    75  	if !ok {
    76  		return nil, errors.New("no layer found")
    77  	}
    78  
    79  	return os.Open(tarFile)
    80  }