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 }