github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/cf/commands/spacequota/create_space_quota.go (about) 1 package spacequota 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "strconv" 7 8 "github.com/liamawhite/cli-with-i18n/cf" 9 "github.com/liamawhite/cli-with-i18n/cf/api/resources" 10 "github.com/liamawhite/cli-with-i18n/cf/api/spacequotas" 11 "github.com/liamawhite/cli-with-i18n/cf/commandregistry" 12 "github.com/liamawhite/cli-with-i18n/cf/configuration/coreconfig" 13 "github.com/liamawhite/cli-with-i18n/cf/errors" 14 "github.com/liamawhite/cli-with-i18n/cf/flags" 15 "github.com/liamawhite/cli-with-i18n/cf/formatters" 16 . "github.com/liamawhite/cli-with-i18n/cf/i18n" 17 "github.com/liamawhite/cli-with-i18n/cf/models" 18 "github.com/liamawhite/cli-with-i18n/cf/requirements" 19 "github.com/liamawhite/cli-with-i18n/cf/terminal" 20 ) 21 22 type CreateSpaceQuota struct { 23 ui terminal.UI 24 config coreconfig.Reader 25 quotaRepo spacequotas.SpaceQuotaRepository 26 } 27 28 func init() { 29 commandregistry.Register(&CreateSpaceQuota{}) 30 } 31 32 func (cmd *CreateSpaceQuota) MetaData() commandregistry.CommandMetadata { 33 fs := make(map[string]flags.FlagSet) 34 fs["allow-paid-service-plans"] = &flags.BoolFlag{Name: "allow-paid-service-plans", Usage: T("Can provision instances of paid service plans (Default: disallowed)")} 35 fs["i"] = &flags.StringFlag{ShortName: "i", Usage: T("Maximum amount of memory an application instance can have (e.g. 1024M, 1G, 10G). -1 represents an unlimited amount. (Default: unlimited)")} 36 fs["m"] = &flags.StringFlag{ShortName: "m", Usage: T("Total amount of memory a space can have (e.g. 1024M, 1G, 10G)")} 37 fs["r"] = &flags.IntFlag{ShortName: "r", Usage: T("Total number of routes")} 38 fs["s"] = &flags.IntFlag{ShortName: "s", Usage: T("Total number of service instances")} 39 fs["a"] = &flags.IntFlag{ShortName: "a", Usage: T("Total number of application instances. -1 represents an unlimited amount. (Default: unlimited)")} 40 fs["reserved-route-ports"] = &flags.IntFlag{Name: "reserved-route-ports", Usage: T("Maximum number of routes that may be created with reserved ports (Default: 0)")} 41 42 return commandregistry.CommandMetadata{ 43 Name: "create-space-quota", 44 Description: T("Define a new space resource quota"), 45 Usage: []string{ 46 "CF_NAME create-space-quota ", 47 T("QUOTA"), 48 " ", 49 fmt.Sprintf("[-i %s] ", T("INSTANCE_MEMORY")), 50 fmt.Sprintf("[-m %s] ", T("MEMORY")), 51 fmt.Sprintf("[-r %s] ", T("ROUTES")), 52 fmt.Sprintf("[-s %s] ", T("SERVICE_INSTANCES")), 53 fmt.Sprintf("[-a %s] ", T("APP_INSTANCES")), 54 "[--allow-paid-service-plans] ", 55 fmt.Sprintf("[--reserved-route-ports %s]", T("RESERVED_ROUTE_PORTS")), 56 }, 57 Flags: fs, 58 } 59 } 60 61 func (cmd *CreateSpaceQuota) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) ([]requirements.Requirement, error) { 62 if len(fc.Args()) != 1 { 63 cmd.ui.Failed(T("Incorrect Usage. Requires an argument\n\n") + commandregistry.Commands.CommandUsage("create-space-quota")) 64 return nil, fmt.Errorf("Incorrect usage: %d arguments of %d required", len(fc.Args()), 1) 65 } 66 67 reqs := []requirements.Requirement{ 68 requirementsFactory.NewLoginRequirement(), 69 requirementsFactory.NewTargetedOrgRequirement(), 70 } 71 72 if fc.IsSet("a") { 73 reqs = append(reqs, requirementsFactory.NewMinAPIVersionRequirement("Option '-a'", cf.SpaceAppInstanceLimitMinimumAPIVersion)) 74 } 75 76 if fc.IsSet("reserved-route-ports") { 77 reqs = append(reqs, requirementsFactory.NewMinAPIVersionRequirement("Option '--reserved-route-ports'", cf.ReservedRoutePortsMinimumAPIVersion)) 78 } 79 80 return reqs, nil 81 } 82 83 func (cmd *CreateSpaceQuota) SetDependency(deps commandregistry.Dependency, pluginCall bool) commandregistry.Command { 84 cmd.ui = deps.UI 85 cmd.config = deps.Config 86 cmd.quotaRepo = deps.RepoLocator.GetSpaceQuotaRepository() 87 return cmd 88 } 89 90 func (cmd *CreateSpaceQuota) Execute(context flags.FlagContext) error { 91 name := context.Args()[0] 92 org := cmd.config.OrganizationFields() 93 94 cmd.ui.Say(T("Creating space quota {{.QuotaName}} for org {{.OrgName}} as {{.Username}}...", map[string]interface{}{ 95 "QuotaName": terminal.EntityNameColor(name), 96 "OrgName": terminal.EntityNameColor(org.Name), 97 "Username": terminal.EntityNameColor(cmd.config.Username()), 98 })) 99 100 quota := models.SpaceQuota{ 101 Name: name, 102 OrgGUID: org.GUID, 103 } 104 105 memoryLimit := context.String("m") 106 if memoryLimit != "" { 107 parsedMemory, errr := formatters.ToMegabytes(memoryLimit) 108 if errr != nil { 109 return errors.New(T("Invalid memory limit: {{.MemoryLimit}}\n{{.Err}}", map[string]interface{}{"MemoryLimit": memoryLimit, "Err": errr})) 110 } 111 112 quota.MemoryLimit = parsedMemory 113 } 114 115 instanceMemoryLimit := context.String("i") 116 var parsedMemory int64 117 var err error 118 if instanceMemoryLimit == "-1" || instanceMemoryLimit == "" { 119 parsedMemory = -1 120 } else { 121 parsedMemory, err = formatters.ToMegabytes(instanceMemoryLimit) 122 if err != nil { 123 return errors.New(T("Invalid instance memory limit: {{.MemoryLimit}}\n{{.Err}}", map[string]interface{}{"MemoryLimit": instanceMemoryLimit, "Err": err})) 124 } 125 } 126 127 quota.InstanceMemoryLimit = parsedMemory 128 129 if context.IsSet("r") { 130 quota.RoutesLimit = context.Int("r") 131 } 132 133 if context.IsSet("s") { 134 quota.ServicesLimit = context.Int("s") 135 } 136 137 if context.IsSet("allow-paid-service-plans") { 138 quota.NonBasicServicesAllowed = true 139 } 140 141 if context.IsSet("a") { 142 quota.AppInstanceLimit = context.Int("a") 143 } else { 144 quota.AppInstanceLimit = resources.UnlimitedAppInstances 145 } 146 147 if context.IsSet("reserved-route-ports") { 148 quota.ReservedRoutePortsLimit = json.Number(strconv.Itoa(context.Int("reserved-route-ports"))) 149 } 150 151 err = cmd.quotaRepo.Create(quota) 152 153 httpErr, ok := err.(errors.HTTPError) 154 if ok && httpErr.ErrorCode() == errors.QuotaDefinitionNameTaken { 155 cmd.ui.Ok() 156 cmd.ui.Warn(T("Space Quota Definition {{.QuotaName}} already exists", map[string]interface{}{"QuotaName": quota.Name})) 157 return nil 158 } 159 160 if err != nil { 161 return err 162 } 163 164 cmd.ui.Ok() 165 return nil 166 }