Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions internal/acceptance/carvel/carvel_workflow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,12 +287,12 @@ var _ = Describe("carvel full workflow", Ordered, func() {

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

gitInTile("add", "Kilnfile.lock")
gitInTile("commit", "-m", "add Kilnfile.lock from upload")
Expand Down
32 changes: 23 additions & 9 deletions internal/carvel/baker.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ type Baker interface {
BakeFromLockfile(source string, releaseLock cargo.BOSHReleaseTarballLock, localTarball string) error
KilnBake(destination string) error
GetName() string
GetBoshReleaseName() string
// GetVersion returns the product version from base.yml or the version file.
GetVersion() (string, error)
// GetReleaseVersion returns the BOSH release version, which includes a
Expand Down Expand Up @@ -90,6 +91,9 @@ func (b *baker) Bake(source string) error {
if err != nil {
return err
}
if b.metadata.Name == "" {
return errors.New("missing required field 'name' in tile metadata (base.yml)")
}
if err := validateVariables(b.metadata.Variables); err != nil {
return err
}
Expand Down Expand Up @@ -141,6 +145,9 @@ func (b *baker) BakeFromLockfile(source string, releaseLock cargo.BOSHReleaseTar
if err != nil {
return err
}
if b.metadata.Name == "" {
return errors.New("missing required field 'name' in tile metadata (base.yml)")
}
if err := validateVariables(b.metadata.Variables); err != nil {
return err
}
Expand All @@ -151,8 +158,8 @@ func (b *baker) BakeFromLockfile(source string, releaseLock cargo.BOSHReleaseTar
}
b.progress(fmt.Sprintf("Tile: %s version %s (metadata_version %s)", b.metadata.Name, ver, b.metadata.MetadataVersion))

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

b.releaseVersion = releaseLock.Version
Expand Down Expand Up @@ -194,7 +201,7 @@ func (b *baker) BakeFromLockfile(source string, releaseLock cargo.BOSHReleaseTar
return err
}

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

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

func (b *baker) GetBoshReleaseName() string {
if b.metadata.Name == "" {
Comment thread
ram-pivot marked this conversation as resolved.
return ""
}
return b.metadata.Name + "-pkg"
}

func (b *baker) GetReleaseVersion() string {
return b.releaseVersion
}
Expand Down Expand Up @@ -627,7 +641,7 @@ func (b *baker) generateBaseYaml() error {

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

yamlData, err := yaml.Marshal(&meta)
Expand Down Expand Up @@ -719,13 +733,13 @@ func (b *baker) generateRuntimeConfigs() error {

registryDataJob := models.Job{
Name: "registry-data",
Release: b.metadata.Name,
Release: b.GetBoshReleaseName(),
Properties: registryDataProps,
}

inner := models.RuntimeConfigInner{
Releases: []string{
`$( release "` + b.metadata.Name + `" )`,
`$( release "` + b.GetBoshReleaseName() + `" )`,
},
Addons: []models.Addon{
{
Expand Down Expand Up @@ -807,12 +821,12 @@ func (b *baker) createBoshRelease() error {
releaseVersion := buildReleaseVersion(productVersion, fingerprint)
b.releaseVersion = releaseVersion

finalTarball := path.Join(b.destination, "releases", b.metadata.Name+"-"+releaseVersion+".tgz")
finalTarball := path.Join(b.destination, "releases", b.GetBoshReleaseName()+"-"+releaseVersion+".tgz")
cmd := exec.Command("bosh",
"create-release",
"--dir="+dirName,
"--force",
"--name", b.metadata.Name,
"--name", b.GetBoshReleaseName(),
"--version", releaseVersion,
"--tarball", finalTarball)
b.log("executing " + cmd.String())
Expand Down
45 changes: 38 additions & 7 deletions internal/carvel/baker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ consumes:
}
for _, cmd := range commands {
cmd.Dir = inputPath
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")
out, err := cmd.CombinedOutput()
Expect(err).NotTo(HaveOccurred(), "error invoking git: "+string(out))
}
Expand Down Expand Up @@ -341,6 +342,8 @@ consumes:
Expect(err).NotTo(HaveOccurred())

Expect(outMeta.Name).To(Equal("k8s-tile-test"))
Expect(subject.GetName()).To(Equal("k8s-tile-test"))
Expect(subject.GetBoshReleaseName()).To(Equal("k8s-tile-test-pkg"))
Expect(outMeta.ProductVersion).To(Equal(`$( version )`))
Expect(outMeta.MetadataVersion).To(Equal("3.2.0"))
Expect(outMeta.Rank).To(Equal(1))
Expand All @@ -353,7 +356,7 @@ consumes:
Expect(outMeta.Variables[0].Options).To(HaveKeyWithValue("common_name", "Sample Tile CA"))
Expect(outMeta.Variables[0].Options).To(HaveKeyWithValue("is_ca", true))
Expect(outMeta.Releases).To(HaveLen(1))
Expect(outMeta.Releases[0]).To(ContainSubstring("k8s-tile-test"))
Expect(outMeta.Releases[0]).To(Equal(`$( release "k8s-tile-test-pkg" )`))
Expect(outMeta.InstanceGroups).To(HaveLen(0))
Expect(outMeta.RuntimeConfigs).To(HaveLen(1))
Expect(outMeta.RuntimeConfigs[0]).To(Equal(`$( runtime_config "k8s-tile-test-pkgr" )`))
Expand All @@ -380,7 +383,7 @@ consumes:
releaseVersion := subject.GetReleaseVersion()
Expect(releaseVersion).To(HavePrefix("0.1.1+"))
Expect(releaseVersion).To(MatchRegexp(`^0\.1\.1\+[0-9a-f]{12}$`))
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-"+releaseVersion+".tgz")).To(BeAnExistingFile())
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-pkg-"+releaseVersion+".tgz")).To(BeAnExistingFile())

tarball, err := subject.GetReleaseTarball()
Expect(err).NotTo(HaveOccurred())
Expand Down Expand Up @@ -448,7 +451,7 @@ consumes:
By("having only the registry-data job (no separate package-install job)")
Expect(addon.Jobs).To(HaveLen(1))
Expect(addon.Jobs[0].Name).To(Equal("registry-data"))
Expect(addon.Jobs[0].Release).To(Equal("k8s-tile-test"))
Expect(addon.Jobs[0].Release).To(Equal("k8s-tile-test-pkg"))

By("carrying package install properties on the registry-data job")
Expect(addon.Jobs[0].Properties).To(HaveKey("test-install"))
Expand Down Expand Up @@ -522,6 +525,7 @@ consumes:
}
for _, cmd := range commands {
cmd.Dir = inputPath
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")
out, err := cmd.CombinedOutput()
Expect(err).NotTo(HaveOccurred(), "error invoking git: "+string(out))
}
Expand All @@ -541,7 +545,7 @@ consumes:
uploadReleaseVersion := subject.GetReleaseVersion()

releaseLock := cargo.BOSHReleaseTarballLock{
Name: "k8s-tile-test",
Name: "k8s-tile-test-pkg",
Version: uploadReleaseVersion,
}

Expand All @@ -552,7 +556,7 @@ consumes:

outputPath := path.Join(inputPath, ".carvel-tile")
Expect(filepath.Join(outputPath, "base.yml")).To(BeAnExistingFile())
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-"+uploadReleaseVersion+".tgz")).To(BeAnExistingFile())
Expect(filepath.Join(outputPath, "releases", "k8s-tile-test-pkg-"+uploadReleaseVersion+".tgz")).To(BeAnExistingFile())
Expect(filepath.Join(outputPath, "runtime_configs")).To(BeADirectory())
Expect(subject2.GetReleaseVersion()).To(Equal(uploadReleaseVersion))
})
Expand All @@ -576,7 +580,27 @@ consumes:
subject := NewBaker()
err = subject.BakeFromLockfile(inputPath, releaseLock, "/nonexistent/tarball.tgz")
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("does not match tile name"))
Expect(err.Error()).To(ContainSubstring("does not match tile-derived name"))
})
})

When("the tile metadata name is missing", func() {
It("returns an error early", func() {
inputPath, err := os.MkdirTemp("", "missing-name-*")
Expect(err).NotTo(HaveOccurred())
defer func() { _ = os.RemoveAll(inputPath) }()

err = os.WriteFile(filepath.Join(inputPath, "base.yml"), []byte("label: no-name-tile"), 0644)
Expect(err).NotTo(HaveOccurred())

subject := NewBaker()
err = subject.Bake(inputPath)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("missing required field 'name'"))

err = subject.BakeFromLockfile(inputPath, cargo.BOSHReleaseTarballLock{}, "/nonexistent/tarball.tgz")
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(ContainSubstring("missing required field 'name'"))
})
})
})
Expand Down Expand Up @@ -629,7 +653,7 @@ consumes:
Expect(copyTestFile(uploadTarball, cachedTarball)).To(Succeed())

