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