func (b *CloudFormationBroker) Bind(instanceID, bindingID string, details brokerapi.BindDetails) (brokerapi.BindingResponse, error) { b.logger.Debug("bind", lager.Data{ instanceIDLogKey: instanceID, bindingIDLogKey: bindingID, detailsLogKey: details, }) bindingResponse := brokerapi.BindingResponse{} service, ok := b.catalog.FindService(details.ServiceID) if !ok { return bindingResponse, fmt.Errorf("Service '%s' not found", details.ServiceID) } if !service.Bindable { return bindingResponse, brokerapi.ErrInstanceNotBindable } stackDetails, err := b.stack.Describe(b.stackName(instanceID)) if err != nil { if err == awscf.ErrStackDoesNotExist { return bindingResponse, brokerapi.ErrInstanceDoesNotExist } return bindingResponse, err } credentials := make(map[string]string) for key, value := range stackDetails.Outputs { credentials[key] = value } bindingResponse.Credentials = credentials return bindingResponse, nil }
func (b *SQSBroker) Bind(instanceID, bindingID string, details brokerapi.BindDetails) (brokerapi.BindingResponse, error) { var err error var accessKeyID, secretAccessKey string var policyARN string b.logger.Debug("bind", lager.Data{ instanceIDLogKey: instanceID, bindingIDLogKey: bindingID, detailsLogKey: details, }) bindingResponse := brokerapi.BindingResponse{} service, ok := b.catalog.FindService(details.ServiceID) if !ok { return bindingResponse, fmt.Errorf("Service '%s' not found", details.ServiceID) } if !service.Bindable { return bindingResponse, brokerapi.ErrInstanceNotBindable } queueDetails, err := b.queue.Describe(b.queueName(instanceID)) if err != nil { if err == awssqs.ErrQueueDoesNotExist { return bindingResponse, brokerapi.ErrInstanceDoesNotExist } return bindingResponse, err } if _, err = b.user.Create(b.userName(bindingID)); err != nil { return bindingResponse, err } defer func() { if err != nil { if policyARN != "" { b.user.DeletePolicy(policyARN) } if accessKeyID != "" { b.user.DeleteAccessKey(b.userName(bindingID), accessKeyID) } b.user.Delete(b.userName(bindingID)) } }() accessKeyID, secretAccessKey, err = b.user.CreateAccessKey(b.userName(bindingID)) if err != nil { return bindingResponse, err } policyARN, err = b.user.CreatePolicy(b.policyName(bindingID), "Allow", "sqs:*", queueDetails.QueueArn) if err != nil { return bindingResponse, err } if err = b.user.AttachUserPolicy(b.userName(bindingID), policyARN); err != nil { return bindingResponse, err } bindingResponse.Credentials = &brokerapi.CredentialsHash{ Username: accessKeyID, Password: secretAccessKey, URI: queueDetails.QueueURL, } return bindingResponse, nil }
func (b *RDSBroker) Bind(instanceID, bindingID string, details brokerapi.BindDetails) (brokerapi.BindingResponse, error) { b.logger.Debug("bind", lager.Data{ instanceIDLogKey: instanceID, bindingIDLogKey: bindingID, detailsLogKey: details, }) bindingResponse := brokerapi.BindingResponse{} bindParameters := BindParameters{} if b.allowUserBindParameters { if err := mapstructure.Decode(details.Parameters, &bindParameters); err != nil { return bindingResponse, err } } service, ok := b.catalog.FindService(details.ServiceID) if !ok { return bindingResponse, fmt.Errorf("Service '%s' not found", details.ServiceID) } if !service.Bindable { return bindingResponse, brokerapi.ErrInstanceNotBindable } servicePlan, ok := b.catalog.FindServicePlan(details.PlanID) if !ok { return bindingResponse, fmt.Errorf("Service Plan '%s' not found", details.PlanID) } var dbAddress, dbName, masterUsername string var dbPort int64 if strings.ToLower(servicePlan.RDSProperties.Engine) == "aurora" { dbClusterDetails, err := b.dbCluster.Describe(b.dbClusterIdentifier(instanceID)) if err != nil { if err == awsrds.ErrDBInstanceDoesNotExist { return bindingResponse, brokerapi.ErrInstanceDoesNotExist } return bindingResponse, err } dbAddress = dbClusterDetails.Endpoint dbPort = dbClusterDetails.Port masterUsername = dbClusterDetails.MasterUsername if dbClusterDetails.DatabaseName != "" { dbName = dbClusterDetails.DatabaseName } else { dbName = b.dbName(instanceID) } } else { dbInstanceDetails, err := b.dbInstance.Describe(b.dbInstanceIdentifier(instanceID)) if err != nil { if err == awsrds.ErrDBInstanceDoesNotExist { return bindingResponse, brokerapi.ErrInstanceDoesNotExist } return bindingResponse, err } dbAddress = dbInstanceDetails.Address dbPort = dbInstanceDetails.Port masterUsername = dbInstanceDetails.MasterUsername if dbInstanceDetails.DBName != "" { dbName = dbInstanceDetails.DBName } else { dbName = b.dbName(instanceID) } } sqlEngine, err := b.sqlProvider.GetSQLEngine(servicePlan.RDSProperties.Engine) if err != nil { return bindingResponse, err } if err = sqlEngine.Open(dbAddress, dbPort, dbName, masterUsername, b.masterPassword(instanceID)); err != nil { return bindingResponse, err } defer sqlEngine.Close() dbUsername := b.dbUsername(bindingID) dbPassword := b.dbPassword() if bindParameters.DBName != "" { dbName = bindParameters.DBName if err = sqlEngine.CreateDB(dbName); err != nil { return bindingResponse, err } } if err = sqlEngine.CreateUser(dbUsername, dbPassword); err != nil { return bindingResponse, err } if err = sqlEngine.GrantPrivileges(dbName, dbUsername); err != nil { return bindingResponse, err } bindingResponse.Credentials = &brokerapi.CredentialsHash{ Host: dbAddress, Port: dbPort, Name: dbName, Username: dbUsername, Password: dbPassword, URI: sqlEngine.URI(dbAddress, dbPort, dbName, dbUsername, dbPassword), JDBCURI: sqlEngine.JDBCURI(dbAddress, dbPort, dbName, dbUsername, dbPassword), } return bindingResponse, nil }