deploy_handler.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "math/rand"
  6. "net/http"
  7. "net/url"
  8. "github.com/go-chi/chi"
  9. "github.com/porter-dev/porter/internal/forms"
  10. "github.com/porter-dev/porter/internal/helm"
  11. "github.com/porter-dev/porter/internal/helm/loader"
  12. "github.com/porter-dev/porter/internal/models"
  13. )
  14. // HandleDeployTemplate triggers a chart deployment from a template
  15. func (app *App) HandleDeployTemplate(w http.ResponseWriter, r *http.Request) {
  16. name := chi.URLParam(r, "name")
  17. version := chi.URLParam(r, "version")
  18. // if version passed as latest, pass empty string to loader to get latest
  19. if version == "latest" {
  20. version = ""
  21. }
  22. getChartForm := &forms.ChartForm{
  23. Name: name,
  24. Version: version,
  25. RepoURL: app.ServerConf.DefaultHelmRepoURL,
  26. }
  27. // if a repo_url is passed as query param, it will be populated
  28. vals, err := url.ParseQuery(r.URL.RawQuery)
  29. if err != nil {
  30. app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
  31. return
  32. }
  33. getChartForm.PopulateRepoURLFromQueryParams(vals)
  34. chart, err := loader.LoadChartPublic(getChartForm.RepoURL, getChartForm.Name, getChartForm.Version)
  35. if err != nil {
  36. app.handleErrorFormDecoding(err, ErrReleaseDecode, w)
  37. return
  38. }
  39. form := &forms.InstallChartTemplateForm{
  40. ReleaseForm: &forms.ReleaseForm{
  41. Form: &helm.Form{
  42. Repo: app.Repo,
  43. },
  44. },
  45. ChartTemplateForm: &forms.ChartTemplateForm{},
  46. }
  47. form.ReleaseForm.PopulateHelmOptionsFromQueryParams(
  48. vals,
  49. app.Repo.Cluster,
  50. )
  51. if err := json.NewDecoder(r.Body).Decode(form); err != nil {
  52. app.handleErrorFormDecoding(err, ErrUserDecode, w)
  53. return
  54. }
  55. agent, err := app.getAgentFromReleaseForm(
  56. w,
  57. r,
  58. form.ReleaseForm,
  59. )
  60. if err != nil {
  61. app.handleErrorFormDecoding(err, ErrUserDecode, w)
  62. return
  63. }
  64. conf := &helm.InstallChartConfig{
  65. Chart: chart,
  66. Name: form.ChartTemplateForm.Name,
  67. Namespace: form.ReleaseForm.Form.Namespace,
  68. Values: form.ChartTemplateForm.FormValues,
  69. }
  70. _, err = agent.InstallChart(conf)
  71. if err != nil {
  72. app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
  73. Code: ErrReleaseDeploy,
  74. Errors: []string{"error installing a new chart: " + err.Error()},
  75. }, w)
  76. return
  77. }
  78. // generate 8 characters long webhook token.
  79. const letters = "abcdefghijklmnopqrstuvwxyz"
  80. token := make([]byte, 8)
  81. for i := range token {
  82. token[i] = letters[rand.Intn(len(letters))]
  83. }
  84. // create release with webhook token in db
  85. release := &models.Release{
  86. ClusterID: form.ReleaseForm.Form.Cluster.ID,
  87. ProjectID: form.ReleaseForm.Form.Cluster.ProjectID,
  88. Namespace: form.ReleaseForm.Form.Namespace,
  89. Name: form.ChartTemplateForm.Name,
  90. WebhookToken: string(token),
  91. }
  92. _, err = app.Repo.Release.CreateRelease(release)
  93. if err != nil {
  94. app.sendExternalError(err, http.StatusInternalServerError, HTTPError{
  95. Code: ErrReleaseDeploy,
  96. Errors: []string{"error creating a webhook: " + err.Error()},
  97. }, w)
  98. }
  99. w.WriteHeader(http.StatusOK)
  100. }
  101. // HandleUninstallTemplate triggers a chart deployment from a template
  102. func (app *App) HandleUninstallTemplate(w http.ResponseWriter, r *http.Request) {
  103. name := chi.URLParam(r, "name")
  104. fmt.Println(name)
  105. form := &forms.GetReleaseForm{
  106. ReleaseForm: &forms.ReleaseForm{
  107. Form: &helm.Form{
  108. Repo: app.Repo,
  109. },
  110. },
  111. Name: name,
  112. Revision: int(0),
  113. }
  114. agent, err := app.getAgentFromQueryParams(
  115. w,
  116. r,
  117. form.ReleaseForm,
  118. form.ReleaseForm.PopulateHelmOptionsFromQueryParams,
  119. )
  120. // errors are handled in app.getAgentFromQueryParams
  121. if err != nil {
  122. fmt.Println("asdf")
  123. return
  124. }
  125. _, err = agent.UninstallChart(name)
  126. if err != nil {
  127. fmt.Println("gg")
  128. }
  129. w.WriteHeader(http.StatusOK)
  130. return
  131. }