releaseLock := cargo.BOSHReleaseTarballLock{
Name: "k8s-tile-test",
Name: "k8s-tile-test-pkg",
Version: uploadBaker.GetReleaseVersion(),
}

Expand Down Expand Up @@ -753,6 +777,13 @@ consumes:
})
})

Context("GetBoshReleaseName", func() {
It("returns empty string before Bake is called", func() {
b := NewBaker()
Expect(b.GetBoshReleaseName()).To(BeEmpty())
})
})

Context("generateManifestTemplate with different entry names", func() {
It("parameterizes the entry name throughout the template", func() {
template := generateManifestTemplate("my-custom-pkg", "")
Expand Down
7 changes: 5 additions & 2 deletions internal/commands/carvel.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ type Carvel struct {
synopses map[string]string
}

func NewCarvel(outLogger, errLogger *log.Logger) Carvel {
func NewCarvel(outLogger, errLogger *log.Logger, kilnVersion string) Carvel {
c := Carvel{
outLogger: outLogger,
errLogger: errLogger,
Expand All @@ -27,10 +27,13 @@ func NewCarvel(outLogger, errLogger *log.Logger) Carvel {
synopses: map[string]string{},
}

publishCmd := NewCarvelPublish(outLogger, errLogger)
publishCmd.KilnVersion = kilnVersion

// Register subcommands
c.commands["bake"] = NewCarvelBake(outLogger, errLogger)
c.commands["upload"] = NewCarvelUpload(outLogger, errLogger)
c.commands["publish"] = NewCarvelPublish(outLogger, errLogger)
c.commands["publish"] = publishCmd
c.commands["re-bake"] = NewCarvelReBake(outLogger, errLogger)

// Positional argument synopses for usage lines
Expand Down
6 changes: 3 additions & 3 deletions internal/commands/carvel_publish_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ var _ = Describe("CarvelPublish", func() {
}))

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

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

lock := cargo.KilnfileLock{
Releases: []cargo.BOSHReleaseTarballLock{{
Name: "k8s-tile-test",
Name: "k8s-tile-test-pkg",
Version: releaseVersion,
RemotePath: "bosh-releases/k8s-tile-test/k8s-tile-test-" + releaseVersion + ".tgz",
RemotePath: "bosh-releases/k8s-tile-test-pkg/k8s-tile-test-pkg-" + releaseVersion + ".tgz",
RemoteSource: "artifactory",
}},
Stemcell: cargo.Stemcell{OS: "ubuntu-jammy", Version: "1.446"},
Expand Down
6 changes: 3 additions & 3 deletions internal/commands/carvel_rebake_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ var _ = Describe("CarvelReBake", func() {
}))

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

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

lock := cargo.KilnfileLock{
Releases: []cargo.BOSHReleaseTarballLock{{
Name: "k8s-tile-test",
Name: "k8s-tile-test-pkg",
Version: releaseVersion,
RemotePath: "bosh-releases/k8s-tile-test/k8s-tile-test-" + releaseVersion + ".tgz",
RemotePath: "bosh-releases/k8s-tile-test-pkg/k8s-tile-test-pkg-" + releaseVersion + ".tgz",
RemoteSource: "artifactory",
}},
Stemcell: cargo.Stemcell{OS: "ubuntu-jammy", Version: "1.446"},
Expand Down
4 changes: 2 additions & 2 deletions internal/commands/carvel_upload.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func (c CarvelUpload) Execute(args []string) error {
if artConfig.PathTemplate != "" {
pathTmpl = artConfig.PathTemplate
}
remotePath, err := evaluatePathTemplate(pathTmpl, baker.GetName(), releaseVersion)
remotePath, err := evaluatePathTemplate(pathTmpl, baker.GetBoshReleaseName(), releaseVersion)
if err != nil {
return fmt.Errorf("failed to evaluate path template: %w", err)
}
Expand All @@ -113,7 +113,7 @@ func (c CarvelUpload) Execute(args []string) error {

sourceID := cargo.BOSHReleaseTarballSourceID(artConfig)
lockfilePath := kilnfilePath + ".lock"
err = writeStandardKilnfileLock(lockfilePath, baker.GetName(), releaseVersion, remotePath, sourceID, sha1sum)
err = writeStandardKilnfileLock(lockfilePath, baker.GetBoshReleaseName(), releaseVersion, remotePath, sourceID, sha1sum)
if err != nil {
return fmt.Errorf("failed to write Kilnfile.lock: %w", err)
}
Expand Down
4 changes: 2 additions & 2 deletions internal/commands/carvel_upload_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,11 +160,11 @@ var _ = Describe("CarvelUpload", func() {
var lock cargo.KilnfileLock
Expect(yaml.Unmarshal(lockData, &lock)).To(Succeed())
Expect(lock.Releases).To(HaveLen(1))
Expect(lock.Releases[0].Name).To(Equal("k8s-tile-test"))
Expect(lock.Releases[0].Name).To(Equal("k8s-tile-test-pkg"))
Expect(lock.Releases[0].Version).To(HavePrefix("0.1.1+"))
Expect(lock.Releases[0].Version).To(MatchRegexp(`^0\.1\.1\+[0-9a-f]{12}$`))
Expect(lock.Releases[0].SHA1).NotTo(BeEmpty())
Expect(lock.Releases[0].RemotePath).To(ContainSubstring("k8s-tile-test"))
Expect(lock.Releases[0].RemotePath).To(ContainSubstring("k8s-tile-test-pkg"))
Expect(lock.Releases[0].RemotePath).To(ContainSubstring(lock.Releases[0].Version))
Expect(lock.Releases[0].RemoteSource).To(Equal("artifactory"))

Expand Down
2 changes: 1 addition & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func main() {
log.Fatal(err)
}

carvelCommand := commands.NewCarvel(outLogger, errLogger)
carvelCommand := commands.NewCarvel(outLogger, errLogger, version)
commandSet["carvel"] = carvelCommand

if command == "carvel" {
Expand Down
Loading