deploy_handler.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package api
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/url"
  6. "github.com/go-chi/chi"
  7. "github.com/porter-dev/porter/internal/forms"
  8. "github.com/porter-dev/porter/internal/helm"
  9. "github.com/porter-dev/porter/internal/helm/loader"
  10. )
  11. // HandleDeployTemplate triggers a chart deployment from a template
  12. func (app *App) HandleDeployTemplate(w http.ResponseWriter, r *http.Request) {
  13. name := chi.URLParam(r, "name")
  14. version := chi.URLParam(r, "version")
  15. // if version passed as latest, pass empty string to loader to get latest
  16. if version == "latest" {
  17. version = ""
  18. }
  19. getChartForm := &forms.ChartForm{
  20. Name: name,
  21. Version: version,
  22. RepoURL: "https://porter-dev.github.io/chart-repo/",
  23. }
  24. // if a repo_url is passed as query param, it will be populated
  25. vals, err := url.ParseQuery(r.URL.RawQuery)
  26. if err != nil {
  27. app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
  28. return
  29. }
  30. getChartForm.PopulateRepoURLFromQueryParams(vals)
  31. chart, err := loader.LoadChart(getChartForm.RepoURL, getChartForm.Name, getChartForm.Version)
  32. if err != nil {
  33. app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
  34. return
  35. }
  36. form := &forms.InstallChartTemplateForm{
  37. ReleaseForm: &forms.ReleaseForm{
  38. Form: &helm.Form{
  39. Repo: app.repo,
  40. },
  41. },
  42. ChartTemplateForm: &forms.ChartTemplateForm{},
  43. }
  44. form.ReleaseForm.PopulateHelmOptionsFromQueryParams(
  45. vals,
  46. app.repo.Cluster,
  47. )
  48. if err := json.NewDecoder(r.Body).Decode(form); err != nil {
  49. app.handleErrorFormDecoding(err, ErrUserDecode, w)
  50. return
  51. }
  52. agent, err := app.getAgentFromReleaseForm(
  53. w,
  54. r,
  55. form.ReleaseForm,
  56. )
  57. if err != nil {
  58. app.handleErrorFormDecoding(err, ErrUserDecode, w)
  59. return
  60. }
  61. conf := &helm.InstallChartConfig{
  62. Chart: chart,
  63. Name: form.ChartTemplateForm.Name,
  64. Namespace: form.ReleaseForm.Form.Namespace,
  65. Values: form.ChartTemplateForm.FormValues,
  66. }
  67. _, err = agent.InstallChart(conf)
  68. if err != nil {
  69. app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
  70. Code: ErrReleaseDeploy,
  71. Errors: []string{"error installing a new chart: " + err.Error()},
  72. }, w)
  73. return
  74. }
  75. w.WriteHeader(http.StatusOK)
  76. }