github.com/asifdxtreme/cli@v6.1.3-0.20150123051144-9ead8700b4ae+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_metadata"
     7  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
     8  	"github.com/cloudfoundry/cli/cf/errors"
     9  	"github.com/cloudfoundry/cli/cf/flag_helpers"
    10  	. "github.com/cloudfoundry/cli/cf/i18n"
    11  	"github.com/cloudfoundry/cli/cf/models"
    12  	"github.com/cloudfoundry/cli/cf/requirements"
    13  	"github.com/cloudfoundry/cli/cf/terminal"
    14  	"github.com/codegangsta/cli"
    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 NewTarget(ui terminal.UI,
    25  	config core_config.ReadWriter,
    26  	orgRepo organizations.OrganizationRepository,
    27  	spaceRepo spaces.SpaceRepository) (cmd Target) {
    28  
    29  	cmd.ui = ui
    30  	cmd.config = config
    31  	cmd.orgRepo = orgRepo
    32  	cmd.spaceRepo = spaceRepo
    33  
    34  	return
    35  }
    36  
    37  func (cmd Target) Metadata() command_metadata.CommandMetadata {
    38  	return command_metadata.CommandMetadata{
    39  		Name:        "target",
    40  		ShortName:   "t",
    41  		Description: T("Set or view the targeted org or space"),
    42  		Usage:       T("CF_NAME target [-o ORG] [-s SPACE]"),
    43  		Flags: []cli.Flag{
    44  			flag_helpers.NewStringFlag("o", T("organization")),
    45  			flag_helpers.NewStringFlag("s", T("space")),
    46  		},
    47  	}
    48  }
    49  
    50  func (cmd Target) GetRequirements(requirementsFactory requirements.Factory, c *cli.Context) (reqs []requirements.Requirement, err error) {
    51  	if len(c.Args()) != 0 {
    52  		err = errors.New(T("incorrect usage"))
    53  		cmd.ui.FailWithUsage(c)
    54  		return
    55  	}
    56  
    57  	reqs = append(reqs, requirementsFactory.NewApiEndpointRequirement())
    58  	if c.String("o") != "" || c.String("s") != "" {
    59  		reqs = append(reqs, requirementsFactory.NewLoginRequirement())
    60  	}
    61  
    62  	return
    63  }
    64  
    65  func (cmd Target) Run(c *cli.Context) {
    66  	orgName := c.String("o")
    67  	spaceName := c.String("s")
    68  
    69  	if orgName != "" {
    70  		err := cmd.setOrganization(orgName)
    71  		if err != nil {
    72  			cmd.ui.Failed(err.Error())
    73  		}
    74  	}
    75  
    76  	if spaceName != "" {
    77  		err := cmd.setSpace(spaceName)
    78  		if err != nil {
    79  			cmd.ui.Failed(err.Error())
    80  		}
    81  	}
    82  
    83  	cmd.ui.ShowConfiguration(cmd.config)
    84  	if !cmd.config.IsLoggedIn() {
    85  		cmd.ui.PanicQuietly()
    86  	}
    87  	return
    88  }
    89  
    90  func (cmd Target) setOrganization(orgName string) error {
    91  	// setting an org necessarily invalidates any space you had previously targeted
    92  	cmd.config.SetOrganizationFields(models.OrganizationFields{})
    93  	cmd.config.SetSpaceFields(models.SpaceFields{})
    94  
    95  	org, apiErr := cmd.orgRepo.FindByName(orgName)
    96  	if apiErr != nil {
    97  		return errors.NewWithFmt(T("Could not target org.\n{{.ApiErr}}",
    98  			map[string]interface{}{"ApiErr": apiErr.Error()}))
    99  	}
   100  
   101  	cmd.config.SetOrganizationFields(org.OrganizationFields)
   102  	return nil
   103  }
   104  
   105  func (cmd Target) setSpace(spaceName string) error {
   106  	cmd.config.SetSpaceFields(models.SpaceFields{})
   107  
   108  	if !cmd.config.HasOrganization() {
   109  		return errors.New(T("An org must be targeted before targeting a space"))
   110  	}
   111  
   112  	space, apiErr := cmd.spaceRepo.FindByName(spaceName)
   113  	if apiErr != nil {
   114  		return errors.NewWithFmt(T("Unable to access space {{.SpaceName}}.\n{{.ApiErr}}",
   115  			map[string]interface{}{"SpaceName": spaceName, "ApiErr": apiErr.Error()}))
   116  	}
   117  
   118  	cmd.config.SetSpaceFields(space.SpaceFields)
   119  	return nil
   120  }