github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/service/create_user_provided_service.go (about)

     1  package service
     2  
     3  import (
     4  	"encoding/json"
     5  	"strings"
     6  
     7  	. "github.com/cloudfoundry/cli/cf/i18n"
     8  	"github.com/cloudfoundry/cli/flags"
     9  	"github.com/cloudfoundry/cli/flags/flag"
    10  
    11  	"github.com/cloudfoundry/cli/cf/api"
    12  	"github.com/cloudfoundry/cli/cf/command_registry"
    13  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
    14  	"github.com/cloudfoundry/cli/cf/requirements"
    15  	"github.com/cloudfoundry/cli/cf/terminal"
    16  )
    17  
    18  type CreateUserProvidedService struct {
    19  	ui                              terminal.UI
    20  	config                          core_config.Reader
    21  	userProvidedServiceInstanceRepo api.UserProvidedServiceInstanceRepository
    22  }
    23  
    24  func init() {
    25  	command_registry.Register(&CreateUserProvidedService{})
    26  }
    27  
    28  func (cmd *CreateUserProvidedService) MetaData() command_registry.CommandMetadata {
    29  	fs := make(map[string]flags.FlagSet)
    30  	fs["p"] = &cliFlags.StringFlag{Name: "p", Usage: T("Credentials")}
    31  	fs["l"] = &cliFlags.StringFlag{Name: "l", Usage: T("Syslog Drain Url")}
    32  
    33  	return command_registry.CommandMetadata{
    34  		Name:        "create-user-provided-service",
    35  		ShortName:   "cups",
    36  		Description: T("Make a user-provided service instance available to cf apps"),
    37  		Usage: T(`CF_NAME create-user-provided-service SERVICE_INSTANCE [-p CREDENTIALS] [-l SYSLOG-DRAIN-URL]
    38  
    39     Pass comma separated credential parameter names to enable interactive mode:
    40     CF_NAME create-user-provided-service SERVICE_INSTANCE -p "comma, separated, parameter, names"
    41  
    42     Pass credential parameters as JSON to create a service non-interactively:
    43     CF_NAME create-user-provided-service SERVICE_INSTANCE -p '{"name":"value","name":"value"}'
    44  
    45  EXAMPLE 
    46        CF_NAME create-user-provided-service my-db-mine -p "username, password"
    47        CF_NAME create-user-provided-service my-drain-service -l syslog://example.com
    48  
    49     Linux/Mac:
    50        CF_NAME create-user-provided-service my-db-mine -p '{"username":"admin","password":"pa55woRD"}'
    51  
    52     Windows Command Line
    53        CF_NAME create-user-provided-service my-db-mine -p "{\"username\":\"admin\",\"password\":\"pa55woRD\"}"
    54  
    55     Windows PowerShell
    56        CF_NAME create-user-provided-service my-db-mine -p '{\"username\":\"admin\",\"password\":\"pa55woRD\"}'
    57  `),
    58  		Flags: fs,
    59  	}
    60  }
    61  
    62  func (cmd *CreateUserProvidedService) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) {
    63  	if len(fc.Args()) != 1 {
    64  		cmd.ui.Failed(T("Incorrect Usage. Requires an argument\n\n") + command_registry.Commands.CommandUsage("create-user-provided-service"))
    65  	}
    66  
    67  	reqs = []requirements.Requirement{
    68  		requirementsFactory.NewLoginRequirement(),
    69  		requirementsFactory.NewTargetedSpaceRequirement(),
    70  	}
    71  	return
    72  }
    73  
    74  func (cmd *CreateUserProvidedService) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command {
    75  	cmd.ui = deps.Ui
    76  	cmd.config = deps.Config
    77  	cmd.userProvidedServiceInstanceRepo = deps.RepoLocator.GetUserProvidedServiceInstanceRepository()
    78  	return cmd
    79  }
    80  
    81  func (cmd *CreateUserProvidedService) Execute(c flags.FlagContext) {
    82  	name := c.Args()[0]
    83  	drainUrl := c.String("l")
    84  
    85  	params := c.String("p")
    86  	params = strings.Trim(params, `"`)
    87  	paramsMap := make(map[string]interface{})
    88  
    89  	err := json.Unmarshal([]byte(params), &paramsMap)
    90  	if err != nil && params != "" {
    91  		paramsMap = cmd.mapValuesFromPrompt(params, paramsMap)
    92  	}
    93  
    94  	cmd.ui.Say(T("Creating user provided service {{.ServiceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...",
    95  		map[string]interface{}{
    96  			"ServiceName": terminal.EntityNameColor(name),
    97  			"OrgName":     terminal.EntityNameColor(cmd.config.OrganizationFields().Name),
    98  			"SpaceName":   terminal.EntityNameColor(cmd.config.SpaceFields().Name),
    99  			"CurrentUser": terminal.EntityNameColor(cmd.config.Username()),
   100  		}))
   101  
   102  	apiErr := cmd.userProvidedServiceInstanceRepo.Create(name, drainUrl, paramsMap)
   103  	if apiErr != nil {
   104  		cmd.ui.Failed(apiErr.Error())
   105  		return
   106  	}
   107  
   108  	cmd.ui.Ok()
   109  }
   110  
   111  func (cmd CreateUserProvidedService) mapValuesFromPrompt(params string, paramsMap map[string]interface{}) map[string]interface{} {
   112  	for _, param := range strings.Split(params, ",") {
   113  		param = strings.Trim(param, " ")
   114  		paramsMap[param] = cmd.ui.Ask("%s", param)
   115  	}
   116  	return paramsMap
   117  }