diff --git a/.github/workflows/create-debugging-artifact.yml b/.github/workflows/create-debugging-artifact.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/README.md b/README.md index 5fb4e137a..77a4a2af6 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,6 @@ Usage: kiln [options] [] Commands: bake bakes a tile - cache-compiled-releases Cache compiled releases fetch fetches releases find-release-version prints a json string of a remote release satisfying the Kilnfile version and stemcell constraints find-stemcell-version prints the latest stemcell version from Pivnet using the stemcell type listed in the Kilnfile @@ -153,7 +152,6 @@ Commands: test Test manifest for a product update-release bumps a release to a new version update-stemcell updates stemcell and release information in Kilnfile.lock - upload-release uploads a BOSH release to an s3 release_source validate validate Kilnfile and Kilnfile.lock version prints the kiln release version ``` diff --git a/TILE_AUTHOR_GUIDE.md b/TILE_AUTHOR_GUIDE.md index 15ea1052a..35234bb9d 100644 --- a/TILE_AUTHOR_GUIDE.md +++ b/TILE_AUTHOR_GUIDE.md @@ -402,7 +402,7 @@ Please see [Path Templates](#path-templates). The value of `remote_path` in the #### AWS S3 -Kiln can fetch and upload releases to/from AWS S3. +Kiln can fetch releases from AWS S3. ```yaml release_sources: @@ -463,9 +463,6 @@ om upload-product --product=tile.pivotal om configure-product --config=simple_config.yml om apply-changes --product-name=my-tile-name -# Download Compiled BOSH Releases from the BOSH Director and Upload them to the S3 Bucket or Artifactory -kiln cache-compiled-releases --upload-target-id=my_compiled_release_bucket --name=hello - # Commit and push the changes to Kilnfile.lock git add -p Kilnfile.lock git commit -m "compile BOSH Releases with $(yq '.stemcell_criteria.os' Kilnfile.lock)/$(yq '.stemcell_criteria.version' Kilnfile.lock)" diff --git a/internal/acceptance/workflows/using_kiln.feature b/internal/acceptance/workflows/using_kiln.feature index 8ccc35c57..ef971eba3 100644 --- a/internal/acceptance/workflows/using_kiln.feature +++ b/internal/acceptance/workflows/using_kiln.feature @@ -41,5 +41,4 @@ Feature: As a developer, I want the Kiln CLI to be usable | sync-with-local | | update-release | | update-stemcell | - | upload-release | | validate | diff --git a/internal/commands/fakes/release_uploader_finder.go b/internal/commands/fakes/release_uploader_finder.go deleted file mode 100644 index 9991dbc84..000000000 --- a/internal/commands/fakes/release_uploader_finder.go +++ /dev/null @@ -1,119 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/pivotal-cf/kiln/internal/commands" - "github.com/pivotal-cf/kiln/internal/component" - "github.com/pivotal-cf/kiln/pkg/cargo" -) - -type ReleaseUploaderFinder struct { - Stub func(cargo.Kilnfile, string) (component.ReleaseUploader, error) - mutex sync.RWMutex - argsForCall []struct { - arg1 cargo.Kilnfile - arg2 string - } - returns struct { - result1 component.ReleaseUploader - result2 error - } - returnsOnCall map[int]struct { - result1 component.ReleaseUploader - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *ReleaseUploaderFinder) Spy(arg1 cargo.Kilnfile, arg2 string) (component.ReleaseUploader, error) { - fake.mutex.Lock() - ret, specificReturn := fake.returnsOnCall[len(fake.argsForCall)] - fake.argsForCall = append(fake.argsForCall, struct { - arg1 cargo.Kilnfile - arg2 string - }{arg1, arg2}) - stub := fake.Stub - returns := fake.returns - fake.recordInvocation("ReleaseUploaderFinder", []interface{}{arg1, arg2}) - fake.mutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return returns.result1, returns.result2 -} - -func (fake *ReleaseUploaderFinder) CallCount() int { - fake.mutex.RLock() - defer fake.mutex.RUnlock() - return len(fake.argsForCall) -} - -func (fake *ReleaseUploaderFinder) Calls(stub func(cargo.Kilnfile, string) (component.ReleaseUploader, error)) { - fake.mutex.Lock() - defer fake.mutex.Unlock() - fake.Stub = stub -} - -func (fake *ReleaseUploaderFinder) ArgsForCall(i int) (cargo.Kilnfile, string) { - fake.mutex.RLock() - defer fake.mutex.RUnlock() - return fake.argsForCall[i].arg1, fake.argsForCall[i].arg2 -} - -func (fake *ReleaseUploaderFinder) Returns(result1 component.ReleaseUploader, result2 error) { - fake.mutex.Lock() - defer fake.mutex.Unlock() - fake.Stub = nil - fake.returns = struct { - result1 component.ReleaseUploader - result2 error - }{result1, result2} -} - -func (fake *ReleaseUploaderFinder) ReturnsOnCall(i int, result1 component.ReleaseUploader, result2 error) { - fake.mutex.Lock() - defer fake.mutex.Unlock() - fake.Stub = nil - if fake.returnsOnCall == nil { - fake.returnsOnCall = make(map[int]struct { - result1 component.ReleaseUploader - result2 error - }) - } - fake.returnsOnCall[i] = struct { - result1 component.ReleaseUploader - result2 error - }{result1, result2} -} - -func (fake *ReleaseUploaderFinder) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.mutex.RLock() - defer fake.mutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *ReleaseUploaderFinder) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ commands.ReleaseUploaderFinder = new(ReleaseUploaderFinder).Spy diff --git a/internal/commands/upload_release.go b/internal/commands/upload_release.go deleted file mode 100644 index aa1e1c1ea..000000000 --- a/internal/commands/upload_release.go +++ /dev/null @@ -1,98 +0,0 @@ -package commands - -import ( - "fmt" - "log" - "os" - - "github.com/Masterminds/semver/v3" - - "github.com/go-git/go-billy/v5" - "github.com/pivotal-cf/jhanda" - - "github.com/pivotal-cf/kiln/internal/commands/flags" - "github.com/pivotal-cf/kiln/internal/component" - "github.com/pivotal-cf/kiln/pkg/cargo" -) - -type UploadRelease struct { - FS billy.Filesystem - ReleaseUploaderFinder ReleaseUploaderFinder - Logger *log.Logger - - Options struct { - flags.Standard - - UploadTargetID string ` long:"upload-target-id" required:"true" description:"the ID of the release source where the built release will be uploaded"` - LocalPath string `short:"lp" long:"local-path" required:"true" description:"path to BOSH release tarball"` - } -} - -//counterfeiter:generate -o ./fakes/release_uploader_finder.go --fake-name ReleaseUploaderFinder . ReleaseUploaderFinder -type ReleaseUploaderFinder func(cargo.Kilnfile, string) (component.ReleaseUploader, error) - -func (command UploadRelease) Execute(args []string) error { - _, err := flags.LoadWithDefaultFilePaths(&command.Options, args, os.Stat) - if err != nil { - return err - } - - kilnfile, _, err := command.Options.Standard.LoadKilnfiles(command.FS, nil) - if err != nil { - return fmt.Errorf("error loading Kilnfiles: %w", err) - } - - releaseUploader, err := command.ReleaseUploaderFinder(kilnfile, command.Options.UploadTargetID) - if err != nil { - return fmt.Errorf("error finding release source: %w", err) - } - - releaseTarball, err := cargo.OpenBOSHReleaseTarball(command.Options.LocalPath) - if err != nil { - return fmt.Errorf("error reading the release manifest: %w", err) - } - - version, err := semver.NewVersion(releaseTarball.Manifest.Version) - if err != nil { - return fmt.Errorf("error parsing release version %q: release version is not valid semver: %w", releaseTarball.Manifest.Version, err) - } - if version.Prerelease() != "" { - return fmt.Errorf("cannot upload development release %q - only finalized releases are allowed", releaseTarball.Manifest.Version) - } - - requirement := cargo.BOSHReleaseTarballSpecification{Name: releaseTarball.Manifest.Name, Version: releaseTarball.Manifest.Version} - _, err = releaseUploader.GetMatchedRelease(requirement) - if err != nil { - if !component.IsErrNotFound(err) { - return fmt.Errorf("couldn't query release source: %w", err) - } - } else { - return fmt.Errorf("a release with name %q and version %q already exists on %s", - releaseTarball.Manifest.Name, releaseTarball.Manifest.Version, command.Options.UploadTargetID) - } - - file, err := os.Open(releaseTarball.FilePath) - if err != nil { - return err - } - defer closeAndIgnoreError(file) - _, err = releaseUploader.UploadRelease(cargo.BOSHReleaseTarballSpecification{ - Name: releaseTarball.Manifest.Name, - Version: releaseTarball.Manifest.Version, - }, file) - if err != nil { - return fmt.Errorf("error uploading the release: %w", err) - } - - command.Logger.Println("Upload succeeded") - - return nil -} - -func (command UploadRelease) Usage() jhanda.Usage { - return jhanda.Usage{ - Description: "Uploads a BOSH Release to an S3 release source for use in kiln fetch", - ShortDescription: "uploads a BOSH release to an s3 release_source", - Flags: command.Options, - } -} diff --git a/internal/component/fakes/release_uploader.go b/internal/component/fakes/release_uploader.go deleted file mode 100644 index 82ef6dcea..000000000 --- a/internal/component/fakes/release_uploader.go +++ /dev/null @@ -1,199 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "io" - "sync" - - "github.com/pivotal-cf/kiln/internal/component" - "github.com/pivotal-cf/kiln/pkg/cargo" -) - -type ReleaseUploader struct { - GetMatchedReleaseStub func(cargo.BOSHReleaseTarballSpecification) (cargo.BOSHReleaseTarballLock, error) - getMatchedReleaseMutex sync.RWMutex - getMatchedReleaseArgsForCall []struct { - arg1 cargo.BOSHReleaseTarballSpecification - } - getMatchedReleaseReturns struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - } - getMatchedReleaseReturnsOnCall map[int]struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - } - UploadReleaseStub func(cargo.BOSHReleaseTarballSpecification, io.Reader) (cargo.BOSHReleaseTarballLock, error) - uploadReleaseMutex sync.RWMutex - uploadReleaseArgsForCall []struct { - arg1 cargo.BOSHReleaseTarballSpecification - arg2 io.Reader - } - uploadReleaseReturns struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - } - uploadReleaseReturnsOnCall map[int]struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *ReleaseUploader) GetMatchedRelease(arg1 cargo.BOSHReleaseTarballSpecification) (cargo.BOSHReleaseTarballLock, error) { - fake.getMatchedReleaseMutex.Lock() - ret, specificReturn := fake.getMatchedReleaseReturnsOnCall[len(fake.getMatchedReleaseArgsForCall)] - fake.getMatchedReleaseArgsForCall = append(fake.getMatchedReleaseArgsForCall, struct { - arg1 cargo.BOSHReleaseTarballSpecification - }{arg1}) - stub := fake.GetMatchedReleaseStub - fakeReturns := fake.getMatchedReleaseReturns - fake.recordInvocation("GetMatchedRelease", []interface{}{arg1}) - fake.getMatchedReleaseMutex.Unlock() - if stub != nil { - return stub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ReleaseUploader) GetMatchedReleaseCallCount() int { - fake.getMatchedReleaseMutex.RLock() - defer fake.getMatchedReleaseMutex.RUnlock() - return len(fake.getMatchedReleaseArgsForCall) -} - -func (fake *ReleaseUploader) GetMatchedReleaseCalls(stub func(cargo.BOSHReleaseTarballSpecification) (cargo.BOSHReleaseTarballLock, error)) { - fake.getMatchedReleaseMutex.Lock() - defer fake.getMatchedReleaseMutex.Unlock() - fake.GetMatchedReleaseStub = stub -} - -func (fake *ReleaseUploader) GetMatchedReleaseArgsForCall(i int) cargo.BOSHReleaseTarballSpecification { - fake.getMatchedReleaseMutex.RLock() - defer fake.getMatchedReleaseMutex.RUnlock() - argsForCall := fake.getMatchedReleaseArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *ReleaseUploader) GetMatchedReleaseReturns(result1 cargo.BOSHReleaseTarballLock, result2 error) { - fake.getMatchedReleaseMutex.Lock() - defer fake.getMatchedReleaseMutex.Unlock() - fake.GetMatchedReleaseStub = nil - fake.getMatchedReleaseReturns = struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - }{result1, result2} -} - -func (fake *ReleaseUploader) GetMatchedReleaseReturnsOnCall(i int, result1 cargo.BOSHReleaseTarballLock, result2 error) { - fake.getMatchedReleaseMutex.Lock() - defer fake.getMatchedReleaseMutex.Unlock() - fake.GetMatchedReleaseStub = nil - if fake.getMatchedReleaseReturnsOnCall == nil { - fake.getMatchedReleaseReturnsOnCall = make(map[int]struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - }) - } - fake.getMatchedReleaseReturnsOnCall[i] = struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - }{result1, result2} -} - -func (fake *ReleaseUploader) UploadRelease(arg1 cargo.BOSHReleaseTarballSpecification, arg2 io.Reader) (cargo.BOSHReleaseTarballLock, error) { - fake.uploadReleaseMutex.Lock() - ret, specificReturn := fake.uploadReleaseReturnsOnCall[len(fake.uploadReleaseArgsForCall)] - fake.uploadReleaseArgsForCall = append(fake.uploadReleaseArgsForCall, struct { - arg1 cargo.BOSHReleaseTarballSpecification - arg2 io.Reader - }{arg1, arg2}) - stub := fake.UploadReleaseStub - fakeReturns := fake.uploadReleaseReturns - fake.recordInvocation("UploadRelease", []interface{}{arg1, arg2}) - fake.uploadReleaseMutex.Unlock() - if stub != nil { - return stub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *ReleaseUploader) UploadReleaseCallCount() int { - fake.uploadReleaseMutex.RLock() - defer fake.uploadReleaseMutex.RUnlock() - return len(fake.uploadReleaseArgsForCall) -} - -func (fake *ReleaseUploader) UploadReleaseCalls(stub func(cargo.BOSHReleaseTarballSpecification, io.Reader) (cargo.BOSHReleaseTarballLock, error)) { - fake.uploadReleaseMutex.Lock() - defer fake.uploadReleaseMutex.Unlock() - fake.UploadReleaseStub = stub -} - -func (fake *ReleaseUploader) UploadReleaseArgsForCall(i int) (cargo.BOSHReleaseTarballSpecification, io.Reader) { - fake.uploadReleaseMutex.RLock() - defer fake.uploadReleaseMutex.RUnlock() - argsForCall := fake.uploadReleaseArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *ReleaseUploader) UploadReleaseReturns(result1 cargo.BOSHReleaseTarballLock, result2 error) { - fake.uploadReleaseMutex.Lock() - defer fake.uploadReleaseMutex.Unlock() - fake.UploadReleaseStub = nil - fake.uploadReleaseReturns = struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - }{result1, result2} -} - -func (fake *ReleaseUploader) UploadReleaseReturnsOnCall(i int, result1 cargo.BOSHReleaseTarballLock, result2 error) { - fake.uploadReleaseMutex.Lock() - defer fake.uploadReleaseMutex.Unlock() - fake.UploadReleaseStub = nil - if fake.uploadReleaseReturnsOnCall == nil { - fake.uploadReleaseReturnsOnCall = make(map[int]struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - }) - } - fake.uploadReleaseReturnsOnCall[i] = struct { - result1 cargo.BOSHReleaseTarballLock - result2 error - }{result1, result2} -} - -func (fake *ReleaseUploader) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.getMatchedReleaseMutex.RLock() - defer fake.getMatchedReleaseMutex.RUnlock() - fake.uploadReleaseMutex.RLock() - defer fake.uploadReleaseMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *ReleaseUploader) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ component.ReleaseUploader = new(ReleaseUploader) diff --git a/internal/component/fakes/s3_uploader.go b/internal/component/fakes/s3_uploader.go deleted file mode 100644 index 77bfc52d3..000000000 --- a/internal/component/fakes/s3_uploader.go +++ /dev/null @@ -1,119 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/aws/aws-sdk-go/service/s3/s3manager" - "github.com/pivotal-cf/kiln/internal/component" -) - -type S3Uploader struct { - UploadStub func(*s3manager.UploadInput, ...func(*s3manager.Uploader)) (*s3manager.UploadOutput, error) - uploadMutex sync.RWMutex - uploadArgsForCall []struct { - arg1 *s3manager.UploadInput - arg2 []func(*s3manager.Uploader) - } - uploadReturns struct { - result1 *s3manager.UploadOutput - result2 error - } - uploadReturnsOnCall map[int]struct { - result1 *s3manager.UploadOutput - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *S3Uploader) Upload(arg1 *s3manager.UploadInput, arg2 ...func(*s3manager.Uploader)) (*s3manager.UploadOutput, error) { - fake.uploadMutex.Lock() - ret, specificReturn := fake.uploadReturnsOnCall[len(fake.uploadArgsForCall)] - fake.uploadArgsForCall = append(fake.uploadArgsForCall, struct { - arg1 *s3manager.UploadInput - arg2 []func(*s3manager.Uploader) - }{arg1, arg2}) - stub := fake.UploadStub - fakeReturns := fake.uploadReturns - fake.recordInvocation("Upload", []interface{}{arg1, arg2}) - fake.uploadMutex.Unlock() - if stub != nil { - return stub(arg1, arg2...) - } - if specificReturn { - return ret.result1, ret.result2 - } - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *S3Uploader) UploadCallCount() int { - fake.uploadMutex.RLock() - defer fake.uploadMutex.RUnlock() - return len(fake.uploadArgsForCall) -} - -func (fake *S3Uploader) UploadCalls(stub func(*s3manager.UploadInput, ...func(*s3manager.Uploader)) (*s3manager.UploadOutput, error)) { - fake.uploadMutex.Lock() - defer fake.uploadMutex.Unlock() - fake.UploadStub = stub -} - -func (fake *S3Uploader) UploadArgsForCall(i int) (*s3manager.UploadInput, []func(*s3manager.Uploader)) { - fake.uploadMutex.RLock() - defer fake.uploadMutex.RUnlock() - argsForCall := fake.uploadArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *S3Uploader) UploadReturns(result1 *s3manager.UploadOutput, result2 error) { - fake.uploadMutex.Lock() - defer fake.uploadMutex.Unlock() - fake.UploadStub = nil - fake.uploadReturns = struct { - result1 *s3manager.UploadOutput - result2 error - }{result1, result2} -} - -func (fake *S3Uploader) UploadReturnsOnCall(i int, result1 *s3manager.UploadOutput, result2 error) { - fake.uploadMutex.Lock() - defer fake.uploadMutex.Unlock() - fake.UploadStub = nil - if fake.uploadReturnsOnCall == nil { - fake.uploadReturnsOnCall = make(map[int]struct { - result1 *s3manager.UploadOutput - result2 error - }) - } - fake.uploadReturnsOnCall[i] = struct { - result1 *s3manager.UploadOutput - result2 error - }{result1, result2} -} - -func (fake *S3Uploader) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.uploadMutex.RLock() - defer fake.uploadMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *S3Uploader) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ component.S3Uploader = new(S3Uploader) diff --git a/internal/component/release_source.go b/internal/component/release_source.go index 29b24f9c4..a3d2cb3cf 100644 --- a/internal/component/release_source.go +++ b/internal/component/release_source.go @@ -2,8 +2,6 @@ package component import ( "fmt" - "io" - "github.com/pivotal-cf/kiln/pkg/cargo" ) @@ -22,16 +20,6 @@ type MultiReleaseSource interface { //counterfeiter:generate -o ./fakes/multi_release_source.go --fake-name MultiReleaseSource . MultiReleaseSource -// ReleaseUploader represents a place to put releases. Some implementations of ReleaseSource -// should implement this interface. Credentials for this should come from an interpolated -// cargo.ReleaseSourceConfig. -type ReleaseUploader interface { - GetMatchedRelease(cargo.BOSHReleaseTarballSpecification) (cargo.BOSHReleaseTarballLock, error) - UploadRelease(spec cargo.BOSHReleaseTarballSpecification, file io.Reader) (cargo.BOSHReleaseTarballLock, error) -} - -//counterfeiter:generate -o ./fakes/release_uploader.go --fake-name ReleaseUploader . ReleaseUploader - // RemotePather is used to get the remote path for a remote release. For example // the complete s3 uri. // diff --git a/internal/component/release_source_list.go b/internal/component/release_source_list.go index 125496ec5..eba457f45 100644 --- a/internal/component/release_source_list.go +++ b/internal/component/release_source_list.go @@ -34,37 +34,6 @@ func (list ReleaseSourceList) Filter(allowOnlyPublishable bool) ReleaseSourceLis return sources } -func (list ReleaseSourceList) FindReleaseUploader(sourceID string) (ReleaseUploader, error) { - var ( - uploader ReleaseUploader - availableIDs []string - ) - for _, src := range list { - u, ok := src.(ReleaseUploader) - if !ok { - continue - } - availableIDs = append(availableIDs, src.Configuration().ID) - if src.Configuration().ID == sourceID { - uploader = u - break - } - } - - if len(availableIDs) == 0 { - return nil, errors.New("no upload-capable release sources were found in the Kilnfile") - } - - if uploader == nil { - return nil, fmt.Errorf( - "could not find a valid matching release source in the Kilnfile, available upload-compatible sources are: %q", - availableIDs, - ) - } - - return uploader, nil -} - func (list ReleaseSourceList) FindRemotePather(sourceID string) (RemotePather, error) { var ( pather RemotePather diff --git a/internal/component/release_source_test.go b/internal/component/release_source_test.go index 7e380ac91..301015052 100644 --- a/internal/component/release_source_test.go +++ b/internal/component/release_source_test.go @@ -207,80 +207,6 @@ var _ = Describe("ReleaseSourceList", func() { }) }) - Describe("FindReleaseUploader", func() { - var ( - repo component.ReleaseSourceList - kilnfile cargo.Kilnfile - ) - - JustBeforeEach(func() { - repo = component.NewReleaseSourceRepo(kilnfile) - }) - - BeforeEach(func() { - kilnfile = cargo.Kilnfile{ - ReleaseSources: []cargo.ReleaseSourceConfig{ - { - Type: "s3", Bucket: "bucket-1", Region: "us-west-1", AccessKeyId: "ak1", SecretAccessKey: "shhhh!", - PathTemplate: `2.8/{{trimSuffix .Name "-release"}}/{{.Name}}-{{.Version}}-{{.StemcellOS}}-{{.StemcellVersion}}.tgz`, - }, - { - Type: "s3", Bucket: "bucket-2", Region: "us-west-2", AccessKeyId: "aki", SecretAccessKey: "shhhh!", - PathTemplate: `2.8/{{trimSuffix .Name "-release"}}/{{.Name}}-{{.Version}}.tgz`, - }, - {Type: "bosh.io"}, - { - Type: "s3", Bucket: "bucket-3", Region: "us-west-2", AccessKeyId: "aki", SecretAccessKey: "shhhh!", - PathTemplate: `{{.Name}}-{{.Version}}.tgz`, - }, - }, - } - }) - - Context("when the named source exists and accepts uploads", func() { - It("returns a valid release uploader", func() { - uploader, err := repo.FindReleaseUploader("bucket-2") - Expect(err).NotTo(HaveOccurred()) - - var s3ReleaseSource component.S3ReleaseSource - Expect(uploader).To(BeAssignableToTypeOf(s3ReleaseSource)) - }) - }) - - Context("when no sources accept uploads", func() { - BeforeEach(func() { - kilnfile = cargo.Kilnfile{ - ReleaseSources: []cargo.ReleaseSourceConfig{{Type: "bosh.io"}}, - } - }) - - It("errors", func() { - _, err := repo.FindReleaseUploader("bosh.io") - Expect(err).To(MatchError(ContainSubstring("no upload-capable release sources were found"))) - }) - }) - - Context("when the named source doesn't accept uploads", func() { - It("errors with a list of valid sources", func() { - _, err := repo.FindReleaseUploader("bosh.io") - Expect(err).To(MatchError(ContainSubstring("could not find a valid matching release source"))) - Expect(err).To(MatchError(ContainSubstring("bucket-1"))) - Expect(err).To(MatchError(ContainSubstring("bucket-2"))) - Expect(err).To(MatchError(ContainSubstring("bucket-3"))) - }) - }) - - Context("when the named source doesn't exist", func() { - It("errors with a list of valid sources", func() { - _, err := repo.FindReleaseUploader("bucket-42") - Expect(err).To(MatchError(ContainSubstring("could not find a valid matching release source"))) - Expect(err).To(MatchError(ContainSubstring("bucket-1"))) - Expect(err).To(MatchError(ContainSubstring("bucket-2"))) - Expect(err).To(MatchError(ContainSubstring("bucket-3"))) - }) - }) - }) - Describe("RemotePather", func() { var ( list component.ReleaseSourceList @@ -311,16 +237,6 @@ var _ = Describe("ReleaseSourceList", func() { } }) - Context("when the named source exists and implements RemotePath", func() { - It("returns a valid release uploader", func() { - uploader, err := list.FindRemotePather("bucket-2") - Expect(err).NotTo(HaveOccurred()) - - var s3ReleaseSource component.S3ReleaseSource - Expect(uploader).To(BeAssignableToTypeOf(s3ReleaseSource)) - }) - }) - Context("when no sources implement RemotePath", func() { BeforeEach(func() { kilnfile = cargo.Kilnfile{ diff --git a/internal/component/s3_release_source.go b/internal/component/s3_release_source.go index 62073615b..884c6d2f8 100644 --- a/internal/component/s3_release_source.go +++ b/internal/component/s3_release_source.go @@ -29,11 +29,6 @@ type S3Downloader interface { Download(w io.WriterAt, input *s3.GetObjectInput, options ...func(*s3manager.Downloader)) (n int64, err error) } -//counterfeiter:generate -o ./fakes/s3_uploader.go --fake-name S3Uploader . S3Uploader -type S3Uploader interface { - Upload(input *s3manager.UploadInput, options ...func(*s3manager.Uploader)) (*s3manager.UploadOutput, error) -} - //counterfeiter:generate -o ./fakes/s3_client.go --fake-name S3Client . S3Client type S3Client interface { HeadObject(input *s3.HeadObjectInput) (*s3.HeadObjectOutput, error) @@ -45,14 +40,13 @@ type S3ReleaseSource struct { s3Client S3Client s3Downloader S3Downloader - s3Uploader S3Uploader DownloadThreads int logger *log.Logger } -func NewS3ReleaseSource(c cargo.ReleaseSourceConfig, client S3Client, downloader S3Downloader, uploader S3Uploader, logger *log.Logger) S3ReleaseSource { +func NewS3ReleaseSource(c cargo.ReleaseSourceConfig, client S3Client, downloader S3Downloader, logger *log.Logger) S3ReleaseSource { if c.Type != "" && c.Type != ReleaseSourceTypeS3 { panic(panicMessageWrongReleaseSourceType) } @@ -65,7 +59,6 @@ func NewS3ReleaseSource(c cargo.ReleaseSourceConfig, client S3Client, downloader ReleaseSourceConfig: c, s3Client: client, s3Downloader: downloader, - s3Uploader: uploader, logger: logger, } } @@ -96,7 +89,6 @@ func NewS3ReleaseSourceFromConfig(config cargo.ReleaseSourceConfig, logger *log. config, client, s3manager.NewDownloaderWithClient(client), - s3manager.NewUploaderWithClient(client), logger, ) } @@ -279,31 +271,6 @@ func (src S3ReleaseSource) DownloadRelease(releaseDir string, lock cargo.BOSHRel return Local{Lock: lock, LocalPath: outputFile}, nil } -func (src S3ReleaseSource) UploadRelease(spec cargo.BOSHReleaseTarballSpecification, file io.Reader) (cargo.BOSHReleaseTarballLock, error) { - remotePath, err := src.RemotePath(spec) - if err != nil { - return cargo.BOSHReleaseTarballLock{}, err - } - - src.logger.Printf("uploading release %q to %s at %q...\n", spec.Name, src.ReleaseSourceConfig.Bucket, remotePath) - - _, err = src.s3Uploader.Upload(&s3manager.UploadInput{ - Bucket: aws.String(src.ReleaseSourceConfig.Bucket), - Key: aws.String(remotePath), - Body: file, - }) - if err != nil { - return cargo.BOSHReleaseTarballLock{}, err - } - - return cargo.BOSHReleaseTarballLock{ - Name: spec.Name, - Version: spec.Version, - RemotePath: remotePath, - RemoteSource: src.ReleaseSourceConfig.Bucket, - }, nil -} - func (src S3ReleaseSource) RemotePath(spec cargo.BOSHReleaseTarballSpecification) (string, error) { pathBuf := new(bytes.Buffer) diff --git a/internal/component/s3_release_source_test.go b/internal/component/s3_release_source_test.go index c5e03c4ee..009bb7718 100644 --- a/internal/component/s3_release_source_test.go +++ b/internal/component/s3_release_source_test.go @@ -3,16 +3,14 @@ package component_test import ( "errors" "fmt" - "io" - "log" - "os" - "path/filepath" - "strings" - . "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo/extensions/table" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gstruct" + "io" + "log" + "os" + "path/filepath" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3manager" @@ -119,7 +117,7 @@ var _ = Describe("S3ReleaseSource", func() { Bucket: bucket, PathTemplate: "", Publishable: false, - }, nil, fakeS3Downloader, nil, logger) + }, nil, fakeS3Downloader, logger) }) AfterEach(func() { @@ -220,7 +218,6 @@ var _ = Describe("S3ReleaseSource", func() { }, fakeS3Client, nil, - nil, logger, ) bpmKey = "2.5/bpm/bpm-release-1.2.3-ubuntu-xenial-190.0.0.tgz" @@ -268,7 +265,6 @@ var _ = Describe("S3ReleaseSource", func() { }, fakeS3Client, nil, - nil, logger, ) }) @@ -332,7 +328,6 @@ var _ = Describe("S3ReleaseSource", func() { }, fakeS3Client, fakeS3Downloader, - nil, logger, ) uaaKey = "uaa/uaa-1.1.1.tgz" @@ -394,7 +389,6 @@ var _ = Describe("S3ReleaseSource", func() { }, fakeS3Client, fakeS3Downloader, - nil, logger, ) uaaKey = "uaa/uaa-123.tgz" @@ -456,7 +450,6 @@ var _ = Describe("S3ReleaseSource", func() { }, fakeS3Client, fakeS3Downloader, - nil, logger, ) uaaKey = "uaa/uaa-123.tgz" @@ -531,7 +524,6 @@ var _ = Describe("S3ReleaseSource", func() { }, fakeS3Client, fakeS3Downloader, - nil, logger, ) uaaKey = "2.11/uaa/uaa-1.2.3-ubuntu-xenial-621.71.tgz" @@ -550,92 +542,6 @@ var _ = Describe("S3ReleaseSource", func() { }) }) - Describe("UploadRelease", func() { - var ( - s3Uploader *fetcherFakes.S3Uploader - releaseSource component.S3ReleaseSource - file io.Reader - ) - - BeforeEach(func() { - s3Uploader = new(fetcherFakes.S3Uploader) - releaseSource = component.NewS3ReleaseSource( - cargo.ReleaseSourceConfig{ - ID: sourceID, - Bucket: "orange-bucket", - PathTemplate: `{{.Name}}/{{.Name}}-{{.Version}}.tgz`, - Publishable: false, - }, - nil, - nil, - s3Uploader, - log.New(GinkgoWriter, "", 0), - ) - file = strings.NewReader("banana banana") - }) - - Context("happy path", func() { - It("uploads the file to the correct location", func() { - _, err := releaseSource.UploadRelease(cargo.BOSHReleaseTarballSpecification{ - Name: "banana", - Version: "1.2.3", - }, file) - Expect(err).NotTo(HaveOccurred()) - - Expect(s3Uploader.UploadCallCount()).To(Equal(1)) - - opts, fns := s3Uploader.UploadArgsForCall(0) - - Expect(fns).To(HaveLen(0)) - - Expect(opts.Bucket).To(PointTo(Equal("orange-bucket"))) - Expect(opts.Key).To(PointTo(Equal("banana/banana-1.2.3.tgz"))) - Expect(opts.Body).To(Equal(file)) - }) - - It("returns the remote release", func() { - remoteRelease, err := releaseSource.UploadRelease(cargo.BOSHReleaseTarballSpecification{ - Name: "banana", - Version: "1.2.3", - }, file) - Expect(err).NotTo(HaveOccurred()) - - Expect(remoteRelease).To(Equal(cargo.BOSHReleaseTarballLock{ - Name: "banana", - Version: "1.2.3", - RemotePath: "banana/banana-1.2.3.tgz", - RemoteSource: "orange-bucket", - })) - }) - }) - - When("there is an error evaluating the path template", func() { - BeforeEach(func() { - releaseSource = component.NewS3ReleaseSource( - cargo.ReleaseSourceConfig{ - ID: sourceID, - Bucket: "orange-bucket", - PathTemplate: `{{.NoSuchField}}`, - Publishable: false, - }, - nil, - nil, - s3Uploader, - log.New(GinkgoWriter, "", 0), - ) - }) - - It("returns a descriptive error", func() { - _, err := releaseSource.UploadRelease(cargo.BOSHReleaseTarballSpecification{ - Name: "banana", - Version: "1.2.3", - }, file) - - Expect(err).To(MatchError(ContainSubstring(`unable to evaluate path_template`))) - }) - }) - }) - Describe("RemotePath", func() { var ( releaseSource component.S3ReleaseSource @@ -652,7 +558,6 @@ var _ = Describe("S3ReleaseSource", func() { }, nil, nil, - nil, log.New(GinkgoWriter, "", 0), ) requirement = cargo.BOSHReleaseTarballSpecification{ @@ -680,7 +585,6 @@ var _ = Describe("S3ReleaseSource", func() { }, nil, nil, - nil, log.New(GinkgoWriter, "", 0), ) }) diff --git a/main.go b/main.go index 58fe875f0..fb6c5fe58 100644 --- a/main.go +++ b/main.go @@ -63,10 +63,6 @@ func main() { repo := component.NewReleaseSourceRepo(kilnfile) return repo.Filter(allowOnlyPublishable) }) - ruFinder := commands.ReleaseUploaderFinder(func(kilnfile cargo.Kilnfile, sourceID string) (component.ReleaseUploader, error) { - repo := component.NewReleaseSourceRepo(kilnfile) - return repo.FindReleaseUploader(sourceID) - }) rpFinder := commands.RemotePatherFinder(func(kilnfile cargo.Kilnfile, sourceID string) (component.RemotePather, error) { repo := component.NewReleaseSourceRepo(kilnfile) return repo.FindRemotePather(sourceID) @@ -85,11 +81,6 @@ func main() { commandSet["help"] = commands.NewHelp(os.Stdout, globalFlagsUsage, commandSet) commandSet["version"] = commands.NewVersion(outLogger, version) commandSet["update-release"] = commands.NewUpdateRelease(outLogger, fs, mrsProvider) - commandSet["upload-release"] = commands.UploadRelease{ - FS: fs, - Logger: outLogger, - ReleaseUploaderFinder: ruFinder, - } commandSet["sync-with-local"] = commands.NewSyncWithLocal(fs, localReleaseDirectory, rpFinder, outLogger) commandSet["update-stemcell"] = commands.UpdateStemcell{