Skip to content

Commit

Permalink
Add without-download flag to update-stemcell
Browse files Browse the repository at this point in the history
Allows Kiln to skip downloading a release if the remote source can
provide the SHA1 for the release tarball.
  • Loading branch information
davewalter committed Jan 11, 2025
1 parent 27b429b commit dd7474d
Show file tree
Hide file tree
Showing 4 changed files with 187 additions and 66 deletions.
33 changes: 17 additions & 16 deletions internal/commands/update_stemcell.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +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"`
UpdateReleases bool `short:"ur" long:"update-releases" description:"finds latest matching releases for new stemcell version"`
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 `short:"ur" long:"update-releases" description:"finds latest matching releases for new stemcell version"`
WithoutDownload bool ` long:"without-download" description:"updates stemcell releases without downloading releases"`
}
FS billy.Filesystem
MultiReleaseSourceProvider MultiReleaseSourceProvider
Expand Down Expand Up @@ -69,45 +69,46 @@ func (update UpdateStemcell) Execute(args []string) error {
releaseSource := update.MultiReleaseSourceProvider(kilnfile, false)

for i, rel := range kilnfileLock.Releases {
update.Logger.Printf("Updating release %q with stemcell %s %s...", rel.Name, kilnfileLock.Stemcell.OS, trimmedInputVersion)
update.Logger.Printf("Updating release %s %s with stemcell %s %s...", rel.Name, rel.Version, kilnfileLock.Stemcell.OS, trimmedInputVersion)

spec, err := kilnfile.BOSHReleaseTarballSpecification(rel.Name)
if err != nil {
return err
}

spec.StemcellOS = kilnfileLock.Stemcell.OS
spec.StemcellVersion = trimmedInputVersion

var remote cargo.BOSHReleaseTarballLock
if update.Options.UpdateReleases {
remote, err = releaseSource.FindReleaseVersion(spec, true)
} else {
if !update.Options.UpdateReleases {
spec.Version = rel.Version
remote, err = releaseSource.GetMatchedRelease(spec)
}

remote, err := releaseSource.FindReleaseVersion(spec, true)
if err != nil {
return fmt.Errorf("while finding release %q, encountered error: %w", rel.Name, err)
return fmt.Errorf("while finding release %s %s, encountered error: %w", rel.Name, rel.Version, err)
}

if component.IsErrNotFound(err) {
return fmt.Errorf("couldn't find release %q", rel.Name)
return fmt.Errorf("couldn't find release %s %s", rel.Name, rel.Version)
}

if remote.RemotePath == rel.RemotePath && remote.RemoteSource == rel.RemoteSource {
update.Logger.Printf("No change for release %q\n", rel.Name)
update.Logger.Printf("No change for release %s %s\n", rel.Name, rel.Version)
continue
}
lock := &kilnfileLock.Releases[i]

lock := &kilnfileLock.Releases[i]
lock.RemotePath = remote.RemotePath
lock.RemoteSource = remote.RemoteSource
lock.SHA1 = remote.SHA1
if remote.SHA1 == "" || remote.SHA1 == "not-calculated" {

if !update.Options.WithoutDownload || lock.SHA1 == "" || lock.SHA1 == "not-calculated" {
// release source needs to download.
local, err := releaseSource.DownloadRelease(update.Options.ReleasesDir, remote)
if err != nil {
return fmt.Errorf("while downloading release %q, encountered error: %w", rel.Name, err)
return fmt.Errorf("while downloading release %s %s, encountered error: %w", rel.Name, rel.Version, err)
}

lock.SHA1 = local.Lock.SHA1
}
}
Expand Down
Loading

0 comments on commit dd7474d

Please sign in to comment.