code.cloudfoundry.org/cli@v7.1.0+incompatible/command/v7/target_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"code.cloudfoundry.org/cli/command/translatableerror"
     7  	"code.cloudfoundry.org/cli/util/configv3"
     8  )
     9  
    10  type TargetCommand struct {
    11  	BaseCommand
    12  
    13  	Organization    string      `short:"o" description:"Organization"`
    14  	Space           string      `short:"s" description:"Space"`
    15  	usage           interface{} `usage:"CF_NAME target [-o ORG] [-s SPACE]"`
    16  	relatedCommands interface{} `related_commands:"create-org, create-space, login, orgs, spaces"`
    17  }
    18  
    19  func (cmd *TargetCommand) Execute(args []string) error {
    20  	err := cmd.SharedActor.CheckTarget(false, false)
    21  	if err != nil {
    22  		return err
    23  	}
    24  
    25  	user, err := cmd.Config.CurrentUser()
    26  	if err != nil {
    27  		cmd.clearTargets()
    28  		return err
    29  	}
    30  
    31  	switch {
    32  	case cmd.Organization != "" && cmd.Space != "":
    33  		err = cmd.setOrgAndSpace()
    34  		if err != nil {
    35  			cmd.clearTargets()
    36  			return err
    37  		}
    38  	case cmd.Organization != "":
    39  		err = cmd.setOrg()
    40  		if err != nil {
    41  			cmd.clearTargets()
    42  			return err
    43  		}
    44  		err = cmd.autoTargetSpace(cmd.Config.TargetedOrganization().GUID)
    45  		if err != nil {
    46  			cmd.clearTargets()
    47  			return err
    48  		}
    49  	case cmd.Space != "":
    50  		err = cmd.setSpace()
    51  		if err != nil {
    52  			cmd.clearTargets()
    53  			return err
    54  		}
    55  	}
    56  
    57  	cmd.displayTargetTable(user)
    58  
    59  	if !cmd.Config.HasTargetedOrganization() {
    60  		cmd.UI.DisplayText("No org or space targeted, use '{{.CFTargetCommand}}'",
    61  			map[string]interface{}{
    62  				"CFTargetCommand": fmt.Sprintf("%s target -o ORG -s SPACE", cmd.Config.BinaryName()),
    63  			})
    64  		return nil
    65  	}
    66  
    67  	if !cmd.Config.HasTargetedSpace() {
    68  		cmd.UI.DisplayText("No space targeted, use '{{.CFTargetCommand}}'",
    69  			map[string]interface{}{
    70  				"CFTargetCommand": fmt.Sprintf("%s target -s SPACE", cmd.Config.BinaryName()),
    71  			})
    72  	}
    73  
    74  	return nil
    75  }
    76  
    77  func (cmd TargetCommand) clearTargets() {
    78  	if cmd.Organization != "" {
    79  		cmd.Config.UnsetOrganizationAndSpaceInformation()
    80  	} else if cmd.Space != "" {
    81  		cmd.Config.UnsetSpaceInformation()
    82  	}
    83  }
    84  
    85  // setOrgAndSpace sets organization and space
    86  func (cmd *TargetCommand) setOrgAndSpace() error {
    87  	err := cmd.setOrg()
    88  	if err != nil {
    89  		return err
    90  	}
    91  
    92  	err = cmd.setSpace()
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	return nil
    98  }
    99  
   100  // setOrg sets organization
   101  func (cmd *TargetCommand) setOrg() error {
   102  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization)
   103  	cmd.UI.DisplayWarnings(warnings)
   104  	if err != nil {
   105  		return err
   106  	}
   107  
   108  	cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization)
   109  	cmd.Config.UnsetSpaceInformation()
   110  
   111  	return nil
   112  }
   113  
   114  // autoTargetSpace targets the space if there is only one space in the org
   115  // and no space arg was provided.
   116  func (cmd *TargetCommand) autoTargetSpace(orgGUID string) error {
   117  	spaces, warnings, err := cmd.Actor.GetOrganizationSpaces(orgGUID)
   118  	cmd.UI.DisplayWarnings(warnings)
   119  	if err != nil {
   120  		return err
   121  	}
   122  
   123  	if len(spaces) == 1 {
   124  		space := spaces[0]
   125  		cmd.Config.V7SetSpaceInformation(space.GUID, space.Name)
   126  	}
   127  
   128  	return nil
   129  }
   130  
   131  // setSpace sets space
   132  func (cmd *TargetCommand) setSpace() error {
   133  	if !cmd.Config.HasTargetedOrganization() {
   134  		return translatableerror.NoOrganizationTargetedError{BinaryName: cmd.Config.BinaryName()}
   135  	}
   136  
   137  	space, warnings, err := cmd.Actor.GetSpaceByNameAndOrganization(cmd.Space, cmd.Config.TargetedOrganization().GUID)
   138  	cmd.UI.DisplayWarnings(warnings)
   139  	if err != nil {
   140  		return err
   141  	}
   142  
   143  	cmd.Config.V7SetSpaceInformation(space.GUID, space.Name)
   144  
   145  	return nil
   146  }
   147  
   148  // displayTargetTable neatly displays target information.
   149  func (cmd *TargetCommand) displayTargetTable(user configv3.User) {
   150  	table := [][]string{
   151  		{cmd.UI.TranslateText("API endpoint:"), cmd.Config.Target()},
   152  		{cmd.UI.TranslateText("API version:"), cmd.Actor.CloudControllerAPIVersion()},
   153  		{cmd.UI.TranslateText("user:"), user.Name},
   154  	}
   155  
   156  	if cmd.Config.HasTargetedOrganization() {
   157  		table = append(table, []string{
   158  			cmd.UI.TranslateText("org:"), cmd.Config.TargetedOrganization().Name,
   159  		})
   160  	}
   161  
   162  	if cmd.Config.HasTargetedSpace() {
   163  		table = append(table, []string{
   164  			cmd.UI.TranslateText("space:"), cmd.Config.TargetedSpace().Name,
   165  		})
   166  	}
   167  	cmd.UI.DisplayKeyValueTable("", table, 3)
   168  }