github.com/arunkumar7540/cli@v6.45.0+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  
    16  type TargetActor interface {
    17  	GetOrganizationByName(orgName string) (v7action.Organization, v7action.Warnings, error)
    18  	GetOrganizationSpaces(orgGUID string) ([]v7action.Space, v7action.Warnings, error)
    19  	GetSpaceByNameAndOrganization(spaceName string, orgGUID string) (v7action.Space, v7action.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.NewClients(config, ui, true, "")
    41  	if err != nil {
    42  		return err
    43  	}
    44  	cmd.Actor = v7action.NewActor(ccClient, config, nil, uaaClient)
    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  	err := cmd.setOrg()
   123  	if err != nil {
   124  		return err
   125  	}
   126  
   127  	err = cmd.setSpace()
   128  	if err != nil {
   129  		return err
   130  	}
   131  
   132  	return nil
   133  }
   134  
   135  // setOrg sets organization
   136  func (cmd *TargetCommand) setOrg() error {
   137  	org, warnings, err := cmd.Actor.GetOrganizationByName(cmd.Organization)
   138  	cmd.UI.DisplayWarnings(warnings)
   139  	if err != nil {
   140  		return err
   141  	}
   142  
   143  	cmd.Config.SetOrganizationInformation(org.GUID, cmd.Organization)
   144  	cmd.Config.UnsetSpaceInformation()
   145  
   146  	return nil
   147  }
   148  
   149  // autoTargetSpace targets the space if there is only one space in the org
   150  // and no space arg was provided.
   151  func (cmd *TargetCommand) autoTargetSpace(orgGUID string) error {
   152  	spaces, warnings, err := cmd.Actor.GetOrganizationSpaces(orgGUID)
   153  	cmd.UI.DisplayWarnings(warnings)
   154  	if err != nil {
   155  		return err
   156  	}
   157  
   158  	if len(spaces) == 1 {
   159  		space := spaces[0]
   160  		cmd.Config.V7SetSpaceInformation(space.GUID, space.Name)
   161  	}
   162  
   163  	return nil
   164  }
   165  
   166  // setSpace sets space
   167  func (cmd *TargetCommand) setSpace() error {
   168  	if !cmd.Config.HasTargetedOrganization() {
   169  		return translatableerror.NoOrganizationTargetedError{BinaryName: cmd.Config.BinaryName()}
   170  	}
   171  
   172  	space, warnings, err := cmd.Actor.GetSpaceByNameAndOrganization(cmd.Space, cmd.Config.TargetedOrganization().GUID)
   173  	cmd.UI.DisplayWarnings(warnings)
   174  	if err != nil {
   175  		return err
   176  	}
   177  
   178  	cmd.Config.V7SetSpaceInformation(space.GUID, space.Name)
   179  
   180  	return nil
   181  }
   182  
   183  // displayTargetTable neatly displays target information.
   184  func (cmd *TargetCommand) displayTargetTable(user configv3.User) {
   185  	table := [][]string{
   186  		{cmd.UI.TranslateText("api endpoint:"), cmd.Config.Target()},
   187  		{cmd.UI.TranslateText("api version:"), cmd.Actor.CloudControllerAPIVersion()},
   188  		{cmd.UI.TranslateText("user:"), user.Name},
   189  	}
   190  
   191  	if cmd.Config.HasTargetedOrganization() {
   192  		table = append(table, []string{
   193  			cmd.UI.TranslateText("org:"), cmd.Config.TargetedOrganization().Name,
   194  		})
   195  	}
   196  
   197  	if cmd.Config.HasTargetedSpace() {
   198  		table = append(table, []string{
   199  			cmd.UI.TranslateText("space:"), cmd.Config.TargetedSpace().Name,
   200  		})
   201  	}
   202  	cmd.UI.DisplayKeyValueTable("", table, 3)
   203  }