github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v6/create_route_command.go (about)

     1  package v6
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/actor/sharedaction"
     6  	"code.cloudfoundry.org/cli/actor/v2action"
     7  	"code.cloudfoundry.org/cli/command"
     8  	"code.cloudfoundry.org/cli/command/flag"
     9  	"code.cloudfoundry.org/cli/command/translatableerror"
    10  	"code.cloudfoundry.org/cli/command/v6/shared"
    11  )
    12  
    13  //go:generate counterfeiter . CreateRouteActor
    14  
    15  type CreateRouteActor interface {
    16  	CloudControllerAPIVersion() string
    17  	CreateRouteWithExistenceCheck(orgGUID string, spaceName string, route v2action.Route, generatePort bool) (v2action.Route, v2action.Warnings, error)
    18  }
    19  
    20  type CreateRouteCommand struct {
    21  	RequiredArgs    flag.SpaceDomain `positional-args:"yes"`
    22  	Hostname        string           `long:"hostname" short:"n" description:"Hostname for the HTTP route (required for shared domains)"`
    23  	Path            string           `long:"path" description:"Path for the HTTP route"`
    24  	Port            flag.Port        `long:"port" description:"Port for the TCP route"`
    25  	RandomPort      bool             `long:"random-port" description:"Create a random port for the TCP route"`
    26  	usage           interface{}      `usage:"Create an HTTP route:\n      CF_NAME create-route SPACE DOMAIN [--hostname HOSTNAME] [--path PATH]\n\n   Create a TCP route:\n      CF_NAME create-route SPACE DOMAIN (--port PORT | --random-port)\n\nEXAMPLES:\n   CF_NAME create-route my-space example.com                             # example.com\n   CF_NAME create-route my-space example.com --hostname myapp            # myapp.example.com\n   CF_NAME create-route my-space example.com --hostname myapp --path foo # myapp.example.com/foo\n   CF_NAME create-route my-space example.com --port 5000                 # example.com:5000"`
    27  	relatedCommands interface{}      `related_commands:"check-route, domains, map-route"`
    28  
    29  	UI          command.UI
    30  	Config      command.Config
    31  	SharedActor command.SharedActor
    32  	Actor       CreateRouteActor
    33  }
    34  
    35  func (cmd *CreateRouteCommand) Setup(config command.Config, ui command.UI) error {
    36  	cmd.Config = config
    37  	cmd.UI = ui
    38  	cmd.SharedActor = sharedaction.NewActor(config)
    39  
    40  	ccClient, uaaClient, err := shared.GetNewClientsAndConnectToCF(config, ui)
    41  	if err != nil {
    42  		return err
    43  	}
    44  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    45  
    46  	return nil
    47  }
    48  
    49  func (cmd CreateRouteCommand) Execute(args []string) error {
    50  	err := cmd.validateArguments()
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	err = cmd.SharedActor.CheckTarget(true, false)
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	user, err := cmd.Config.CurrentUser()
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	route := v2action.Route{
    66  		Domain: v2action.Domain{Name: cmd.RequiredArgs.Domain},
    67  		Host:   cmd.Hostname,
    68  		Path:   cmd.Path,
    69  		Port:   cmd.Port.NullInt,
    70  	}
    71  
    72  	cmd.UI.DisplayTextWithFlavor("Creating route {{.Route}} for org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    73  		"Route":     route,
    74  		"OrgName":   cmd.Config.TargetedOrganization().Name,
    75  		"SpaceName": cmd.RequiredArgs.Space,
    76  		"Username":  user.Name,
    77  	})
    78  
    79  	createdRoute, warnings, err := cmd.Actor.CreateRouteWithExistenceCheck(cmd.Config.TargetedOrganization().GUID, cmd.RequiredArgs.Space, route, cmd.RandomPort)
    80  	cmd.UI.DisplayWarnings(warnings)
    81  	if err != nil {
    82  		if _, ok := err.(actionerror.RouteAlreadyExistsError); ok {
    83  			cmd.UI.DisplayWarning("Route {{.Route}} already exists.", map[string]interface{}{
    84  				"Route": route,
    85  			})
    86  			cmd.UI.DisplayOK()
    87  			return nil
    88  		}
    89  
    90  		return err
    91  	}
    92  
    93  	cmd.UI.DisplayTextWithFlavor("Route {{.Route}} has been created.", map[string]interface{}{
    94  		"Route": createdRoute,
    95  	})
    96  
    97  	cmd.UI.DisplayOK()
    98  
    99  	return nil
   100  }
   101  
   102  func (cmd CreateRouteCommand) validateArguments() error {
   103  	var failedArgs []string
   104  
   105  	if cmd.Hostname != "" {
   106  		failedArgs = append(failedArgs, "--hostname")
   107  	}
   108  	if cmd.Path != "" {
   109  		failedArgs = append(failedArgs, "--path")
   110  	}
   111  	if cmd.Port.IsSet {
   112  		failedArgs = append(failedArgs, "--port")
   113  	}
   114  	if cmd.RandomPort {
   115  		failedArgs = append(failedArgs, "--random-port")
   116  	}
   117  
   118  	switch {
   119  	case (cmd.Hostname != "" || cmd.Path != "") && (cmd.Port.IsSet || cmd.RandomPort),
   120  		cmd.Port.IsSet && cmd.RandomPort:
   121  		return translatableerror.ArgumentCombinationError{Args: failedArgs}
   122  	}
   123  
   124  	return nil
   125  }