server.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package cmd
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/fatih/color"
  6. "github.com/porter-dev/porter/cli/cmd/docker"
  7. "github.com/spf13/cobra"
  8. )
  9. type startOps struct {
  10. imageTag string `form:"required"`
  11. db string `form:"oneof=sqlite postgres"`
  12. port *int `form:"required"`
  13. }
  14. var opts = &startOps{}
  15. var serverCmd = &cobra.Command{
  16. Use: "server",
  17. Short: "Commands to control a local Porter server",
  18. }
  19. // startCmd represents the start command
  20. var startCmd = &cobra.Command{
  21. Use: "start",
  22. Short: "Starts a Porter instance using the Docker engine",
  23. Run: func(cmd *cobra.Command, args []string) {
  24. err := start(
  25. opts.imageTag,
  26. opts.db,
  27. *opts.port,
  28. )
  29. if err != nil {
  30. red := color.New(color.FgRed)
  31. red.Println("Error running start:", err.Error())
  32. red.Println("Shutting down...")
  33. err = stop()
  34. if err != nil {
  35. red.Println("Shutdown unsuccessful:", err.Error())
  36. }
  37. os.Exit(1)
  38. }
  39. },
  40. }
  41. var stopCmd = &cobra.Command{
  42. Use: "stop",
  43. Short: "Stops a Porter instance running on the Docker engine",
  44. Run: func(cmd *cobra.Command, args []string) {
  45. if err := stop(); err != nil {
  46. color.New(color.FgRed).Println("Shutdown unsuccessful:", err.Error())
  47. os.Exit(1)
  48. }
  49. },
  50. }
  51. func init() {
  52. rootCmd.AddCommand(serverCmd)
  53. serverCmd.AddCommand(startCmd)
  54. serverCmd.AddCommand(stopCmd)
  55. startCmd.PersistentFlags().StringVar(
  56. &opts.db,
  57. "db",
  58. "sqlite",
  59. "the db to use, one of sqlite or postgres",
  60. )
  61. startCmd.PersistentFlags().StringVar(
  62. &opts.imageTag,
  63. "image-tag",
  64. "latest",
  65. "the Porter image tag to use",
  66. )
  67. opts.port = startCmd.PersistentFlags().IntP(
  68. "port",
  69. "p",
  70. 8080,
  71. "the host port to run the server on",
  72. )
  73. }
  74. func start(
  75. imageTag string,
  76. db string,
  77. port int,
  78. ) error {
  79. env := make([]string, 0)
  80. var porterDB docker.PorterDB
  81. switch db {
  82. case "postgres":
  83. porterDB = docker.Postgres
  84. case "sqlite":
  85. porterDB = docker.SQLite
  86. }
  87. startOpts := &docker.PorterStartOpts{
  88. ProcessID: "main",
  89. ServerImageTag: imageTag,
  90. ServerPort: port,
  91. DB: porterDB,
  92. Env: env,
  93. }
  94. _, _, err := docker.StartPorter(startOpts)
  95. if err != nil {
  96. return err
  97. }
  98. green := color.New(color.FgGreen)
  99. green.Printf("Server ready: listening on localhost:%d\n", port)
  100. return setHost(fmt.Sprintf("http://localhost:%d", port))
  101. }
  102. func stop() error {
  103. agent, err := docker.NewAgentFromEnv()
  104. if err != nil {
  105. return err
  106. }
  107. err = agent.StopPorterContainersWithProcessID("main", false)
  108. if err != nil {
  109. return err
  110. }
  111. green := color.New(color.FgGreen)
  112. green.Println("Successfully stopped the Porter server.")
  113. return nil
  114. }