Kaynağa Gözat

retrieve webhook token for release

sunguroku 5 yıl önce
ebeveyn
işleme
fcd27965cf

+ 14 - 0
dashboard/src/main/home/cluster-dashboard/expanded-chart/SettingsSection.tsx

@@ -32,6 +32,8 @@ export default class SettingsSection extends Component<PropsType, StateType> {
 
   // TODO: read in set image from form context instead of config
   componentDidMount() {
+    let { currentCluster, currentProject } = this.context;
+
     let image = this.props.currentChart.config?.image;
     if (image?.repository && image.tag) {
       this.setState({ 
@@ -39,6 +41,18 @@ export default class SettingsSection extends Component<PropsType, StateType> {
         selectedTag: image.tag 
       });
     }
+
+    api.getReleaseToken('<token>', {
+      namespace: this.props.currentChart.namespace,
+      cluster_id: currentCluster.id,
+      storage: StorageType.Secret
+    }, { id: currentProject.id, name: this.props.currentChart.name }, (err: any, res: any) => {
+      if (err) {
+        console.log(err)
+      } else {
+        console.log(res.data.webhook_token)
+      }
+    });
   }
 
   redeployWithNewImage = (img: string, tag: string) => {

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

@@ -149,6 +149,14 @@ const getProjects = baseApi<{}, { id: number }>('GET', pathParams => {
   return `/api/users/${pathParams.id}/projects`;
 });
 
+const getReleaseToken = baseApi<{ 
+  namespace: string,
+  cluster_id: number,
+  storage: StorageType,
+}, { name: string, id: number }>('GET', pathParams => {
+  return `/api/projects/${pathParams.id}/releases/${pathParams.name}/webhook_token`;
+});
+
 const createProject = baseApi<{ name: string }, {}>('POST', pathParams => {
   return `/api/projects`;
 });
@@ -247,6 +255,7 @@ export default {
   getBranches,
   getBranchContents,
   getProjects,
+  getReleaseToken,
   createProject,
   deleteProject,
   deployTemplate,

+ 9 - 1
server/api/deploy_handler.go

@@ -2,6 +2,7 @@ package api
 
 import (
 	"encoding/json"
+	"math/rand"
 	"net/http"
 	"net/url"
 
@@ -93,13 +94,20 @@ func (app *App) HandleDeployTemplate(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 
+	// generate 8 characters long webhook token.
+	const letters = "abcdefghijklmnopqrstuvwxyz"
+	token := make([]byte, 8)
+	for i := range token {
+		token[i] = letters[rand.Intn(len(letters))]
+	}
+
 	// create release with webhook token in db
 	release := &models.Release{
 		ClusterID:    form.ReleaseForm.Form.Cluster.ID,
 		ProjectID:    form.ReleaseForm.Form.Cluster.ProjectID,
 		Namespace:    form.ReleaseForm.Form.Namespace,
 		Name:         form.ChartTemplateForm.Name,
-		WebhookToken: "abcdef",
+		WebhookToken: string(token),
 	}
 
 	_, err = app.Repo.Release.CreateRelease(release)

+ 26 - 0
server/api/release_handler.go

@@ -2,6 +2,7 @@ package api
 
 import (
 	"encoding/json"
+	"fmt"
 	"net/http"
 	"net/url"
 	"strconv"
@@ -391,6 +392,31 @@ func (app *App) HandleListReleaseHistory(w http.ResponseWriter, r *http.Request)
 	}
 }
 
+// HandleGetReleaseToken retrieves the webhook token of a specific release.
+func (app *App) HandleGetReleaseToken(w http.ResponseWriter, r *http.Request) {
+	fmt.Println("GETTING RELEASE TOKEN")
+	name := chi.URLParam(r, "name")
+
+	vals, err := url.ParseQuery(r.URL.RawQuery)
+	namespace := vals["namespace"][0]
+
+	release, err := app.Repo.Release.ReadRelease(name, namespace)
+
+	if err != nil {
+		app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
+			Code:   ErrReleaseReadData,
+			Errors: []string{"release not found"},
+		}, w)
+	}
+
+	releaseExt := release.Externalize()
+
+	if err := json.NewEncoder(w).Encode(releaseExt); err != nil {
+		app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
+		return
+	}
+}
+
 // HandleUpgradeRelease upgrades a release with new values.yaml
 func (app *App) HandleUpgradeRelease(w http.ResponseWriter, r *http.Request) {
 	name := chi.URLParam(r, "name")

+ 20 - 0
server/router/router.go

@@ -471,6 +471,20 @@ func New(a *api.App) *chi.Mux {
 			),
 		)
 
+		r.Method(
+			"GET",
+			"/projects/{project_id}/releases/{name}/webhook_token",
+			auth.DoesUserHaveProjectAccess(
+				auth.DoesUserHaveClusterAccess(
+					requestlog.NewHandler(a.HandleGetReleaseToken, l),
+					mw.URLParam,
+					mw.QueryParam,
+				),
+				mw.URLParam,
+				mw.ReadAccess,
+			),
+		)
+
 		r.Method(
 			"POST",
 			"/projects/{project_id}/releases/{name}/upgrade",
@@ -519,6 +533,12 @@ func New(a *api.App) *chi.Mux {
 			requestlog.NewHandler(a.HandleReleaseDeployHook, l),
 		)
 
+		r.Method(
+			"POST",
+			"/webhooks/deploy/{token}",
+			requestlog.NewHandler(a.HandleReleaseDeployHook, l),
+		)
+
 		// /api/projects/{project_id}/repos routes
 		// r.Method(
 		// 	"GET",