goProject/.svn/pristine/54/54a0e682fd6262e24fa94fe5e10814532f88b5bf.svn-base

248 lines
7.0 KiB
Plaintext
Raw Normal View History

2025-01-06 16:21:36 +08:00
package managecenterMgr
import (
"encoding/json"
"errors"
"fmt"
"sort"
"Framework/ipMgr"
"Framework/managecenterModel"
. "Framework/managecenterModel"
"goutil/logUtil"
"goutil/webUtil"
)
var (
// 服务器组集合
serverGroupMap = make(map[int32]*ServerGroup, 512)
serverGroupHash string
// 服务器组变化方法集合 (完整列表,新增列表,删除列表,更新列表)
serverGroupChangeFuncMap = make(map[string]func([]*ServerGroup, []*ServerGroup, []*ServerGroup, []*ServerGroup))
)
func init() {
ipMgr.RegisterIpCheckFunc("ServerGroupIpCheck", isIpValid)
}
// 重新加载服务器组
func reloadServerGroup(isInit bool) error {
//logUtil.DebugLog("开始刷新服务器组信息")
url := getManageCenterUrl("/API/ServerGroupList.ashx")
// 定义请求参数
postDict := make(map[string]string)
postDict["GroupType"] = "Mix"
postDict["HashValue"] = serverGroupHash
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 30)
statusCode, returnBytes, err := webUtil.PostMapData(url, postDict, header, transport)
//statusCode, returnBytes, err := webUtil.PostMapData(url, postDict, header, nil)
if err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取服务器组列表出错url:%s,错误信息为:%s", url, err))
return err
}
if statusCode != 200 {
logUtil.ErrorLog(fmt.Sprintf("获取服务器组列表出错url:%s,错误码为:%d", url, statusCode))
return err
}
// 解析返回值
returnObj := new(ReturnObject)
if err = json.Unmarshal(returnBytes, &returnObj); err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取服务器组列表出错,反序列化返回值出错,错误信息为:%s", err))
return err
}
// 判断返回状态是否为成功
if returnObj.Code != 0 {
// 数据没有变化,所以没有获取到新的数据,不能算错误。
if returnObj.Code == 47 || returnObj.Message == "DataNotChanged" {
//如果本地集合为空且数据又没变化时重新初始化一下本地hash值
if len(serverGroupMap) == 0 {
serverGroupHash = ""
}
return nil
} else {
msg := fmt.Sprintf("获取服务器组列表出错,返回状态:%d信息为%s", returnObj.Code, returnObj.Message)
logUtil.ErrorLog(msg)
return errors.New(msg)
}
}
// 解析Data
tmpServerGroupList := make([]*ServerGroup, 0, 512)
if data, ok := returnObj.Data.(string); !ok {
msg := "获取服务器组列表出错返回的数据不是string类型"
logUtil.ErrorLog(msg)
return errors.New(msg)
} else {
if err = json.Unmarshal([]byte(data), &tmpServerGroupList); err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取服务器组列表出错,反序列化数据出错,错误信息为:%s", err))
return err
}
}
//logUtil.DebugLog(fmt.Sprintf("刷新服务器组信息结束,服务器组数量:%d", len(tmpServerGroupList)))
tmpServerGroupMap := make(map[int32]*ServerGroup, 512)
for _, item := range tmpServerGroupList {
tmpServerGroupMap[item.Id] = item
}
// 处理服务器组是否变化情况
addList, deleteList, updateList := handleServerGroupChange(GetServerGroupMap(), tmpServerGroupMap)
triggerServerGroupChangeFunc(tmpServerGroupList, addList, deleteList, updateList)
// 赋值给最终的ServerGroupMap
serverGroupMap = tmpServerGroupMap
serverGroupHash = returnObj.HashValue
//通知变更
mcDataChangeCallBack(managecenterModel.ServerGroupData, isInit)
return nil
}
// 处理服务器组是否变化情况
// originalServerGroupMap: 当前服务器组集合
// newServerGroupMap: 新的服务器组集合
func handleServerGroupChange(currServerGroupMap, newServerGroupMap map[int32]*ServerGroup) (
addList []*ServerGroup, deleteList []*ServerGroup, updateList []*ServerGroup) {
// 判断是否有新增的数据
for k, v := range newServerGroupMap {
if _, exist := currServerGroupMap[k]; !exist {
addList = append(addList, v)
}
}
// 判断是否有删除的数据
for k, v := range currServerGroupMap {
if _, exist := newServerGroupMap[k]; !exist {
deleteList = append(deleteList, v)
}
}
// 判断是否有更新的数据
for k, currItem := range currServerGroupMap {
if newItem, exist := newServerGroupMap[k]; exist {
if currItem.IsEqual(newItem) == false {
updateList = append(updateList, newItem)
}
}
}
return
}
// 触发服务器组变化的方法
func triggerServerGroupChangeFunc(allList []*ServerGroup, addList []*ServerGroup, deleteList []*ServerGroup, updateList []*ServerGroup) {
// 如果有注册服务器组变化的方法
if len(serverGroupChangeFuncMap) > 0 {
for _, serverGroupChangeFunc := range serverGroupChangeFuncMap {
serverGroupChangeFunc(allList, addList, deleteList, updateList)
}
}
}
// 注册服务器组变化方法
// funcName方法名称
// serverGroupChangeFunc服务器组变化方法
func RegisterServerGroupChangeFunc(funcName string, serverGroupChangeFunc func([]*ServerGroup, []*ServerGroup, []*ServerGroup, []*ServerGroup)) {
if _, exists := serverGroupChangeFuncMap[funcName]; exists {
panic(fmt.Errorf("RegisterServerGroupChange:%s已经存在请检查", funcName))
}
serverGroupChangeFuncMap[funcName] = serverGroupChangeFunc
logUtil.DebugLog(fmt.Sprintf("注册服务器组变化方法 funcName:%s当前共有%d个注册", funcName, len(serverGroupChangeFuncMap)))
}
// 获取服务器组集合
// 返回值:
// 服务器组集合
func GetServerGroupMap() (retServerGroupMap map[int32]*ServerGroup) {
retServerGroupMap = make(map[int32]*ServerGroup, 128)
for k, v := range serverGroupMap {
retServerGroupMap[k] = v
}
return
}
// 获取服务器组列表
// 返回值:
// 服务器组列表
func GetServerGroupList() (serverGroupList []*ServerGroup) {
for _, item := range serverGroupMap {
serverGroupList = append(serverGroupList, item)
}
sort.Slice(serverGroupList, func(i, j int) bool {
return serverGroupList[i].SortByIdAsc(serverGroupList[j])
})
return
}
// 获取服务器组项
// id
// 返回值:
// 服务器组对象
// 是否存在
func GetServerGroupItem(id int32) (serverGroupObj *ServerGroup, exist bool) {
serverGroupObj, exist = serverGroupMap[id]
return
}
// 根据合作商Id、服务器Id获取服务器组对象
// partnerId合作商Id
// serverId服务器Id
// 返回值:
// 服务器组对象
// 服务器对象
// 是否存在
func GetServerGroup(partnerId, serverId int32) (serverGroupObj *ServerGroup, serverObj *Server, exist bool) {
var partnerObj *Partner
// 获取合作商对象
partnerObj, exist = GetPartner(partnerId)
if !exist {
return
}
// 获取服务器对象
serverObj, exist = GetServer(partnerObj, serverId)
if !exist {
return
}
// 获取服务器组对象
serverGroupObj, exist = GetServerGroupItem(serverObj.GroupId)
return
}
// 判断IP是否有效
// ip指定IP地址
// 返回值:
// IP是否有效
func isIpValid(ip string) (exist bool) {
for _, v := range serverGroupMap {
for _, item := range v.GetIPList() {
if ip == item {
exist = true
return
}
}
}
return
}