Skip to content

Commit e567b3c

Browse files
authored
Merge pull request #985 from joeybrown-sf/feature/rebase-digest
allow passing previous image in rebase cmd
2 parents 72bb706 + 9614cad commit e567b3c

7 files changed

Lines changed: 94 additions & 52 deletions

File tree

cmd/lifecycle/rebaser.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,11 @@ func (r *rebaseCmd) DefineFlags() {
3737
cli.FlagRunImage(&r.RunImageRef)
3838
cli.FlagUID(&r.UID)
3939
cli.FlagUseDaemon(&r.UseDaemon)
40-
4140
cli.DeprecatedFlagRunImage(&r.DeprecatedRunImageRef)
41+
42+
if r.PlatformAPI.AtLeast("0.11") {
43+
cli.FlagPreviousImage(&r.PreviousImageRef)
44+
}
4245
}
4346

4447
// Args validates arguments and flags, and fills in default values.
@@ -101,7 +104,7 @@ func (r *rebaseCmd) Exec() error {
101104
Logger: cmd.DefaultLogger,
102105
PlatformAPI: r.PlatformAPI,
103106
}
104-
report, err := rebaser.Rebase(r.appImage, newBaseImage, r.AdditionalTags)
107+
report, err := rebaser.Rebase(r.appImage, newBaseImage, r.OutputImageRef, r.AdditionalTags)
105108
if err != nil {
106109
return cmd.FailErrCode(err, r.CodeFor(platform.RebaseError), "rebase")
107110
}
@@ -113,28 +116,35 @@ func (r *rebaseCmd) Exec() error {
113116
}
114117

