github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/command/v2/target_command.go (about)

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