mirror of
https://github.com/komodorio/helm-dashboard.git
synced 2026-03-24 11:48:04 +00:00
Support working with local charts (#215)
* Basic functioning * Support reconfiguring * Improve tests coverage * Always update local repo, don't offer to delete it * Handle multi-repo correctly * Document local charts usage * Screenshot for docs
This commit is contained in:
@@ -3,11 +3,13 @@ package handlers
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/hexops/gotextdiff"
|
||||
"github.com/hexops/gotextdiff/myers"
|
||||
"github.com/hexops/gotextdiff/span"
|
||||
"github.com/joomcode/errorx"
|
||||
"github.com/komodorio/helm-dashboard/pkg/dashboard/objects"
|
||||
"github.com/komodorio/helm-dashboard/pkg/dashboard/utils"
|
||||
"github.com/rogpeppe/go-internal/semver"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"gopkg.in/yaml.v3"
|
||||
@@ -15,12 +17,11 @@ import (
|
||||
"helm.sh/helm/v3/pkg/release"
|
||||
"helm.sh/helm/v3/pkg/repo"
|
||||
helmtime "helm.sh/helm/v3/pkg/time"
|
||||
"k8s.io/utils/strings/slices"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strconv"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/komodorio/helm-dashboard/pkg/dashboard/utils"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type HelmHandler struct {
|
||||
@@ -162,6 +163,7 @@ func (h *HelmHandler) RepoVersions(c *gin.Context) {
|
||||
AppVersion: r.AppVersion,
|
||||
Description: r.Description,
|
||||
Repository: r.Annotations[objects.AnnRepo],
|
||||
URLs: r.URLs,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -194,6 +196,7 @@ func (h *HelmHandler) RepoLatestVer(c *gin.Context) {
|
||||
AppVersion: r.AppVersion,
|
||||
Description: r.Description,
|
||||
Repository: r.Annotations[objects.AnnRepo],
|
||||
URLs: r.URLs,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -288,12 +291,19 @@ func (h *HelmHandler) Install(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
repoChart, err := h.checkLocalRepo(c.PostForm("chart"))
|
||||
if err != nil {
|
||||
_ = c.AbortWithError(http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
justTemplate := c.PostForm("preview") == "true"
|
||||
ns := c.Param("ns")
|
||||
if ns == "[empty]" {
|
||||
ns = ""
|
||||
}
|
||||
rel, err := app.Releases.Install(ns, c.PostForm("name"), c.PostForm("chart"), c.PostForm("version"), justTemplate, values)
|
||||
|
||||
rel, err := app.Releases.Install(ns, c.PostForm("name"), repoChart, c.PostForm("version"), justTemplate, values)
|
||||
if err != nil {
|
||||
_ = c.AbortWithError(http.StatusInternalServerError, err)
|
||||
return
|
||||
@@ -306,6 +316,16 @@ func (h *HelmHandler) Install(c *gin.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
func (h *HelmHandler) checkLocalRepo(repoChart string) (string, error) {
|
||||
if strings.HasPrefix(repoChart, "file://") {
|
||||
repoChart = repoChart[len("file://"):]
|
||||
if !slices.Contains(h.Data.LocalCharts, repoChart) {
|
||||
return "", fmt.Errorf("chart path is not present in local charts: %s", repoChart)
|
||||
}
|
||||
}
|
||||
return repoChart, nil
|
||||
}
|
||||
|
||||
func (h *HelmHandler) Upgrade(c *gin.Context) {
|
||||
app := h.GetApp(c)
|
||||
if app == nil {
|
||||
@@ -325,8 +345,14 @@ func (h *HelmHandler) Upgrade(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
repoChart, err := h.checkLocalRepo(c.PostForm("chart"))
|
||||
if err != nil {
|
||||
_ = c.AbortWithError(http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
justTemplate := c.PostForm("preview") == "true"
|
||||
rel, err := existing.Upgrade(c.PostForm("chart"), c.PostForm("version"), justTemplate, values)
|
||||
rel, err := existing.Upgrade(repoChart, c.PostForm("version"), justTemplate, values)
|
||||
if err != nil {
|
||||
_ = c.AbortWithError(http.StatusInternalServerError, err)
|
||||
return
|
||||
@@ -409,7 +435,13 @@ func (h *HelmHandler) RepoValues(c *gin.Context) {
|
||||
return // sets error inside
|
||||
}
|
||||
|
||||
out, err := app.Repositories.GetChartValues(c.Query("chart"), c.Query("version"))
|
||||
repoChart, err := h.checkLocalRepo(c.Query("chart"))
|
||||
if err != nil {
|
||||
_ = c.AbortWithError(http.StatusInternalServerError, err)
|
||||
return
|
||||
}
|
||||
|
||||
out, err := app.Repositories.GetChartValues(repoChart, c.Query("version"))
|
||||
if err != nil {
|
||||
_ = c.AbortWithError(http.StatusInternalServerError, err)
|
||||
return
|
||||
@@ -433,8 +465,8 @@ func (h *HelmHandler) RepoList(c *gin.Context) {
|
||||
out := []RepositoryElement{}
|
||||
for _, r := range repos {
|
||||
out = append(out, RepositoryElement{
|
||||
Name: r.Orig.Name,
|
||||
URL: r.Orig.URL,
|
||||
Name: r.Name(),
|
||||
URL: r.URL(),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -521,15 +553,16 @@ func (h *HelmHandler) handleGetSection(rel *objects.Release, section string, rDi
|
||||
return res, nil
|
||||
}
|
||||
|
||||
type RepoChartElement struct {
|
||||
type RepoChartElement struct { // TODO: do we need it at all? there is existing repo.ChartVersion in Helm
|
||||
Name string `json:"name"`
|
||||
Version string `json:"version"`
|
||||
AppVersion string `json:"app_version"`
|
||||
Description string `json:"description"`
|
||||
|
||||
InstalledNamespace string `json:"installed_namespace"`
|
||||
InstalledName string `json:"installed_name"`
|
||||
Repository string `json:"repository"`
|
||||
InstalledNamespace string `json:"installed_namespace"`
|
||||
InstalledName string `json:"installed_name"`
|
||||
Repository string `json:"repository"`
|
||||
URLs []string `json:"urls"`
|
||||
}
|
||||
|
||||
func HReleaseToJSON(o *release.Release) *ReleaseElement {
|
||||
|
||||
Reference in New Issue
Block a user