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 }