github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+incompatible/command/v7/target_command.go (about)

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