github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/command/v2/create_route_command.go (about)

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