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

     1  package space
     2  
     3  import (
     4  	"github.com/cloudfoundry/cli/cf"
     5  	"github.com/cloudfoundry/cli/cf/api"
     6  	"github.com/cloudfoundry/cli/cf/api/organizations"
     7  	"github.com/cloudfoundry/cli/cf/api/space_quotas"
     8  	"github.com/cloudfoundry/cli/cf/api/spaces"
     9  	"github.com/cloudfoundry/cli/cf/command_registry"
    10  	"github.com/cloudfoundry/cli/cf/commands/user"
    11  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
    12  	"github.com/cloudfoundry/cli/cf/errors"
    13  	. "github.com/cloudfoundry/cli/cf/i18n"
    14  	"github.com/cloudfoundry/cli/cf/models"
    15  	"github.com/cloudfoundry/cli/cf/requirements"
    16  	"github.com/cloudfoundry/cli/cf/terminal"
    17  	"github.com/cloudfoundry/cli/flags"
    18  	"github.com/cloudfoundry/cli/flags/flag"
    19  )
    20  
    21  type CreateSpace struct {
    22  	ui              terminal.UI
    23  	config          core_config.Reader
    24  	spaceRepo       spaces.SpaceRepository
    25  	orgRepo         organizations.OrganizationRepository
    26  	userRepo        api.UserRepository
    27  	spaceRoleSetter user.SpaceRoleSetter
    28  	spaceQuotaRepo  space_quotas.SpaceQuotaRepository
    29  }
    30  
    31  func init() {
    32  	command_registry.Register(&CreateSpace{})
    33  }
    34  
    35  func (cmd *CreateSpace) MetaData() command_registry.CommandMetadata {
    36  	fs := make(map[string]flags.FlagSet)
    37  	fs["o"] = &cliFlags.StringFlag{Name: "o", Usage: T("Organization")}
    38  	fs["q"] = &cliFlags.StringFlag{Name: "q", Usage: T("Quota to assign to the newly created space (excluding this option results in assignment of default quota)")}
    39  
    40  	return command_registry.CommandMetadata{
    41  		Name:        "create-space",
    42  		Description: T("Create a space"),
    43  		Usage:       T("CF_NAME create-space SPACE [-o ORG] [-q SPACE-QUOTA]"),
    44  		Flags:       fs,
    45  	}
    46  }
    47  
    48  func (cmd *CreateSpace) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) {
    49  	if len(fc.Args()) != 1 {
    50  		cmd.ui.Failed(T("Incorrect Usage. Requires an argument\n\n") + command_registry.Commands.CommandUsage("create-space"))
    51  	}
    52  
    53  	reqs = []requirements.Requirement{requirementsFactory.NewLoginRequirement()}
    54  	if fc.String("o") == "" {
    55  		reqs = append(reqs, requirementsFactory.NewTargetedOrgRequirement())
    56  	}
    57  
    58  	return
    59  }
    60  
    61  func (cmd *CreateSpace) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command {
    62  	cmd.ui = deps.Ui
    63  	cmd.config = deps.Config
    64  	cmd.spaceRepo = deps.RepoLocator.GetSpaceRepository()
    65  	cmd.orgRepo = deps.RepoLocator.GetOrganizationRepository()
    66  	cmd.userRepo = deps.RepoLocator.GetUserRepository()
    67  	cmd.spaceQuotaRepo = deps.RepoLocator.GetSpaceQuotaRepository()
    68  
    69  	//get command from registry for dependency
    70  	commandDep := command_registry.Commands.FindCommand("set-space-role")
    71  	commandDep = commandDep.SetDependency(deps, false)
    72  	cmd.spaceRoleSetter = commandDep.(user.SpaceRoleSetter)
    73  
    74  	return cmd
    75  }
    76  
    77  func (cmd *CreateSpace) Execute(c flags.FlagContext) {
    78  	spaceName := c.Args()[0]
    79  	orgName := c.String("o")
    80  	spaceQuotaName := c.String("q")
    81  	orgGuid := ""
    82  	if orgName == "" {
    83  		orgName = cmd.config.OrganizationFields().Name
    84  		orgGuid = cmd.config.OrganizationFields().Guid
    85  	}
    86  
    87  	cmd.ui.Say(T("Creating space {{.SpaceName}} in org {{.OrgName}} as {{.CurrentUser}}...",
    88  		map[string]interface{}{
    89  			"SpaceName":   terminal.EntityNameColor(spaceName),
    90  			"OrgName":     terminal.EntityNameColor(orgName),
    91  			"CurrentUser": terminal.EntityNameColor(cmd.config.Username()),
    92  		}))
    93  
    94  	var spaceQuotaGuid string
    95  	if spaceQuotaName != "" {
    96  		spaceQuota, err := cmd.spaceQuotaRepo.FindByName(spaceQuotaName)
    97  		if err != nil {
    98  			cmd.ui.Failed(err.Error())
    99  		}
   100  		spaceQuotaGuid = spaceQuota.Guid
   101  	}
   102  
   103  	if orgGuid == "" {
   104  		org, apiErr := cmd.orgRepo.FindByName(orgName)
   105  		switch apiErr.(type) {
   106  		case nil:
   107  		case *errors.ModelNotFoundError:
   108  			cmd.ui.Failed(T("Org {{.OrgName}} does not exist or is not accessible", map[string]interface{}{"OrgName": orgName}))
   109  			return
   110  		default:
   111  			cmd.ui.Failed(T("Error finding org {{.OrgName}}\n{{.ErrorDescription}}",
   112  				map[string]interface{}{
   113  					"OrgName":          orgName,
   114  					"ErrorDescription": apiErr.Error(),
   115  				}))
   116  			return
   117  		}
   118  
   119  		orgGuid = org.Guid
   120  	}
   121  
   122  	space, err := cmd.spaceRepo.Create(spaceName, orgGuid, spaceQuotaGuid)
   123  	if err != nil {
   124  		if httpErr, ok := err.(errors.HttpError); ok && httpErr.ErrorCode() == errors.SPACE_EXISTS {
   125  			cmd.ui.Ok()
   126  			cmd.ui.Warn(T("Space {{.SpaceName}} already exists", map[string]interface{}{"SpaceName": spaceName}))
   127  			return
   128  		}
   129  		cmd.ui.Failed(err.Error())
   130  		return
   131  	}
   132  	cmd.ui.Ok()
   133  
   134  	err = cmd.spaceRoleSetter.SetSpaceRole(space, models.SPACE_MANAGER, cmd.config.UserGuid(), cmd.config.Username())
   135  	if err != nil {
   136  		cmd.ui.Failed(err.Error())
   137  		return
   138  	}
   139  
   140  	err = cmd.spaceRoleSetter.SetSpaceRole(space, models.SPACE_DEVELOPER, cmd.config.UserGuid(), cmd.config.Username())
   141  	if err != nil {
   142  		cmd.ui.Failed(err.Error())
   143  		return
   144  	}
   145  
   146  	cmd.ui.Say(T("\nTIP: Use '{{.CFTargetCommand}}' to target new space",
   147  		map[string]interface{}{
   148  			"CFTargetCommand": terminal.CommandColor(cf.Name() + " target -o \"" + orgName + "\" -s \"" + space.Name + "\""),
   149  		}))
   150  }