github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/command/v2/target_command.go (about)

     1  package v2
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"code.cloudfoundry.org/cli/actor/sharedaction"
     7  	"code.cloudfoundry.org/cli/actor/v2action"
     8  	"code.cloudfoundry.org/cli/command"
     9  	"code.cloudfoundry.org/cli/command/v2/shared"
    10  	"code.cloudfoundry.org/cli/util/configv3"
    11  )
    12  
    13  //go:generate counterfeiter . TargetActor
    14  type TargetActor interface {
    15  	GetOrganizationByName(orgName string) (v2action.Organization, v2action.Warnings, error)
    16  	GetOrganizationSpaces(orgGUID string) ([]v2action.Space, v2action.Warnings, error)
    17  	GetSpaceByOrganizationAndName(orgGUID string, spaceName string) (v2action.Space, v2action.Warnings, error)
    18  }
    19  
    20  type TargetCommand struct {
    21  	Organization    string      `short:"o" description:"Organization"`
    22  	Space           string      `short:"s" description:"Space"`
    23  	usage           interface{} `usage:"CF_NAME target [-o ORG] [-s SPACE]"`
    24  	relatedCommands interface{} `related_commands:"create-org, create-space, login, orgs, spaces"`
    25  
    26  	UI          command.UI
    27  	Config      command.Config
    28  	SharedActor command.SharedActor
    29  	Actor       TargetActor
    30  }
    31  
    32  func (cmd *TargetCommand) Setup(config command.Config, ui command.UI) error {
    33  	cmd.Config = config
    34  	cmd.UI = ui
    35  	cmd.SharedActor = sharedaction.NewActor()
    36  
    37  	ccClient, uaaClient, err := shared.NewClients(config, ui)
    38  	if err != nil {
    39  		return err
    40  	}
    41  	cmd.Actor = v2action.NewActor(ccClient, uaaClient)
    42  
    43  	return nil
    44  }
    45  
    46  func (cmd *TargetCommand) Execute(args []string) error {
    47  	cmd.notifyCLIUpdateIfNeeded()
    48  
    49  	err := cmd.SharedActor.CheckTarget(cmd.Config, false, false)
    50  	if err != nil {
    51  		return shared.HandleError(err)
    52  	}
    53  
    54  	user, err := cmd.Config.CurrentUser()
    55  	if err != nil {
    56  		cmd.clearTargets()
    57  		return shared.HandleError(err)
    58  	}
    59  
    60  	switch {
    61  	case cmd.Organization != "" && cmd.Space != "":
    62  		err = cmd.setOrgAndSpace()
    63  		if err != nil {
    64  			cmd.clearTargets()
    65  			return err
    66  		}
    67  	case cmd.Organization != "":
    68  		err = cmd.setOrg()
    69  		if err != nil {
    70  			cmd.clearTargets()
    71  			return err
    72  		}
    73  		err = cmd.autoTargetSpace(cmd.Config.TargetedOrganization().GUID)
    74  		if err != nil {
    75  			cmd.clearTargets()
    76  			return err
    77  		}
    78  	case cmd.Space != "":
    79  		err = cmd.setSpace()
    80  		if err != nil {
    81  			cmd.clearTargets()
    82  			return err
    83  		}
    84  	}
    85  
    86  	cmd.displayTargetTable(user)
    87  
    88  	if !cmd.Config.HasTargetedOrganization() {
    89  		cmd.UI.DisplayText("No org or space targeted, use '{{.CFTargetCommand}}'",
    90  			map[string]interface{}{
    91  				"CFTargetCommand": fmt.Sprintf("%s target -o ORG -s SPACE", cmd.Config.BinaryName()),
    92  			})
    93  		return nil
    94  	}
    95  
    96  	if !cmd.Config.HasTargetedSpace() {
    97  		cmd.UI.DisplayText("No space targeted, use '{{.CFTargetCommand}}'",
    98  			map[string]interface{}{
    99  				"CFTargetCommand": fmt.Sprintf("%s target -s SPACE", cmd.Config.BinaryName()),
   100  			})
   101  	}
   102  
   103  	return nil
   104  }
   105  
   106  func (cmd *TargetCommand) notifyCLIUpdateIfNeeded() {
   107  	err := command.MinimumAPIVersionCheck(cmd.Config.BinaryVersion(), cmd.Config.MinCLIVersion())
   108  
   109  	if _, ok := err.(command.MinimumAPIVersionNotMetError); ok {
   110  		cmd.UI.DisplayWarning("Cloud Foundry API version {{.APIVersion}} requires CLI version {{.MinCLIVersion}}. You are currently on version {{.BinaryVersion}}. To upgrade your CLI, please visit: https://github.com/cloudfoundry/cli#downloads",
   111  			map[string]interface{}{
   112  				"APIVersion":    cmd.Config.APIVersion(),
   113  				"MinCLIVersion": cmd.Config.MinCLIVersion(),
   114  				"BinaryVersion": cmd.Config.BinaryVersion(),
   115  			})
   116  	}
   117  }
   118  
   119  func (cmd TargetCommand) clearTargets() {
   120  	if cmd.Organization != "" {
   121  		cmd.Config.UnsetOrganizationInformation()
   122  		cmd.Config.UnsetSpaceInformation()
   123  	} else if cmd.Space != "" {
   124  		cmd.Config.UnsetSpaceInformation()
   125  	}
   126  }
   127  
   128  // setOrgAndSpace sets organization and space
   129  func (cmd *TargetCommand) setOrgAndSpace() error {
   130  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization)
   131  	cmd.UI.DisplayWarnings(warnings)
   132  	if err != nil {
   133  		return shared.HandleError(err)
   134  	}
   135  
   136  	space, warnings, err := cmd.Actor.GetSpaceByOrganizationAndName(org.GUID, cmd.Space)
   137  	cmd.UI.DisplayWarnings(warnings)
   138  	if err != nil {
   139  		return shared.HandleError(err)
   140  	}
   141  
   142  	cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization)
   143  	cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH)
   144  
   145  	return nil
   146  }
   147  
   148  // setOrg sets organization
   149  func (cmd *TargetCommand) setOrg() error {
   150  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization)
   151  	cmd.UI.DisplayWarnings(warnings)
   152  	if err != nil {
   153  		return shared.HandleError(err)
   154  	}
   155  
   156  	cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization)
   157  	cmd.Config.UnsetSpaceInformation()
   158  
   159  	return nil
   160  }
   161  
   162  // autoTargetSpace targets the space if there is only one space in the org
   163  // and no space arg was provided.
   164  func (cmd *TargetCommand) autoTargetSpace(orgGUID string) error {
   165  	spaces, warnings, err := cmd.Actor.GetOrganizationSpaces(orgGUID)
   166  	cmd.UI.DisplayWarnings(warnings)
   167  	if err != nil {
   168  		return shared.HandleError(err)
   169  	}
   170  
   171  	if len(spaces) == 1 {
   172  		space := spaces[0]
   173  		cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH)
   174  	}
   175  
   176  	return nil
   177  }
   178  
   179  // setSpace sets space
   180  func (cmd *TargetCommand) setSpace() error {
   181  	if !cmd.Config.HasTargetedOrganization() {
   182  		return shared.NoOrganizationTargetedError{}
   183  	}
   184  
   185  	space, warnings, err := cmd.Actor.GetSpaceByOrganizationAndName(cmd.Config.TargetedOrganization().GUID, cmd.Space)
   186  	cmd.UI.DisplayWarnings(warnings)
   187  	if err != nil {
   188  		return shared.HandleError(err)
   189  	}
   190  
   191  	cmd.Config.SetSpaceInformation(space.GUID, space.Name, space.AllowSSH)
   192  
   193  	return nil
   194  }
   195  
   196  // displayTargetTable neatly displays target information.
   197  func (cmd *TargetCommand) displayTargetTable(user configv3.User) {
   198  	table := [][]string{
   199  		{cmd.UI.TranslateText("API endpoint:"), cmd.Config.Target()},
   200  		{cmd.UI.TranslateText("API version:"), cmd.Config.APIVersion()},
   201  		{cmd.UI.TranslateText("User:"), user.Name},
   202  	}
   203  
   204  	if cmd.Config.HasTargetedOrganization() {
   205  		table = append(table, []string{
   206  			cmd.UI.TranslateText("Org:"), cmd.Config.TargetedOrganization().Name,
   207  		})
   208  	}
   209  
   210  	if cmd.Config.HasTargetedSpace() {
   211  		table = append(table, []string{
   212  			cmd.UI.TranslateText("Space:"), cmd.Config.TargetedSpace().Name,
   213  		})
   214  	}
   215  	cmd.UI.DisplayTable("", table, 3)
   216  }