Prechádzať zdrojové kódy

delete capi clusters on project deletion (#2915)

Stefan McShane 3 rokov pred
rodič
commit
5215e2e36f

+ 3 - 2
api/server/handlers/infra/delete.go

@@ -30,8 +30,9 @@ func NewInfraDeleteHandler(
 }
 
 func (c *InfraDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
-	infra, _ := r.Context().Value(types.InfraScope).(*models.Infra)
+	ctx := r.Context()
+	proj, _ := ctx.Value(types.ProjectScope).(*models.Project)
+	infra, _ := ctx.Value(types.InfraScope).(*models.Infra)
 
 	req := &types.DeleteInfraRequest{}
 

+ 46 - 4
api/server/handlers/project/delete.go

@@ -1,8 +1,11 @@
 package project
 
 import (
+	"fmt"
 	"net/http"
 
+	"github.com/bufbuild/connect-go"
+	porterv1 "github.com/porter-dev/api-contracts/generated/go/porter/v1"
 	"github.com/porter-dev/porter/api/server/handlers"
 	"github.com/porter-dev/porter/api/server/shared"
 	"github.com/porter-dev/porter/api/server/shared/apierrors"
@@ -25,16 +28,55 @@ func NewProjectDeleteHandler(
 }
 
 func (p *ProjectDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	user, _ := r.Context().Value(types.UserScope).(*models.User)
-	proj, _ := r.Context().Value(types.ProjectScope).(*models.Project)
+	ctx := r.Context()
+	user, _ := ctx.Value(types.UserScope).(*models.User)
+	proj, _ := ctx.Value(types.ProjectScope).(*models.Project)
 
-	proj, err := p.Repo().Project().DeleteProject(proj)
+	if proj.CapiProvisionerEnabled {
+		clusters, err := p.Config().Repo.Cluster().ListClustersByProjectID(proj.ID)
+		if err != nil {
+			p.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("error finding clusters for project: %w", err)))
+			return
+		}
+
+		for _, cluster := range clusters {
+			if cluster.ProvisionedBy == "CAPI" {
+				if !cluster.DeletedAt.Time.IsZero() {
+					continue
+				}
+
+				contractRevision, err := p.Config().Repo.APIContractRevisioner().List(ctx, proj.ID, cluster.ID)
+				if err != nil {
+					p.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("error finding contract revisions for cluster: %w", err)))
+					return
+				}
+				if len(contractRevision) == 0 {
+					continue
+				}
+
+				req := connect.NewRequest(&porterv1.DeleteClusterRequest{
+					ContractRevision: &porterv1.ContractRevision{
+						ClusterId:  int32(cluster.ID),
+						ProjectId:  int32(cluster.ProjectID),
+						RevisionId: contractRevision[0].ID.String(),
+					},
+				})
+				_, err = p.Config().ClusterControlPlaneClient.DeleteCluster(ctx, req)
+				if err != nil {
+					p.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("error deleting cluster: %w", err)))
+					return
+				}
+			}
+		}
+	}
+
+	deletedProject, err := p.Repo().Project().DeleteProject(proj)
 	if err != nil {
 		p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
 		return
 	}
 
-	p.WriteResult(w, r, proj.ToProjectType())
+	p.WriteResult(w, r, deletedProject.ToProjectType())
 
 	// delete the billing team
 	if err := p.Config().BillingManager.DeleteTeam(user, proj); err != nil {