func RunMethodIfExists(coreCommandRunner *cli.App, args []string, outputCapture terminal.OutputCapture, terminalOutputSwitch terminal.TerminalOutputSwitch) bool { pluginsConfig := plugin_config.NewPluginConfig(func(err error) { panic(err) }) pluginList := pluginsConfig.Plugins() for _, metadata := range pluginList { for _, command := range metadata.Commands { if command.Name == args[0] { cliServer, err := startCliServer(coreCommandRunner, outputCapture, terminalOutputSwitch) if err != nil { os.Exit(1) } defer cliServer.Stop() pluginArgs := append([]string{cliServer.Port()}, args...) cmd := exec.Command(metadata.Location, pluginArgs...) cmd.Stdout = os.Stdout cmd.Stdin = os.Stdin defer stopPlugin(cmd) err = cmd.Run() if err != nil { os.Exit(1) } return true } } } return false }
func setupDependencies() (deps *cliDependencies) { deps = new(cliDependencies) deps.teePrinter = terminal.NewTeePrinter() deps.termUI = terminal.NewUI(os.Stdin, deps.teePrinter) deps.manifestRepo = manifest.NewManifestDiskRepository() errorHandler := func(err error) { if err != nil { deps.termUI.Failed(fmt.Sprintf("Config error: %s", err)) } } deps.configRepo = core_config.NewRepositoryFromFilepath(config_helpers.DefaultFilePath(), errorHandler) deps.pluginConfig = plugin_config.NewPluginConfig(errorHandler) i18n.T = i18n.Init(deps.configRepo) terminal.UserAskedForColors = deps.configRepo.ColorEnabled() terminal.InitColorSupport() if os.Getenv("CF_TRACE") != "" { trace.Logger = trace.NewLogger(os.Getenv("CF_TRACE")) } else { trace.Logger = trace.NewLogger(deps.configRepo.Trace()) } deps.gateways = map[string]net.Gateway{ "auth": net.NewUAAGateway(deps.configRepo, deps.termUI), "cloud-controller": net.NewCloudControllerGateway(deps.configRepo, time.Now, deps.termUI), "uaa": net.NewUAAGateway(deps.configRepo, deps.termUI), } deps.apiRepoLocator = api.NewRepositoryLocator(deps.configRepo, deps.gateways) return }
Expect(err).ToNot(HaveOccurred()) fixtureDir := filepath.Join("..", "..", "..", "fixtures", "plugins") pluginDir = filepath.Join(fakePluginRepoDir, ".cf", "plugins") err = os.MkdirAll(pluginDir, 0700) Expect(err).NotTo(HaveOccurred()) fileutils.CopyFile(filepath.Join(pluginDir, "test_1.exe"), filepath.Join(fixtureDir, "test_1.exe")) fileutils.CopyFile(filepath.Join(pluginDir, "test_2.exe"), filepath.Join(fixtureDir, "test_2.exe")) config_helpers.PluginRepoDir = func() string { return fakePluginRepoDir } pluginConfig = plugin_config.NewPluginConfig(func(err error) { Expect(err).ToNot(HaveOccurred()) }) pluginConfig.SetPlugin("test_1.exe", plugin_config.PluginMetadata{Location: filepath.Join(pluginDir, "test_1.exe")}) pluginConfig.SetPlugin("test_2.exe", plugin_config.PluginMetadata{Location: filepath.Join(pluginDir, "test_2.exe")}) }) AfterEach(func() { os.Remove(fakePluginRepoDir) }) runCommand := func(args ...string) bool { cmd := NewPluginUninstall(ui, pluginConfig) return testcmd.RunCommand(cmd, args, requirementsFactory) } Describe("requirements", func() { It("fails with usage when not provided a path to the plugin executable", func() {
func newAppPresenter(app *cli.App) (presenter appPresenter) { maxNameLen := 0 for _, cmd := range app.Commands { name := presentCmdName(cmd) if utf8.RuneCountInString(name) > maxNameLen { maxNameLen = len(name) } } presentCommand := func(commandName string) (presenter cmdPresenter) { cmd := app.Command(commandName) presenter.Name = presentCmdName(*cmd) padding := strings.Repeat(" ", maxNameLen-utf8.RuneCountInString(presenter.Name)) presenter.Name = presenter.Name + padding presenter.Description = cmd.Description return } presentPluginCommands := func() []cmdPresenter { pluginConfig := plugin_config.NewPluginConfig(func(err error) { //fail silently when running help? }) plugins := pluginConfig.Plugins() var presenters []cmdPresenter var pluginPresenter cmdPresenter for _, pluginMetadata := range plugins { for _, cmd := range pluginMetadata.Commands { pluginPresenter.Name = cmd.Name padding := strings.Repeat(" ", maxNameLen-utf8.RuneCountInString(pluginPresenter.Name)) pluginPresenter.Name = pluginPresenter.Name + padding pluginPresenter.Description = cmd.HelpText presenters = append(presenters, pluginPresenter) } } return presenters } presenter.Name = app.Name presenter.Flags = app.Flags presenter.Usage = app.Usage presenter.Version = app.Version presenter.Compiled = app.Compiled presenter.Commands = []groupedCommands{ { Name: T("GETTING STARTED"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("login"), presentCommand("logout"), presentCommand("passwd"), presentCommand("target"), }, { presentCommand("api"), presentCommand("auth"), }, }, }, { Name: T("APPS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("apps"), presentCommand("app"), }, { presentCommand("push"), presentCommand("scale"), presentCommand("delete"), presentCommand("rename"), }, { presentCommand("start"), presentCommand("stop"), presentCommand("restart"), presentCommand("restage"), }, { presentCommand("events"), presentCommand("files"), presentCommand("logs"), }, { presentCommand("env"), presentCommand("set-env"), presentCommand("unset-env"), }, { presentCommand("stacks"), }, { presentCommand("copy-source"), }, }, }, { Name: T("SERVICES"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("marketplace"), presentCommand("services"), presentCommand("service"), }, { presentCommand("create-service"), presentCommand("update-service"), presentCommand("delete-service"), presentCommand("rename-service"), }, { presentCommand("bind-service"), presentCommand("unbind-service"), }, { presentCommand("create-user-provided-service"), presentCommand("update-user-provided-service"), }, }, }, { Name: T("ORGS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("orgs"), presentCommand("org"), }, { presentCommand("create-org"), presentCommand("delete-org"), presentCommand("rename-org"), }, }, }, { Name: T("SPACES"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("spaces"), presentCommand("space"), }, { presentCommand("create-space"), presentCommand("delete-space"), presentCommand("rename-space"), }, }, }, { Name: T("DOMAINS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("domains"), presentCommand("create-domain"), presentCommand("delete-domain"), presentCommand("create-shared-domain"), presentCommand("delete-shared-domain"), }, }, }, { Name: T("ROUTES"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("routes"), presentCommand("create-route"), presentCommand("check-route"), presentCommand("map-route"), presentCommand("unmap-route"), presentCommand("delete-route"), presentCommand("delete-orphaned-routes"), }, }, }, { Name: T("BUILDPACKS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("buildpacks"), presentCommand("create-buildpack"), presentCommand("update-buildpack"), presentCommand("rename-buildpack"), presentCommand("delete-buildpack"), }, }, }, { Name: T("USER ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("create-user"), presentCommand("delete-user"), }, { presentCommand("org-users"), presentCommand("set-org-role"), presentCommand("unset-org-role"), }, { presentCommand("space-users"), presentCommand("set-space-role"), presentCommand("unset-space-role"), }, }, }, { Name: T("ORG ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("quotas"), presentCommand("quota"), presentCommand("set-quota"), }, { presentCommand("create-quota"), presentCommand("delete-quota"), presentCommand("update-quota"), }, }, }, { Name: T("SPACE ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("space-quota"), presentCommand("space-quotas"), presentCommand("create-space-quota"), presentCommand("update-space-quota"), presentCommand("delete-space-quota"), presentCommand("set-space-quota"), presentCommand("unset-space-quota"), }, }, }, { Name: T("SERVICE ADMIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("service-auth-tokens"), presentCommand("create-service-auth-token"), presentCommand("update-service-auth-token"), presentCommand("delete-service-auth-token"), }, { presentCommand("service-brokers"), presentCommand("create-service-broker"), presentCommand("update-service-broker"), presentCommand("delete-service-broker"), presentCommand("rename-service-broker"), }, { presentCommand("migrate-service-instances"), presentCommand("purge-service-offering"), }, { presentCommand("service-access"), presentCommand("enable-service-access"), presentCommand("disable-service-access"), }, }, }, { Name: T("SECURITY GROUP"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("security-group"), presentCommand("security-groups"), presentCommand("create-security-group"), presentCommand("update-security-group"), presentCommand("delete-security-group"), presentCommand("bind-security-group"), presentCommand("unbind-security-group"), }, { presentCommand("bind-staging-security-group"), presentCommand("staging-security-groups"), presentCommand("unbind-staging-security-group"), }, { presentCommand("bind-running-security-group"), presentCommand("running-security-groups"), presentCommand("unbind-running-security-group"), }, }, }, { Name: T("ENVIRONMENT VARIABLE GROUPS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("running-environment-variable-group"), presentCommand("staging-environment-variable-group"), presentCommand("set-staging-environment-variable-group"), presentCommand("set-running-environment-variable-group"), }, }, }, { Name: T("FEATURE FLAGS"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("feature-flags"), presentCommand("feature-flag"), presentCommand("enable-feature-flag"), presentCommand("disable-feature-flag"), }, }, }, { Name: T("ADVANCED"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("curl"), presentCommand("config"), presentCommand("oauth-token"), }, }, }, { Name: T("PLUGIN"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("plugins"), presentCommand("install-plugin"), presentCommand("uninstall-plugin"), }, }, }, { Name: T("PLUGIN COMMANDS"), CommandSubGroups: [][]cmdPresenter{ presentPluginCommands(), }, }, { Name: T("ZONE"), CommandSubGroups: [][]cmdPresenter{ { presentCommand("zone"), presentCommand("zones"), presentCommand("create-zone"), presentCommand("delete-zone"), presentCommand("update-zone"), }, }, }, } return }