From ff030871287b100cdaf651f606e5080cd90365bf Mon Sep 17 00:00:00 2001 From: Daniel Linsley Date: Mon, 25 Nov 2024 16:56:24 -0800 Subject: [PATCH] Add option to update releases along with stemcell --- internal/commands/update_stemcell.go | 16 +++++-- internal/commands/update_stemcell_test.go | 52 +++++++++++++++++++++-- 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/internal/commands/update_stemcell.go b/internal/commands/update_stemcell.go index 36992c79f..ef4f98319 100644 --- a/internal/commands/update_stemcell.go +++ b/internal/commands/update_stemcell.go @@ -12,14 +12,16 @@ import ( "github.com/pivotal-cf/kiln/internal/commands/flags" "github.com/pivotal-cf/kiln/internal/component" + "github.com/pivotal-cf/kiln/pkg/cargo" ) type UpdateStemcell struct { Options struct { flags.Standard - Version string `short:"v" long:"version" required:"true" description:"desired version of stemcell"` - ReleasesDir string `short:"rd" long:"releases-directory" default:"releases" description:"path to a directory to download releases into"` + Version string `short:"v" long:"version" required:"true" description:"desired version of stemcell"` + ReleasesDir string `short:"rd" long:"releases-directory" default:"releases" description:"path to a directory to download releases into"` + UpdateReleases bool `long:"update-releases" default:"false" description:"finds latest matching releases for new stemcell version"` } FS billy.Filesystem MultiReleaseSourceProvider MultiReleaseSourceProvider @@ -75,9 +77,15 @@ func (update UpdateStemcell) Execute(args []string) error { } spec.StemcellOS = kilnfileLock.Stemcell.OS spec.StemcellVersion = trimmedInputVersion - spec.Version = rel.Version - remote, err := releaseSource.GetMatchedRelease(spec) + var remote cargo.BOSHReleaseTarballLock + if update.Options.UpdateReleases { + remote, err = releaseSource.FindReleaseVersion(spec, true) + } else { + spec.Version = rel.Version + remote, err = releaseSource.GetMatchedRelease(spec) + } + if err != nil { return fmt.Errorf("while finding release %q, encountered error: %w", rel.Name, err) } diff --git a/internal/commands/update_stemcell_test.go b/internal/commands/update_stemcell_test.go index c2ab0df43..bc3b13094 100644 --- a/internal/commands/update_stemcell_test.go +++ b/internal/commands/update_stemcell_test.go @@ -66,8 +66,8 @@ var _ = Describe("UpdateStemcell", func() { Version: "^1", }, Releases: []cargo.BOSHReleaseTarballSpecification{ - {Name: release1Name, GitHubRepository: "https://example.com/lemon"}, - {Name: release2Name, GitHubRepository: "https://example.com/orange"}, + {Name: release1Name, GitHubRepository: "https://example.com/lemon", Version: "*"}, + {Name: release2Name, GitHubRepository: "https://example.com/orange", Version: "*"}, }, } kilnfileLock = cargo.KilnfileLock{ @@ -115,6 +115,27 @@ var _ = Describe("UpdateStemcell", func() { } }) + releaseSource.FindReleaseVersionCalls(func(requirement cargo.BOSHReleaseTarballSpecification, download bool) (cargo.BOSHReleaseTarballLock, error) { + switch requirement.Name { + case release1Name: + remote := cargo.BOSHReleaseTarballLock{ + Name: release1Name, Version: release1Version, + RemotePath: newRelease1RemotePath, + RemoteSource: publishableReleaseSourceID, + } + return remote, nil + case release2Name: + remote := cargo.BOSHReleaseTarballLock{ + Name: release2Name, Version: release2Version, + RemotePath: newRelease2RemotePath, + RemoteSource: unpublishableReleaseSourceID, + } + return remote, nil + default: + panic("unexpected release name") + } + }) + releaseSource.DownloadReleaseCalls(func(_ string, remote cargo.BOSHReleaseTarballLock) (component.Local, error) { switch remote.Name { case release1Name: @@ -130,7 +151,7 @@ var _ = Describe("UpdateStemcell", func() { } return local, nil default: - panic("unexpected release name") + panic("unexpected release name '"+remote.Name +"'") } }) @@ -214,6 +235,31 @@ var _ = Describe("UpdateStemcell", func() { GitHubRepository: "https://example.com/orange", })) }) + It("looks up the correct releases with -ffr", func() { + err := update.Execute([]string{ + "--kilnfile", kilnfilePath, "--version", "1.100", "--releases-directory", releasesDirPath, "--update-releases", "true", + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(releaseSource.FindReleaseVersionCallCount()).To(Equal(2)) + + req1, noDownload1 := releaseSource.FindReleaseVersionArgsForCall(0) + Expect(req1).To(Equal(cargo.BOSHReleaseTarballSpecification{ + Name: release1Name, Version: "*", + StemcellOS: newStemcellOS, StemcellVersion: newStemcellVersion, + GitHubRepository: "https://example.com/lemon", + })) + Expect(noDownload1).To(BeTrue()) + + req2, noDownload2 := releaseSource.FindReleaseVersionArgsForCall(1) + Expect(req2).To(Equal(cargo.BOSHReleaseTarballSpecification{ + Name: release2Name, Version: "*", + StemcellOS: newStemcellOS, StemcellVersion: newStemcellVersion, + GitHubRepository: "https://example.com/orange", + })) + Expect(noDownload2).To(BeTrue()) + }) + It("downloads the correct releases", func() { err := update.Execute([]string{