2
0

delete.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package release
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. "github.com/porter-dev/porter/api/server/authz"
  7. "github.com/porter-dev/porter/api/server/handlers"
  8. "github.com/porter-dev/porter/api/server/shared"
  9. "github.com/porter-dev/porter/api/server/shared/apierrors"
  10. "github.com/porter-dev/porter/api/server/shared/config"
  11. "github.com/porter-dev/porter/api/types"
  12. "github.com/porter-dev/porter/internal/integrations/ci/gitlab"
  13. "github.com/porter-dev/porter/internal/models"
  14. "helm.sh/helm/v3/pkg/release"
  15. )
  16. type DeleteReleaseHandler struct {
  17. handlers.PorterHandlerReadWriter
  18. authz.KubernetesAgentGetter
  19. }
  20. func NewDeleteReleaseHandler(
  21. config *config.Config,
  22. decoderValidator shared.RequestDecoderValidator,
  23. writer shared.ResultWriter,
  24. ) *DeleteReleaseHandler {
  25. return &DeleteReleaseHandler{
  26. PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
  27. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  28. }
  29. }
  30. func (c *DeleteReleaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  31. user, _ := r.Context().Value(types.UserScope).(*models.User)
  32. cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
  33. helmRelease, _ := r.Context().Value(types.ReleaseScope).(*release.Release)
  34. helmAgent, err := c.GetHelmAgent(r, cluster, "")
  35. if err != nil {
  36. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  37. return
  38. }
  39. _, err = helmAgent.UninstallChart(helmRelease.Name)
  40. if err != nil {
  41. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  42. return
  43. }
  44. rel, releaseErr := c.Repo().Release().ReadRelease(cluster.ID, helmRelease.Name, helmRelease.Namespace)
  45. // update the github actions env if the release exists and is built from source
  46. if cName := helmRelease.Chart.Metadata.Name; cName == "job" || cName == "web" || cName == "worker" {
  47. if releaseErr == nil && rel != nil {
  48. gitAction := rel.GitActionConfig
  49. if gitAction != nil && gitAction.ID != 0 {
  50. if gitAction.GitlabIntegrationID != 0 {
  51. repoSplit := strings.Split(gitAction.GitRepo, "/")
  52. if len(repoSplit) != 2 {
  53. c.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("invalid formatting of repo name")))
  54. return
  55. }
  56. giRunner := &gitlab.GitlabCI{
  57. ServerURL: c.Config().ServerConf.ServerURL,
  58. GitRepoOwner: repoSplit[0],
  59. GitRepoName: repoSplit[1],
  60. Repo: c.Repo(),
  61. ProjectID: cluster.ProjectID,
  62. ClusterID: cluster.ID,
  63. UserID: user.ID,
  64. IntegrationID: gitAction.GitlabIntegrationID,
  65. PorterConf: c.Config(),
  66. ReleaseName: helmRelease.Name,
  67. ReleaseNamespace: helmRelease.Namespace,
  68. }
  69. err = giRunner.Cleanup()
  70. if err != nil {
  71. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  72. return
  73. }
  74. } else {
  75. gaRunner, err := GetGARunner(
  76. c.Config(),
  77. user.ID,
  78. cluster.ProjectID,
  79. cluster.ID,
  80. rel.GitActionConfig,
  81. helmRelease.Name,
  82. helmRelease.Namespace,
  83. rel,
  84. helmRelease,
  85. )
  86. if err != nil {
  87. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  88. return
  89. }
  90. err = gaRunner.Cleanup()
  91. if err != nil {
  92. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  93. return
  94. }
  95. }
  96. }
  97. }
  98. }
  99. }