github.com/wanddynosios/cli/v8@v8.7.9-0.20240221182337-1a92e3a7017f/command/v7/create_service_broker_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"os"
     5  
     6  	"code.cloudfoundry.org/cli/actor/actionerror"
     7  	"code.cloudfoundry.org/cli/command"
     8  	"code.cloudfoundry.org/cli/command/flag"
     9  	"code.cloudfoundry.org/cli/resources"
    10  	"code.cloudfoundry.org/cli/util/configv3"
    11  )
    12  
    13  type CreateServiceBrokerCommand struct {
    14  	BaseCommand
    15  
    16  	PositionalArgs  flag.ServiceBrokerArgs `positional-args:"yes"`
    17  	SpaceScoped     bool                   `long:"space-scoped" description:"Make the broker's service plans only visible within the targeted space"`
    18  	UpdateIfExists  bool                   `long:"update-if-exists" description:"If the broker already exists, update it rather than failing. Ignores --space-scoped."`
    19  	usage           any                    `usage:"CF_NAME create-service-broker SERVICE_BROKER USERNAME PASSWORD URL [--space-scoped]\n   CF_NAME create-service-broker SERVICE_BROKER USERNAME URL [--space-scoped] (omit password to specify interactively or via environment variable)\n\nWARNING:\n   Providing your password as a command line option is highly discouraged\n   Your password may be visible to others and may be recorded in your shell history"`
    20  	relatedCommands any                    `related_commands:"enable-service-access, service-brokers, target"`
    21  	envPassword     any                    `environmentName:"CF_BROKER_PASSWORD" environmentDescription:"Password associated with user. Overridden if PASSWORD argument is provided" environmentDefault:"password"`
    22  }
    23  
    24  func (cmd *CreateServiceBrokerCommand) Execute(args []string) error {
    25  	err := cmd.SharedActor.CheckTarget(cmd.SpaceScoped, cmd.SpaceScoped)
    26  	if err != nil {
    27  		return err
    28  	}
    29  
    30  	brokerName, username, password, url, err := promptUserForBrokerPasswordIfRequired(cmd.PositionalArgs, cmd.UI)
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	user, err := cmd.Actor.GetCurrentUser()
    36  	if err != nil {
    37  		return err
    38  	}
    39  
    40  	if cmd.UpdateIfExists {
    41  		serviceBroker, warnings, err := cmd.Actor.GetServiceBrokerByName(brokerName)
    42  		cmd.UI.DisplayWarnings(warnings)
    43  		switch err.(type) {
    44  		case nil:
    45  			return updateServiceBroker(cmd.UI, cmd.Actor, user.Name, serviceBroker.GUID, brokerName, username, password, url)
    46  		case actionerror.ServiceBrokerNotFoundError: // do nothing
    47  		default:
    48  			return err
    49  		}
    50  	}
    51  
    52  	var space configv3.Space
    53  	if cmd.SpaceScoped {
    54  		space = cmd.Config.TargetedSpace()
    55  		cmd.UI.DisplayTextWithFlavor(
    56  			"Creating service broker {{.ServiceBroker}} in org {{.Org}} / space {{.Space}} as {{.Username}}...",
    57  			map[string]any{
    58  				"Username":      user.Name,
    59  				"ServiceBroker": brokerName,
    60  				"Org":           cmd.Config.TargetedOrganizationName(),
    61  				"Space":         space.Name,
    62  			},
    63  		)
    64  	} else {
    65  		cmd.UI.DisplayTextWithFlavor(
    66  			"Creating service broker {{.ServiceBroker}} as {{.Username}}...",
    67  			map[string]any{
    68  				"Username":      user.Name,
    69  				"ServiceBroker": brokerName,
    70  			},
    71  		)
    72  	}
    73  
    74  	warnings, err := cmd.Actor.CreateServiceBroker(
    75  		resources.ServiceBroker{
    76  			Name:      brokerName,
    77  			Username:  username,
    78  			Password:  password,
    79  			URL:       url,
    80  			SpaceGUID: space.GUID,
    81  		},
    82  	)
    83  	cmd.UI.DisplayWarnings(warnings)
    84  	if err != nil {
    85  		return err
    86  	}
    87  
    88  	cmd.UI.DisplayOK()
    89  	return nil
    90  }
    91  
    92  func promptUserForBrokerPasswordIfRequired(args flag.ServiceBrokerArgs, ui command.UI) (string, string, string, string, error) {
    93  	if args.URL != "" {
    94  		return args.ServiceBroker, args.Username, args.PasswordOrURL, args.URL, nil
    95  	}
    96  
    97  	if password, ok := os.LookupEnv("CF_BROKER_PASSWORD"); ok {
    98  		return args.ServiceBroker, args.Username, password, args.PasswordOrURL, nil
    99  	}
   100  
   101  	password, err := ui.DisplayPasswordPrompt("Service Broker Password")
   102  	if err != nil {
   103  		return "", "", "", "", err
   104  	}
   105  
   106  	return args.ServiceBroker, args.Username, password, args.PasswordOrURL, nil
   107  }