-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathupload_release.go
More file actions
98 lines (80 loc) · 3.18 KB
/
Copy pathupload_release.go
File metadata and controls
98 lines (80 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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,
}
}