loader.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package loader
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strconv"
  6. "github.com/gorilla/websocket"
  7. "github.com/porter-dev/porter/api/server/shared/apierrors/alerter"
  8. "github.com/porter-dev/porter/api/server/shared/config"
  9. "github.com/porter-dev/porter/api/server/shared/config/env"
  10. "github.com/porter-dev/porter/internal/adapter"
  11. "github.com/porter-dev/porter/internal/auth/sessionstore"
  12. "github.com/porter-dev/porter/internal/auth/token"
  13. "github.com/porter-dev/porter/internal/helm/urlcache"
  14. "github.com/porter-dev/porter/internal/kubernetes"
  15. "github.com/porter-dev/porter/internal/kubernetes/local"
  16. "github.com/porter-dev/porter/internal/notifier"
  17. "github.com/porter-dev/porter/internal/notifier/sendgrid"
  18. "github.com/porter-dev/porter/internal/oauth"
  19. "github.com/porter-dev/porter/internal/repository/gorm"
  20. lr "github.com/porter-dev/porter/internal/logger"
  21. )
  22. type EnvConfigLoader struct{}
  23. func NewEnvLoader() config.ConfigLoader {
  24. return &EnvConfigLoader{}
  25. }
  26. func (e *EnvConfigLoader) LoadConfig() (res *config.Config, err error) {
  27. envConf, err := FromEnv()
  28. if err != nil {
  29. return nil, err
  30. }
  31. sc := envConf.ServerConf
  32. res = &config.Config{
  33. Logger: lr.NewConsole(sc.Debug),
  34. ServerConf: sc,
  35. }
  36. res.Metadata = config.MetadataFromConf(envConf.ServerConf)
  37. db, err := adapter.New(envConf.DBConf)
  38. if err != nil {
  39. return nil, err
  40. }
  41. err = gorm.AutoMigrate(db)
  42. if err != nil {
  43. return nil, err
  44. }
  45. var key [32]byte
  46. for i, b := range []byte(envConf.DBConf.EncryptionKey) {
  47. key[i] = b
  48. }
  49. res.Repo = gorm.NewRepository(db, &key)
  50. // create the session store
  51. res.Store, err = sessionstore.NewStore(
  52. &sessionstore.NewStoreOpts{
  53. SessionRepository: res.Repo.Session(),
  54. CookieSecrets: envConf.ServerConf.CookieSecrets,
  55. },
  56. )
  57. if err != nil {
  58. return nil, err
  59. }
  60. res.TokenConf = &token.TokenGeneratorConf{
  61. TokenSecret: envConf.ServerConf.TokenGeneratorSecret,
  62. }
  63. res.UserNotifier = &notifier.EmptyUserNotifier{}
  64. if res.Metadata.Email {
  65. res.UserNotifier = sendgrid.NewUserNotifier(&sendgrid.Client{
  66. APIKey: envConf.ServerConf.SendgridAPIKey,
  67. PWResetTemplateID: envConf.ServerConf.SendgridPWResetTemplateID,
  68. PWGHTemplateID: envConf.ServerConf.SendgridPWGHTemplateID,
  69. VerifyEmailTemplateID: envConf.ServerConf.SendgridVerifyEmailTemplateID,
  70. ProjectInviteTemplateID: envConf.ServerConf.SendgridProjectInviteTemplateID,
  71. SenderEmail: envConf.ServerConf.SendgridSenderEmail,
  72. })
  73. }
  74. res.Alerter = alerter.NoOpAlerter{}
  75. if envConf.ServerConf.SentryDSN != "" {
  76. res.Alerter, err = alerter.NewSentryAlerter(envConf.ServerConf.SentryDSN)
  77. }
  78. if sc.DOClientID != "" && sc.DOClientSecret != "" {
  79. res.DOConf = oauth.NewDigitalOceanClient(&oauth.Config{
  80. ClientID: sc.DOClientID,
  81. ClientSecret: sc.DOClientSecret,
  82. Scopes: []string{"read", "write"},
  83. BaseURL: sc.ServerURL,
  84. })
  85. }
  86. if sc.GithubClientID != "" && sc.GithubClientSecret != "" {
  87. res.GithubConf = oauth.NewGithubClient(&oauth.Config{
  88. ClientID: sc.GithubClientID,
  89. ClientSecret: sc.GithubClientSecret,
  90. Scopes: []string{"read:user", "user:email"},
  91. BaseURL: sc.ServerURL,
  92. })
  93. }
  94. if sc.GithubAppClientID != "" &&
  95. sc.GithubAppClientSecret != "" &&
  96. sc.GithubAppName != "" &&
  97. sc.GithubAppWebhookSecret != "" &&
  98. sc.GithubAppSecretPath != "" &&
  99. sc.GithubAppID != "" {
  100. if AppID, err := strconv.ParseInt(sc.GithubAppID, 10, 64); err == nil {
  101. res.GithubAppConf = oauth.NewGithubAppClient(&oauth.Config{
  102. ClientID: sc.GithubAppClientID,
  103. ClientSecret: sc.GithubAppClientSecret,
  104. Scopes: []string{"read:user"},
  105. BaseURL: sc.ServerURL,
  106. }, sc.GithubAppName, sc.GithubAppWebhookSecret, sc.GithubAppSecretPath, AppID)
  107. }
  108. }
  109. res.WSUpgrader = &websocket.Upgrader{
  110. ReadBufferSize: 1024,
  111. WriteBufferSize: 1024,
  112. CheckOrigin: func(r *http.Request) bool {
  113. origin := r.Header.Get("Origin")
  114. return origin == sc.ServerURL
  115. },
  116. }
  117. res.URLCache = urlcache.Init(sc.DefaultApplicationHelmRepoURL, sc.DefaultAddonHelmRepoURL)
  118. provAgent, err := getProvisionerAgent(sc)
  119. if err != nil {
  120. return nil, err
  121. }
  122. res.ProvisionerAgent = provAgent
  123. ingressAgent, err := getIngressAgent(sc)
  124. if err != nil {
  125. return nil, err
  126. }
  127. res.IngressAgent = ingressAgent
  128. return res, nil
  129. }
  130. func getProvisionerAgent(sc *env.ServerConf) (*kubernetes.Agent, error) {
  131. if sc.ProvisionerCluster == "kubeconfig" && sc.SelfKubeconfig != "" {
  132. agent, err := local.GetSelfAgentFromFileConfig(sc.SelfKubeconfig)
  133. if err != nil {
  134. return nil, fmt.Errorf("could not get in-cluster agent: %v", err)
  135. }
  136. return agent, nil
  137. } else if sc.ProvisionerCluster == "kubeconfig" {
  138. return nil, fmt.Errorf(`"kubeconfig" cluster option requires path to kubeconfig`)
  139. }
  140. agent, _ := kubernetes.GetAgentInClusterConfig()
  141. return agent, nil
  142. }
  143. func getIngressAgent(sc *env.ServerConf) (*kubernetes.Agent, error) {
  144. if sc.IngressCluster == "kubeconfig" && sc.SelfKubeconfig != "" {
  145. agent, err := local.GetSelfAgentFromFileConfig(sc.SelfKubeconfig)
  146. if err != nil {
  147. return nil, fmt.Errorf("could not get in-cluster agent: %v", err)
  148. }
  149. return agent, nil
  150. } else if sc.ProvisionerCluster == "kubeconfig" {
  151. return nil, fmt.Errorf(`"kubeconfig" cluster option requires path to kubeconfig`)
  152. }
  153. agent, _ := kubernetes.GetAgentInClusterConfig()
  154. return agent, nil
  155. }