delete.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package cluster
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/bufbuild/connect-go"
  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. )
  15. type ClusterDeleteHandler struct {
  16. handlers.PorterHandlerWriter
  17. authz.KubernetesAgentGetter
  18. }
  19. func NewClusterDeleteHandler(
  20. config *config.Config,
  21. writer shared.ResultWriter,
  22. ) *ClusterDeleteHandler {
  23. return &ClusterDeleteHandler{
  24. PorterHandlerWriter: handlers.NewDefaultPorterHandler(config, nil, writer),
  25. KubernetesAgentGetter: authz.NewOutOfClusterAgentGetter(config),
  26. }
  27. }
  28. func (c *ClusterDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  29. ctx := r.Context()
  30. cluster, _ := ctx.Value(types.ClusterScope).(*models.Cluster)
  31. if cluster.ProvisionedBy == "CAPI" {
  32. if !c.Config().DisableCAPIProvisioner {
  33. revisions, err := c.Config().Repo.APIContractRevisioner().List(ctx, cluster.ProjectID, cluster.ID)
  34. if err != nil {
  35. e := fmt.Errorf("error listing revisions for cluster %d: %w", cluster.ID, err)
  36. c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
  37. return
  38. }
  39. var revisionID string
  40. for _, rev := range revisions {
  41. if rev.Condition == "SUCCESS" {
  42. revisionID = rev.ID.String()
  43. break
  44. }
  45. }
  46. cl := connect.NewRequest(&porterv1.DeleteClusterRequest{
  47. ContractRevision: &porterv1.ContractRevision{
  48. ClusterId: int32(cluster.ID),
  49. ProjectId: int32(cluster.ProjectID),
  50. RevisionId: revisionID,
  51. },
  52. })
  53. _, err = c.Config().ClusterControlPlaneClient.DeleteCluster(ctx, cl)
  54. if err != nil {
  55. e := fmt.Errorf("error deleting cluster %d: %w", cluster.ID, err)
  56. c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
  57. return
  58. }
  59. }
  60. }
  61. err := c.Repo().Cluster().DeleteCluster(cluster)
  62. if err != nil {
  63. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  64. return
  65. }
  66. c.WriteResult(w, r, cluster.ToClusterType())
  67. }