115118
func (r *rebaseCmd) setAppImage() error {
116-
ref, err := name.ParseReference(r.OutputImageRef, name.WeakValidation)
119+
var targetImageRef string
120+
if len(r.PreviousImageRef) > 0 {
121+
targetImageRef = r.PreviousImageRef
122+
} else {
123+
targetImageRef = r.OutputImageRef
124+
}
125+
126+
ref, err := name.ParseReference(targetImageRef, name.WeakValidation)
117127
if err != nil {
118128
return err
119129
}
120130
registry := ref.Context().RegistryStr()
121131

122132
if r.UseDaemon {
123133
r.appImage, err = local.NewImage(
124-
r.OutputImageRef,
134+
targetImageRef,
125135
r.docker,
126-
local.FromBaseImage(r.OutputImageRef),
136+
local.FromBaseImage(targetImageRef),
127137
)
128138
} else {
129139
var keychain authn.Keychain
130-
keychain, err = auth.DefaultKeychain(r.OutputImageRef)
140+
keychain, err = auth.DefaultKeychain(targetImageRef)
131141
if err != nil {
132142
return err
133143
}
134144
r.appImage, err = remote.NewImage(
135-
r.OutputImageRef,
145+
targetImageRef,
136146
keychain,
137-
remote.FromBaseImage(r.OutputImageRef),
147+
remote.FromBaseImage(targetImageRef),
138148
)
139149
}
140150
if err != nil || !r.appImage.Found() {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ require (
55
github.com/GoogleContainerTools/kaniko v1.9.2-0.20220928141902-4d077e2a4084
66
github.com/apex/log v1.9.0
77
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20221206183240-3b42f427f89a
8-
github.com/buildpacks/imgutil v0.0.0-20221128174954-533a87656dc4
8+
github.com/buildpacks/imgutil v0.0.0-20230109221445-3a4729624abe
99
github.com/chrismellard/docker-credential-acr-env v0.0.0-20221129204813-6a4d6ed5d396
1010
github.com/containerd/containerd v1.6.13
1111
github.com/docker/docker v20.10.21+incompatible

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,8 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2
255255
github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
256256
github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
257257
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
258-
github.com/buildpacks/imgutil v0.0.0-20221128174954-533a87656dc4 h1:JrC06zJNkuOGrNVh7u8RXjfSNO8810blRjLeBplMQZA=
259-
github.com/buildpacks/imgutil v0.0.0-20221128174954-533a87656dc4/go.mod h1:7XJyKf8MwQfHcsjjA9et24BWN3gE1FztxnN8de54mL0=
258+
github.com/buildpacks/imgutil v0.0.0-20230109221445-3a4729624abe h1:/6zdvfeEvaf1mOrw6LaaUE+wG0PvAKOZOaB3z1DzioA=
259+
github.com/buildpacks/imgutil v0.0.0-20230109221445-3a4729624abe/go.mod h1:7XJyKf8MwQfHcsjjA9et24BWN3gE1FztxnN8de54mL0=
260260
github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw=
261261
github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo=
262262
github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A=

rebaser.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ type RebaseReport struct {
2525
Image platform.ImageReport `toml:"image"`
2626
}
2727

28-
func (r *Rebaser) Rebase(appImage imgutil.Image, newBaseImage imgutil.Image, additionalNames []string) (RebaseReport, error) {
28+
func (r *Rebaser) Rebase(workingImage imgutil.Image, newBaseImage imgutil.Image, outputImageRef string, additionalNames []string) (RebaseReport, error) {
2929
var origMetadata platform.LayersMetadataCompat
30-
if err := image.DecodeLabel(appImage, platform.LayerMetadataLabel, &origMetadata); err != nil {
30+
if err := image.DecodeLabel(workingImage, platform.LayerMetadataLabel, &origMetadata); err != nil {
3131
return RebaseReport{}, errors.Wrap(err, "get image metadata")
3232
}
3333

34-
appStackID, err := appImage.Label(platform.StackIDLabel)
34+
appStackID, err := workingImage.Label(platform.StackIDLabel)
3535
if err != nil {
3636
return RebaseReport{}, errors.Wrap(err, "get app image stack")
3737
}
@@ -53,11 +53,11 @@ func (r *Rebaser) Rebase(appImage imgutil.Image, newBaseImage imgutil.Image, add
5353
return RebaseReport{}, fmt.Errorf("incompatible stack: '%s' is not compatible with '%s'", newBaseStackID, appStackID)
5454
}
5555

56-
if err := validateMixins(appImage, newBaseImage); err != nil {
56+
if err := validateMixins(workingImage, newBaseImage); err != nil {
5757
return RebaseReport{}, err
5858
}
5959

60-
if err := appImage.Rebase(origMetadata.RunImage.TopLayer, newBaseImage); err != nil {
60+
if err := workingImage.Rebase(origMetadata.RunImage.TopLayer, newBaseImage); err != nil {
6161
return RebaseReport{}, errors.Wrap(err, "rebase app image")
6262
}
6363

@@ -77,17 +77,16 @@ func (r *Rebaser) Rebase(appImage imgutil.Image, newBaseImage imgutil.Image, add
7777
return RebaseReport{}, errors.Wrap(err, "marshall metadata")
7878
}
7979

80-
if err := appImage.SetLabel(platform.LayerMetadataLabel, string(data)); err != nil {
80+
if err := workingImage.SetLabel(platform.LayerMetadataLabel, string(data)); err != nil {
8181
return RebaseReport{}, errors.Wrap(err, "set app image metadata label")
8282
}
8383

8484
hasPrefix := func(l string) bool { return strings.HasPrefix(l, "io.buildpacks.stack.") }
85-
if err := image.SyncLabels(newBaseImage, appImage, hasPrefix); err != nil {
85+
if err := image.SyncLabels(newBaseImage, workingImage, hasPrefix); err != nil {
8686
return RebaseReport{}, errors.Wrap(err, "set stack labels")
8787
}
88-
8988
report := RebaseReport{}
90-
report.Image, err = saveImage(appImage, additionalNames, r.Logger)
89+
report.Image, err = saveImageAs(workingImage, outputImageRef, additionalNames, r.Logger)
9190
if err != nil {
9291
return RebaseReport{}, err
9392
}

rebaser_test.go

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,12 @@ func TestRebaser(t *testing.T) {
2828

2929
func testRebaser(t *testing.T, when spec.G, it spec.S) {
3030
var (
31-
rebaser *lifecycle.Rebaser
32-
fakeAppImage *fakes.Image
33-
fakeNewBaseImage *fakes.Image
34-
additionalNames []string
35-
md platform.LayersMetadataCompat
31+
rebaser *lifecycle.Rebaser
32+
fakeAppImage *fakes.Image
33+
fakeNewBaseImage *fakes.Image
34+
fakePreviousImage *fakes.Image
35+
additionalNames []string
36+
md platform.LayersMetadataCompat
3637
)
3738

3839
it.Before(func() {
@@ -54,6 +55,15 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
5455
)
5556
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.StackIDLabel, "io.buildpacks.stacks.bionic"))
5657

58+
fakePreviousImage = fakes.NewImage(
59+
"some-repo/previous-image",
60+
"previous-layer-sha",
61+
local.IDIdentifier{
62+
ImageID: "previous-run-id",
63+
},
64+
)
65+
h.AssertNil(t, fakePreviousImage.SetLabel(platform.StackIDLabel, "io.buildpacks.stacks.bionic"))
66+
5767
additionalNames = []string{"some-repo/app-image:foo", "some-repo/app-image:bar"}
5868

5969
rebaser = &lifecycle.Rebaser{
@@ -70,33 +80,33 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
7080
when("#Rebase", func() {
7181
when("app image and run image exist", func() {
7282
it("updates the base image of the app image", func() {
73-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
83+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
7484
h.AssertNil(t, err)
7585
h.AssertEq(t, fakeAppImage.Base(), "some-repo/new-base-image")
7686
})
7787

7888
it("saves to all names", func() {
79-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
89+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
8090
h.AssertNil(t, err)
8191
h.AssertContains(t, fakeAppImage.SavedNames(), "some-repo/app-image", "some-repo/app-image:foo", "some-repo/app-image:bar")
8292
})
8393

8494
it("adds all names to report", func() {
85-
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
95+
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
8696
h.AssertNil(t, err)
8797
h.AssertContains(t, report.Image.Tags, "some-repo/app-image", "some-repo/app-image:foo", "some-repo/app-image:bar")
8898
})
8999

90100
it("sets the top layer in the metadata", func() {
91-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
101+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
92102
h.AssertNil(t, err)
93103
h.AssertNil(t, image.DecodeLabel(fakeAppImage, platform.LayerMetadataLabel, &md))
94104

95105
h.AssertEq(t, md.RunImage.TopLayer, "new-top-layer-sha")
96106
})
97107

98108
it("sets the run image reference in the metadata", func() {
99-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
109+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
100110
h.AssertNil(t, err)
101111
h.AssertNil(t, image.DecodeLabel(fakeAppImage, platform.LayerMetadataLabel, &md))
102112

@@ -108,7 +118,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
108118
platform.LayerMetadataLabel,
109119
`{"app": [{"sha": "123456"}], "buildpacks":[{"key": "buildpack.id", "layers": {}}]}`,
110120
))
111-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
121+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
112122
h.AssertNil(t, err)
113123
h.AssertNil(t, image.DecodeLabel(fakeAppImage, platform.LayerMetadataLabel, &md))
114124

@@ -144,7 +154,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
144154
})
145155

146156
it("syncs matching labels", func() {
147-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
157+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
148158
h.AssertNil(t, err)
149159

150160
for _, test := range tests {
@@ -170,7 +180,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
170180
})
171181

172182
it("add the digest to the report", func() {
173-
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
183+
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
174184
h.AssertNil(t, err)
175185

176186
h.AssertEq(t, report.Image.Digest, fakeRemoteDigest)
@@ -192,7 +202,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
192202
})
193203

194204
it("doesn't set the manifest size in the report.toml", func() {
195-
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
205+
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
196206
h.AssertNil(t, err)
197207

198208
h.AssertEq(t, report.Image.ManifestSize, int64(0))
@@ -208,7 +218,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
208218
})
209219

210220
it("add the manifest size to the report", func() {
211-
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
221+
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
212222
h.AssertNil(t, err)
213223

214224
h.AssertEq(t, report.Image.ManifestSize, fakeRemoteManifestSize)
@@ -222,7 +232,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
222232
})
223233

224234
it("doesn't set the manifest size in the report.toml", func() {
225-
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
235+
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
226236
h.AssertNil(t, err)
227237

228238
h.AssertEq(t, report.Image.ManifestSize, int64(0))
@@ -233,7 +243,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
233243

234244
when("image has an ID identifier", func() {
235245
it("add the imageID to the report", func() {
236-
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
246+
report, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
237247
h.AssertNil(t, err)
238248

239249
h.AssertEq(t, report.Image.ImageID, "some-image-id")
@@ -243,7 +253,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
243253
when("validating mixins", func() {
244254
when("there are no mixin labels", func() {
245255
it("allows rebase", func() {
246-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
256+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
247257
h.AssertNil(t, err)
248258
h.AssertEq(t, fakeAppImage.Base(), "some-repo/new-base-image")
249259
})
@@ -252,7 +262,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
252262
when("there are invalid mixin labels", func() {
253263
it("returns an error", func() {
254264
h.AssertNil(t, fakeAppImage.SetLabel(platform.MixinsLabel, "thisisn'tvalid!"))
255-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
265+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
256266
h.AssertError(t, err, "get app image mixins: failed to unmarshal context of label 'io.buildpacks.stack.mixins': invalid character 'h' in literal true (expecting 'r')")
257267
})
258268
})
@@ -261,7 +271,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
261271
it("allows rebase", func() {
262272
h.AssertNil(t, fakeAppImage.SetLabel(platform.MixinsLabel, "null"))
263273
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.MixinsLabel, "null"))
264-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
274+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
265275
h.AssertNil(t, err)
266276
h.AssertEq(t, fakeAppImage.Base(), "some-repo/new-base-image")
267277
})
@@ -271,7 +281,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
271281
it("allows rebase", func() {
272282
h.AssertNil(t, fakeAppImage.SetLabel(platform.MixinsLabel, "null"))
273283
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\"]"))
274-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
284+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
275285
h.AssertNil(t, err)
276286
h.AssertEq(t, fakeAppImage.Base(), "some-repo/new-base-image")
277287
})
@@ -281,7 +291,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
281291
it("allows rebase", func() {
282292
h.AssertNil(t, fakeAppImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\", \"run:mixin-2\"]"))
283293
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\", \"run:mixin-2\"]"))
284-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
294+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
285295
h.AssertNil(t, err)
286296
h.AssertEq(t, fakeAppImage.Base(), "some-repo/new-base-image")
287297
})
@@ -291,7 +301,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
291301
it("allows rebase", func() {
292302
h.AssertNil(t, fakeAppImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\", \"run:mixin-2\"]"))
293303
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\", \"run:mixin-2\", \"mixin-3\"]"))
294-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
304+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
295305
h.AssertNil(t, err)
296306
h.AssertEq(t, fakeAppImage.Base(), "some-repo/new-base-image")
297307
})
@@ -301,7 +311,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
301311
it("allows rebase", func() {
302312
h.AssertNil(t, fakeAppImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\", \"run:mixin-2\"]"))
303313
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\", \"mixin-2\"]"))
304-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
314+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
305315
h.AssertNil(t, err)
306316
h.AssertEq(t, fakeAppImage.Base(), "some-repo/new-base-image")
307317
})
@@ -311,7 +321,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
311321
it("allows rebase", func() {
312322
h.AssertNil(t, fakeAppImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\", \"run:mixin-2\"]"))
313323
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.MixinsLabel, "[\"run:mixin-1\", \"run:mixin-2\"]"))
314-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
324+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
315325
h.AssertNil(t, err)
316326
h.AssertEq(t, fakeAppImage.Base(), "some-repo/new-base-image")
317327
})
@@ -321,7 +331,7 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
321331
it("does not allow rebase", func() {
322332
h.AssertNil(t, fakeAppImage.SetLabel(platform.MixinsLabel, "[\"mixin-1\", \"run:mixin-2\"]"))
323333
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.MixinsLabel, "[\"run:mixin-2\"]"))
324-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
334+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
325335
h.AssertError(t, err, "missing required mixin(s): mixin-1")
326336
})
327337
})
@@ -333,25 +343,35 @@ func testRebaser(t *testing.T, when spec.G, it spec.S) {
333343
h.AssertNil(t, fakeAppImage.SetLabel(platform.StackIDLabel, "io.buildpacks.stacks.bionic"))
334344
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.StackIDLabel, "io.buildpacks.stacks.cflinuxfs3"))
335345

336-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
346+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
337347
h.AssertError(t, err, "incompatible stack: 'io.buildpacks.stacks.cflinuxfs3' is not compatible with 'io.buildpacks.stacks.bionic'")
338348
})
339349

340350
it("returns an error and prevents the rebase from taking place when the new base image has no stack defined", func() {
341351
h.AssertNil(t, fakeAppImage.SetLabel(platform.StackIDLabel, "io.buildpacks.stacks.bionic"))
342352
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.StackIDLabel, ""))
343353

344-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
354+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
345355
h.AssertError(t, err, "stack not defined on new base image")
346356
})
347357

348358
it("returns an error and prevents the rebase from taking place when the app image has no stack defined", func() {
349359
h.AssertNil(t, fakeAppImage.SetLabel(platform.StackIDLabel, ""))
350360
h.AssertNil(t, fakeNewBaseImage.SetLabel(platform.StackIDLabel, "io.buildpacks.stacks.cflinuxfs3"))
351361

352-
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, additionalNames)
362+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, fakeAppImage.Name(), additionalNames)
353363
h.AssertError(t, err, "stack not defined on app image")
354364
})
355365
})
366+
367+
when("outputImageRef is different than workingImage name", func() {
368+
it("saves using outputImageRef, not the app image name", func() {
369+
outputImageRef := "fizz"
370+
_, err := rebaser.Rebase(fakeAppImage, fakeNewBaseImage, outputImageRef, additionalNames)
371+
h.AssertNil(t, err)
372+
h.AssertContains(t, fakeAppImage.SavedNames(), append(additionalNames, outputImageRef)...)
373+
h.AssertDoesNotContain(t, fakeAppImage.SavedNames(), fakePreviousImage.Name())
374+
})
375+
})
356376
})
357377
}

0 commit comments

Comments
 (0)