forked from cloudfoundry/cli
/
update_buildpack.go
152 lines (129 loc) · 4.52 KB
/
update_buildpack.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package buildpack
import (
"path/filepath"
"github.com/cloudfoundry/cli/cf/api"
"github.com/cloudfoundry/cli/cf/command_registry"
. "github.com/cloudfoundry/cli/cf/i18n"
"github.com/cloudfoundry/cli/cf/requirements"
"github.com/cloudfoundry/cli/cf/terminal"
"github.com/simonleung8/flags"
"github.com/simonleung8/flags/flag"
)
type UpdateBuildpack struct {
ui terminal.UI
buildpackRepo api.BuildpackRepository
buildpackBitsRepo api.BuildpackBitsRepository
buildpackReq requirements.BuildpackRequirement
}
func init() {
command_registry.Register(&UpdateBuildpack{})
}
func (cmd *UpdateBuildpack) MetaData() command_registry.CommandMetadata {
fs := make(map[string]flags.FlagSet)
fs["i"] = &cliFlags.IntFlag{Name: "i", Usage: T("The order in which the buildpacks are checked during buildpack auto-detection")}
fs["p"] = &cliFlags.StringFlag{Name: "p", Usage: T("Path to directory or zip file")}
fs["enable"] = &cliFlags.BoolFlag{Name: "enable", Usage: T("Enable the buildpack to be used for staging")}
fs["disable"] = &cliFlags.BoolFlag{Name: "disable", Usage: T("Disable the buildpack from being used for staging")}
fs["lock"] = &cliFlags.BoolFlag{Name: "lock", Usage: T("Lock the buildpack to prevent updates")}
fs["unlock"] = &cliFlags.BoolFlag{Name: "disable", Usage: T("Unlock the buildpack to enable updates")}
return command_registry.CommandMetadata{
Name: "update-buildpack",
Description: T("Update a buildpack"),
Usage: T("CF_NAME update-buildpack BUILDPACK [-p PATH] [-i POSITION] [--enable|--disable] [--lock|--unlock]") +
T("\n\nTIP:\n") + T(" Path should be a zip file, a url to a zip file, or a local directory. Position is a positive integer, sets priority, and is sorted from lowest to highest."),
Flags: fs,
}
}
func (cmd *UpdateBuildpack) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) {
if len(fc.Args()) != 1 {
cmd.ui.Failed(T("Incorrect Usage. Requires an argument\n\n") + command_registry.Commands.CommandUsage("update-buildpack"))
}
loginReq := requirementsFactory.NewLoginRequirement()
cmd.buildpackReq = requirementsFactory.NewBuildpackRequirement(fc.Args()[0])
reqs = []requirements.Requirement{
loginReq,
cmd.buildpackReq,
}
return
}
func (cmd *UpdateBuildpack) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command {
cmd.ui = deps.Ui
cmd.buildpackRepo = deps.RepoLocator.GetBuildpackRepository()
cmd.buildpackBitsRepo = deps.RepoLocator.GetBuildpackBitsRepository()
return cmd
}
func (cmd *UpdateBuildpack) Execute(c flags.FlagContext) {
buildpack := cmd.buildpackReq.GetBuildpack()
cmd.ui.Say(T("Updating buildpack {{.BuildpackName}}...", map[string]interface{}{"BuildpackName": terminal.EntityNameColor(buildpack.Name)}))
updateBuildpack := false
if c.IsSet("i") {
position := c.Int("i")
buildpack.Position = &position
updateBuildpack = true
}
enabled := c.Bool("enable")
disabled := c.Bool("disable")
if enabled && disabled {
cmd.ui.Failed(T("Cannot specify both {{.Enabled}} and {{.Disabled}}.", map[string]interface{}{
"Enabled": "enabled",
"Disabled": "disabled",
}))
}
if enabled {
buildpack.Enabled = &enabled
updateBuildpack = true
}
if disabled {
disabled = false
buildpack.Enabled = &disabled
updateBuildpack = true
}
lock := c.Bool("lock")
unlock := c.Bool("unlock")
if lock && unlock {
cmd.ui.Failed(T("Cannot specify both lock and unlock options."))
return
}
path := c.String("p")
var dir string
var err error
if path != "" {
dir, err = filepath.Abs(path)
if err != nil {
cmd.ui.Failed(err.Error())
return
}
}
if dir != "" && (lock || unlock) {
cmd.ui.Failed(T("Cannot specify buildpack bits and lock/unlock."))
}
if lock {
buildpack.Locked = &lock
updateBuildpack = true
}
if unlock {
unlock = false
buildpack.Locked = &unlock
updateBuildpack = true
}
if updateBuildpack {
newBuildpack, apiErr := cmd.buildpackRepo.Update(buildpack)
if apiErr != nil {
cmd.ui.Failed(T("Error updating buildpack {{.Name}}\n{{.Error}}", map[string]interface{}{
"Name": terminal.EntityNameColor(buildpack.Name),
"Error": apiErr.Error(),
}))
}
buildpack = newBuildpack
}
if dir != "" {
apiErr := cmd.buildpackBitsRepo.UploadBuildpack(buildpack, dir)
if apiErr != nil {
cmd.ui.Failed(T("Error uploading buildpack {{.Name}}\n{{.Error}}", map[string]interface{}{
"Name": terminal.EntityNameColor(buildpack.Name),
"Error": apiErr.Error(),
}))
}
}
cmd.ui.Ok()
}