Skip to main content
Glama
cluster.go6.27 kB
package cluster import ( "errors" "github.com/duke-git/lancet/v2/slice" "github.com/gin-gonic/gin" "github.com/weibaohui/k8m/internal/dao" "github.com/weibaohui/k8m/pkg/comm/utils" "github.com/weibaohui/k8m/pkg/comm/utils/amis" "github.com/weibaohui/k8m/pkg/models" "github.com/weibaohui/k8m/pkg/service" "gorm.io/gorm" ) type Controller struct { } func RegisterAdminClusterRoutes(admin *gin.RouterGroup) { ctrl := &Controller{} admin.POST("/cluster/scan", ctrl.Scan) admin.GET("/cluster/file/option_list", ctrl.FileOptionList) admin.POST("/cluster/kubeconfig/save", ctrl.SaveKubeConfig) admin.POST("/cluster/kubeconfig/remove", ctrl.RemoveKubeConfig) admin.POST("/cluster/:cluster/disconnect", ctrl.Disconnect) admin.POST("/cluster/aws/save", ctrl.SaveAWSEKSCluster) admin.POST("/cluster/token/save", ctrl.SaveTokenCluster) admin.GET("/cluster/config/:id", ctrl.GetClusterConfig) admin.POST("/cluster/config/save", ctrl.SaveClusterConfig) } func RegisterUserClusterRoutes(mgm *gin.RouterGroup) { ctrl := &Controller{} // 前端用户点击重连接按钮 mgm.POST("/cluster/:cluster/reconnect", ctrl.Reconnect) } // @Summary 获取文件类型的集群选项 // @Description 获取所有已发现集群的kubeconfig文件名列表,用于下拉选项 // @Security BearerAuth // @Success 200 {object} string // @Router /admin/cluster/file/option_list [get] func (a *Controller) FileOptionList(c *gin.Context) { clusters := service.ClusterService().AllClusters() if len(clusters) == 0 { amis.WriteJsonData(c, gin.H{ "options": make([]map[string]string, 0), }) return } var fileNames []string for _, cluster := range clusters { fileNames = append(fileNames, cluster.FileName) } fileNames = slice.Unique(fileNames) var options []map[string]any for _, fn := range fileNames { options = append(options, map[string]any{ "label": fn, "value": fn, }) } amis.WriteJsonData(c, gin.H{ "options": options, }) } // @Summary 扫描集群 // @Description 扫描本地Kubeconfig文件目录以发现新的集群 // @Security BearerAuth // @Success 200 {object} string // @Router /admin/cluster/scan [post] func (a *Controller) Scan(c *gin.Context) { service.ClusterService().Scan() amis.WriteJsonData(c, "ok") } // @Summary 重新连接集群 // @Description 重新连接一个已断开的集群 // @Security BearerAuth // @Param cluster path string true "Base64编码的集群ID" // @Success 200 {object} string "已执行,请稍后刷新" // @Router /mgm/cluster/{cluster}/reconnect [post] func (a *Controller) Reconnect(c *gin.Context) { clusterBase64 := c.Param("cluster") clusterID, err := utils.DecodeBase64(clusterBase64) if err != nil { amis.WriteJsonError(c, err) return } go service.ClusterService().Connect(clusterID) amis.WriteJsonOKMsg(c, "已执行,请稍后刷新") } // @Summary 断开集群连接 // @Description 断开一个正在运行的集群的连接 // @Security BearerAuth // @Param cluster path string true "Base64编码的集群ID" // @Success 200 {object} string "已执行,请稍后刷新" // @Router /admin/cluster/{cluster}/disconnect [post] func (a *Controller) Disconnect(c *gin.Context) { clusterBase64 := c.Param("cluster") clusterID, err := utils.DecodeBase64(clusterBase64) if err != nil { amis.WriteJsonError(c, err) return } service.ClusterService().Disconnect(clusterID) amis.WriteJsonOKMsg(c, "已执行,请稍后刷新") } // GetClusterConfig 获取集群配置参数 // @Summary 获取集群配置参数 // @Description 根据集群ID获取kom相关配置参数 // @Tags cluster // @Accept json // @Produce json // @Param id path string true "集群ID" // @Security BearerAuth // @Success 200 {object} models.KubeConfig // @Router /admin/cluster/config/{id} [get] func (a *Controller) GetClusterConfig(c *gin.Context) { id := c.Param("id") if id == "" { amis.WriteJsonError(c, errors.New("集群ID不能为空")) return } params := dao.BuildParams(c) kubeConfig := &models.KubeConfig{} // 根据ID查询集群配置 config, err := kubeConfig.GetOne(params, func(db *gorm.DB) *gorm.DB { return db.Where("id = ?", id) }) if err != nil { amis.WriteJsonError(c, err) return } // 只返回配置相关的字段 configData := map[string]any{ "id": config.ID, "proxyURL": config.ProxyURL, "timeout": config.Timeout, "qps": config.QPS, "burst": config.Burst, } amis.WriteJsonData(c, configData) } // SaveClusterConfig 保存集群配置参数 // @Summary 保存集群配置参数 // @Description 保存集群的kom相关配置参数 // @Tags cluster // @Accept json // @Produce json // @Param config body object true "集群配置参数" // @Security BearerAuth // @Success 200 {object} string // @Router /admin/cluster/config/save [post] func (a *Controller) SaveClusterConfig(c *gin.Context) { var configData struct { ID uint `json:"id" binding:"required"` ProxyURL string `json:"proxyURL"` Timeout int `json:"timeout"` QPS float32 `json:"qps"` Burst int `json:"burst"` } if err := c.ShouldBindJSON(&configData); err != nil { amis.WriteJsonError(c, err) return } params := dao.BuildParams(c) kubeConfig := &models.KubeConfig{} // 根据ID查询现有配置 config, err := kubeConfig.GetOne(params, func(db *gorm.DB) *gorm.DB { return db.Where("id = ?", configData.ID) }) if err != nil { amis.WriteJsonError(c, err) return } // 更新配置字段 config.ProxyURL = configData.ProxyURL config.Timeout = configData.Timeout config.QPS = configData.QPS config.Burst = configData.Burst // 保存更新 if err := config.Save(params); err != nil { amis.WriteJsonError(c, err) return } // 更新已加载集群的配置参数 if err := service.ClusterService().UpdateClusterConfig(configData.ID, configData.ProxyURL, configData.Timeout, configData.QPS, configData.Burst); err != nil { // 记录错误但不影响保存操作的成功响应 // 因为数据库已经保存成功,只是内存中的集群配置更新失败 // 下次重新扫描时会自动同步 // 这里可以考虑记录日志 } // 执行一下扫描 service.ClusterService().ScanClustersInDB() amis.WriteJsonOKMsg(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