Skip to content

Commit

Permalink
WIP: refactor to use shim
Browse files Browse the repository at this point in the history
Signed-off-by: Micah Young <ymicah@vmware.com>
  • Loading branch information
Micah Young committed Oct 6, 2020
1 parent 8b006ab commit c9815f7
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 19 deletions.
2 changes: 0 additions & 2 deletions acceptance/acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,6 @@ func testWithoutSpecificBuilderRequirement(
"pack does not support 'package-buildpack'",
)

h.SkipIf(t, dockerHostOS() == "windows", "These tests are not yet compatible with Windows-based containers")

var err error
tmpDir, err = ioutil.TempDir("", "package-buildpack-tests")
assert.Nil(err)
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ require (
github.com/gogo/protobuf v1.3.1 // indirect
github.com/golang/mock v1.4.1
github.com/golang/protobuf v1.3.5 // indirect
github.com/google/go-cmp v0.5.1
github.com/google/go-cmp v0.5.2
github.com/google/go-containerregistry v0.0.0-20200313165449-955bf358a3d8
github.com/google/go-github/v30 v30.1.0
github.com/heroku/color v0.0.6
Expand Down
3 changes: 3 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjr
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/gabriel-samfira/go-hivex v0.0.0-20190725123041-b40bc95a7ced/go.mod h1:2uhxVfr/8oFRFnCQbpoSzKG+qCvKH3yVt8FPASfJO28=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
Expand Down Expand Up @@ -189,6 +190,8 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-containerregistry v0.0.0-20200311163244-4b1985e5ea21/go.mod h1:m8YvHwSOuBCq25yrj1DaX/fIMrv6ec3CNg8jY8+5PEA=
github.com/google/go-containerregistry v0.0.0-20200313165449-955bf358a3d8 h1:S7U1nPK3fi2xjZkMrQKcRayVtMmqMFJs9UtXQW3GPzM=
github.com/google/go-containerregistry v0.0.0-20200313165449-955bf358a3d8/go.mod h1:pD1UFYs7MCAx+ZLShBdttcaOSbyc8F9Na/9IZLNwJeA=
Expand Down
65 changes: 49 additions & 16 deletions internal/buildpackage/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@ import (
"archive/tar"
"compress/gzip"
"context"
"io"
"io/ioutil"
"os"

"github.com/buildpacks/imgutil/layer"

"github.com/buildpacks/imgutil"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/empty"
Expand All @@ -22,8 +25,6 @@ import (
"github.com/buildpacks/pack/internal/style"
)

const windowsPackageBase = "mcr.microsoft.com/windows/nanoserver:1809-amd64" // TODO: Should this be hard-coded?

type ImageFactory interface {
NewImage(repoName string, local bool) (imgutil.Image, error)
}
Expand Down Expand Up @@ -91,7 +92,7 @@ func (b *PackageBuilder) AddDependency(buildpack dist.Buildpack) {
b.dependencies = append(b.dependencies, buildpack)
}

func (b *PackageBuilder) finalizeImage(tmpDir string, image WorkableImage) error {
func (b *PackageBuilder) finalizeImage(image WorkableImage, tmpDir string) error {
if err := dist.SetLabel(image, MetadataLabel, &Metadata{
BuildpackInfo: b.buildpack.Descriptor().Info,
Stacks: b.resolvedStacks(),
Expand Down Expand Up @@ -128,6 +129,41 @@ func (b *PackageBuilder) finalizeImage(tmpDir string, image WorkableImage) error
return nil
}

func (b *PackageBuilder) prepareImageForOS(image imgutil.Image, daemon bool, imageOS, tmpDir string) error {
// OS must match for pull, but not OSVersion and Arch
if err := image.SetPlatform(imageOS, "", ""); err != nil {
return err
}

// add shim baselayer
if imageOS == "windows" {
baseLayerFile, err := ioutil.TempFile(tmpDir, "windows-baselayer")
if err != nil {
return err
}
defer baseLayerFile.Close()

baseLayer, err := layer.WindowsBaseLayer()
if err != nil {
return err
}

if _, err := io.Copy(baseLayerFile, baseLayer); err != nil {
return err
}

if err := baseLayerFile.Close(); err != nil {
return err
}

if err := image.AddLayer(baseLayerFile.Name()); err != nil {
return err
}
}

return nil
}

func (b *PackageBuilder) validate() error {
if b.buildpack == nil {
return errors.New("buildpack must be set")
Expand Down Expand Up @@ -174,7 +210,7 @@ func (b *PackageBuilder) SaveAsFile(path string) error {
}
defer os.RemoveAll(tmpDir)

if err := b.finalizeImage(tmpDir, layoutImage); err != nil {
if err := b.finalizeImage(layoutImage, tmpDir); err != nil {
return err
}

Expand Down Expand Up @@ -213,17 +249,10 @@ func (b *PackageBuilder) SaveAsImage(ctx context.Context, repoName string, publi
image imgutil.Image
err error
)
if b.imageOS == "windows" {
image, err = b.imageFetcher.Fetch(ctx, windowsPackageBase, !publish, pullPolicy)
if err != nil {
return nil, errors.Wrapf(err, "fetching base image")
}
image.Rename(repoName)
} else {
image, err = b.imageFactory.NewImage(repoName, !publish)
if err != nil {
return nil, errors.Wrapf(err, "creating image")
}

image, err = b.imageFactory.NewImage(repoName, !publish)
if err != nil {
return nil, errors.Wrapf(err, "creating image")
}

tmpDir, err := ioutil.TempDir("", "package-buildpack")
Expand All @@ -232,7 +261,11 @@ func (b *PackageBuilder) SaveAsImage(ctx context.Context, repoName string, publi
}
defer os.RemoveAll(tmpDir)

if err := b.finalizeImage(tmpDir, image); err != nil {
if err := b.prepareImageForOS(image, !publish, b.imageOS, tmpDir); err != nil {
return nil, errors.Wrap(err, "preparing image for os")
}

if err := b.finalizeImage(image, tmpDir); err != nil {
return nil, err
}

Expand Down

0 comments on commit c9815f7

Please sign in to comment.