goProject/.svn/pristine/54/54a0e682fd6262e24fa94fe5e10814532f88b5bf.svn-base
2025-01-06 16:21:36 +08:00

248 lines
7.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}