delete.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package cluster
  2. import (
  3. "fmt"
  4. "net/http"
  5. "connectrpc.com/connect"
  6. porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
  7. "github.com/porter-dev/porter/api/server/authz"
  8. "github.com/porter-dev/porter/api/server/handlers"
  9. "github.com/porter-dev/porter/api/server/shared"
  10. "github.com/porter-dev/porter/api/server/shared/apierrors"
  11. "github.com/porter-dev/porter/api/server/shared/config"
  12. "github.com/porter-dev/porter/api/types"
  13. "github.com/porter-dev/porter/internal/models"
  14. "github.com/porter-dev/porter/internal/repository"
  15. )
  16. type ClusterDeleteHandler struct {
  17. handlers.PorterHandlerWriter
  18. authz.KubernetesAgentGetter
  19. }
  20. func NewClusterDeleteHandler(
  21. config *config.Config,
  22. writer shared.ResultWriter,
  23. ) *ClusterDeleteHandler {
  24. return &ClusterDeleteHandler{
  25. PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
  26. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  27. }
  28. }
  29. func (c *ClusterDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  30. ctx := r.Context()
  31. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  32. if cluster.ProvisionedBy == "CAPI" {
  33. if c.Config().EnableCAPIProvisioner {
  34. revisions, err := c.Config().Repo.APIContractRevisioner().List(ctx, cluster.ProjectID, repository.WithClusterID(cluster.ID))
  35. if err != nil {
  36. e := fmt.Errorf("error listing revisions for cluster %d: %w", cluster.ID, err)
  37. c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
  38. return
  39. }
  40. if cluster.Status == types.UpdatingUnavailable || cluster.Status == types.Updating {
  41. e := fmt.Errorf("unable to delete cluster %d that is updating", cluster.ID)
  42. c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
  43. return
  44. }
  45. var revisionID string
  46. for _, rev := range revisions {
  47. if rev.Condition != "" {
  48. revisionID = rev.ID.String()
  49. break
  50. }
  51. }
  52. cl := connect.NewRequest(&porterv1.DeleteClusterRequest{
  53. ContractRevision: &porterv1.ContractRevision{
  54. ClusterId: int32(cluster.ID),
  55. ProjectId: int32(cluster.ProjectID),
  56. RevisionId: revisionID,
  57. },
  58. })
  59. _, err = c.Config().ClusterControlPlaneClient.DeleteCluster(ctx, cl)
  60. if err != nil {
  61. e := fmt.Errorf("error deleting cluster %d: %w", cluster.ID, err)
  62. c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
  63. return
  64. }
  65. }
  66. }
  67. err := c.Repo().Cluster().DeleteCluster(cluster)
  68. if err != nil {
  69. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  70. return
  71. }
  72. c.WriteResult(w, r, cluster.ToClusterType())
  73. }