github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/service/bind_service.go (about) 1 package service 2 3 import ( 4 "strings" 5 6 "github.com/cloudfoundry/cli/cf" 7 "github.com/cloudfoundry/cli/cf/api" 8 "github.com/cloudfoundry/cli/cf/command_registry" 9 "github.com/cloudfoundry/cli/cf/configuration/core_config" 10 "github.com/cloudfoundry/cli/cf/errors" 11 . "github.com/cloudfoundry/cli/cf/i18n" 12 "github.com/cloudfoundry/cli/cf/models" 13 "github.com/cloudfoundry/cli/cf/requirements" 14 "github.com/cloudfoundry/cli/cf/terminal" 15 "github.com/cloudfoundry/cli/flags" 16 "github.com/cloudfoundry/cli/flags/flag" 17 "github.com/cloudfoundry/cli/json" 18 ) 19 20 type ServiceBinder interface { 21 BindApplication(app models.Application, serviceInstance models.ServiceInstance, paramsMap map[string]interface{}) (apiErr error) 22 } 23 24 type BindService struct { 25 ui terminal.UI 26 config core_config.Reader 27 serviceBindingRepo api.ServiceBindingRepository 28 appReq requirements.ApplicationRequirement 29 serviceInstanceReq requirements.ServiceInstanceRequirement 30 } 31 32 func init() { 33 command_registry.Register(&BindService{}) 34 } 35 36 func (cmd *BindService) MetaData() command_registry.CommandMetadata { 37 baseUsage := T("CF_NAME bind-service APP_NAME SERVICE_INSTANCE [-c PARAMETERS_AS_JSON]") 38 paramsUsage := T(` Optionally provide service-specific configuration parameters in a valid JSON object in-line: 39 40 CF_NAME bind-service APP_NAME SERVICE_INSTANCE -c '{"name":"value","name":"value"}' 41 42 Optionally provide a file containing service-specific configuration parameters in a valid JSON object. 43 The path to the parameters file can be an absolute or relative path to a file. 44 CF_NAME bind-service APP_NAME SERVICE_INSTANCE -c PATH_TO_FILE 45 46 Example of valid JSON object: 47 { 48 "permissions": "read-only" 49 }`) 50 exampleUsage := T(`EXAMPLE: 51 Linux/Mac: 52 CF_NAME bind-service myapp mydb -c '{"permissions":"read-only"}' 53 54 Windows Command Line: 55 CF_NAME bind-service myapp mydb -c "{\"permissions\":\"read-only\"}" 56 57 Windows PowerShell: 58 CF_NAME bind-service myapp mydb -c '{\"permissions\":\"read-only\"}' 59 60 CF_NAME bind-service myapp mydb -c ~/workspace/tmp/instance_config.json`) 61 62 fs := make(map[string]flags.FlagSet) 63 fs["c"] = &cliFlags.StringFlag{Name: "c", Usage: T("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.")} 64 65 return command_registry.CommandMetadata{ 66 Name: "bind-service", 67 ShortName: "bs", 68 Description: T("Bind a service instance to an app"), 69 Usage: strings.Join([]string{baseUsage, paramsUsage, exampleUsage}, "\n\n"), 70 Flags: fs, 71 } 72 } 73 74 func (cmd *BindService) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) { 75 if len(fc.Args()) != 2 { 76 cmd.ui.Failed(T("Incorrect Usage. Requires APP_NAME and SERVICE_INSTANCE as arguments\n\n") + command_registry.Commands.CommandUsage("bind-service")) 77 } 78 79 serviceName := fc.Args()[1] 80 81 cmd.appReq = requirementsFactory.NewApplicationRequirement(fc.Args()[0]) 82 cmd.serviceInstanceReq = requirementsFactory.NewServiceInstanceRequirement(serviceName) 83 84 reqs = []requirements.Requirement{requirementsFactory.NewLoginRequirement(), cmd.appReq, cmd.serviceInstanceReq} 85 86 return 87 } 88 89 func (cmd *BindService) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command { 90 cmd.ui = deps.Ui 91 cmd.config = deps.Config 92 cmd.serviceBindingRepo = deps.RepoLocator.GetServiceBindingRepository() 93 return cmd 94 } 95 96 func (cmd *BindService) Execute(c flags.FlagContext) { 97 app := cmd.appReq.GetApplication() 98 serviceInstance := cmd.serviceInstanceReq.GetServiceInstance() 99 params := c.String("c") 100 101 paramsMap, err := json.ParseJsonFromFileOrString(params) 102 if err != nil { 103 cmd.ui.Failed(T("Invalid configuration provided for -c flag. Please provide a valid JSON object or path to a file containing a valid JSON object.")) 104 } 105 106 cmd.ui.Say(T("Binding service {{.ServiceInstanceName}} to app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", 107 map[string]interface{}{ 108 "ServiceInstanceName": terminal.EntityNameColor(serviceInstance.Name), 109 "AppName": terminal.EntityNameColor(app.Name), 110 "OrgName": terminal.EntityNameColor(cmd.config.OrganizationFields().Name), 111 "SpaceName": terminal.EntityNameColor(cmd.config.SpaceFields().Name), 112 "CurrentUser": terminal.EntityNameColor(cmd.config.Username()), 113 })) 114 115 err = cmd.BindApplication(app, serviceInstance, paramsMap) 116 if err != nil { 117 if httperr, ok := err.(errors.HttpError); ok && httperr.ErrorCode() == errors.APP_ALREADY_BOUND { 118 cmd.ui.Ok() 119 cmd.ui.Warn(T("App {{.AppName}} is already bound to {{.ServiceName}}.", 120 map[string]interface{}{ 121 "AppName": app.Name, 122 "ServiceName": serviceInstance.Name, 123 })) 124 return 125 } else { 126 cmd.ui.Failed(err.Error()) 127 } 128 } 129 130 cmd.ui.Ok() 131 cmd.ui.Say(T("TIP: Use '{{.CFCommand}} {{.AppName}}' to ensure your env variable changes take effect", 132 map[string]interface{}{"CFCommand": terminal.CommandColor(cf.Name() + " restage"), "AppName": app.Name})) 133 } 134 135 func (cmd *BindService) BindApplication(app models.Application, serviceInstance models.ServiceInstance, paramsMap map[string]interface{}) (apiErr error) { 136 apiErr = cmd.serviceBindingRepo.Create(serviceInstance.Guid, app.Guid, paramsMap) 137 return 138 }