Skip to main content
Glama
helm_release.go10 kB
package helm import ( "fmt" "time" "github.com/duke-git/lancet/v2/slice" "github.com/gin-gonic/gin" "github.com/weibaohui/k8m/pkg/comm/utils" "github.com/weibaohui/k8m/pkg/comm/utils/amis" "github.com/weibaohui/k8m/pkg/models" "k8s.io/klog/v2" ) type ReleaseController struct { } func RegisterHelmReleaseRoutes(api *gin.RouterGroup) { ctrl := &ReleaseController{} api.GET("/helm/release/list", ctrl.ListRelease) api.GET("/helm/release/ns/:ns/name/:name/history/list", ctrl.ListReleaseHistory) api.POST("/helm/release/:release/repo/:repo/chart/:chart/version/:version/install", ctrl.InstallRelease) api.POST("/helm/release/ns/:ns/name/:name/uninstall", ctrl.UninstallRelease) api.GET("/helm/release/ns/:ns/name/:name/revision/:revision/values", ctrl.GetReleaseValues) api.GET("/helm/release/ns/:ns/name/:name/revision/:revision/notes", ctrl.GetReleaseNote) api.GET("/helm/release/ns/:ns/name/:name/revision/:revision/install_log", ctrl.GetReleaseInstallLog) api.POST("/helm/release/batch/uninstall", ctrl.BatchUninstallRelease) api.POST("/helm/release/upgrade", ctrl.UpgradeRelease) } // @Summary 获取Release的历史版本 // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param ns path string true "命名空间" // @Param name path string true "Release名称" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/ns/{ns}/name/{name}/history/list [get] func (hr *ReleaseController) ListReleaseHistory(c *gin.Context) { releaseName := c.Param("name") ns := c.Param("ns") // 检查权限 err := handleCommonLogic(c, "list", releaseName, ns, "") if err != nil { amis.WriteJsonError(c, err) return } h, err := getHelm(c) if err != nil { amis.WriteJsonError(c, err) return } history, err := h.GetReleaseHistory(ns, releaseName) if err != nil { amis.WriteJsonError(c, err) return } amis.WriteJsonData(c, history) } // @Summary 获取Release列表 // @Security BearerAuth // @Param cluster query string true "集群名称" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/list [get] func (hr *ReleaseController) ListRelease(c *gin.Context) { // 检查权限 err := handleCommonLogic(c, "list", "", "", "") if err != nil { amis.WriteJsonError(c, err) return } h, err := getHelm(c) if err != nil { amis.WriteJsonError(c, err) return } list, err := h.GetReleaseList() if err != nil { amis.WriteJsonError(c, err) return } slice.SortBy(list, func(i, j *models.Release) bool { it, err := time.Parse("2006-01-02 15:04:05.000000 -0700 MST", i.Updated) if err != nil { return false } jt, err := time.Parse("2006-01-02 15:04:05.000000 -0700 MST", j.Updated) if err != nil { return false } return it.Before(jt) }) if list == nil { list = make([]*models.Release, 0) } amis.WriteJsonData(c, list) } // @Summary 安装Helm Release // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param release path string true "Release名称" // @Param repo path string true "仓库名称" // @Param chart path string true "Chart名称" // @Param version path string true "版本号" // @Param body body object true "安装参数" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/{release}/repo/{repo}/chart/{chart}/version/{version}/install [post] func (hr *ReleaseController) InstallRelease(c *gin.Context) { releaseName := c.Param("release") repoName := c.Param("repo") chartName := c.Param("chart") version := c.Param("version") var req struct { Values string `json:"values,omitempty"` Namespace string `json:"ns,omitempty"` } if err := c.ShouldBindJSON(&req); err != nil { amis.WriteJsonError(c, err) return } // 检查权限 err := handleCommonLogic(c, "create", releaseName, req.Namespace, repoName) if err != nil { amis.WriteJsonError(c, err) return } h, err := getHelm(c) if err != nil { amis.WriteJsonError(c, err) return } if releaseName == "" { releaseName = fmt.Sprintf("%s-%d", chartName, utils.RandNDigitInt(8)) } err = h.InstallRelease(req.Namespace, releaseName, repoName, chartName, version, req.Values) if err != nil { klog.Errorf("install %s/%s error %v", req.Namespace, releaseName, err) amis.WriteJsonError(c, err) return } amis.WriteJsonOKMsg(c, "正在安装中,界面显示可能有延迟") } // @Summary 卸载Helm Release // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param ns path string true "命名空间" // @Param name path string true "Release名称" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/ns/{ns}/name/{name}/uninstall [post] func (hr *ReleaseController) UninstallRelease(c *gin.Context) { releaseName := c.Param("name") ns := c.Param("ns") // 检查权限 err := handleCommonLogic(c, "delete", releaseName, ns, "") if err != nil { amis.WriteJsonError(c, err) return } h, err := getHelm(c) if err != nil { amis.WriteJsonError(c, err) return } if err := h.UninstallRelease(ns, releaseName); err != nil { amis.WriteJsonError(c, err) return } amis.WriteJsonOK(c) } // @Summary 获取ReleaseNote // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param ns path string true "命名空间" // @Param name path string true "Release名称" // @Param revision path string true "版本号" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/ns/{ns}/name/{name}/revision/{revision}/notes [get] func (hr *ReleaseController) GetReleaseNote(c *gin.Context) { releaseName := c.Param("name") ns := c.Param("ns") revision := c.Param("revision") // 检查权限 err := handleCommonLogic(c, "get", releaseName, ns, "") if err != nil { amis.WriteJsonError(c, err) return } h, err := getHelm(c) if err != nil { amis.WriteJsonError(c, err) return } note, err := h.GetReleaseNoteWithRevision(ns, releaseName, revision) if err != nil { amis.WriteJsonError(c, err) return } amis.WriteJsonData(c, gin.H{ "note": note, }) } // @Summary 获取Release安装Log // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param ns path string true "命名空间" // @Param name path string true "Release名称" // @Param revision path string true "版本号" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/ns/{ns}/name/{name}/revision/{revision}/install_log [get] func (hr *ReleaseController) GetReleaseInstallLog(c *gin.Context) { releaseName := c.Param("name") ns := c.Param("ns") selectedCluster, err := amis.GetSelectedCluster(c) if err != nil { amis.WriteJsonError(c, err) return } // 检查权限 err = handleCommonLogic(c, "get", releaseName, ns, "") if err != nil { amis.WriteJsonError(c, err) return } rr, err := models.GetHelmReleaseByNsAndReleaseName(ns, releaseName, selectedCluster) if err != nil { amis.WriteJsonError(c, err) return } amis.WriteJsonData(c, gin.H{ "result": rr.Result, }) } // @Summary 获取安装yaml // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param ns path string true "命名空间" // @Param name path string true "Release名称" // @Param revision path string true "版本号" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/ns/{ns}/name/{name}/revision/{revision}/values [get] func (hr *ReleaseController) GetReleaseValues(c *gin.Context) { releaseName := c.Param("name") ns := c.Param("ns") revision := c.Param("revision") // 检查权限 err := handleCommonLogic(c, "get", releaseName, ns, "") if err != nil { amis.WriteJsonError(c, err) return } h, err := getHelm(c) if err != nil { amis.WriteJsonError(c, err) return } ret := "" if revision == "" { ret, err = h.GetReleaseValues(ns, releaseName) if err != nil { amis.WriteJsonError(c, err) return } } else { ret, err = h.GetReleaseValuesWithRevision(ns, releaseName, revision) if err != nil { amis.WriteJsonError(c, err) return } } amis.WriteJsonData(c, ret) } // @Summary 批量卸载Helm Release // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param body body object true "批量卸载参数" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/batch/uninstall [post] func (hr *ReleaseController) BatchUninstallRelease(c *gin.Context) { var req struct { Names []string `json:"name_list"` Namespaces []string `json:"ns_list"` } if err := c.ShouldBindJSON(&req); err != nil { amis.WriteJsonError(c, err) return } for i := 0; i < len(req.Names); i++ { name := req.Names[i] ns := req.Namespaces[i] h, err := getHelm(c) if err != nil { amis.WriteJsonError(c, err) return } // 检查权限 err = handleCommonLogic(c, "delete", name, ns, "") if err != nil { amis.WriteJsonError(c, err) return } x := h.UninstallRelease(ns, name) if x != nil { klog.V(6).Infof("batch remove %s/%s error %v", ns, name, x) err = x } } amis.WriteJsonOK(c) } // @Summary 升级Helm Release // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param body body object true "升级参数" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/helm/release/upgrade [post] func (hr *ReleaseController) UpgradeRelease(c *gin.Context) { var req struct { Name string `json:"name,omitempty"` Namespace string `json:"namespace,omitempty"` Values string `json:"values,omitempty"` } if err := c.ShouldBindJSON(&req); err != nil { amis.WriteJsonError(c, err) return } // 检查权限 err := handleCommonLogic(c, "update", req.Name, req.Namespace, "") if err != nil { amis.WriteJsonError(c, err) return } h, err := getHelm(c) if err != nil { amis.WriteJsonError(c, err) return } if err := h.UpgradeRelease(req.Namespace, req.Name, req.Values); err != nil { amis.WriteJsonError(c, err) return } amis.WriteJsonOK(c) }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/weibaohui/k8m'

If you have feedback or need assistance with the MCP directory API, please join our Discord server