-
Notifications
You must be signed in to change notification settings - Fork 160
/
export_release.go
86 lines (75 loc) · 1.94 KB
/
export_release.go
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
package cmd
import (
"fmt"
"sort"
"strings"
. "github.com/cloudfoundry/bosh-cli/cmd/opts"
boshdir "github.com/cloudfoundry/bosh-cli/director"
bosherr "github.com/cloudfoundry/bosh-utils/errors"
)
type ExportReleaseCmd struct {
deployment boshdir.Deployment
downloader Downloader
}
func NewExportReleaseCmd(deployment boshdir.Deployment, downloader Downloader) ExportReleaseCmd {
return ExportReleaseCmd{deployment: deployment, downloader: downloader}
}
func (c ExportReleaseCmd) Run(opts ExportReleaseOpts) error {
rel := opts.Args.ReleaseSlug
os := opts.Args.OSVersionSlug
jobs := opts.Jobs
err := c.ensureJobsValidForRelease(jobs, rel)
if err != nil {
return err
}
result, err := c.deployment.ExportRelease(rel, os, jobs)
if err != nil {
return err
}
prefix := fmt.Sprintf("%s-%s-%s-%s", rel.Name(), rel.Version(), os.OS(), os.Version())
if len(jobs) != 0 {
sort.Strings(jobs)
prefix = fmt.Sprintf("%s-%s", strings.Join(jobs, "-"), prefix)
}
err = c.downloader.Download(
result.BlobstoreID,
result.SHA1,
prefix,
opts.Directory.Path,
)
if err != nil {
return bosherr.WrapError(err, "Downloading exported release")
}
return nil
}
func (c ExportReleaseCmd) ensureJobsValidForRelease(jobs []string, rel boshdir.ReleaseSlug) error {
releases, err := c.deployment.Releases()
if err != nil {
return err
}
releaseJobs := make([]string, 0)
for _, release := range releases {
if release.Name() == rel.Name() &&
release.Version().String() == rel.Version() {
jobs, err := release.Jobs()
if err != nil {
return err
}
for _, job := range jobs {
releaseJobs = append(releaseJobs, job.Name)
}
}
}
for _, job := range jobs {
if !contains(releaseJobs, job) {
return fmt.Errorf(
"Job '%s' for release '%s' doesn't exist", job, rel)
}
}
return nil
}
func contains(s []string, searchterm string) bool {
sort.Strings(s)
i := sort.SearchStrings(s, searchterm)
return i < len(s) && s[i] == searchterm
}