get.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package release
  2. import (
  3. "net/http"
  4. "github.com/porter-dev/porter/api/server/authz"
  5. "github.com/porter-dev/porter/api/server/handlers"
  6. "github.com/porter-dev/porter/api/server/shared"
  7. "github.com/porter-dev/porter/api/server/shared/apierrors"
  8. "github.com/porter-dev/porter/api/server/shared/config"
  9. "github.com/porter-dev/porter/api/types"
  10. "github.com/porter-dev/porter/internal/models"
  11. "github.com/porter-dev/porter/internal/templater/parser"
  12. "gorm.io/gorm"
  13. "helm.sh/helm/v3/pkg/release"
  14. )
  15. type ReleaseGetHandler struct {
  16. handlers.PorterHandlerWriter
  17. authz.KubernetesAgentGetter
  18. }
  19. func NewReleaseGetHandler(
  20. config *config.Config,
  21. writer shared.ResultWriter,
  22. ) *ReleaseGetHandler {
  23. return &ReleaseGetHandler{
  24. PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
  25. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  26. }
  27. }
  28. func (c *ReleaseGetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  29. helmRelease, _ := r.Context().Value(types.ReleaseScope).(*release.Release)
  30. res := &types.Release{
  31. Release: helmRelease,
  32. }
  33. // look up the release in the database; if not found, do not populate Porter fields
  34. cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
  35. release, err := c.Repo().Release().ReadRelease(cluster.ID, helmRelease.Name, helmRelease.Namespace)
  36. if err == nil {
  37. res.PorterRelease = release.ToReleaseType()
  38. res.ID = release.ID
  39. res.WebhookToken = release.WebhookToken
  40. if release.GitActionConfig != nil {
  41. res.GitActionConfig = release.GitActionConfig.ToGitActionConfigType()
  42. }
  43. } else if err != gorm.ErrRecordNotFound {
  44. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  45. return
  46. }
  47. // look for the form using the dynamic client
  48. dynClient, err := c.GetDynamicClient(r, cluster)
  49. if err != nil {
  50. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  51. return
  52. }
  53. parserDef := &parser.ClientConfigDefault{
  54. DynamicClient: dynClient,
  55. HelmChart: helmRelease.Chart,
  56. HelmRelease: helmRelease,
  57. }
  58. form, err := parser.GetFormFromRelease(parserDef, helmRelease)
  59. if err != nil {
  60. // TODO: log non-fatal parsing error
  61. } else {
  62. res.Form = form
  63. }
  64. c.WriteResult(w, r, res)
  65. }