root.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package commands
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "runtime"
  7. "strings"
  8. "time"
  9. "github.com/Masterminds/semver/v3"
  10. "github.com/fatih/color"
  11. "github.com/google/go-github/v41/github"
  12. cfg "github.com/porter-dev/porter/cli/cmd/config"
  13. "github.com/spf13/cobra"
  14. "k8s.io/client-go/util/homedir"
  15. )
  16. var home = homedir.HomeDir()
  17. // Execute adds all child commands to the root command and sets flags appropriately.
  18. // This is called by main.main(). It only needs to happen once to the rootCmd.
  19. func Execute(ctx context.Context) error {
  20. if cfg.Version != "dev" {
  21. ghClient := github.NewClient(nil)
  22. ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
  23. defer cancel()
  24. release, _, err := ghClient.Repositories.GetLatestRelease(ctx, "porter-dev", "porter")
  25. if err == nil {
  26. release.GetURL()
  27. // we do not care for an error here because we do not want to block the user here
  28. constraint, err := semver.NewConstraint(fmt.Sprintf("> %s", strings.TrimPrefix(cfg.Version, "v")))
  29. if err == nil {
  30. latestRelease, err := semver.NewVersion(strings.TrimPrefix(release.GetTagName(), "v"))
  31. if err == nil {
  32. if constraint.Check(latestRelease) {
  33. color.New(color.FgYellow).Fprint(os.Stderr, "A new version of the porter CLI is available. Run the following to update: ")
  34. if runtime.GOOS == "darwin" {
  35. color.New(color.FgYellow, color.Bold).Fprintln(os.Stderr, "brew install porter-dev/porter/porter")
  36. } else {
  37. color.New(color.FgYellow, color.Bold).Fprintln(os.Stderr, "/bin/bash -c \"$(curl -fsSL https://install.porter.run)\"")
  38. }
  39. color.New(color.FgYellow).Fprintf(os.Stderr, "View CLI installation and upgrade docs at https://docs.porter.run/cli/installation\n\n")
  40. }
  41. }
  42. }
  43. }
  44. }
  45. rootCmd := &cobra.Command{
  46. Use: "porter",
  47. Short: "Porter is a dashboard for managing Kubernetes clusters.",
  48. Long: `Porter is a tool for creating, versioning, and updating Kubernetes deployments using a visual dashboard. For more information, visit github.com/porter-dev/porter`,
  49. RunE: func(cmd *cobra.Command, args []string) error {
  50. return cmd.Help()
  51. },
  52. }
  53. err := registerRootCommands(rootCmd, nil)
  54. if err != nil {
  55. return fmt.Errorf("error registering root commands: %w", err)
  56. }
  57. // we shouldnt set default values in flags or they will overwrite all other values.
  58. // These should be set in defaultCLIConfig
  59. rootCmd.PersistentFlags().String("driver", "", "driver to use (local or docker)")
  60. rootCmd.PersistentFlags().String("host", "", "url of the porter instance to use")
  61. rootCmd.PersistentFlags().String("token", "", "token used for authentication")
  62. rootCmd.PersistentFlags().String("profile", "", "name of the profile to use with the CLI")
  63. rootCmd.PersistentFlags().Uint("project", 0, "project ID of the porter project to target")
  64. rootCmd.PersistentFlags().Uint("cluster", 0, "cluster ID of the porter cluster to target")
  65. rootCmd.PersistentFlags().Uint("registry", 0, "registry ID of connected Porter registry")
  66. rootCmd.PersistentFlags().Uint("helmrepo", 0, "helm repo ID of connected Porter Helm repository")
  67. if err := rootCmd.Execute(); err != nil {
  68. color.New(color.FgRed).Println(err)
  69. os.Exit(1)
  70. }
  71. return nil
  72. }
  73. func registerRootCommands(cmd *cobra.Command, args []string) error {
  74. cmd.AddCommand(registerCommand_App())
  75. cmd.AddCommand(registerCommand_Apply())
  76. cmd.AddCommand(registerCommand_Auth())
  77. cmd.AddCommand(registerCommand_Cluster())
  78. cmd.AddCommand(registerCommand_Config())
  79. cmd.AddCommand(registerCommand_Connect())
  80. cmd.AddCommand(registerCommand_Create())
  81. cmd.AddCommand(registerCommand_Delete())
  82. cmd.AddCommand(registerCommand_Deploy())
  83. cmd.AddCommand(registerCommand_Docker())
  84. cmd.AddCommand(registerCommand_Get())
  85. cmd.AddCommand(registerCommand_Helm())
  86. cmd.AddCommand(registerCommand_Job())
  87. cmd.AddCommand(registerCommand_Kubectl())
  88. cmd.AddCommand(registerCommand_List())
  89. cmd.AddCommand(registerCommand_Logs())
  90. cmd.AddCommand(registerCommand_Open())
  91. cmd.AddCommand(registerCommand_PortForward())
  92. cmd.AddCommand(registerCommand_Project())
  93. cmd.AddCommand(registerCommand_Registry())
  94. cmd.AddCommand(registerCommand_Run())
  95. cmd.AddCommand(registerCommand_Server())
  96. cmd.AddCommand(registerCommand_Stack())
  97. cmd.AddCommand(registerCommand_Update())
  98. cmd.AddCommand(registerCommand_Version())
  99. return nil
  100. }