github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/command/v2/api_command.go (about) 1 package v2 2 3 import ( 4 "fmt" 5 "strings" 6 7 "code.cloudfoundry.org/cli/actor/v2action" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2" 9 "code.cloudfoundry.org/cli/command" 10 "code.cloudfoundry.org/cli/command/flag" 11 "code.cloudfoundry.org/cli/command/v2/shared" 12 ) 13 14 //go:generate counterfeiter . APIActor 15 16 type APIActor interface { 17 ClearTarget(config v2action.Config) 18 SetTarget(config v2action.Config, settings v2action.TargetSettings) (v2action.Warnings, error) 19 } 20 21 type ApiCommand struct { 22 OptionalArgs flag.APITarget `positional-args:"yes"` 23 SkipSSLValidation bool `long:"skip-ssl-validation" description:"Skip verification of the API endpoint. Not recommended!"` 24 Unset bool `long:"unset" description:"Remove all api endpoint targeting"` 25 usage interface{} `usage:"CF_NAME api [URL]"` 26 relatedCommands interface{} `related_commands:"auth, login, target"` 27 28 UI command.UI 29 Actor APIActor 30 Config command.Config 31 } 32 33 func (cmd *ApiCommand) Setup(config command.Config, ui command.UI) error { 34 ccClient := ccv2.NewClient(ccv2.Config{ 35 AppName: config.BinaryName(), 36 AppVersion: config.BinaryVersion(), 37 JobPollingTimeout: config.OverallPollingTimeout(), 38 JobPollingInterval: config.PollingInterval(), 39 }) 40 cmd.Actor = v2action.NewActor(ccClient, nil) 41 cmd.UI = ui 42 cmd.Config = config 43 return nil 44 } 45 46 func (cmd *ApiCommand) Execute(args []string) error { 47 if cmd.Unset { 48 return cmd.ClearTarget() 49 } 50 51 if cmd.OptionalArgs.URL != "" { 52 err := cmd.setAPI() 53 if err != nil { 54 return err 55 } 56 } 57 58 if cmd.Config.Target() == "" { 59 cmd.UI.DisplayText("No api endpoint set. Use '{{.Name}}' to set an endpoint", map[string]interface{}{ 60 "Name": "cf api", 61 }) 62 return nil 63 } 64 65 cmd.UI.DisplayTable("", [][]string{ 66 {cmd.UI.TranslateText("API endpoint:"), cmd.Config.Target()}, 67 {cmd.UI.TranslateText("API version:"), cmd.Config.APIVersion()}, 68 }, 3) 69 70 user, err := cmd.Config.CurrentUser() 71 if user.Name == "" { 72 cmd.UI.DisplayText("Not logged in. Use '{{.CFLoginCommand}}' to log in.", map[string]interface{}{ 73 "CFLoginCommand": fmt.Sprintf("%s login", cmd.Config.BinaryName()), 74 }) 75 } 76 return err 77 } 78 79 func (cmd *ApiCommand) ClearTarget() error { 80 cmd.UI.DisplayTextWithFlavor("Unsetting api endpoint...") 81 cmd.Actor.ClearTarget(cmd.Config) 82 cmd.UI.DisplayOK() 83 return nil 84 } 85 86 func (cmd *ApiCommand) setAPI() error { 87 cmd.UI.DisplayTextWithFlavor("Setting api endpoint to {{.Endpoint}}...", map[string]interface{}{ 88 "Endpoint": cmd.OptionalArgs.URL, 89 }) 90 91 apiURL := processURL(cmd.OptionalArgs.URL) 92 93 _, err := cmd.Actor.SetTarget(cmd.Config, v2action.TargetSettings{ 94 URL: apiURL, 95 SkipSSLValidation: cmd.SkipSSLValidation, 96 DialTimeout: cmd.Config.DialTimeout(), 97 }) 98 if err != nil { 99 return shared.HandleError(err) 100 } 101 102 if strings.HasPrefix(apiURL, "http:") { 103 cmd.UI.DisplayText("Warning: Insecure http API endpoint detected: secure https API endpoints are recommended") 104 } 105 106 cmd.UI.DisplayOK() 107 cmd.UI.DisplayNewline() 108 return nil 109 } 110 111 func processURL(apiURL string) string { 112 if !strings.HasPrefix(apiURL, "http") { 113 return fmt.Sprintf("https://%s", apiURL) 114 115 } 116 return apiURL 117 }