浏览代码

add delete endpoint

Alexander Belanger 4 年之前
父节点
当前提交
9483c5c634

+ 7 - 9
api/server/handlers/release/create.go

@@ -273,35 +273,35 @@ type containerEnvConfig struct {
 	} `yaml:"container"`
 }
 
-func updateGitActionEnvSecret(
+func getGARunner(
 	config *config.Config,
 	userID, projectID, clusterID uint,
 	ga *models.GitActionConfig,
 	name, namespace string,
 	release *models.Release,
 	helmRelease *release.Release,
-) error {
+) (*actions.GithubActions, error) {
 	cEnv := &containerEnvConfig{}
 	rawValues, err := yaml.Marshal(helmRelease.Config)
 
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	err = yaml.Unmarshal(rawValues, cEnv)
 
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	repoSplit := strings.Split(ga.GitRepo, "/")
 
 	if len(repoSplit) != 2 {
-		return fmt.Errorf("invalid formatting of repo name")
+		return nil, fmt.Errorf("invalid formatting of repo name")
 	}
 
 	// create the commit in the git repo
-	gaRunner := &actions.GithubActions{
+	return &actions.GithubActions{
 		ServerURL:              config.ServerConf.ServerURL,
 		GithubOAuthIntegration: nil,
 		BuildEnv:               cEnv.Container.Env.Normal,
@@ -319,7 +319,5 @@ func updateGitActionEnvSecret(
 		FolderPath:             ga.FolderPath,
 		ImageRepoURL:           ga.ImageRepoURI,
 		Version:                "v0.1.0",
-	}
-
-	return gaRunner.CreateEnvSecret()
+	}, nil
 }

+ 85 - 0
api/server/handlers/release/delete.go

@@ -0,0 +1,85 @@
+package release
+
+import (
+	"net/http"
+
+	"github.com/porter-dev/porter/api/server/authz"
+	"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"
+	"github.com/porter-dev/porter/api/server/shared/config"
+	"github.com/porter-dev/porter/api/types"
+	"github.com/porter-dev/porter/internal/models"
+	"helm.sh/helm/v3/pkg/release"
+)
+
+type DeleteReleaseHandler struct {
+	handlers.PorterHandlerReadWriter
+	authz.KubernetesAgentGetter
+}
+
+func NewDeleteReleaseHandler(
+	config *config.Config,
+	decoderValidator shared.RequestDecoderValidator,
+	writer shared.ResultWriter,
+) *DeleteReleaseHandler {
+	return &DeleteReleaseHandler{
+		PorterHandlerReadWriter: handlers.NewDefaultPorterHandler(config, decoderValidator, writer),
+		KubernetesAgentGetter:   authz.NewOutOfClusterAgentGetter(config),
+	}
+}
+
+func (c *DeleteReleaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	user, _ := r.Context().Value(types.UserScope).(*models.User)
+	cluster, _ := r.Context().Value(types.ClusterScope).(*models.Cluster)
+	helmRelease, _ := r.Context().Value(types.ReleaseScope).(*release.Release)
+
+	helmAgent, err := c.GetHelmAgent(r, cluster)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	_, err = helmAgent.UninstallChart(helmRelease.Name)
+
+	if err != nil {
+		c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+		return
+	}
+
+	rel, releaseErr := c.Repo().Release().ReadRelease(cluster.ID, helmRelease.Name, helmRelease.Namespace)
+
+	// update the github actions env if the release exists and is built from source
+	if cName := helmRelease.Chart.Metadata.Name; cName == "job" || cName == "web" || cName == "worker" {
+		if releaseErr == nil && rel != nil {
+			gitAction := rel.GitActionConfig
+
+			if gitAction != nil && gitAction.ID != 0 {
+				gaRunner, err := getGARunner(
+					c.Config(),
+					user.ID,
+					cluster.ProjectID,
+					cluster.ID,
+					rel.GitActionConfig,
+					helmRelease.Name,
+					helmRelease.Namespace,
+					rel,
+					helmRelease,
+				)
+
+				if err != nil {
+					c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+					return
+				}
+
+				err = gaRunner.Cleanup()
+
+				if err != nil {
+					c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+					return
+				}
+			}
+		}
+	}
+}

+ 8 - 1
api/server/handlers/release/ugprade.go

@@ -174,7 +174,7 @@ func (c *UpgradeReleaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request
 			gitAction := rel.GitActionConfig
 
 			if gitAction != nil && gitAction.ID != 0 {
-				err = updateGitActionEnvSecret(
+				gaRunner, err := getGARunner(
 					c.Config(),
 					user.ID,
 					cluster.ProjectID,
@@ -190,6 +190,13 @@ func (c *UpgradeReleaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request
 					c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
 					return
 				}
+
+				err = gaRunner.CreateEnvSecret()
+
+				if err != nil {
+					c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+					return
+				}
 			}
 		}
 	}

+ 8 - 1
api/server/handlers/release/update_rollback.go

@@ -74,7 +74,7 @@ func (c *RollbackReleaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Reques
 			gitAction := rel.GitActionConfig
 
 			if gitAction != nil && gitAction.ID != 0 {
-				err = updateGitActionEnvSecret(
+				gaRunner, err := getGARunner(
 					c.Config(),
 					user.ID,
 					cluster.ProjectID,
@@ -90,6 +90,13 @@ func (c *RollbackReleaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Reques
 					c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
 					return
 				}
+
+				err = gaRunner.CreateEnvSecret()
+
+				if err != nil {
+					c.HandleAPIError(w, r, apierrors.NewErrInternal(err))
+					return
+				}
 			}
 		}
 	}

+ 32 - 0
api/server/router/release.go

@@ -444,6 +444,38 @@ func getReleaseRoutes(
 		Router:   r,
 	})
 
+	// DELETE /api/projects/{project_id}/clusters/{cluster_id}/namespaces/{namespace}/releases/{name}/{version} ->
+	// release.NewDeleteReleaseHandler
+	deleteEndpoint := factory.NewAPIEndpoint(
+		&types.APIRequestMetadata{
+			Verb:   types.APIVerbDelete,
+			Method: types.HTTPVerbDelete,
+			Path: &types.Path{
+				Parent:       basePath,
+				RelativePath: relPath,
+			},
+			Scopes: []types.PermissionScope{
+				types.UserScope,
+				types.ProjectScope,
+				types.ClusterScope,
+				types.NamespaceScope,
+				types.ReleaseScope,
+			},
+		},
+	)
+
+	deleteHandler := release.NewDeleteReleaseHandler(
+		config,
+		factory.GetDecoderValidator(),
+		factory.GetResultWriter(),
+	)
+
+	routes = append(routes, &Route{
+		Endpoint: deleteEndpoint,
+		Handler:  deleteHandler,
+		Router:   r,
+	})
+
 	// POST /api/projects/{project_id}/clusters/{cluster_id}/namespaces/{namespace}/releases/image/batch ->
 	// release.NewUpdateImageBatchHandler
 	updateImageBatchEndpoint := factory.NewAPIEndpoint(

+ 0 - 1
dashboard/src/main/home/cluster-dashboard/expanded-chart/ExpandedChart.tsx

@@ -572,7 +572,6 @@ const ExpandedChart: React.FC<Props> = (props) => {
         {},
         {
           namespace: currentChart.namespace,
-          storage: StorageType.Secret,
           name: currentChart.name,
           id: currentProject.id,
           cluster_id: currentCluster.id,

+ 0 - 1
dashboard/src/main/home/cluster-dashboard/expanded-chart/ExpandedJobChart.tsx

@@ -554,7 +554,6 @@ class ExpandedJobChart extends Component<PropsType, StateType> {
         {},
         {
           namespace: currentChart.namespace,
-          storage: StorageType.Secret,
           name: currentChart.name,
           id: currentProject.id,
           cluster_id: currentCluster.id,

+ 3 - 4
dashboard/src/shared/api.tsx

@@ -836,11 +836,10 @@ const uninstallTemplate = baseApi<
     name: string;
     cluster_id: number;
     namespace: string;
-    storage: StorageType;
   }
->("POST", (pathParams) => {
-  let { id, name, cluster_id, storage, namespace } = pathParams;
-  return `/api/projects/${id}/delete/${name}?cluster_id=${cluster_id}&namespace=${namespace}&storage=${storage}`;
+>("DELETE", (pathParams) => {
+  let { id, name, cluster_id, namespace } = pathParams;
+  return `/api/projects/${id}/clusters/${cluster_id}/namespaces/${namespace}/releases/${name}/0`;
 });
 
 const updateUser = baseApi<

+ 1 - 1
docs/developing/backend-refactor-status.md

@@ -47,7 +47,7 @@
 | <li>- [X] `GET /api/projects/{project_id}/clusters/{cluster_id}/node/{node_name}`                                           | AB          |                 |             |                  |
 | <li>- [X] `GET /api/projects/{project_id}/clusters/{cluster_id}/nodes`                                                      | AB          |                 |             |                  |
 | <li>- [ ] `GET /api/projects/{project_id}/collaborators`                                                                    |             |                 |             |                  |
-| <li>- [ ] `POST /api/projects/{project_id}/delete/{name}`                                                                   |             |                 |             |                  |
+| <li>- [X] `POST /api/projects/{project_id}/delete/{name}`                                                                   | AB          |                 |             |                  |
 | <li>- [X] `POST /api/projects/{project_id}/deploy/addon/{name}/{version}`                                                   | AB          |                 |             |                  |
 | <li>- [X] `POST /api/projects/{project_id}/deploy/{name}/{version}`                                                         | AB          |                 |             |                  |
 | <li>- [X] `GET /api/projects/{project_id}/gitrepos`                                                                         | AB          |                 |             |                  |