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  }