loader.go 5.2 KB

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