Skip to main content
Glama
crd_option.go3.54 kB
package dynamic import ( "context" "time" "github.com/duke-git/lancet/v2/slice" "github.com/gin-gonic/gin" "github.com/weibaohui/k8m/pkg/comm/utils/amis" "github.com/weibaohui/kom/kom" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) type CRDController struct{} func RegisterCRDRoutes(api *gin.RouterGroup) { ctrl := &CRDController{} api.GET("/crd/group/option_list", ctrl.GroupOptionList) api.GET("/crd/kind/option_list", ctrl.KindOptionList) api.GET("/crd/status", ctrl.CRDStatus) } // @Summary 获取CRD组选项列表 // @Security BearerAuth // @Param cluster query string true "集群名称" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/crd/group/option_list [get] func (cc *CRDController) GroupOptionList(c *gin.Context) { ctx := amis.GetContextWithUser(c) selectedCluster, err := amis.GetSelectedCluster(c) if err != nil { amis.WriteJsonError(c, err) return } groups := getCrdGroupList(ctx, selectedCluster) var options []map[string]string for _, n := range groups { options = append(options, map[string]string{ "label": n, "value": n, }) } amis.WriteJsonData(c, gin.H{ "options": options, }) } // @Summary 获取指定组的CRD类型选项列表 // @Security BearerAuth // @Param cluster query string true "集群名称" // @Param spec[group] query string true "CRD组名称" // @Success 200 {object} string // @Router /k8s/cluster/{cluster}/crd/kind/option_list [get] func (cc *CRDController) KindOptionList(c *gin.Context) { ctx := amis.GetContextWithUser(c) selectedCluster, err := amis.GetSelectedCluster(c) if err != nil { amis.WriteJsonError(c, err) return } g := c.Query("spec[group]") if g == "" { // 还没选group amis.WriteJsonData(c, gin.H{ "options": make([]map[string]string, 0), }) return } kinds := getCrdKindListByGroup(ctx, selectedCluster, g) var options []map[string]string for _, n := range kinds { options = append(options, map[string]string{ "label": n, "value": n, }) } amis.WriteJsonData(c, gin.H{ "options": options, }) } func getCrdGroupList(ctx context.Context, selectedCluster string) []string { list, err := getCrdList(ctx, selectedCluster) if err != nil { return make([]string, 0) } var groups []string for _, item := range list { group, found, err := unstructured.NestedString(item.Object, "spec", "group") if err != nil || !found { continue } groups = append(groups, group) } groups = slice.Unique(groups) slice.Sort(groups, "asc") return groups } func getCrdList(ctx context.Context, selectedCluster string) ([]*unstructured.Unstructured, error) { var list []*unstructured.Unstructured err := kom.Cluster(selectedCluster).WithContext(ctx).GVK( "apiextensions.k8s.io", "v1", "CustomResourceDefinition"). WithCache(time.Second * 30). List(&list).Error return list, err } func getCrdKindListByGroup(ctx context.Context, selectedCluster string, group string) []string { var list []*unstructured.Unstructured err := kom.Cluster(selectedCluster).WithContext(ctx).GVK( "apiextensions.k8s.io", "v1", "CustomResourceDefinition"). Where("`spec.group`=?", group). WithCache(time.Second * 30). List(&list).Error if err != nil { return make([]string, 0) } var kinds []string for _, item := range list { kind, found, err := unstructured.NestedString(item.Object, "spec", "names", "kind") if err != nil || !found { continue } kinds = append(kinds, kind) } kinds = slice.Unique(kinds) slice.Sort(kinds, "asc") return kinds }

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