Просмотр исходного кода

Merge branch 'beta.3.delete-pod' of https://github.com/porter-dev/porter

jusrhee 5 лет назад
Родитель
Сommit
e0ebfd1606
4 измененных файлов с 82 добавлено и 0 удалено
  1. 10 0
      dashboard/src/shared/api.tsx
  2. 9 0
      internal/kubernetes/agent.go
  3. 49 0
      server/api/k8s_handler.go
  4. 14 0
      server/router/router.go

+ 10 - 0
dashboard/src/shared/api.tsx

@@ -220,6 +220,15 @@ const deleteInvite = baseApi<{}, { id: number; invId: number }>(
   }
 );
 
+const deletePod = baseApi<
+{
+  cluster_id: number;
+},
+{ name: string; namespace: string; id: number }
+>("DELETE", pathParams => {
+  return `/api/projects/${pathParams.id}/k8s/pods`;
+});
+
 const deleteProject = baseApi<{}, { id: number }>("DELETE", pathParams => {
   return `/api/projects/${pathParams.id}`;
 });
@@ -700,6 +709,7 @@ export default {
   deleteCluster,
   deleteGitRepoIntegration,
   deleteInvite,
+  deletePod,
   deleteProject,
   deleteRegistryIntegration,
   createSubdomain,

+ 9 - 0
internal/kubernetes/agent.go

@@ -140,6 +140,15 @@ func (a *Agent) GetPodsByLabel(selector string) (*v1.PodList, error) {
 	)
 }
 
+// DeletePod deletes a pod by name and namespace
+func (a *Agent) DeletePod(namespace string, name string) error {
+	return a.Clientset.CoreV1().Pods(namespace).Delete(
+		context.TODO(),
+		name,
+		metav1.DeleteOptions{},
+	)
+}
+
 // GetPodLogs streams real-time logs from a given pod.
 func (a *Agent) GetPodLogs(namespace string, name string, conn *websocket.Conn) error {
 	tails := int64(400)

+ 49 - 0
server/api/k8s_handler.go

@@ -262,6 +262,55 @@ func (app *App) HandleListPods(w http.ResponseWriter, r *http.Request) {
 	}
 }
 
+// HandleDeletePod deletes the pod given the name and namespace.
+func (app *App) HandleDeletePod(w http.ResponseWriter, r *http.Request) {
+	// get path parameters
+	namespace := chi.URLParam(r, "namespace")
+	name := chi.URLParam(r, "name")
+
+	vals, err := url.ParseQuery(r.URL.RawQuery)
+
+	if err != nil {
+		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
+		return
+	}
+
+	// get the filter options
+	form := &forms.K8sForm{
+		OutOfClusterConfig: &kubernetes.OutOfClusterConfig{
+			Repo:              app.Repo,
+			DigitalOceanOAuth: app.DOConf,
+		},
+	}
+
+	form.PopulateK8sOptionsFromQueryParams(vals, app.Repo.Cluster)
+
+	// validate the form
+	if err := app.validator.Struct(form); err != nil {
+		app.handleErrorFormValidation(err, ErrK8sValidate, w)
+		return
+	}
+
+	// create a new agent
+	var agent *kubernetes.Agent
+
+	if app.ServerConf.IsTesting {
+		agent = app.TestAgents.K8sAgent
+	} else {
+		agent, err = kubernetes.GetAgentOutOfClusterConfig(form.OutOfClusterConfig)
+	}
+
+	err = agent.DeletePod(namespace, name)
+
+	if err != nil {
+		app.handleErrorInternal(err, w)
+		return
+	}
+
+	w.WriteHeader(http.StatusOK)
+	return
+}
+
 // HandleStreamControllerStatus test calls
 // TODO: Refactor repeated calls.
 func (app *App) HandleStreamControllerStatus(w http.ResponseWriter, r *http.Request) {

+ 14 - 0
server/router/router.go

@@ -1182,6 +1182,20 @@ func New(a *api.App) *chi.Mux {
 			),
 		)
 
+		r.Method(
+			"DELETE",
+			"/projects/{project_id}/k8s/pods",
+			auth.DoesUserHaveProjectAccess(
+				auth.DoesUserHaveClusterAccess(
+					requestlog.NewHandler(a.HandleDeletePod, l),
+					mw.URLParam,
+					mw.QueryParam,
+				),
+				mw.URLParam,
+				mw.ReadAccess,
+			),
+		)
+
 		// /api/projects/{project_id}/subdomain routes
 		r.Method(
 			"POST",