Преглед изворни кода

Updation tables on deletion (#4207)

Stefan McShane пре 2 година
родитељ
комит
010a1952b2

+ 35 - 7
api/server/handlers/project/delete.go

@@ -1,7 +1,6 @@
 package project
 
 import (
-	"fmt"
 	"net/http"
 
 	"connectrpc.com/connect"
@@ -13,6 +12,7 @@ import (
 	"github.com/porter-dev/porter/api/types"
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/notifier"
+	"github.com/porter-dev/porter/internal/telemetry"
 )
 
 type ProjectDeleteHandler struct {
@@ -29,14 +29,18 @@ func NewProjectDeleteHandler(
 }
 
 func (p *ProjectDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
-	ctx := r.Context()
+	ctx, span := telemetry.NewSpan(r.Context(), "delete-project")
+	defer span.End()
+
 	user, _ := ctx.Value(types.UserScope).(*models.User)
 	proj, _ := ctx.Value(types.ProjectScope).(*models.Project)
 
 	if proj.GetFeatureFlag(models.CapiProvisionerEnabled, p.Config().LaunchDarklyClient) {
 		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)))
+			e := "error finding clusters for project"
+			err = telemetry.Error(ctx, span, err, e)
+			p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 			return
 		}
 
@@ -48,7 +52,9 @@ func (p *ProjectDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
 
 				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)))
+					e := "error finding contract revisions for cluster"
+					err = telemetry.Error(ctx, span, err, e)
+					p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 					return
 				}
 				if len(contractRevision) == 0 {
@@ -64,7 +70,9 @@ func (p *ProjectDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
 				})
 				_, err = p.Config().ClusterControlPlaneClient.DeleteCluster(ctx, req)
 				if err != nil {
-					p.HandleAPIError(w, r, apierrors.NewErrInternal(fmt.Errorf("error deleting cluster: %w", err)))
+					e := "error deleting cluster"
+					err = telemetry.Error(ctx, span, err, e)
+					p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 					return
 				}
 			}
@@ -77,13 +85,33 @@ func (p *ProjectDeleteHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
 		},
 	)
 	if err != nil {
-		p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		e := "error sending project deletion email"
+		err = telemetry.Error(ctx, span, err, e)
+		p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 
 	deletedProject, err := p.Repo().Project().DeleteProject(proj)
 	if err != nil {
-		p.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		e := "error deleting project"
+		err = telemetry.Error(ctx, span, err, e)
+		p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
+		return
+	}
+
+	err = p.Repo().AWSAssumeRoleChainer().Delete(ctx, proj.ID)
+	if err != nil {
+		e := "error deleting assume role chain"
+		err = telemetry.Error(ctx, span, err, e)
+		p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
+		return
+	}
+
+	err = p.Repo().Project().DeleteRolesForProject(proj.ID)
+	if err != nil {
+		e := "error deleting roles for project"
+		err = telemetry.Error(ctx, span, err, e)
+		p.HandleAPIError(w, r, apierrors.NewErrPassThroughToClient(err, http.StatusInternalServerError))
 		return
 	}
 

+ 2 - 0
internal/repository/aws_assume_role_chain.go

@@ -14,4 +14,6 @@ type AWSAssumeRoleChainer interface {
 	List(ctx context.Context, projectID uint) ([]*models.AWSAssumeRoleChain, error)
 	// ListByAwsAccountId returns the final hops in an assume role chain, where the ARN accounts match the supplied AWS account ID
 	ListByAwsAccountId(ctx context.Context, targetAwsAccountId string) ([]*models.AWSAssumeRoleChain, error)
+	// Delete deletes an AWS assume role chain by project ID
+	Delete(ctx context.Context, projectID uint) error
 }

+ 22 - 0
internal/repository/gorm/aws_assume_role_chain.go

@@ -66,3 +66,25 @@ func (cr AWSAssumeRoleChain) ListByAwsAccountId(ctx context.Context, awsAccountI
 
 	return confs, nil
 }
+
+// Delete deletes an AWS assume role chain by project ID
+func (cr AWSAssumeRoleChain) Delete(ctx context.Context, projectID uint) error {
+	if projectID == 0 {
+		return errors.New("must provide a project ID")
+	}
+
+	var confs []*models.AWSAssumeRoleChain
+	tx := cr.db.Where("project_id = ?", projectID).Find(&confs)
+	if tx.Error != nil {
+		return tx.Error
+	}
+
+	for _, conf := range confs {
+		tx := cr.db.Delete(conf)
+		if tx.Error != nil {
+			return tx.Error
+		}
+	}
+
+	return nil
+}

+ 24 - 0
internal/repository/gorm/project.go

@@ -1,6 +1,8 @@
 package gorm
 
 import (
+	"errors"
+
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/repository"
 	"gorm.io/gorm"
@@ -135,3 +137,25 @@ func (repo *ProjectRepository) DeleteProjectRole(projID, userID uint) (*models.R
 
 	return role, nil
 }
+
+// DeleteRolesForProject deletes all roles for a project
+func (repo *ProjectRepository) DeleteRolesForProject(projID uint) error {
+	if projID == 0 {
+		return errors.New("must provide a project ID")
+	}
+
+	var roles []models.Role
+
+	if err := repo.db.Where("project_id = ?", projID).Find(&roles).Error; err != nil {
+		return err
+	}
+
+	for _, role := range roles {
+		r := role
+		if err := repo.db.Delete(&r).Error; err != nil {
+			return err
+		}
+	}
+
+	return nil
+}

+ 1 - 0
internal/repository/project.go

@@ -19,4 +19,5 @@ type ProjectRepository interface {
 	ListProjectsByUserID(userID uint) ([]*models.Project, error)
 	DeleteProject(project *models.Project) (*models.Project, error)
 	DeleteProjectRole(projID, userID uint) (*models.Role, error)
+	DeleteRolesForProject(projID uint) error
 }

+ 5 - 0
internal/repository/test/aws_assume_role_chain.go

@@ -25,3 +25,8 @@ func (cr AWSAssumeRoleChain) List(ctx context.Context, projectID uint) ([]*model
 func (cr AWSAssumeRoleChain) ListByAwsAccountId(ctx context.Context, targetAwsAccountId string) ([]*models.AWSAssumeRoleChain, error) {
 	return nil, errors.New("not implemented")
 }
+
+// Delete ...
+func (cr AWSAssumeRoleChain) Delete(ctx context.Context, projectID uint) error {
+	return errors.New("not implemented")
+}

+ 5 - 0
internal/repository/test/project.go

@@ -222,3 +222,8 @@ func (repo *ProjectRepository) DeleteProjectRole(projID, userID uint) (*models.R
 
 	return &res, nil
 }
+
+// DeleteRolesForProject deletes all roles for a project
+func (repo *ProjectRepository) DeleteRolesForProject(projID uint) error {
+	return errors.New("unimplemented")
+}