github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v6/target_command.go (about)

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