chart_handler.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package api
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "net/url"
  6. "strconv"
  7. "github.com/go-chi/chi"
  8. "github.com/porter-dev/porter/internal/forms"
  9. "github.com/porter-dev/porter/internal/helm"
  10. )
  11. // Enumeration of chart API error codes, represented as int64
  12. const (
  13. ErrChartDecode ErrorCode = iota + 600
  14. ErrChartValidateFields
  15. )
  16. // HandleListCharts retrieves a list of charts with various filter options
  17. func (app *App) HandleListCharts(w http.ResponseWriter, r *http.Request) {
  18. session, err := app.store.Get(r, app.cookieName)
  19. if err != nil {
  20. app.handleErrorFormDecoding(err, ErrChartDecode, w)
  21. return
  22. }
  23. vals, err := url.ParseQuery(r.URL.RawQuery)
  24. if err != nil {
  25. app.handleErrorFormDecoding(err, ErrChartDecode, w)
  26. return
  27. }
  28. // get the filter options
  29. form := &forms.ListChartForm{
  30. ChartForm: &forms.ChartForm{
  31. Form: &helm.Form{},
  32. },
  33. ListFilter: &helm.ListFilter{},
  34. }
  35. form.PopulateListFromQueryParams(vals)
  36. if sessID, ok := session.Values["user_id"].(uint); ok {
  37. form.PopulateHelmOptionsFromUserID(sessID, app.repo.User)
  38. }
  39. // validate the form
  40. if err := app.validator.Struct(form); err != nil {
  41. app.handleErrorFormValidation(err, ErrChartValidateFields, w)
  42. return
  43. }
  44. // create a new agent
  45. var agent *helm.Agent
  46. if app.testing {
  47. agent = app.TestAgents.HelmAgent
  48. } else {
  49. agent, err = helm.GetAgentOutOfClusterConfig(form.ChartForm.Form, app.logger)
  50. }
  51. releases, err := agent.ListReleases(form.Namespace, form.ListFilter)
  52. if err != nil {
  53. app.handleErrorFormValidation(err, ErrChartValidateFields, w)
  54. return
  55. }
  56. if err := json.NewEncoder(w).Encode(releases); err != nil {
  57. app.handleErrorFormDecoding(err, ErrChartDecode, w)
  58. return
  59. }
  60. }
  61. // HandleGetChart retrieves a single chart based on a name and revision
  62. func (app *App) HandleGetChart(w http.ResponseWriter, r *http.Request) {
  63. session, err := app.store.Get(r, app.cookieName)
  64. if err != nil {
  65. app.handleErrorFormDecoding(err, ErrChartDecode, w)
  66. return
  67. }
  68. name := chi.URLParam(r, "name")
  69. revision, err := strconv.ParseUint(chi.URLParam(r, "revision"), 0, 64)
  70. // get the filter options
  71. form := &forms.GetChartForm{
  72. ChartForm: &forms.ChartForm{
  73. Form: &helm.Form{},
  74. },
  75. Name: name,
  76. Revision: int(revision),
  77. }
  78. vals, err := url.ParseQuery(r.URL.RawQuery)
  79. if err != nil {
  80. app.handleErrorFormDecoding(err, ErrChartDecode, w)
  81. return
  82. }
  83. form.PopulateHelmOptionsFromQueryParams(vals)
  84. if sessID, ok := session.Values["user_id"].(uint); ok {
  85. form.PopulateHelmOptionsFromUserID(sessID, app.repo.User)
  86. }
  87. // validate the form
  88. if err := app.validator.Struct(form); err != nil {
  89. app.handleErrorFormValidation(err, ErrChartValidateFields, w)
  90. return
  91. }
  92. // create a new agent
  93. var agent *helm.Agent
  94. if app.testing {
  95. agent = app.TestAgents.HelmAgent
  96. } else {
  97. agent, err = helm.GetAgentOutOfClusterConfig(form.ChartForm.Form, app.logger)
  98. }
  99. release, err := agent.GetRelease(form.Name, form.Revision)
  100. if err != nil {
  101. app.handleErrorFormValidation(err, ErrChartValidateFields, w)
  102. return
  103. }
  104. if err := json.NewEncoder(w).Encode(release); err != nil {
  105. app.handleErrorFormDecoding(err, ErrChartDecode, w)
  106. return
  107. }
  108. }