delete.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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().EnableCAPIProvisioner {
  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. if cluster.Status == types.UpdatingUnavailable || cluster.Status == types.Updating {
  40. e := fmt.Errorf("unable to delete cluster %d that is updating", cluster.ID)
  41. c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
  42. return
  43. }
  44. var revisionID string
  45. for _, rev := range revisions {
  46. if rev.Condition != "" {
  47. revisionID = rev.ID.String()
  48. break
  49. }
  50. }
  51. cl := connect.NewRequest(&porterv1.DeleteClusterRequest{
  52. ContractRevision: &porterv1.ContractRevision{
  53. ClusterId: int32(cluster.ID),
  54. ProjectId: int32(cluster.ProjectID),
  55. RevisionId: revisionID,
  56. },
  57. })
  58. _, err = c.Config().ClusterControlPlaneClient.DeleteCluster(ctx, cl)
  59. if err != nil {
  60. e := fmt.Errorf("error deleting cluster %d: %w", cluster.ID, err)
  61. c.HandleAPIError(w, r, apierrors.NewErrInternal(e))
  62. return
  63. }
  64. }
  65. }
  66. err := c.Repo().Cluster().DeleteCluster(cluster)
  67. if err != nil {
  68. c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
  69. return
  70. }
  71. c.WriteResult(w, r, cluster.ToClusterType())
  72. }