main.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "os"
  8. "strings"
  9. "github.com/porter-dev/porter/internal/adapter"
  10. "github.com/porter-dev/porter/provisioner/integrations/redis_stream"
  11. "github.com/porter-dev/porter/provisioner/server/config"
  12. "github.com/porter-dev/porter/provisioner/server/router"
  13. "golang.org/x/net/http2"
  14. "golang.org/x/net/http2/h2c"
  15. "github.com/porter-dev/porter/provisioner/pb"
  16. "google.golang.org/grpc"
  17. pgrpc "github.com/porter-dev/porter/provisioner/server/grpc"
  18. )
  19. // Version will be linked by an ldflag during build
  20. var Version string = "dev-ce"
  21. func main() {
  22. var versionFlag bool
  23. flag.BoolVar(&versionFlag, "version", false, "print version and exit")
  24. flag.Parse()
  25. // Exit safely when version is used
  26. if versionFlag {
  27. fmt.Println(Version)
  28. os.Exit(0)
  29. }
  30. envConf, err := config.FromEnv()
  31. if err != nil {
  32. log.Fatal("Environment loading failed: ", err)
  33. }
  34. config, err := config.GetConfig(envConf)
  35. if err != nil {
  36. log.Fatal("Config loading failed: ", err)
  37. }
  38. if config.RedisConf.Enabled {
  39. redis, err := adapter.NewRedisClient(config.RedisConf)
  40. if err != nil {
  41. config.Logger.Fatal().Err(err).Msg("redis connection failed")
  42. return
  43. }
  44. redis_stream.InitGlobalStream(redis)
  45. errorChan := make(chan error)
  46. go redis_stream.GlobalStreamListener(redis, config, config.Repo, nil, errorChan)
  47. }
  48. appRouter := router.NewAPIRouter(config)
  49. // if config.RedisConf.Enabled {
  50. // redis, err := adapter.NewRedisClient(config.RedisConf)
  51. // if err != nil {
  52. // config.Logger.Fatal().Err(err).Msg("redis connection failed")
  53. // return
  54. // }
  55. // redis_stream.InitGlobalStream(redis)
  56. // errorChan := make(chan error)
  57. // go redis_stream.GlobalStreamListener(redis, config, config.Repo, config.AnalyticsClient, errorChan)
  58. // }
  59. address := fmt.Sprintf(":%d", config.ProvisionerConf.Port)
  60. config.Logger.Info().Msgf("Starting server %v", address)
  61. grpcServer := grpc.NewServer()
  62. pb.RegisterProvisionerServer(grpcServer, pgrpc.NewProvisionerServer(config))
  63. http2Server := &http2.Server{}
  64. s := &http.Server{
  65. Addr: address,
  66. Handler: h2c.NewHandler(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
  67. if request.ProtoMajor != 2 {
  68. appRouter.ServeHTTP(writer, request)
  69. return
  70. }
  71. if strings.Contains(request.Header.Get("Content-Type"), "application/grpc") {
  72. grpcServer.ServeHTTP(writer, request)
  73. return
  74. }
  75. appRouter.ServeHTTP(writer, request)
  76. }), http2Server),
  77. ReadTimeout: config.ProvisionerConf.TimeoutRead,
  78. WriteTimeout: config.ProvisionerConf.TimeoutWrite,
  79. IdleTimeout: config.ProvisionerConf.TimeoutIdle,
  80. }
  81. if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  82. config.Logger.Fatal().Err(err).Msg("Server startup failed")
  83. }
  84. }