|
|
@@ -2,6 +2,7 @@ package api
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
+ "fmt"
|
|
|
"net/http"
|
|
|
"net/url"
|
|
|
"strconv"
|
|
|
@@ -391,6 +392,30 @@ 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) {
|
|
|
+ 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")
|
|
|
@@ -446,6 +471,147 @@ func (app *App) HandleUpgradeRelease(w http.ResponseWriter, r *http.Request) {
|
|
|
w.WriteHeader(http.StatusOK)
|
|
|
}
|
|
|
|
|
|
+// HandleReleaseDeployHook upgrades a release with new image commit
|
|
|
+func (app *App) HandleReleaseDeployHook(w http.ResponseWriter, r *http.Request) {
|
|
|
+ name := chi.URLParam(r, "name")
|
|
|
+ vals, err := url.ParseQuery(r.URL.RawQuery)
|
|
|
+
|
|
|
+ commit := vals["commit"][0]
|
|
|
+ repository := vals["repository"][0]
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ form := &forms.UpgradeReleaseForm{
|
|
|
+ ReleaseForm: &forms.ReleaseForm{
|
|
|
+ Form: &helm.Form{
|
|
|
+ Repo: app.Repo,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Name: name,
|
|
|
+ }
|
|
|
+
|
|
|
+ form.ReleaseForm.PopulateHelmOptionsFromQueryParams(
|
|
|
+ vals,
|
|
|
+ app.Repo.Cluster,
|
|
|
+ )
|
|
|
+
|
|
|
+ if err := json.NewDecoder(r.Body).Decode(form); err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrUserDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ agent, err := app.getAgentFromReleaseForm(
|
|
|
+ w,
|
|
|
+ r,
|
|
|
+ form.ReleaseForm,
|
|
|
+ )
|
|
|
+
|
|
|
+ // errors are handled in app.getAgentFromBodyParams
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ image := map[string]interface{}{}
|
|
|
+ image["repository"] = repository
|
|
|
+ image["tag"] = commit
|
|
|
+
|
|
|
+ newval := map[string]interface{}{}
|
|
|
+ newval["image"] = image
|
|
|
+
|
|
|
+ _, err = agent.UpgradeReleaseByValues(form.Name, newval)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
|
|
|
+ Code: ErrReleaseDeploy,
|
|
|
+ Errors: []string{"error upgrading release " + err.Error()},
|
|
|
+ }, w)
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusOK)
|
|
|
+}
|
|
|
+
|
|
|
+// HandleReleaseDeployWebhook upgrades a release when a chart specific webhook is called.
|
|
|
+func (app *App) HandleReleaseDeployWebhook(w http.ResponseWriter, r *http.Request) {
|
|
|
+ token := chi.URLParam(r, "token")
|
|
|
+
|
|
|
+ // retrieve release by token
|
|
|
+ release, err := app.Repo.Release.ReadReleaseByWebhookToken(token)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
|
|
|
+ Code: ErrReleaseReadData,
|
|
|
+ Errors: []string{"release not found with given webhook"},
|
|
|
+ }, w)
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ params := map[string][]string{}
|
|
|
+ params["cluster_id"] = []string{fmt.Sprint(release.ClusterID)}
|
|
|
+ params["storage"] = []string{"secret"}
|
|
|
+ params["namespace"] = []string{release.Namespace}
|
|
|
+
|
|
|
+ vals, err := url.ParseQuery(r.URL.RawQuery)
|
|
|
+
|
|
|
+ commit := vals["commit"][0]
|
|
|
+ repository := vals["repository"][0]
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ form := &forms.UpgradeReleaseForm{
|
|
|
+ ReleaseForm: &forms.ReleaseForm{
|
|
|
+ Form: &helm.Form{
|
|
|
+ Repo: app.Repo,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Name: release.Name,
|
|
|
+ }
|
|
|
+
|
|
|
+ form.ReleaseForm.PopulateHelmOptionsFromQueryParams(
|
|
|
+ params,
|
|
|
+ app.Repo.Cluster,
|
|
|
+ )
|
|
|
+
|
|
|
+ agent, err := app.getAgentFromReleaseForm(
|
|
|
+ w,
|
|
|
+ r,
|
|
|
+ form.ReleaseForm,
|
|
|
+ )
|
|
|
+
|
|
|
+ // errors are handled in app.getAgentFromBodyParams
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ image := map[string]interface{}{}
|
|
|
+ image["repository"] = repository
|
|
|
+ image["tag"] = commit
|
|
|
+
|
|
|
+ newval := map[string]interface{}{}
|
|
|
+ newval["image"] = image
|
|
|
+
|
|
|
+ _, err = agent.UpgradeReleaseByValues(form.Name, newval)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
|
|
|
+ Code: ErrReleaseDeploy,
|
|
|
+ Errors: []string{"error upgrading release " + err.Error()},
|
|
|
+ }, w)
|
|
|
+
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ w.WriteHeader(http.StatusOK)
|
|
|
+}
|
|
|
+
|
|
|
// HandleRollbackRelease rolls a release back to a specified revision
|
|
|
func (app *App) HandleRollbackRelease(w http.ResponseWriter, r *http.Request) {
|
|
|
name := chi.URLParam(r, "name")
|