install_operator.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package doppler
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/porter-dev/porter/api/server/authz"
  6. "github.com/porter-dev/porter/api/server/handlers"
  7. "github.com/porter-dev/porter/api/server/shared"
  8. "github.com/porter-dev/porter/api/server/shared/apierrors"
  9. "github.com/porter-dev/porter/api/server/shared/config"
  10. "github.com/porter-dev/porter/api/types"
  11. "github.com/porter-dev/porter/internal/helm"
  12. "github.com/porter-dev/porter/internal/helm/loader"
  13. "github.com/porter-dev/porter/internal/models"
  14. "github.com/porter-dev/porter/internal/telemetry"
  15. )
  16. const (
  17. monitoringNodeLabel = "porter.run/workload-kind=monitoring"
  18. )
  19. type InstallDopplerHandler struct {
  20. handlers.PorterHandlerReadWriter
  21. authz.KubernetesAgentGetter
  22. }
  23. func NewInstallDopplerHandler(
  24. config *config.Config,
  25. decoderValidator shared.RequestDecoderValidator,
  26. writer shared.ResultWriter,
  27. ) *InstallDopplerHandler {
  28. return &InstallDopplerHandler{
  29. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  30. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  31. }
  32. }
  33. func (c *InstallDopplerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  34. ctx, span := telemetry.NewSpan(r.Context(), "serve-install-doppler-handler")
  35. defer span.End()
  36. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  37. helmAgent, err := c.GetHelmAgent(ctx, r, cluster, "default")
  38. if err != nil {
  39. err = telemetry.Error(ctx, span, err, "failed to get helm agent")
  40. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  41. return
  42. }
  43. chart, err := loader.LoadChartPublic(ctx, "https://helm.doppler.com", "doppler/doppler-kubernetes-operator", "")
  44. if err != nil {
  45. err = telemetry.Error(ctx, span, err, "failed load public doppler operator chart")
  46. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  47. return
  48. }
  49. // create namespace if not exists
  50. _, err = helmAgent.K8sAgent.CreateNamespace("doppler", nil)
  51. if err != nil {
  52. err = telemetry.Error(ctx, span, err, "failed to create doppler namespace")
  53. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  54. return
  55. }
  56. conf := &helm.InstallChartConfig{
  57. Chart: chart,
  58. Name: "doppler",
  59. Namespace: "doppler",
  60. Cluster: cluster,
  61. Repo: c.Repo(),
  62. }
  63. _, err = helmAgent.InstallChart(context.Background(), conf, c.Config().DOConf, c.Config().ServerConf.DisablePullSecretsInjection)
  64. if err != nil {
  65. err = telemetry.Error(ctx, span, err, "error installing doppler operator")
  66. c.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
  67. return
  68. }
  69. w.WriteHeader(http.StatusOK)
  70. }