Skip to content

Commit 610703e

Browse files
committed
feat: Updated kiln carvel command to include -pkg suffix to bosh release names (#669)
ai-assisted=yes JIRA-ID: 119962 Authored-by: Ramkumar Vengadakrishnan <ramkumar.vengadakrishnan@broadcom.com>
1 parent 9e14199 commit 610703e

9 files changed

Lines changed: 79 additions & 31 deletions

File tree

internal/acceptance/carvel/carvel_workflow_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,12 +287,12 @@ var _ = Describe("carvel full workflow", Ordered, func() {
287287

288288
Expect(lock.Releases).To(HaveLen(1))
289289
rel := lock.Releases[0]
290-
Expect(rel.Name).To(Equal("k8s-tile-test"))
290+
Expect(rel.Name).To(Equal("k8s-tile-test-pkg"))
291291
Expect(rel.Version).To(HavePrefix("0.1.1+"))
292292
Expect(rel.Version).To(MatchRegexp(`^0\.1\.1\+[0-9a-f]{12}$`))
293293
Expect(rel.SHA1).NotTo(BeEmpty(), "lock must contain SHA1 of uploaded tarball")
294294
Expect(rel.RemoteSource).To(Equal("artifactory"))
295-
Expect(rel.RemotePath).To(Equal("bosh-releases/k8s-tile-test/k8s-tile-test-" + rel.Version + ".tgz"))
295+
Expect(rel.RemotePath).To(Equal("bosh-releases/k8s-tile-test-pkg/k8s-tile-test-pkg-" + rel.Version + ".tgz"))
296296

297297
gitInTile("add", "Kilnfile.lock")
298298
gitInTile("commit", "-m", "add Kilnfile.lock from upload")

internal/carvel/baker.go

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ type Baker interface {
3030
BakeFromLockfile(source string, releaseLock cargo.BOSHReleaseTarballLock, localTarball string) error
3131
KilnBake(destination string) error
3232
GetName() string
33+
GetBoshReleaseName() string
3334
// GetVersion returns the product version from base.yml or the version file.
3435
GetVersion() (string, error)
3536
// GetReleaseVersion returns the BOSH release version, which includes a
@@ -90,6 +91,9 @@ func (b *baker) Bake(source string) error {
9091
if err != nil {
9192
return err
9293
}
94+
if b.metadata.Name == "" {
95+
return errors.New("missing required field 'name' in tile metadata (base.yml)")
96+
}
9397
if err := validateVariables(b.metadata.Variables); err != nil {
9498
return err
9599
}
@@ -141,6 +145,9 @@ func (b *baker) BakeFromLockfile(source string, releaseLock cargo.BOSHReleaseTar
141145
if err != nil {
142146
return err
143147
}
148+
if b.metadata.Name == "" {
149+
return errors.New("missing required field 'name' in tile metadata (base.yml)")
150+
}
144151
if err := validateVariables(b.metadata.Variables); err != nil {
145152
return err
146153
}
@@ -151,8 +158,8 @@ func (b *baker) BakeFromLockfile(source string, releaseLock cargo.BOSHReleaseTar
151158
}
152159
b.progress(fmt.Sprintf("Tile: %s version %s (metadata_version %s)", b.metadata.Name, ver, b.metadata.MetadataVersion))
153160

154-
if releaseLock.Name != b.metadata.Name {
155-
return fmt.Errorf("lockfile release name %q does not match tile name %q", releaseLock.Name, b.metadata.Name)
161+
if releaseLock.Name != b.GetBoshReleaseName() {
162+
return fmt.Errorf("lockfile release name %q does not match tile-derived name %q", releaseLock.Name, b.GetBoshReleaseName())
156163
}
157164

158165
b.releaseVersion = releaseLock.Version
@@ -194,7 +201,7 @@ func (b *baker) BakeFromLockfile(source string, releaseLock cargo.BOSHReleaseTar
194201
return err
195202
}
196203

197-
destTarball := path.Join(releasesDir, b.metadata.Name+"-"+releaseLock.Version+".tgz")
204+
destTarball := path.Join(releasesDir, b.GetBoshReleaseName()+"-"+releaseLock.Version+".tgz")
198205

199206
b.progress("Copying cached BOSH release from " + localTarball)
200207
b.log("copying cached BOSH release from " + localTarball)
@@ -210,7 +217,7 @@ func (b *baker) GetReleaseTarball() (string, error) {
210217
if b.releaseVersion == "" {
211218
return "", fmt.Errorf("release version not set -- call Bake() or BakeFromLockfile() first")
212219
}
213-
tarball := path.Join(b.destination, "releases", b.metadata.Name+"-"+b.releaseVersion+".tgz")
220+
tarball := path.Join(b.destination, "releases", b.GetBoshReleaseName()+"-"+b.releaseVersion+".tgz")
214221
if _, err := os.Stat(tarball); err != nil {
215222
return "", fmt.Errorf("release tarball not found at %s: %w", tarball, err)
216223
}
@@ -221,6 +228,13 @@ func (b *baker) GetName() string {
221228
return b.metadata.Name
222229
}
223230

231+
func (b *baker) GetBoshReleaseName() string {
232+
if b.metadata.Name == "" {
233+
return ""
234+
}
235+
return b.metadata.Name + "-pkg"
236+
}
237+
224238
func (b *baker) GetReleaseVersion() string {
225239
return b.releaseVersion
226240
}
@@ -663,7 +677,7 @@ func (b *baker) generateBaseYaml() error {
663677

664678
// we will use the tile name and version as the bosh release name and version.
665679
meta.Releases = []string{
666-
`$( release "` + b.metadata.Name + `" )`,
680+
`$( release "` + b.GetBoshReleaseName() + `" )`,
667681
}
668682

669683
yamlData, err := yaml.Marshal(&meta)
@@ -771,7 +785,7 @@ func (b *baker) generateRuntimeConfigs() error {
771785

772786
registryDataJob := models.Job{
773787
Name: "registry-data",
774-
Release: b.metadata.Name,
788+
Release: b.GetBoshReleaseName(),
775789
Properties: registryDataProps,
776790
}
777791
if len(consumesMap) > 0 {
@@ -780,7 +794,7 @@ func (b *baker) generateRuntimeConfigs() error {
780794

781795
inner := models.RuntimeConfigInner{
782796
Releases: []string{
783-
`$( release "` + b.metadata.Name + `" )`,
797+
`$( release "` + b.GetBoshReleaseName() + `" )`,
784798
},
785799
Addons: []models.Addon{
786800
{
@@ -862,12 +876,12 @@ func (b *baker) createBoshRelease() error {
862876
releaseVersion := buildReleaseVersion(productVersion, fingerprint)
863877
b.releaseVersion = releaseVersion
864878

865-
finalTarball := path.Join(b.destination, "releases", b.metadata.Name+"-"+releaseVersion+".tgz")
879+
finalTarball := path.Join(b.destination, "releases", b.GetBoshReleaseName()+"-"+releaseVersion+".tgz")
866880
cmd := exec.Command("bosh",
867881
"create-release",
868882
"--dir="+dirName,
869883
"--force",
870-
"--name", b.metadata.Name,
884+
"--name", b.GetBoshReleaseName(),
871885
"--version", releaseVersion,
872886
"--tarball", finalTarball)
873887
b.log("executing " + cmd.String())

internal/carvel/baker_test.go

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@ consumes:
360360
}
361361
for _, cmd := range commands {
362362
cmd.Dir = inputPath
363+
cmd.Env = append(os.Environ(), "GIT_AUTHOR_NAME=test", "GIT_AUTHOR_EMAIL=test@test.com", "GIT_COMMITTER_NAME=test", "GIT_COMMITTER_EMAIL=test@test.com")
363364
out, err := cmd.CombinedOutput()
364365
Expect(err).NotTo(HaveOccurred(), "error invoking git: "+string(out))
365366
}
@@ -390,6 +391,8 @@ consumes:
390391
Expect(err).NotTo(HaveOccurred())
391392

392393
Expect(outMeta.Name).To(Equal("k8s-tile-test"))
394+
Expect(subject.GetName()).To(Equal("k8s-tile-test"))
395+
Expect(subject.GetBoshReleaseName()).To(Equal("k8s-tile-test-pkg"))
393396
Expect(outMeta.ProductVersion).To(Equal(`$( version )`))
394397
Expect(outMeta.MetadataVersion).To(Equal("3.2.0"))
395398
Expect(outMeta.Rank).To(Equal(1))
@@ -402,7 +405,7 @@ consumes:
402405
Expect(outMeta.Variables[0].Options).To(HaveKeyWithValue("common_name", "Sample Tile CA"))
403406
Expect(outMeta.Variables[0].Options).To(HaveKeyWithValue("is_ca", true))
404407
Expect(outMeta.Releases).To(HaveLen(1))
405-
Expect(outMeta.Releases[0]).To(ContainSubstring("k8s-tile-test"))
408+
Expect(outMeta.Releases[0]).To(Equal(`$( release "k8s-tile-test-pkg" )`))
406409
Expect(outMeta.InstanceGroups).To(HaveLen(0))
407410
Expect(outMeta.RuntimeConfigs).To(HaveLen(1))
408411
Expect(outMeta.RuntimeConfigs[0]).To(Equal(`$( runtime_config "k8s-tile-test-pkgr" )`))
@@ -434,7 +437,7 @@ consumes:
434437
releaseVersion := subject.GetReleaseVersion()
435438
Expect(releaseVersion).To(HavePrefix("0.1.1+"))
436439
Expect(releaseVersion).To(MatchRegexp(`^0\.1\.1\+[0-9a-f]{12}$`))
437-
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-"+releaseVersion+".tgz")).To(BeAnExistingFile())
440+
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-pkg-"+releaseVersion+".tgz")).To(BeAnExistingFile())
438441

439442
tarball, err := subject.GetReleaseTarball()
440443
Expect(err).NotTo(HaveOccurred())
@@ -502,7 +505,7 @@ consumes:
502505
By("having only the registry-data job (no separate package-install job)")
503506
Expect(addon.Jobs).To(HaveLen(1))
504507
Expect(addon.Jobs[0].Name).To(Equal("registry-data"))
505-
Expect(addon.Jobs[0].Release).To(Equal("k8s-tile-test"))
508+
Expect(addon.Jobs[0].Release).To(Equal("k8s-tile-test-pkg"))
506509

507510
By("carrying package install properties on the registry-data job")
508511
Expect(addon.Jobs[0].Properties).To(HaveKey("test-install"))
@@ -624,6 +627,7 @@ consumes:
624627
}
625628
for _, cmd := range commands {
626629
cmd.Dir = inputPath
630+
cmd.Env = append(os.Environ(), "GIT_AUTHOR_NAME=test", "GIT_AUTHOR_EMAIL=test@test.com", "GIT_COMMITTER_NAME=test", "GIT_COMMITTER_EMAIL=test@test.com")
627631
out, err := cmd.CombinedOutput()
628632
Expect(err).NotTo(HaveOccurred(), "error invoking git: "+string(out))
629633
}
@@ -643,7 +647,7 @@ consumes:
643647
uploadReleaseVersion := subject.GetReleaseVersion()
644648

645649
releaseLock := cargo.BOSHReleaseTarballLock{
646-
Name: "k8s-tile-test",
650+
Name: "k8s-tile-test-pkg",
647651
Version: uploadReleaseVersion,
648652
}
649653

@@ -654,7 +658,7 @@ consumes:
654658

655659
outputPath := path.Join(inputPath, ".carvel-tile")
656660
Expect(filepath.Join(outputPath, "base.yml")).To(BeAnExistingFile())
657-
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-"+uploadReleaseVersion+".tgz")).To(BeAnExistingFile())
661+
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-pkg-"+uploadReleaseVersion+".tgz")).To(BeAnExistingFile())
658662
Expect(filepath.Join(outputPath, "runtime_configs")).To(BeADirectory())
659663
Expect(subject2.GetReleaseVersion()).To(Equal(uploadReleaseVersion))
660664
})
@@ -678,7 +682,27 @@ consumes:
678682
subject := NewBaker()
679683
err = subject.BakeFromLockfile(inputPath, releaseLock, "/nonexistent/tarball.tgz")
680684
Expect(err).To(HaveOccurred())
681-
Expect(err.Error()).To(ContainSubstring("does not match tile name"))
685+
Expect(err.Error()).To(ContainSubstring("does not match tile-derived name"))
686+
})
687+
})
688+
689+
When("the tile metadata name is missing", func() {
690+
It("returns an error early", func() {
691+
inputPath, err := os.MkdirTemp("", "missing-name-*")
692+
Expect(err).NotTo(HaveOccurred())
693+
defer func() { _ = os.RemoveAll(inputPath) }()
694+
695+
err = os.WriteFile(filepath.Join(inputPath, "base.yml"), []byte("label: no-name-tile"), 0644)
696+
Expect(err).NotTo(HaveOccurred())
697+
698+
subject := NewBaker()
699+
err = subject.Bake(inputPath)
700+
Expect(err).To(HaveOccurred())
701+
Expect(err.Error()).To(ContainSubstring("missing required field 'name'"))
702+
703+
err = subject.BakeFromLockfile(inputPath, cargo.BOSHReleaseTarballLock{}, "/nonexistent/tarball.tgz")
704+
Expect(err).To(HaveOccurred())
705+
Expect(err.Error()).To(ContainSubstring("missing required field 'name'"))
682706
})
683707
})
684708
})
@@ -731,7 +755,7 @@ consumes:
731755
Expect(copyTestFile(uploadTarball, cachedTarball)).To(Succeed())
732756

733757
releaseLock := cargo.BOSHReleaseTarballLock{
734-
Name: "k8s-tile-test",
758+
Name: "k8s-tile-test-pkg",
735759
Version: uploadBaker.GetReleaseVersion(),
736760
}
737761

@@ -855,6 +879,13 @@ consumes:
855879
})
856880
})
857881

882+
Context("GetBoshReleaseName", func() {
883+
It("returns empty string before Bake is called", func() {
884+
b := NewBaker()
885+
Expect(b.GetBoshReleaseName()).To(BeEmpty())
886+
})
887+
})
888+
858889
Context("generateManifestTemplate with different entry names", func() {
859890
It("parameterizes the entry name throughout the template", func() {
860891
template := generateManifestTemplate("my-custom-pkg", "")

internal/commands/carvel.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ type Carvel struct {
1818
synopses map[string]string
1919
}
2020

21-
func NewCarvel(outLogger, errLogger *log.Logger) Carvel {
21+
func NewCarvel(outLogger, errLogger *log.Logger, kilnVersion string) Carvel {
2222
c := Carvel{
2323
outLogger: outLogger,
2424
errLogger: errLogger,
@@ -27,10 +27,13 @@ func NewCarvel(outLogger, errLogger *log.Logger) Carvel {
2727
synopses: map[string]string{},
2828
}
2929

30+
publishCmd := NewCarvelPublish(outLogger, errLogger)
31+
publishCmd.KilnVersion = kilnVersion
32+
3033
// Register subcommands
3134
c.commands["bake"] = NewCarvelBake(outLogger, errLogger)
3235
c.commands["upload"] = NewCarvelUpload(outLogger, errLogger)
33-
c.commands["publish"] = NewCarvelPublish(outLogger, errLogger)
36+
c.commands["publish"] = publishCmd
3437
c.commands["re-bake"] = NewCarvelReBake(outLogger, errLogger)
3538

3639
// Positional argument synopses for usage lines

internal/commands/carvel_publish_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ var _ = Describe("CarvelPublish", func() {
139139
}))
140140

141141
// Pre-load mock with the tarball (simulating a prior upload)
142-
remotePath := "/test-repo/bosh-releases/k8s-tile-test/k8s-tile-test-" + releaseVersion + ".tgz"
142+
remotePath := "/test-repo/bosh-releases/k8s-tile-test-pkg/k8s-tile-test-pkg-" + releaseVersion + ".tgz"
143143
blobs[remotePath] = tarballData
144144

145145
kf := cargo.Kilnfile{
@@ -158,9 +158,9 @@ var _ = Describe("CarvelPublish", func() {
158158

159159
lock := cargo.KilnfileLock{
160160
Releases: []cargo.BOSHReleaseTarballLock{{
161-
Name: "k8s-tile-test",
161+
Name: "k8s-tile-test-pkg",
162162
Version: releaseVersion,
163-
RemotePath: "bosh-releases/k8s-tile-test/k8s-tile-test-" + releaseVersion + ".tgz",
163+
RemotePath: "bosh-releases/k8s-tile-test-pkg/k8s-tile-test-pkg-" + releaseVersion + ".tgz",
164164
RemoteSource: "artifactory",
165165
}},
166166
Stemcell: cargo.Stemcell{OS: "ubuntu-jammy", Version: "1.446"},

internal/commands/carvel_rebake_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ var _ = Describe("CarvelReBake", func() {
194194
}))
195195

196196
// Pre-load the mock with the tarball at the expected path
197-
remotePath := "/test-repo/bosh-releases/k8s-tile-test/k8s-tile-test-" + releaseVersion + ".tgz"
197+
remotePath := "/test-repo/bosh-releases/k8s-tile-test-pkg/k8s-tile-test-pkg-" + releaseVersion + ".tgz"
198198
blobs[remotePath] = tarballData
199199

200200
kf := cargo.Kilnfile{
@@ -213,9 +213,9 @@ var _ = Describe("CarvelReBake", func() {
213213

214214
lock := cargo.KilnfileLock{
215215
Releases: []cargo.BOSHReleaseTarballLock{{
216-
Name: "k8s-tile-test",
216+
Name: "k8s-tile-test-pkg",
217217
Version: releaseVersion,
218-
RemotePath: "bosh-releases/k8s-tile-test/k8s-tile-test-" + releaseVersion + ".tgz",
218+
RemotePath: "bosh-releases/k8s-tile-test-pkg/k8s-tile-test-pkg-" + releaseVersion + ".tgz",
219219
RemoteSource: "artifactory",
220220
}},
221221
Stemcell: cargo.Stemcell{OS: "ubuntu-jammy", Version: "1.446"},

internal/commands/carvel_upload.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (c CarvelUpload) Execute(args []string) error {
9595
if artConfig.PathTemplate != "" {
9696
pathTmpl = artConfig.PathTemplate
9797
}
98-
remotePath, err := evaluatePathTemplate(pathTmpl, baker.GetName(), releaseVersion)
98+
remotePath, err := evaluatePathTemplate(pathTmpl, baker.GetBoshReleaseName(), releaseVersion)
9999
if err != nil {
100100
return fmt.Errorf("failed to evaluate path template: %w", err)
101101
}
@@ -113,7 +113,7 @@ func (c CarvelUpload) Execute(args []string) error {
113113

114114
sourceID := cargo.BOSHReleaseTarballSourceID(artConfig)
115115
lockfilePath := kilnfilePath + ".lock"
116-
err = writeStandardKilnfileLock(lockfilePath, baker.GetName(), releaseVersion, remotePath, sourceID, sha1sum)
116+
err = writeStandardKilnfileLock(lockfilePath, baker.GetBoshReleaseName(), releaseVersion, remotePath, sourceID, sha1sum)
117117
if err != nil {
118118
return fmt.Errorf("failed to write Kilnfile.lock: %w", err)
119119
}

internal/commands/carvel_upload_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,11 @@ var _ = Describe("CarvelUpload", func() {
160160
var lock cargo.KilnfileLock
161161
Expect(yaml.Unmarshal(lockData, &lock)).To(Succeed())
162162
Expect(lock.Releases).To(HaveLen(1))
163-
Expect(lock.Releases[0].Name).To(Equal("k8s-tile-test"))
163+
Expect(lock.Releases[0].Name).To(Equal("k8s-tile-test-pkg"))
164164
Expect(lock.Releases[0].Version).To(HavePrefix("0.1.1+"))
165165
Expect(lock.Releases[0].Version).To(MatchRegexp(`^0\.1\.1\+[0-9a-f]{12}$`))
166166
Expect(lock.Releases[0].SHA1).NotTo(BeEmpty())
167-
Expect(lock.Releases[0].RemotePath).To(ContainSubstring("k8s-tile-test"))
167+
Expect(lock.Releases[0].RemotePath).To(ContainSubstring("k8s-tile-test-pkg"))
168168
Expect(lock.Releases[0].RemotePath).To(ContainSubstring(lock.Releases[0].Version))
169169
Expect(lock.Releases[0].RemoteSource).To(Equal("artifactory"))
170170

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ func main() {
106106
log.Fatal(err)
107107
}
108108

109-
carvelCommand := commands.NewCarvel(outLogger, errLogger)
109+
carvelCommand := commands.NewCarvel(outLogger, errLogger, version)
110110
commandSet["carvel"] = carvelCommand
111111

112112
if command == "carvel" {

0 commit comments

Comments
 (0)