From 880da199a14efe25ac87ef04c7ab1844c6fbda7b Mon Sep 17 00:00:00 2001 From: Emily Casey Date: Mon, 1 Feb 2021 10:05:22 -0500 Subject: [PATCH] Buildpack API 0.5 Signed-off-by: Emily Casey --- boot/build.go | 9 +++++--- boot/build_test.go | 15 +++++++++++-- boot/spring_cloud_bindings.go | 13 ++++++----- boot/spring_cloud_bindings_test.go | 2 +- boot/web_application_type.go | 11 ++++++++-- buildpack.toml | 2 +- go.mod | 8 +++---- go.sum | 35 +++++++++++++++--------------- 8 files changed, 58 insertions(+), 37 deletions(-) diff --git a/boot/build.go b/boot/build.go index 5010afd..db5dd67 100644 --- a/boot/build.go +++ b/boot/build.go @@ -131,9 +131,10 @@ func (b Build) Build(context libcnb.BuildContext) (libcnb.BuildResult, error) { if err != nil { return libcnb.BuildResult{}, fmt.Errorf("unable to generate dependencies from %s\n%w", context.Application.Path, err) } - result.Plan.Entries = append(result.Plan.Entries, libcnb.BuildpackPlanEntry{ + result.BOM.Entries = append(result.BOM.Entries, libcnb.BOMEntry{ Name: "dependencies", Metadata: map[string]interface{}{"layer": "application", "dependencies": d}, + Launch: true, }) gv, err := NewGenerationValidator(filepath.Join(context.Buildpack.Path, "spring-generations.toml")) @@ -166,9 +167,10 @@ func (b Build) Build(context libcnb.BuildContext) (libcnb.BuildResult, error) { return libcnb.BuildResult{}, fmt.Errorf("unable to create WebApplicationTypeResolver\n%w", err) } - h := libpak.NewHelperLayerContributor(context.Buildpack, result.Plan, "spring-cloud-bindings") + h, be := libpak.NewHelperLayer(context.Buildpack, "spring-cloud-bindings") h.Logger = b.Logger result.Layers = append(result.Layers, h) + result.BOM.Entries = append(result.BOM.Entries, be) at, err := NewWebApplicationType(context.Application.Path, wr) if err != nil { @@ -182,9 +184,10 @@ func (b Build) Build(context libcnb.BuildContext) (libcnb.BuildResult, error) { return libcnb.BuildResult{}, fmt.Errorf("unable to find dependency\n%w", err) } - bindingsLayer := NewSpringCloudBindings(filepath.Join(context.Application.Path, lib), dep, dc, result.Plan) + bindingsLayer, be := NewSpringCloudBindings(filepath.Join(context.Application.Path, lib), dep, dc) bindingsLayer.Logger = b.Logger result.Layers = append(result.Layers, bindingsLayer) + result.BOM.Entries = append(result.BOM.Entries, be) if index, ok := manifest.Get("Spring-Boot-Layers-Index"); ok { b.Logger.Header("Creating slices from layers index") diff --git a/boot/build_test.go b/boot/build_test.go index aecd660..16a7f2b 100644 --- a/boot/build_test.go +++ b/boot/build_test.go @@ -159,7 +159,7 @@ Implementation-Version: 2.2.2 })) }) - it("contributes dependencies plan entry", func() { + it("contributes dependencies bom entry", func() { Expect(ioutil.WriteFile(filepath.Join(ctx.Application.Path, "META-INF", "MANIFEST.MF"), []byte(` Spring-Boot-Version: 1.1.1 Spring-Boot-Classes: BOOT-INF/classes @@ -172,7 +172,7 @@ Spring-Boot-Lib: BOOT-INF/lib result, err := build.Build(ctx) Expect(err).NotTo(HaveOccurred()) - Expect(result.Plan.Entries).To(ContainElement(libcnb.BuildpackPlanEntry{ + Expect(result.BOM.Entries).To(ContainElement(libcnb.BOMEntry{ Name: "dependencies", Metadata: map[string]interface{}{ "layer": "application", @@ -184,6 +184,8 @@ Spring-Boot-Lib: BOOT-INF/lib }, }, }, + Build: false, + Launch: true, })) }) @@ -202,6 +204,15 @@ Spring-Boot-Lib: BOOT-INF/lib Expect(result.Layers[0].(libpak.HelperLayerContributor).Names).To(Equal([]string{"spring-cloud-bindings"})) Expect(result.Layers[1].Name()).To(Equal("web-application-type")) Expect(result.Layers[2].Name()).To(Equal("spring-cloud-bindings")) + + Expect(result.BOM.Entries).To(HaveLen(3)) + Expect(result.BOM.Entries[0].Name).To(Equal("dependencies")) + Expect(result.BOM.Entries[1].Name).To(Equal("helper")) + Expect(result.BOM.Entries[1].Launch).To(BeTrue()) + Expect(result.BOM.Entries[1].Build).To(BeFalse()) + Expect(result.BOM.Entries[2].Name).To(Equal("spring-cloud-bindings")) + Expect(result.BOM.Entries[2].Launch).To(BeTrue()) + Expect(result.BOM.Entries[2].Build).To(BeFalse()) }) it("contributes slices from layers index", func() { diff --git a/boot/spring_cloud_bindings.go b/boot/spring_cloud_bindings.go index a02e43b..a0094b4 100644 --- a/boot/spring_cloud_bindings.go +++ b/boot/spring_cloud_bindings.go @@ -34,14 +34,15 @@ type SpringCloudBindings struct { SpringBootLib string } -func NewSpringCloudBindings(springBootLib string, dependency libpak.BuildpackDependency, cache libpak.DependencyCache, - plan *libcnb.BuildpackPlan) SpringCloudBindings { - +func NewSpringCloudBindings(springBootLib string, dependency libpak.BuildpackDependency, cache libpak.DependencyCache) (SpringCloudBindings, libcnb.BOMEntry) { + contributor, entry := libpak.NewDependencyLayer(dependency, cache, libcnb.LayerTypes{ + Launch: true, + }) return SpringCloudBindings{ Dependency: dependency, - LayerContributor: libpak.NewDependencyLayerContributor(dependency, cache, plan), + LayerContributor: contributor, SpringBootLib: springBootLib, - } + }, entry } func (s SpringCloudBindings) Contribute(layer libcnb.Layer) (libcnb.Layer, error) { @@ -57,7 +58,7 @@ func (s SpringCloudBindings) Contribute(layer libcnb.Layer) (libcnb.Layer, error } return layer, nil - }, libpak.LaunchLayer) + }) if err != nil { return libcnb.Layer{}, fmt.Errorf("unable to contribute spring-cloud-bindings layer\n%w", err) } diff --git a/boot/spring_cloud_bindings_test.go b/boot/spring_cloud_bindings_test.go index 25d9f74..c1f201d 100644 --- a/boot/spring_cloud_bindings_test.go +++ b/boot/spring_cloud_bindings_test.go @@ -59,7 +59,7 @@ func testSpringCloudBindings(t *testing.T, context spec.G, it spec.S) { } dc := libpak.DependencyCache{CachePath: "testdata"} - s := boot.NewSpringCloudBindings(filepath.Join(ctx.Application.Path, "test-lib"), dep, dc, &libcnb.BuildpackPlan{}) + s, _ := boot.NewSpringCloudBindings(filepath.Join(ctx.Application.Path, "test-lib"), dep, dc) layer, err := ctx.Layers.Layer("test-layer") Expect(err).NotTo(HaveOccurred()) diff --git a/boot/web_application_type.go b/boot/web_application_type.go index 7e86e10..d48f52d 100644 --- a/boot/web_application_type.go +++ b/boot/web_application_type.go @@ -40,8 +40,15 @@ func NewWebApplicationType(applicationPath string, resolver WebApplicationTypeRe return WebApplicationType{}, fmt.Errorf("unable to create file listing for %s\n%w", applicationPath, err) } + contributor := libpak.NewLayerContributor( + "Web Application Type", + expected, + libcnb.LayerTypes{ + Launch: true, + }, + ) return WebApplicationType{ - LayerContributor: libpak.NewLayerContributor("Web Application Type", expected), + LayerContributor: contributor, Resolver: resolver, }, nil } @@ -63,7 +70,7 @@ func (w WebApplicationType) Contribute(layer libcnb.Layer) (libcnb.Layer, error) } return layer, nil - }, libpak.LaunchLayer) + }) } func (WebApplicationType) Name() string { diff --git a/buildpack.toml b/buildpack.toml index 4e504e9..b63a470 100644 --- a/buildpack.toml +++ b/buildpack.toml @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -api = "0.4" +api = "0.5" [buildpack] id = "paketo-buildpacks/spring-boot" diff --git a/go.mod b/go.mod index 88455a7..46cd9c6 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,12 @@ go 1.15 require ( github.com/Masterminds/semver/v3 v3.1.1 - github.com/buildpacks/libcnb v1.18.1 + github.com/buildpacks/libcnb v1.19.0 github.com/heroku/color v0.0.6 github.com/magiconair/properties v1.8.4 - github.com/onsi/gomega v1.10.4 - github.com/paketo-buildpacks/libjvm v1.25.0 - github.com/paketo-buildpacks/libpak v1.50.1 + github.com/onsi/gomega v1.10.5 + github.com/paketo-buildpacks/libjvm v1.26.0 + github.com/paketo-buildpacks/libpak v1.51.0 github.com/pelletier/go-toml v1.8.1 github.com/sclevine/spec v1.4.0 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 diff --git a/go.sum b/go.sum index 9326d68..69c1bd8 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,9 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk= -github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/buildpacks/libcnb v1.18.1 h1:NcAqtyLmSkpcgIOl83GOHY5Mk2ltBFiAI8mmAvavvEs= -github.com/buildpacks/libcnb v1.18.1/go.mod h1:ozKZYold67tlck+1cobg11YhGmJqkQr8bMAH5gSvEvw= +github.com/buildpacks/libcnb v1.19.0 h1:7Frn3qErlVmQydk95YXmHtpmf5bZ1l7h4rK/C+SKAmY= +github.com/buildpacks/libcnb v1.19.0/go.mod h1:slnOsywO4mNdkShkwX1GYR+kQF1tH2F9Urfr66lWGQs= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -33,10 +31,13 @@ github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQS github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw= -github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -44,16 +45,14 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/onsi/gomega v1.10.4 h1:NiTx7EEvBzu9sFOD1zORteLSt3o8gnlvZZwSE9TnY9U= github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= -github.com/paketo-buildpacks/libjvm v1.25.0 h1:MUmBm+5b7921oYt4q8KDcqIul/0PkNvdjxfZi/4SLMY= -github.com/paketo-buildpacks/libjvm v1.25.0/go.mod h1:hKunbEe0sAhl6Ot62eH1QImmYCuLR7lR0mV5ER3if7o= -github.com/paketo-buildpacks/libpak v1.50.0 h1:o+KmJFWgLI/ygd4Nru8A1EuE3xJ1a0BuhsWUIVB8BPI= -github.com/paketo-buildpacks/libpak v1.50.0/go.mod h1:0JfeM5G7dtsan6yDjL8X60L+Jdiz6REVnxgkBVRp+ho= -github.com/paketo-buildpacks/libpak v1.50.1 h1:FumhbCg/sY3xzCyTj7je+0c4aQsVBU9T5ZJIBCexu9M= -github.com/paketo-buildpacks/libpak v1.50.1/go.mod h1:8EpJg+Lju6Vqb21ot4FXxTJbX8h6p0+xRWPF3uu5jPo= +github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/paketo-buildpacks/libjvm v1.26.0 h1:2C675B/Ym/OUcFzk0ekR2p91gmFnd6cb50a4QPWyDJI= +github.com/paketo-buildpacks/libjvm v1.26.0/go.mod h1:yYkaIASJu7/Frmu4J/C56tXsfSwbQD+W8+PX5EkdMdU= +github.com/paketo-buildpacks/libpak v1.51.0 h1:l9qhxIAn0K4KkcrScR4cnu8sNk5h+j9MynX6bbcCwHY= +github.com/paketo-buildpacks/libpak v1.51.0/go.mod h1:HPC3yyLkRW1P4ObNt3fxpFxldFrS1J0AkxpoFkqyB/Y= github.com/pavel-v-chernykh/keystore-go/v4 v4.1.0 h1:xKxUVGoB9VJU+lgQLPN0KURjw+XCVVSpHfQEeyxk3zo= github.com/pavel-v-chernykh/keystore-go/v4 v4.1.0/go.mod h1:2ejgys4qY+iNVW1IittZhyRYA6MNv8TgM6VHqojbB9g= github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= @@ -65,8 +64,6 @@ github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4Qn github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= @@ -79,8 +76,6 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -92,8 +87,12 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=