forked from cloudfoundry/cli
/
bind_service_command.go
128 lines (104 loc) · 4.56 KB
/
bind_service_command.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
package v7
import (
"github.com/LukasHeimann/cloudfoundrycli/v8/actor/actionerror"
"github.com/LukasHeimann/cloudfoundrycli/v8/actor/v7action"
"github.com/LukasHeimann/cloudfoundrycli/v8/command/flag"
"github.com/LukasHeimann/cloudfoundrycli/v8/command/v7/shared"
"github.com/LukasHeimann/cloudfoundrycli/v8/types"
)
type BindServiceCommand struct {
BaseCommand
RequiredArgs flag.BindServiceArgs `positional-args:"yes"`
BindingName flag.BindingName `long:"binding-name" description:"Name to expose service instance to app process with (Default: service instance name)"`
ParametersAsJSON flag.JSONOrFileWithValidation `short:"c" description:"Valid JSON object containing service-specific configuration parameters, provided either in-line or in a file. For a list of supported configuration parameters, see documentation for the particular service offering."`
Wait bool `short:"w" long:"wait" description:"Wait for the operation to complete"`
relatedCommands interface{} `related_commands:"services"`
}
func (cmd BindServiceCommand) Execute(args []string) error {
if err := cmd.SharedActor.CheckTarget(true, true); err != nil {
return err
}
if err := cmd.displayIntro(); err != nil {
return err
}
stream, warnings, err := cmd.Actor.CreateServiceAppBinding(v7action.CreateServiceAppBindingParams{
SpaceGUID: cmd.Config.TargetedSpace().GUID,
ServiceInstanceName: cmd.RequiredArgs.ServiceInstanceName,
AppName: cmd.RequiredArgs.AppName,
BindingName: cmd.BindingName.Value,
Parameters: types.OptionalObject(cmd.ParametersAsJSON),
})
cmd.UI.DisplayWarnings(warnings)
switch err.(type) {
case nil:
case actionerror.ResourceAlreadyExistsError:
cmd.UI.DisplayText("App {{.AppName}} is already bound to service instance {{.ServiceInstanceName}}.", cmd.names())
cmd.UI.DisplayOK()
return nil
default:
return err
}
completed, err := shared.WaitForResult(stream, cmd.UI, cmd.Wait)
switch {
case err != nil:
return err
case completed:
cmd.UI.DisplayOK()
cmd.UI.DisplayText("TIP: Use 'cf restage {{.AppName}}' to ensure your env variable changes take effect", cmd.names())
return nil
default:
cmd.UI.DisplayOK()
cmd.UI.DisplayText("Binding in progress. Use 'cf service {{.ServiceInstanceName}}' to check operation status.", cmd.names())
cmd.UI.DisplayNewline()
cmd.UI.DisplayText("TIP: Once this operation succeeds, use 'cf restage {{.AppName}}' to ensure your env variable changes take effect", cmd.names())
return nil
}
}
func (cmd BindServiceCommand) Usage() string {
return `CF_NAME bind-service APP_NAME SERVICE_INSTANCE [-c PARAMETERS_AS_JSON] [--binding-name BINDING_NAME]
Optionally provide service-specific configuration parameters in a valid JSON object in-line:
CF_NAME bind-service APP_NAME SERVICE_INSTANCE -c '{"name":"value","name":"value"}'
Optionally provide a file containing service-specific configuration parameters in a valid JSON object.
The path to the parameters file can be an absolute or relative path to a file.
CF_NAME bind-service APP_NAME SERVICE_INSTANCE -c PATH_TO_FILE
Example of valid JSON object:
{
"permissions": "read-only"
}
Optionally provide a binding name for the association between an app and a service instance:
CF_NAME bind-service APP_NAME SERVICE_INSTANCE --binding-name BINDING_NAME`
}
func (cmd BindServiceCommand) Examples() string {
return `
Linux/Mac:
CF_NAME bind-service myapp mydb -c '{"permissions":"read-only"}'
Windows Command Line:
CF_NAME bind-service myapp mydb -c "{\"permissions\":\"read-only\"}"
Windows PowerShell:
CF_NAME bind-service myapp mydb -c '{\"permissions\":\"read-only\"}'
CF_NAME bind-service myapp mydb -c ~/workspace/tmp/instance_config.json --binding-name BINDING_NAME
`
}
func (cmd BindServiceCommand) displayIntro() error {
user, err := cmd.Actor.GetCurrentUser()
if err != nil {
return err
}
cmd.UI.DisplayTextWithFlavor(
"Binding service instance {{.ServiceInstance}} to app {{.AppName}} in org {{.Org}} / space {{.Space}} as {{.User}}...",
map[string]interface{}{
"ServiceInstance": cmd.RequiredArgs.ServiceInstanceName,
"AppName": cmd.RequiredArgs.AppName,
"User": user.Name,
"Space": cmd.Config.TargetedSpace().Name,
"Org": cmd.Config.TargetedOrganization().Name,
},
)
return nil
}
func (cmd BindServiceCommand) names() map[string]interface{} {
return map[string]interface{}{
"ServiceInstanceName": cmd.RequiredArgs.ServiceInstanceName,
"AppName": cmd.RequiredArgs.AppName,
}
}