github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/target.go (about)

     1  package commands
     2  
     3  import (
     4  	"github.com/cloudfoundry/cli/cf/api/organizations"
     5  	"github.com/cloudfoundry/cli/cf/api/spaces"
     6  	"github.com/cloudfoundry/cli/cf/command_registry"
     7  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
     8  	"github.com/cloudfoundry/cli/cf/errors"
     9  	. "github.com/cloudfoundry/cli/cf/i18n"
    10  	"github.com/cloudfoundry/cli/cf/models"
    11  	"github.com/cloudfoundry/cli/cf/requirements"
    12  	"github.com/cloudfoundry/cli/cf/terminal"
    13  	"github.com/cloudfoundry/cli/flags"
    14  	"github.com/cloudfoundry/cli/flags/flag"
    15  )
    16  
    17  type Target struct {
    18  	ui        terminal.UI
    19  	config    core_config.ReadWriter
    20  	orgRepo   organizations.OrganizationRepository
    21  	spaceRepo spaces.SpaceRepository
    22  }
    23  
    24  func init() {
    25  	command_registry.Register(&Target{})
    26  }
    27  
    28  func (cmd *Target) MetaData() command_registry.CommandMetadata {
    29  	fs := make(map[string]flags.FlagSet)
    30  	fs["o"] = &cliFlags.StringFlag{Name: "o", Usage: T("organization")}
    31  	fs["s"] = &cliFlags.StringFlag{Name: "s", Usage: T("space")}
    32  
    33  	return command_registry.CommandMetadata{
    34  		Name:        "target",
    35  		ShortName:   "t",
    36  		Description: T("Set or view the targeted org or space"),
    37  		Usage:       T("CF_NAME target [-o ORG] [-s SPACE]"),
    38  		Flags:       fs,
    39  	}
    40  }
    41  
    42  func (cmd *Target) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) {
    43  	if len(fc.Args()) != 0 {
    44  		cmd.ui.Failed(T("Incorrect Usage. No argument required\n\n") + command_registry.Commands.CommandUsage("target"))
    45  	}
    46  
    47  	reqs = []requirements.Requirement{
    48  		requirementsFactory.NewApiEndpointRequirement(),
    49  	}
    50  
    51  	if fc.IsSet("o") || fc.IsSet("s") {
    52  		reqs = append(reqs, requirementsFactory.NewLoginRequirement())
    53  	}
    54  
    55  	return
    56  }
    57  
    58  func (cmd *Target) SetDependency(deps command_registry.Dependency, _ bool) command_registry.Command {
    59  	cmd.ui = deps.Ui
    60  	cmd.config = deps.Config
    61  	cmd.orgRepo = deps.RepoLocator.GetOrganizationRepository()
    62  	cmd.spaceRepo = deps.RepoLocator.GetSpaceRepository()
    63  	return cmd
    64  }
    65  
    66  func (cmd *Target) Execute(c flags.FlagContext) {
    67  	orgName := c.String("o")
    68  	spaceName := c.String("s")
    69  
    70  	if orgName != "" {
    71  		err := cmd.setOrganization(orgName)
    72  		if err != nil {
    73  			cmd.ui.Failed(err.Error())
    74  		} else if spaceName == "" {
    75  			spaceList, apiErr := cmd.getSpaceList()
    76  			if apiErr == nil && len(spaceList) == 1 {
    77  				cmd.setSpace(spaceList[0].Name)
    78  			}
    79  		}
    80  	}
    81  
    82  	if spaceName != "" {
    83  		err := cmd.setSpace(spaceName)
    84  		if err != nil {
    85  			cmd.ui.Failed(err.Error())
    86  		}
    87  	}
    88  
    89  	cmd.ui.ShowConfiguration(cmd.config)
    90  	if !cmd.config.IsLoggedIn() {
    91  		cmd.ui.PanicQuietly()
    92  	}
    93  	cmd.ui.NotifyUpdateIfNeeded(cmd.config)
    94  	return
    95  }
    96  
    97  func (cmd Target) setOrganization(orgName string) error {
    98  	// setting an org necessarily invalidates any space you had previously targeted
    99  	cmd.config.SetOrganizationFields(models.OrganizationFields{})
   100  	cmd.config.SetSpaceFields(models.SpaceFields{})
   101  
   102  	org, apiErr := cmd.orgRepo.FindByName(orgName)
   103  	if apiErr != nil {
   104  		return errors.NewWithFmt(T("Could not target org.\n{{.ApiErr}}",
   105  			map[string]interface{}{"ApiErr": apiErr.Error()}))
   106  	}
   107  
   108  	cmd.config.SetOrganizationFields(org.OrganizationFields)
   109  	return nil
   110  }
   111  
   112  func (cmd Target) setSpace(spaceName string) error {
   113  	cmd.config.SetSpaceFields(models.SpaceFields{})
   114  
   115  	if !cmd.config.HasOrganization() {
   116  		return errors.New(T("An org must be targeted before targeting a space"))
   117  	}
   118  
   119  	space, apiErr := cmd.spaceRepo.FindByName(spaceName)
   120  	if apiErr != nil {
   121  		return errors.NewWithFmt(T("Unable to access space {{.SpaceName}}.\n{{.ApiErr}}",
   122  			map[string]interface{}{"SpaceName": spaceName, "ApiErr": apiErr.Error()}))
   123  	}
   124  
   125  	cmd.config.SetSpaceFields(space.SpaceFields)
   126  	return nil
   127  }
   128  
   129  func (cmd Target) getSpaceList() ([]models.Space, error) {
   130  	spaceList := []models.Space{}
   131  	apiErr := cmd.spaceRepo.ListSpaces(
   132  		func(space models.Space) bool {
   133  			spaceList = append(spaceList, space)
   134  			return true
   135  		})
   136  	return spaceList, apiErr
   137  }