func (cmd *UpdateUserProvidedService) Run(c *cli.Context) { serviceInstance := cmd.serviceInstanceReq.GetServiceInstance() if !serviceInstance.IsUserProvided() { cmd.ui.Failed(T("Service Instance is not user provided")) return } drainUrl := c.String("l") params := c.String("p") paramsMap := make(map[string]interface{}) if params != "" { err := json.Unmarshal([]byte(params), ¶msMap) if err != nil { cmd.ui.Failed(T("JSON is invalid: {{.ErrorDescription}}", map[string]interface{}{"ErrorDescription": err.Error()})) return } } cmd.ui.Say(T("Updating user provided service {{.ServiceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", map[string]interface{}{ "ServiceName": terminal.EntityNameColor(serviceInstance.Name), "OrgName": terminal.EntityNameColor(cmd.config.OrganizationFields().Name), "SpaceName": terminal.EntityNameColor(cmd.config.SpaceFields().Name), "CurrentUser": terminal.EntityNameColor(cmd.config.Username()), })) serviceInstance.Params = paramsMap serviceInstance.SysLogDrainUrl = drainUrl apiErr := cmd.userProvidedServiceInstanceRepo.Update(serviceInstance.ServiceInstanceFields) if apiErr != nil { cmd.ui.Failed(apiErr.Error()) return } cmd.ui.Ok() cmd.ui.Say(T("TIP: To make these changes take effect, use '{{.CFUnbindCommand}}' to unbind the service, '{{.CFBindComand}}' to rebind, and then '{{.CFRestageCommand}}' to update the app with the new env variables", map[string]interface{}{ "CFUnbindCommand": cf.Name() + " unbind-service", "CFBindComand": cf.Name() + " bind-service", "CFRestageCommand": cf.Name() + " restage", })) if params == "" && drainUrl == "" { cmd.ui.Warn(T("No flags specified. No changes were made.")) } }
func CrashDialog(errorMessage string, commandArgs string, stackTrace string) string { formattedString := ` Aww shucks. Something completely unexpected happened. This is a bug in %s. Please file this bug : https://github.com/nttlabs/cli/issues Tell us that you ran this command: %s using this version of the CLI: %s and that this error occurred: %s and this stack trace: %s ` return fmt.Sprintf(formattedString, cf.Name(), commandArgs, cf.Version, errorMessage, stackTrace) }
func (cmd *UnsetEnv) Run(c *cli.Context) { varName := c.Args()[1] app := cmd.appReq.GetApplication() cmd.ui.Say(T("Removing env variable {{.VarName}} from app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", map[string]interface{}{ "VarName": terminal.EntityNameColor(varName), "AppName": terminal.EntityNameColor(app.Name), "OrgName": terminal.EntityNameColor(cmd.config.OrganizationFields().Name), "SpaceName": terminal.EntityNameColor(cmd.config.SpaceFields().Name), "CurrentUser": terminal.EntityNameColor(cmd.config.Username())})) envParams := app.EnvironmentVars if _, ok := envParams[varName]; !ok { cmd.ui.Ok() cmd.ui.Warn(T("Env variable {{.VarName}} was not set.", map[string]interface{}{"VarName": varName})) return } delete(envParams, varName) _, apiErr := cmd.appRepo.Update(app.Guid, models.AppParams{EnvironmentVars: &envParams}) if apiErr != nil { cmd.ui.Failed(apiErr.Error()) return } cmd.ui.Ok() cmd.ui.Say(T("TIP: Use '{{.Command}}' to ensure your env variable changes take effect", map[string]interface{}{"Command": terminal.CommandColor(cf.Name() + " restage")})) }
func (cmd *RenameService) Run(c *cli.Context) { newName := c.Args()[1] serviceInstance := cmd.serviceInstanceReq.GetServiceInstance() cmd.ui.Say(T("Renaming service {{.ServiceName}} to {{.NewServiceName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", map[string]interface{}{ "ServiceName": terminal.EntityNameColor(serviceInstance.Name), "NewServiceName": terminal.EntityNameColor(newName), "OrgName": terminal.EntityNameColor(cmd.config.OrganizationFields().Name), "SpaceName": terminal.EntityNameColor(cmd.config.SpaceFields().Name), "CurrentUser": terminal.EntityNameColor(cmd.config.Username()), })) err := cmd.serviceRepo.RenameService(serviceInstance, newName) if err != nil { if httpError, ok := err.(errors.HttpError); ok && httpError.ErrorCode() == errors.SERVICE_INSTANCE_NAME_TAKEN { cmd.ui.Failed(T("{{.ErrorDescription}}\nTIP: Use '{{.CFServicesCommand}}' to view all services in this org and space.", map[string]interface{}{ "ErrorDescription": httpError.Error(), "CFServicesCommand": cf.Name() + " " + "services", })) } else { cmd.ui.Failed(err.Error()) } } cmd.ui.Ok() }
func (cmd *DeleteSpace) Run(c *cli.Context) { spaceName := c.Args()[0] if !c.Bool("f") { if !cmd.ui.ConfirmDelete(T("space"), spaceName) { return } } cmd.ui.Say(T("Deleting space {{.TargetSpace}} in org {{.TargetOrg}} as {{.CurrentUser}}...", map[string]interface{}{ "TargetSpace": terminal.EntityNameColor(spaceName), "TargetOrg": terminal.EntityNameColor(cmd.config.OrganizationFields().Name), "CurrentUser": terminal.EntityNameColor(cmd.config.Username()), })) space := cmd.spaceReq.GetSpace() apiErr := cmd.spaceRepo.Delete(space.Guid) if apiErr != nil { cmd.ui.Failed(apiErr.Error()) return } cmd.ui.Ok() if cmd.config.SpaceFields().Name == spaceName { cmd.config.SetSpaceFields(models.SpaceFields{}) cmd.ui.Say(T("TIP: No space targeted, use '{{.CfTargetCommand}}' to target a space", map[string]interface{}{"CfTargetCommand": cf.Name() + " target -s"})) } return }
func (cmd *SetEnv) Run(c *cli.Context) { varName := c.Args()[1] varValue := c.Args()[2] app := cmd.appReq.GetApplication() cmd.ui.Say(T("Setting env variable '{{.VarName}}' to '{{.VarValue}}' for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.CurrentUser}}...", map[string]interface{}{ "VarName": terminal.EntityNameColor(varName), "VarValue": terminal.EntityNameColor(varValue), "AppName": terminal.EntityNameColor(app.Name), "OrgName": terminal.EntityNameColor(cmd.config.OrganizationFields().Name), "SpaceName": terminal.EntityNameColor(cmd.config.SpaceFields().Name), "CurrentUser": terminal.EntityNameColor(cmd.config.Username())})) if len(app.EnvironmentVars) == 0 { app.EnvironmentVars = map[string]string{} } envParams := app.EnvironmentVars envParams[varName] = varValue _, apiErr := cmd.appRepo.Update(app.Guid, models.AppParams{EnvironmentVars: &envParams}) if apiErr != nil { cmd.ui.Failed(apiErr.Error()) return } cmd.ui.Ok() cmd.ui.Say(T("TIP: Use '{{.Command}}' to ensure your env variable changes take effect", map[string]interface{}{"Command": terminal.CommandColor(cf.Name() + " restage")})) }
func (cmd CreateOrg) Run(c *cli.Context) { name := c.Args()[0] cmd.ui.Say(T("Creating org {{.OrgName}} as {{.Username}}...", map[string]interface{}{ "OrgName": terminal.EntityNameColor(name), "Username": terminal.EntityNameColor(cmd.config.Username())})) org := models.Organization{OrganizationFields: models.OrganizationFields{Name: name}} quotaName := c.String("q") if quotaName != "" { quota, err := cmd.quotaRepo.FindByName(quotaName) if err != nil { cmd.ui.Failed(err.Error()) } org.QuotaDefinition.Guid = quota.Guid } err := cmd.orgRepo.Create(org) if err != nil { if apiErr, ok := err.(errors.HttpError); ok && apiErr.ErrorCode() == errors.ORG_EXISTS { cmd.ui.Ok() cmd.ui.Warn(T("Org {{.OrgName}} already exists", map[string]interface{}{"OrgName": name})) return } else { cmd.ui.Failed(err.Error()) } } cmd.ui.Ok() cmd.ui.Say(T("\nTIP: Use '{{.Command}}' to target new org", map[string]interface{}{"Command": terminal.CommandColor(cf.Name() + " target -o " + name)})) }
func (cmd Start) waitForOneRunningInstance(app models.Application) { startupStartTime := time.Now() for { if time.Since(startupStartTime) > cmd.StartupTimeout { cmd.ui.Failed(fmt.Sprintf(T("Start app timeout\n\nTIP: use '{{.Command}}' for more information", map[string]interface{}{ "Command": terminal.CommandColor(fmt.Sprintf("%s logs %s --recent", cf.Name(), app.Name))}))) return } count, err := cmd.fetchInstanceCount(app.Guid) if err != nil { cmd.ui.Wait(cmd.PingerThrottle) continue } cmd.ui.Say(instancesDetails(count)) if count.running > 0 { return } if count.flapping > 0 { cmd.ui.Failed(fmt.Sprintf(T("Start unsuccessful\n\nTIP: use '{{.Command}}' for more information", map[string]interface{}{"Command": terminal.CommandColor(fmt.Sprintf("%s logs %s --recent", cf.Name(), app.Name))}))) return } cmd.ui.Wait(cmd.PingerThrottle) } }
func getCommand(metadata command_metadata.CommandMetadata, runner command_runner.Runner) cli.Command { return cli.Command{ Name: metadata.Name, ShortName: metadata.ShortName, Description: metadata.Description, Usage: strings.Replace(metadata.Usage, "CF_NAME", cf.Name(), -1), Action: func(context *cli.Context) { err := runner.RunCmdByName(metadata.Name, context) if err != nil { panic(terminal.QuietPanic) } }, Flags: metadata.Flags, SkipFlagParsing: metadata.SkipFlagParsing, } }
func (cmd Authenticate) Run(c *cli.Context) { cmd.config.ClearSession() cmd.authenticator.GetLoginPromptsAndSaveUAAServerURL() cmd.ui.Say(T("API endpoint: {{.ApiEndpoint}}", map[string]interface{}{"ApiEndpoint": terminal.EntityNameColor(cmd.config.ApiEndpoint())})) cmd.ui.Say(T("Authenticating...")) apiErr := cmd.authenticator.Authenticate(map[string]string{"username": c.Args()[0], "password": c.Args()[1]}) if apiErr != nil { cmd.ui.Failed(apiErr.Error()) return } cmd.ui.Ok() cmd.ui.Say(T("Use '{{.Name}}' to view or set your target org and space", map[string]interface{}{"Name": terminal.CommandColor(cf.Name() + " target")})) return }
func (cmd Start) waitForInstancesToStage(app models.Application) { stagingStartTime := time.Now() _, err := cmd.appInstancesRepo.GetInstances(app.Guid) for isStagingError(err) && time.Since(stagingStartTime) < cmd.StagingTimeout { cmd.ui.Wait(cmd.PingerThrottle) _, err = cmd.appInstancesRepo.GetInstances(app.Guid) } if err != nil && !isStagingError(err) { cmd.ui.Say("") cmd.ui.Failed(T("{{.Err}}\n\nTIP: use '{{.Command}}' for more information", map[string]interface{}{ "Err": err.Error(), "Command": terminal.CommandColor(fmt.Sprintf("%s logs %s --recent", cf.Name(), app.Name))})) } return }
func (req TargetedSpaceRequirement) Execute() (success bool) { if !req.config.HasOrganization() { message := fmt.Sprintf(T("No org and space targeted, use '{{.Command}}' to target an org and space", map[string]interface{}{"Command": terminal.CommandColor(cf.Name() + " target -o ORG -s SPACE")})) req.ui.Failed(message) return false } if !req.config.HasSpace() { message := fmt.Sprintf(T("No space targeted, use '{{.Command}}' to target a space", map[string]interface{}{"Command": terminal.CommandColor("cf target -s")})) req.ui.Failed(message) return false } return true }
func NewApp(cmdRunner command_runner.Runner, metadatas ...command_metadata.CommandMetadata) (app *cli.App) { helpCommand := cli.Command{ Name: "help", ShortName: "h", Description: T("Show help"), Usage: fmt.Sprintf(T("{{.Command}} help [COMMAND]", map[string]interface{}{"Command": cf.Name()})), Action: func(c *cli.Context) { args := c.Args() if len(args) > 0 { cli.ShowCommandHelp(c, args[0]) } else { showAppHelp(appHelpTemplate(), c.App) } }, } cli.AppHelpTemplate = appHelpTemplate() cli.HelpPrinter = ShowHelp trace.Logger.Printf("\n%s\n%s\n\n", terminal.HeaderColor(T("VERSION:")), cf.Version) app = cli.NewApp() app.Usage = Usage() app.Version = cf.Version + "-" + cf.BuiltOnDate app.Action = helpCommand.Action app.CommandNotFound = func(c *cli.Context, command string) { panic(errors.Exception{ Message: fmt.Sprintf(UnknownCommand, command), DisplayCrashDialog: false, }) } compiledAtTime, err := time.Parse("2006-01-02T03:04:05+00:00", cf.BuiltOnDate) if err == nil { app.Compiled = compiledAtTime } else { err = nil app.Compiled = time.Now() } app.Commands = []cli.Command{helpCommand} for _, metadata := range metadatas { app.Commands = append(app.Commands, getCommand(metadata, cmdRunner)) } return }
[]string{"OK"}, []string{"Uploading buildpack", "my-buildpack"}, []string{"OK"}, )) Expect(ui.Outputs).ToNot(ContainSubstrings([]string{"FAILED"})) }) It("warns the user when the buildpack already exists", func() { repo.CreateBuildpackExists = true testcmd.RunCommand(cmd, []string{"my-buildpack", "my.war", "5"}, requirementsFactory) Expect(ui.Outputs).To(ContainSubstrings( []string{"Creating buildpack", "my-buildpack"}, []string{"OK"}, []string{"my-buildpack", "already exists"}, []string{"TIP", "use", cf.Name(), "update-buildpack"}, )) Expect(ui.Outputs).ToNot(ContainSubstrings([]string{"FAILED"})) }) It("enables the buildpack when given the --enabled flag", func() { testcmd.RunCommand(cmd, []string{"--enable", "my-buildpack", "my.war", "5"}, requirementsFactory) Expect(*repo.CreateBuildpack.Enabled).To(Equal(true)) }) It("disables the buildpack when given the --disable flag", func() { testcmd.RunCommand(cmd, []string{"--disable", "my-buildpack", "my.war", "5"}, requirementsFactory) Expect(*repo.CreateBuildpack.Enabled).To(Equal(false)) }) It("alerts the user when uploading the buildpack bits fails", func() {
It("prints out the api endpoint", func() { Expect(ui.Outputs).To(ContainSubstrings([]string{"https://api.run.pivotal.io", "2.0"})) }) It("should not change the SSL setting in the config", func() { Expect(config.IsSSLDisabled()).To(BeTrue()) }) }) Context("when the endpoint is not set in the config", func() { It("prompts the user to set an endpoint", func() { ui := callApi([]string{}, config, endpointRepo) Expect(ui.Outputs).To(ContainSubstrings( []string{"No api endpoint set", fmt.Sprintf("Use '%s api' to set an endpoint", cf.Name())}, )) }) }) }) Context("when the user provides the --skip-ssl-validation flag", func() { It("updates the SSLDisabled field in config", func() { config.SetSSLDisabled(false) callApi([]string{"--skip-ssl-validation", "https://example.com"}, config, endpointRepo) Expect(config.IsSSLDisabled()).To(Equal(true)) }) }) Context("the user provides an endpoint", func() {
func (cmd CreateBuildpack) Run(c *cli.Context) { if len(c.Args()) != 3 { cmd.ui.FailWithUsage(c) return } buildpackName := c.Args()[0] cmd.ui.Say(T("Creating buildpack {{.BuildpackName}}...", map[string]interface{}{"BuildpackName": terminal.EntityNameColor(buildpackName)})) buildpack, err := cmd.createBuildpack(buildpackName, c) if err != nil { if httpErr, ok := err.(errors.HttpError); ok && httpErr.ErrorCode() == errors.BUILDPACK_EXISTS { cmd.ui.Ok() cmd.ui.Warn(T("Buildpack {{.BuildpackName}} already exists", map[string]interface{}{"BuildpackName": buildpackName})) cmd.ui.Say(T("TIP: use '{{.CfUpdateBuildpackCommand}}' to update this buildpack", map[string]interface{}{"CfUpdateBuildpackCommand": terminal.CommandColor(cf.Name() + " " + "update-buildpack")})) } else { cmd.ui.Failed(err.Error()) } return } cmd.ui.Ok() cmd.ui.Say("") cmd.ui.Say(T("Uploading buildpack {{.BuildpackName}}...", map[string]interface{}{"BuildpackName": terminal.EntityNameColor(buildpackName)})) dir := c.Args()[1] err = cmd.buildpackBitsRepo.UploadBuildpack(buildpack, dir) if err != nil { cmd.ui.Failed(err.Error()) return } cmd.ui.Ok() }
func (ui *terminalUI) ShowConfiguration(config core_config.Reader) { table := NewTable(ui, []string{"", ""}) if config.HasAPIEndpoint() { table.Add( T("API endpoint:"), T("{{.ApiEndpoint}} (API version: {{.ApiVersionString}})", map[string]interface{}{ "ApiEndpoint": EntityNameColor(config.ApiEndpoint()), "ApiVersionString": EntityNameColor(config.ApiVersion()), }), ) } if !config.IsLoggedIn() { table.Print() ui.Say(NotLoggedInText()) return } else { table.Add( T("User:"******"%s target -o ORG -s SPACE", cf.Name()) ui.Say(T("No org or space targeted, use '{{.CFTargetCommand}}'", map[string]interface{}{ "CFTargetCommand": CommandColor(command), })) return } if config.HasOrganization() { table.Add( T("Org:"), EntityNameColor(config.OrganizationFields().Name), ) } else { command := fmt.Sprintf("%s target -o Org", cf.Name()) table.Add( T("Org:"), T("No org targeted, use '{{.CFTargetCommand}}'", map[string]interface{}{ "CFTargetCommand": CommandColor(command), }), ) } if config.HasSpace() { table.Add( T("Space:"), EntityNameColor(config.SpaceFields().Name), ) } else { command := fmt.Sprintf("%s target -s SPACE", cf.Name()) table.Add( T("Space:"), T("No space targeted, use '{{.CFTargetCommand}}'", map[string]interface{}{"CFTargetCommand": CommandColor(command)}), ) } table.Print() }
func (req ApiEndpointRequirement) Execute() (success bool) { if req.config.ApiEndpoint() == "" { loginTip := terminal.CommandColor(fmt.Sprintf(T("{{.CFName}} login", map[string]interface{}{"CFName": cf.Name()}))) apiTip := terminal.CommandColor(fmt.Sprintf(T("{{.CFName}} api", map[string]interface{}{"CFName": cf.Name()}))) req.ui.Say(T("No API endpoint set. Use '{{.LoginTip}}' or '{{.APITip}}' to target an endpoint.", map[string]interface{}{ "LoginTip": loginTip, "APITip": apiTip, })) return false } return true }
func (req targetedOrgApiRequirement) Execute() (success bool) { if !req.config.HasOrganization() { message := fmt.Sprintf(T("No org targeted, use '{{.Command}}' to target an org.", map[string]interface{}{"Command": terminal.CommandColor(cf.Name() + " target -o ORG")})) req.ui.Failed(message) return false } return true }
func NotLoggedInText() string { return fmt.Sprintf(T("Not logged in. Use '{{.CFLoginCommand}}' to log in.", map[string]interface{}{"CFLoginCommand": CommandColor(cf.Name() + " " + "login")})) }
func (cmd CreateSpace) Run(c *cli.Context) { spaceName := c.Args()[0] orgName := c.String("o") orgGuid := "" if orgName == "" { orgName = cmd.config.OrganizationFields().Name orgGuid = cmd.config.OrganizationFields().Guid } cmd.ui.Say(T("Creating space {{.SpaceName}} in org {{.OrgName}} as {{.CurrentUser}}...", map[string]interface{}{ "SpaceName": terminal.EntityNameColor(spaceName), "OrgName": terminal.EntityNameColor(orgName), "CurrentUser": terminal.EntityNameColor(cmd.config.Username()), })) if orgGuid == "" { org, apiErr := cmd.orgRepo.FindByName(orgName) switch apiErr.(type) { case nil: case *errors.ModelNotFoundError: cmd.ui.Failed(T("Org {{.OrgName}} does not exist or is not accessible", map[string]interface{}{"OrgName": orgName})) return default: cmd.ui.Failed(T("Error finding org {{.OrgName}}\n{{.ErrorDescription}}", map[string]interface{}{ "OrgName": orgName, "ErrorDescription": apiErr.Error(), })) return } orgGuid = org.Guid } space, err := cmd.spaceRepo.Create(spaceName, orgGuid) if err != nil { if httpErr, ok := err.(errors.HttpError); ok && httpErr.ErrorCode() == errors.SPACE_EXISTS { cmd.ui.Ok() cmd.ui.Warn(T("Space {{.SpaceName}} already exists", map[string]interface{}{"SpaceName": spaceName})) return } cmd.ui.Failed(err.Error()) return } cmd.ui.Ok() err = cmd.spaceRoleSetter.SetSpaceRole(space, models.SPACE_MANAGER, cmd.config.UserGuid(), cmd.config.Username()) if err != nil { cmd.ui.Failed(err.Error()) return } err = cmd.spaceRoleSetter.SetSpaceRole(space, models.SPACE_DEVELOPER, cmd.config.UserGuid(), cmd.config.Username()) if err != nil { cmd.ui.Failed(err.Error()) return } cmd.ui.Say(T("\nTIP: Use '{{.CFTargetCommand}}' to target new space", map[string]interface{}{ "CFTargetCommand": terminal.CommandColor(cf.Name() + " target -o " + orgName + " -s " + space.Name), })) }
Expect(len(ui.Outputs)).To(Equal(0)) }) }) }) Describe("CrashDialog", func() { var errMsg = "this is an error" var commandArgs = "command line arguments" var stackTrace = "1000 bottles of beer" It("should return a string containing the default error text", func() { Expect(CrashDialog(errMsg, commandArgs, stackTrace)).To(ContainSubstring("Please file this bug : https://github.com/nttlabs/cli/issues")) }) It("should return the command name", func() { Expect(CrashDialog(errMsg, commandArgs, stackTrace)).To(ContainSubstring(cf.Name())) }) It("should return the inputted arguments", func() { Expect(CrashDialog(errMsg, commandArgs, stackTrace)).To(ContainSubstring("command line arguments")) }) It("should return the specific error message", func() { Expect(CrashDialog(errMsg, commandArgs, stackTrace)).To(ContainSubstring("this is an error")) }) It("should return the stack trace", func() { Expect(CrashDialog(errMsg, commandArgs, stackTrace)).To(ContainSubstring("1000 bottles of beer")) }) It("should print the cli version", func() {
func (cmd CreateUser) Run(c *cli.Context) { username := c.Args()[0] password := c.Args()[1] cmd.ui.Say(T("Creating user {{.TargetUser}} as {{.CurrentUser}}...", map[string]interface{}{ "TargetUser": terminal.EntityNameColor(username), "CurrentUser": terminal.EntityNameColor(cmd.config.Username()), })) err := cmd.userRepo.Create(username, password) switch err.(type) { case nil: case *errors.ModelAlreadyExistsError: cmd.ui.Warn("%s", err.Error()) default: cmd.ui.Failed(T("Error creating user {{.TargetUser}}.\n{{.Error}}", map[string]interface{}{ "TargetUser": terminal.EntityNameColor(username), "Error": err.Error(), })) } cmd.ui.Ok() cmd.ui.Say(T("\nTIP: Assign roles with '{{.CurrentUser}} set-org-role' and '{{.CurrentUser}} set-space-role'", map[string]interface{}{"CurrentUser": cf.Name()})) }