Skip to content

Commit b65d2d5

Browse files
authored
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 b32665e commit b65d2d5

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
}
@@ -661,7 +675,7 @@ func (b *baker) generateBaseYaml() error {
661675

662676
// we will use the tile name and version as the bosh release name and version.
663677
meta.Releases = []string{
664-
`$( release "` + b.metadata.Name + `" )`,
678+
`$( release "` + b.GetBoshReleaseName() + `" )`,
665679
}
666680

667681
yamlData, err := yaml.Marshal(&meta)
@@ -769,7 +783,7 @@ func (b *baker) generateRuntimeConfigs() error {
769783

770784
registryDataJob := models.Job{
771785
Name: "registry-data",
772-
Release: b.metadata.Name,
786+
Release: b.GetBoshReleaseName(),
773787
Properties: registryDataProps,
774788
}
775789
if len(consumesMap) > 0 {
@@ -778,7 +792,7 @@ func (b *baker) generateRuntimeConfigs() error {
778792

779793
inner := models.RuntimeConfigInner{
780794
Releases: []string{
781-
`$( release "` + b.metadata.Name + `" )`,
795+
`$( release "` + b.GetBoshReleaseName() + `" )`,
782796
},
783797
Addons: []models.Addon{
784798
{
@@ -860,12 +874,12 @@ func (b *baker) createBoshRelease() error {
860874
releaseVersion := buildReleaseVersion(productVersion, fingerprint)
861875
b.releaseVersion = releaseVersion
862876

863-
finalTarball := path.Join(b.destination, "releases", b.metadata.Name+"-"+releaseVersion+".tgz")
877+
finalTarball := path.Join(b.destination, "releases", b.GetBoshReleaseName()+"-"+releaseVersion+".tgz")
864878
cmd := exec.Command("bosh",
865879
"create-release",
866880
"--dir="+dirName,
867881
"--force",
868-
"--name", b.metadata.Name,
882+
"--name", b.GetBoshReleaseName(),
869883
"--version", releaseVersion,
870884
"--tarball", finalTarball)
871885
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" )`))
@@ -429,7 +432,7 @@ consumes:
429432
releaseVersion := subject.GetReleaseVersion()
430433
Expect(releaseVersion).To(HavePrefix("0.1.1+"))
431434
Expect(releaseVersion).To(MatchRegexp(`^0\.1\.1\+[0-9a-f]{12}$`))
432-
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-"+releaseVersion+".tgz")).To(BeAnExistingFile())
435+
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-pkg-"+releaseVersion+".tgz")).To(BeAnExistingFile())
433436

434437
tarball, err := subject.GetReleaseTarball()
435438
Expect(err).NotTo(HaveOccurred())
@@ -497,7 +500,7 @@ consumes:
497500
By("having only the registry-data job (no separate package-install job)")
498501
Expect(addon.Jobs).To(HaveLen(1))
499502
Expect(addon.Jobs[0].Name).To(Equal("registry-data"))
500-
Expect(addon.Jobs[0].Release).To(Equal("k8s-tile-test"))
503+
Expect(addon.Jobs[0].Release).To(Equal("k8s-tile-test-pkg"))
501504

502505
By("carrying package install properties on the registry-data job")
503506
Expect(addon.Jobs[0].Properties).To(HaveKey("test-install"))
@@ -577,6 +580,7 @@ consumes:
577580
}
578581
for _, cmd := range commands {
579582
cmd.Dir = inputPath
583+
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")
580584
out, err := cmd.CombinedOutput()
581585
Expect(err).NotTo(HaveOccurred(), "error invoking git: "+string(out))
582586
}
@@ -596,7 +600,7 @@ consumes:
596600
uploadReleaseVersion := subject.GetReleaseVersion()
597601

598602
releaseLock := cargo.BOSHReleaseTarballLock{
599-
Name: "k8s-tile-test",
603+
Name: "k8s-tile-test-pkg",
600604
Version: uploadReleaseVersion,
601605
}
602606

@@ -607,7 +611,7 @@ consumes:
607611

608612
outputPath := path.Join(inputPath, ".carvel-tile")
609613
Expect(filepath.Join(outputPath, "base.yml")).To(BeAnExistingFile())
610-
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-"+uploadReleaseVersion+".tgz")).To(BeAnExistingFile())
614+
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-pkg-"+uploadReleaseVersion+".tgz")).To(BeAnExistingFile())
611615
Expect(filepath.Join(outputPath, "runtime_configs")).To(BeADirectory())
612616
Expect(subject2.GetReleaseVersion()).To(Equal(uploadReleaseVersion))
613617
})
@@ -631,7 +635,27 @@ consumes:
631635
subject := NewBaker()
632636
err = subject.BakeFromLockfile(inputPath, releaseLock, "/nonexistent/tarball.tgz")
633637
Expect(err).To(HaveOccurred())
634-
Expect(err.Error()).To(ContainSubstring("does not match tile name"))
638+
Expect(err.Error()).To(ContainSubstring("does not match tile-derived name"))
639+
})
640+
})
641+
642+
When("the tile metadata name is missing", func() {
643+
It("returns an error early", func() {
644+
inputPath, err := os.MkdirTemp("", "missing-name-*")
645+
Expect(err).NotTo(HaveOccurred())
646+
defer func() { _ = os.RemoveAll(inputPath) }()
647+
648+
err = os.WriteFile(filepath.Join(inputPath, "base.yml"), []byte("label: no-name-tile"), 0644)
649+
Expect(err).NotTo(HaveOccurred())
650+
651+
subject := NewBaker()
652+
err = subject.Bake(inputPath)
653+
Expect(err).To(HaveOccurred())
654+
Expect(err.Error()).To(ContainSubstring("missing required field 'name'"))
655+
656+
err = subject.BakeFromLockfile(inputPath, cargo.BOSHReleaseTarballLock{}, "/nonexistent/tarball.tgz")
657+
Expect(err).To(HaveOccurred())
658+
Expect(err.Error()).To(ContainSubstring("missing required field 'name'"))
635659
})
636660
})
637661
})
@@ -684,7 +708,7 @@ consumes:
684708
Expect(copyTestFile(uploadTarball, cachedTarball)).To(Succeed())
685709

686710
releaseLock := cargo.BOSHReleaseTarballLock{
687-
Name: "k8s-tile-test",
711+
Name: "k8s-tile-test-pkg",
688712
Version: uploadBaker.GetReleaseVersion(),
689713
}
690714

@@ -808,6 +832,13 @@ consumes:
808832
})
809833
})
810834

835+
Context("GetBoshReleaseName", func() {
836+
It("returns empty string before Bake is called", func() {
837+
b := NewBaker()
838+
Expect(b.GetBoshReleaseName()).To(BeEmpty())
839+
})
840+
})
841+
811842
Context("generateManifestTemplate with different entry names", func() {
812843
It("parameterizes the entry name throughout the template", func() {
813844
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)