mirror of
				https://github.com/TeaOSLab/EdgeCommon.git
				synced 2025-11-04 05:00:24 +08:00 
			
		
		
		
	删除不需要的文件
This commit is contained in:
		@@ -1,432 +0,0 @@
 | 
			
		||||
// Copyright 2023 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
 | 
			
		||||
//go:build plus
 | 
			
		||||
 | 
			
		||||
package nodeconfigs
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
 | 
			
		||||
	"github.com/iwind/TeaGo/maps"
 | 
			
		||||
	"github.com/iwind/TeaGo/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type NodeActionParam = string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NodeActionParamDailyTrafficOut   NodeActionParam = "dailyTrafficOut"   // 节点日出口流量
 | 
			
		||||
	NodeActionParamMonthlyTrafficOut NodeActionParam = "monthlyTrafficOut" // 节点月出口流量
 | 
			
		||||
 | 
			
		||||
	// NodeActionParamTotalTraffic   NodeActionParam = "totalTraffic"   // 节点总流量 TODO 需要实现
 | 
			
		||||
 | 
			
		||||
	NodeActionParamBandwidthIn  NodeActionParam = "bandwidthIn"  // 节点入口带宽
 | 
			
		||||
	NodeActionParamBandwidthOut NodeActionParam = "bandwidthOut" // 节点出口带宽
 | 
			
		||||
	NodeActionParamCPUUsage     NodeActionParam = "cpuUsage"     // 节点CPU用量,百分比制,0-100
 | 
			
		||||
	NodeActionParamMemoryUsage  NodeActionParam = "memoryUsage"  // 节点内存用量,百分比制,0-100
 | 
			
		||||
	NodeActionParamLoad         NodeActionParam = "load"         // 当前节点负载
 | 
			
		||||
 | 
			
		||||
	// NodeActionParamConnectivity NodeActionParam = "connectivity" // 节点连通性 TODO 需要实现
 | 
			
		||||
 | 
			
		||||
	NodeActionParamHealthCheckFailure NodeActionParam = "heathCheckFailure" // 节点健康检查失败
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type NodeActionParamDefinition struct {
 | 
			
		||||
	Name        string               `json:"name"`
 | 
			
		||||
	Code        string               `json:"code"`
 | 
			
		||||
	Description string               `json:"description"`
 | 
			
		||||
	Operators   []NodeActionOperator `json:"operators"`
 | 
			
		||||
	ValueName   string               `json:"valueName"`
 | 
			
		||||
	ValueType   string               `json:"valueType"`
 | 
			
		||||
	HasDuration bool                 `json:"hasDuration"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FindAllNodeActionParamDefinitions() []*NodeActionParamDefinition {
 | 
			
		||||
	return []*NodeActionParamDefinition{
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionParamBandwidthOut,
 | 
			
		||||
			Name:        "节点出口带宽",
 | 
			
		||||
			Description: "当前节点当前时间点的出口平均带宽(从节点发送到客户端)。",
 | 
			
		||||
			Operators:   allNodeActionNumberOperators,
 | 
			
		||||
			ValueName:   "对比带宽",
 | 
			
		||||
			ValueType:   "bandwidth",
 | 
			
		||||
			HasDuration: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionParamBandwidthIn,
 | 
			
		||||
			Name:        "节点入口带宽",
 | 
			
		||||
			Description: "当前节点当前时间点的入口平均带宽(从客户端发送到节点)。",
 | 
			
		||||
			Operators:   allNodeActionNumberOperators,
 | 
			
		||||
			ValueName:   "对比带宽",
 | 
			
		||||
			ValueType:   "bandwidth",
 | 
			
		||||
			HasDuration: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionParamMonthlyTrafficOut,
 | 
			
		||||
			Name:        "节点当月流量",
 | 
			
		||||
			Description: "当前节点在当月的出口流量。",
 | 
			
		||||
			Operators:   allNodeActionNumberOperators,
 | 
			
		||||
			ValueName:   "对比流量",
 | 
			
		||||
			ValueType:   "traffic",
 | 
			
		||||
			HasDuration: false,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionParamDailyTrafficOut,
 | 
			
		||||
			Name:        "节点当日流量",
 | 
			
		||||
			Description: "当前节点在当天的出口流量。",
 | 
			
		||||
			Operators:   allNodeActionNumberOperators,
 | 
			
		||||
			ValueName:   "对比流量",
 | 
			
		||||
			ValueType:   "traffic",
 | 
			
		||||
			HasDuration: false,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionParamCPUUsage,
 | 
			
		||||
			Name:        "节点CPU利用率",
 | 
			
		||||
			Description: "节点当前CPU利用率,取值范围为0-100。",
 | 
			
		||||
			Operators:   allNodeActionNumberOperators,
 | 
			
		||||
			ValueName:   "CPU利用率",
 | 
			
		||||
			ValueType:   "cpu",
 | 
			
		||||
			HasDuration: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionParamMemoryUsage,
 | 
			
		||||
			Name:        "节点内存利用率",
 | 
			
		||||
			Description: "节点当前内存利用率,取值范围为0-100。",
 | 
			
		||||
			Operators:   allNodeActionNumberOperators,
 | 
			
		||||
			ValueName:   "内存利用率",
 | 
			
		||||
			ValueType:   "memory",
 | 
			
		||||
			HasDuration: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionParamLoad,
 | 
			
		||||
			Name:        "节点负载",
 | 
			
		||||
			Description: "节点当前负载,取值范围为0-∞,通常超过10表示系统负载较重。",
 | 
			
		||||
			Operators:   allNodeActionNumberOperators,
 | 
			
		||||
			ValueName:   "系统负载",
 | 
			
		||||
			ValueType:   "load",
 | 
			
		||||
			HasDuration: true,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionParamHealthCheckFailure,
 | 
			
		||||
			Name:        "健康检查失败",
 | 
			
		||||
			Description: "当前节点任一IP健康检查失败。",
 | 
			
		||||
			Operators:   nil,
 | 
			
		||||
			HasDuration: true,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NodeActionOperator = string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NodeActionOperatorGt  NodeActionOperator = "gt"
 | 
			
		||||
	NodeActionOperatorGte NodeActionOperator = "gte"
 | 
			
		||||
	NodeActionOperatorLt  NodeActionOperator = "lt"
 | 
			
		||||
	NodeActionOperatorLte NodeActionOperator = "lte"
 | 
			
		||||
	NodeActionOperatorEq  NodeActionOperator = "eq"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var allNodeActionNumberOperators = []NodeActionOperator{NodeActionOperatorGt, NodeActionOperatorGte, NodeActionOperatorLt, NodeActionOperatorLte, NodeActionOperatorEq}
 | 
			
		||||
 | 
			
		||||
func FindAllNodeActionOperatorDefinitions() []*shared.Definition {
 | 
			
		||||
	return []*shared.Definition{
 | 
			
		||||
		{
 | 
			
		||||
			Code: NodeActionOperatorGt,
 | 
			
		||||
			Name: "大于(>)",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code: NodeActionOperatorGte,
 | 
			
		||||
			Name: "大于等于(≥)",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code: NodeActionOperatorLt,
 | 
			
		||||
			Name: "小于(<)",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code: NodeActionOperatorLte,
 | 
			
		||||
			Name: "小于等于(≤)",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code: NodeActionOperatorEq,
 | 
			
		||||
			Name: "等于(=)",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NodeActionCondConnector 条件之间关系
 | 
			
		||||
type NodeActionCondConnector = string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NodeActionCondConnectorAnd NodeActionCondConnector = "and"
 | 
			
		||||
	NodeActionCondConnectorOr  NodeActionCondConnector = "or"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type NodeActionCond struct {
 | 
			
		||||
	Param    NodeActionParam    `json:"param"`    // 参数名
 | 
			
		||||
	Operator NodeActionOperator `json:"operator"` // 操作符
 | 
			
		||||
	Value    any                `json:"value"`    // 对比值
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *NodeActionCond) Match(value any) bool {
 | 
			
		||||
	var paramDef *NodeActionParamDefinition
 | 
			
		||||
	for _, paramDef2 := range FindAllNodeActionParamDefinitions() {
 | 
			
		||||
		if paramDef2.Code == this.Param {
 | 
			
		||||
			paramDef = paramDef2
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if paramDef == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch paramDef.ValueType {
 | 
			
		||||
	case "bandwidth":
 | 
			
		||||
		if value != nil && !this.isScalar(value) {
 | 
			
		||||
			var value1Map = maps.NewMap(value)
 | 
			
		||||
			value = this.toBandwidthBits(value1Map)
 | 
			
		||||
		}
 | 
			
		||||
		var value2Map = maps.NewMap(this.Value)
 | 
			
		||||
		return this.compare(value, this.toBandwidthBits(value2Map))
 | 
			
		||||
	case "traffic":
 | 
			
		||||
		if value != nil && !this.isScalar(value) {
 | 
			
		||||
			var value1Map = maps.NewMap(value)
 | 
			
		||||
			value = this.toTrafficBytes(value1Map)
 | 
			
		||||
		}
 | 
			
		||||
		var value2Map = maps.NewMap(this.Value)
 | 
			
		||||
		return this.compare(value, this.toTrafficBytes(value2Map))
 | 
			
		||||
	case "cpu":
 | 
			
		||||
		return this.compare(value, this.Value)
 | 
			
		||||
	case "memory":
 | 
			
		||||
		return this.compare(value, this.Value)
 | 
			
		||||
	case "load":
 | 
			
		||||
		return this.compare(value, this.Value)
 | 
			
		||||
	case "":
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *NodeActionCond) compare(value1, value2 any) bool {
 | 
			
		||||
	switch this.Operator {
 | 
			
		||||
	case NodeActionOperatorGt:
 | 
			
		||||
		return types.Int64(value1) > types.Int64(value2)
 | 
			
		||||
	case NodeActionOperatorGte:
 | 
			
		||||
		return types.Int64(value1) >= types.Int64(value2)
 | 
			
		||||
	case NodeActionOperatorLt:
 | 
			
		||||
		return types.Int64(value1) < types.Int64(value2)
 | 
			
		||||
	case NodeActionOperatorLte:
 | 
			
		||||
		return types.Int64(value1) <= types.Int64(value2)
 | 
			
		||||
	case NodeActionOperatorEq:
 | 
			
		||||
		return types.Int64(value1) == types.Int64(value2)
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *NodeActionCond) toBandwidthBits(m maps.Map) int64 {
 | 
			
		||||
	var count = m.GetInt64("count")
 | 
			
		||||
	var unit = m.GetString("unit")
 | 
			
		||||
	if count <= 0 {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	switch unit {
 | 
			
		||||
	case "b":
 | 
			
		||||
		return count
 | 
			
		||||
	case "kb":
 | 
			
		||||
		return count << 10
 | 
			
		||||
	case "mb":
 | 
			
		||||
		return count << 20
 | 
			
		||||
	case "gb":
 | 
			
		||||
		return count << 30
 | 
			
		||||
	case "tb":
 | 
			
		||||
		return count << 40
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *NodeActionCond) toTrafficBytes(m maps.Map) int64 {
 | 
			
		||||
	var count = m.GetInt64("count")
 | 
			
		||||
	var unit = m.GetString("unit")
 | 
			
		||||
	if count <= 0 {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	switch unit {
 | 
			
		||||
	case "b":
 | 
			
		||||
		return count
 | 
			
		||||
	case "kb":
 | 
			
		||||
		return count << 10
 | 
			
		||||
	case "mb":
 | 
			
		||||
		return count << 20
 | 
			
		||||
	case "gb":
 | 
			
		||||
		return count << 30
 | 
			
		||||
	case "tb":
 | 
			
		||||
		return count << 40
 | 
			
		||||
	case "pb":
 | 
			
		||||
		return count << 50
 | 
			
		||||
	case "eb":
 | 
			
		||||
		return count << 60
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *NodeActionCond) isScalar(value any) bool {
 | 
			
		||||
	if value == nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	switch value.(type) {
 | 
			
		||||
	case int, int8, int16, int32, int64, uint, uint8, uint16, uint64, float32, float64, string, bool:
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NodeActionCondsConfig struct {
 | 
			
		||||
	Conds     []*NodeActionCond       `json:"conds"`
 | 
			
		||||
	Connector NodeActionCondConnector `json:"connector"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewNodeActionCondsConfig() *NodeActionCondsConfig {
 | 
			
		||||
	return &NodeActionCondsConfig{
 | 
			
		||||
		Connector: NodeActionCondConnectorAnd,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *NodeActionCondsConfig) Match(valueGetter func(param NodeActionParam) (value any, err error)) (bool, error) {
 | 
			
		||||
	if len(this.Conds) == 0 {
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for index, cond := range this.Conds {
 | 
			
		||||
		value, err := valueGetter(cond.Param)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return false, err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var b = cond.Match(value)
 | 
			
		||||
		if !b {
 | 
			
		||||
			if this.Connector == NodeActionCondConnectorAnd {
 | 
			
		||||
				return false, nil
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// 如果是最后一个OR条件,则直接返回false
 | 
			
		||||
			if index == len(this.Conds)-1 {
 | 
			
		||||
				return false, nil
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			if this.Connector == NodeActionCondConnectorOr {
 | 
			
		||||
				return true, nil
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// 如果是最后一个AND条件,则直接返回true
 | 
			
		||||
			if index == len(this.Conds)-1 {
 | 
			
		||||
				return true, nil
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NodeActionCode 动作代号
 | 
			
		||||
type NodeActionCode = string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	NodeActionCodeUp                           NodeActionCode = "up"                           // 上线
 | 
			
		||||
	NodeActionCodeDown                         NodeActionCode = "down"                         // 下线
 | 
			
		||||
	NodeActionCodeSwitchToBackupNodesInCluster NodeActionCode = "switchToBackupNodesInCluster" // 切换到集群备用节点
 | 
			
		||||
	NodeActionCodeSwitchToBackupNodesInGroup   NodeActionCode = "switchToBackupNodesInGroup"   // 切换到分组备用节点
 | 
			
		||||
	NodeActionCodeSwitchToBackupIP             NodeActionCode = "switchToBackupIP"             // 切换到备用IP
 | 
			
		||||
	NodeActionCodeEnableBackupNodesInCluster   NodeActionCode = "enableBackupNodesInCluster"   // 启用集群备用节点
 | 
			
		||||
	NodeActionCodeEnableBackupNodesInGroup     NodeActionCode = "enableBackupNodesInGroup"     // 启用分组备用节点
 | 
			
		||||
	NodeActionCodeEnableBackupIP               NodeActionCode = "enableBackupIP"               // 启用备用IP
 | 
			
		||||
	NodeActionCodeWebHook                      NodeActionCode = "webHook"                      // WebHook
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func FindAllNodeActionDefinitions() []*shared.Definition {
 | 
			
		||||
	return []*shared.Definition{
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeUp,
 | 
			
		||||
			Name:        "上线当前节点",
 | 
			
		||||
			Description: "将当前节点状态设置为在线。",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeDown,
 | 
			
		||||
			Name:        "下线当前节点",
 | 
			
		||||
			Description: "将当前节点状态设置为离线。",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeSwitchToBackupNodesInCluster,
 | 
			
		||||
			Name:        "切换到集群备用节点",
 | 
			
		||||
			Description: "下线当前节点并启用节点所在集群备用节点。",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeSwitchToBackupNodesInGroup,
 | 
			
		||||
			Name:        "切换到分组备用节点",
 | 
			
		||||
			Description: "下线当前节点并启用节点所在分组备用节点。",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeSwitchToBackupIP,
 | 
			
		||||
			Name:        "切换到备用IP",
 | 
			
		||||
			Description: "将当前节点的IP切换到当前节点配置的备用IP。",
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeEnableBackupNodesInCluster,
 | 
			
		||||
			Name:        "启用集群备用节点",
 | 
			
		||||
			Description: "保持当前节点并启用节点所在集群备用节点。",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeEnableBackupNodesInGroup,
 | 
			
		||||
			Name:        "启用分组备用节点",
 | 
			
		||||
			Description: "保持当前节点并启用节点所在分组备用节点。",
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeEnableBackupIP,
 | 
			
		||||
			Name:        "启用备用IP",
 | 
			
		||||
			Description: "保持当前节点的IP并启用当前节点配置的备用IP。",
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Code:        NodeActionCodeWebHook,
 | 
			
		||||
			Name:        "WebHook",
 | 
			
		||||
			Description: "通过WebHook发送通知到URL。",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FindNodeActionDefinition(code NodeActionCode) *shared.Definition {
 | 
			
		||||
	for _, def := range FindAllNodeActionDefinitions() {
 | 
			
		||||
		if def.Code == code {
 | 
			
		||||
			return def
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FindNodeActionName(code NodeActionCode) string {
 | 
			
		||||
	var def = FindNodeActionDefinition(code)
 | 
			
		||||
	if def != nil {
 | 
			
		||||
		return def.Name
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NodeActionConfig 动作配置
 | 
			
		||||
type NodeActionConfig struct {
 | 
			
		||||
	Code   NodeActionCode `json:"code"`   // 动作代号
 | 
			
		||||
	Params any            `json:"params"` // 动作参数
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewNodeActionConfig() *NodeActionConfig {
 | 
			
		||||
	return &NodeActionConfig{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NodeActionCodeWebHookParams struct {
 | 
			
		||||
	URL string `json:"url"` // URL路径
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NodeActionStatus 动作状态
 | 
			
		||||
type NodeActionStatus struct {
 | 
			
		||||
	ActionId  int64                  `json:"actionId"`  // 动作ID
 | 
			
		||||
	CreatedAt int64                  `json:"createdAt"` // 状态创建时间
 | 
			
		||||
	Conds     *NodeActionCondsConfig `json:"conds"`     // 动作条件
 | 
			
		||||
	Action    *NodeActionConfig      `json:"action"`    // 动作配置
 | 
			
		||||
	ExpiresAt int64                  `json:"expiresAt"` // 过期时间
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user