github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/command/v2/target_command.go (about)

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