Files
waf-platform/EdgeAdmin/internal/web/actions/default/httpdns/clusters/cluster.go
2026-02-27 10:35:22 +08:00

98 lines
2.3 KiB
Go

package clusters
import (
"strings"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/httpdns/httpdnsutils"
"github.com/iwind/TeaGo/maps"
)
type ClusterAction struct {
actionutils.ParentAction
}
func (this *ClusterAction) Init() {
this.Nav("httpdns", "cluster", "index")
}
func (this *ClusterAction) RunGet(params struct {
ClusterId int64
InstalledState int
ActiveState int
Keyword string
}) {
httpdnsutils.AddLeftMenu(this.Parent())
cluster, err := findClusterMap(this.Parent(), params.ClusterId)
if err != nil {
this.ErrorPage(err)
return
}
httpdnsutils.AddClusterTabbar(this.Parent(), cluster.GetString("name"), params.ClusterId, "node")
nodes, err := listNodeMaps(this.Parent(), params.ClusterId)
if err != nil {
this.ErrorPage(err)
return
}
nodes = filterClusterNodes(nodes, params.InstalledState, params.ActiveState, params.Keyword)
this.Data["clusterId"] = params.ClusterId
this.Data["cluster"] = cluster
this.Data["installState"] = params.InstalledState
this.Data["activeState"] = params.ActiveState
this.Data["keyword"] = params.Keyword
this.Data["nodes"] = nodes
this.Data["hasNodes"] = len(nodes) > 0
this.Data["page"] = ""
this.Show()
}
func filterClusterNodes(nodes []maps.Map, installedState int, activeState int, keyword string) []maps.Map {
keyword = strings.ToLower(strings.TrimSpace(keyword))
result := make([]maps.Map, 0, len(nodes))
for _, node := range nodes {
isInstalled := node.GetBool("isInstalled")
if installedState == 1 && !isInstalled {
continue
}
if installedState == 2 && isInstalled {
continue
}
status := node.GetMap("status")
isOnline := node.GetBool("isOn") && node.GetBool("isUp") && status.GetBool("isActive")
if activeState == 1 && !isOnline {
continue
}
if activeState == 2 && isOnline {
continue
}
if len(keyword) > 0 {
hit := strings.Contains(strings.ToLower(node.GetString("name")), keyword)
if !hit {
ipAddresses, ok := node["ipAddresses"].([]maps.Map)
if ok {
for _, ipAddr := range ipAddresses {
if strings.Contains(strings.ToLower(ipAddr.GetString("ip")), keyword) {
hit = true
break
}
}
}
}
if !hit {
continue
}
}
result = append(result, node)
}
return result
}