修复混拨配置无法更新的问题
This commit is contained in:
19
README.md
19
README.md
@@ -22,4 +22,23 @@ model/ 数据库模型
|
|||||||
util/ 工具类
|
util/ 工具类
|
||||||
|
|
||||||
scripts/ shell 脚本
|
scripts/ shell 脚本
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
每城市更新数量
|
||||||
|
|
||||||
|
遍历配置[网关][配置]
|
||||||
|
如果无需更新直接放入新配置
|
||||||
|
如果需要更新,放入城市更新统计
|
||||||
|
|
||||||
|
统计[城市][配置]
|
||||||
|
遍历城市
|
||||||
|
取到新节点
|
||||||
|
遍历需要更新的配置:
|
||||||
|
根据配置放入指定槽位[网关][配置]
|
||||||
|
|
||||||
|
新配置[网关][配置]
|
||||||
```
|
```
|
||||||
@@ -63,43 +63,40 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("获取所有配置失败:%w", err)
|
return fmt.Errorf("获取所有配置失败:%w", err)
|
||||||
}
|
}
|
||||||
var findConfig = make(map[string]model.Config)
|
|
||||||
for _, config := range configs {
|
|
||||||
findConfig[config.Cityhash+":"+config.GatewayMac] = config
|
|
||||||
}
|
|
||||||
|
|
||||||
println(fmt.Sprintf("获取配置:%v", time.Since(step)))
|
println(fmt.Sprintf("获取配置:%v", time.Since(step)))
|
||||||
step = time.Now()
|
step = time.Now()
|
||||||
|
|
||||||
|
// 查找需要更新的配置
|
||||||
|
oldConfigs := make(map[model.City][]model.Config)
|
||||||
|
newConfigs := make(map[model.Gateway][]ConfigInfo)
|
||||||
|
for _, config := range configs {
|
||||||
|
city := findCity[config.Cityhash]
|
||||||
|
gateway := findGateway[config.GatewayMac]
|
||||||
|
if config.IsChange == 1 {
|
||||||
|
oldConfigs[city] = append(oldConfigs[city], config)
|
||||||
|
} else {
|
||||||
|
newConfigs[gateway] = append(newConfigs[gateway], ConfigInfo{
|
||||||
|
Change: false,
|
||||||
|
Remote: jd.EdgeInfo{
|
||||||
|
Mac: config.EdgeMac,
|
||||||
|
City: config.Cityhash,
|
||||||
|
Network: config.Network,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println(fmt.Sprintf("查找更新:%v", time.Since(step)))
|
||||||
|
step = time.Now()
|
||||||
|
|
||||||
// 更新网关配置
|
// 更新网关配置
|
||||||
var newConfigs = make(map[model.Gateway][]ConfigInfo)
|
|
||||||
var citiesUpdate []model.City
|
var citiesUpdate []model.City
|
||||||
var changesCreate []model.Change
|
var changesCreate []model.Change
|
||||||
|
for city, configs := range oldConfigs {
|
||||||
for _, city := range cities {
|
|
||||||
|
|
||||||
// 先处理不变更的节点
|
|
||||||
configsUpdate := make([]model.Config, 0)
|
|
||||||
for _, gateway := range gateways {
|
|
||||||
oldConfig, exists := findConfig[city.Hash+":"+gateway.Macaddr]
|
|
||||||
if exists && oldConfig.IsChange != 1 {
|
|
||||||
newConfigs[gateway] = append(newConfigs[gateway], ConfigInfo{
|
|
||||||
Change: false,
|
|
||||||
Remote: jd.EdgeInfo{
|
|
||||||
Mac: oldConfig.EdgeMac,
|
|
||||||
City: oldConfig.Cityhash,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
configsUpdate = append(configsUpdate, oldConfig)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
count := len(configsUpdate)
|
|
||||||
if count == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果有需要变更的节点,获取足量新节点
|
// 如果有需要变更的节点,获取足量新节点
|
||||||
|
count := len(configs)
|
||||||
if count > city.EdgesCount {
|
if count > city.EdgesCount {
|
||||||
slog.Warn(fmt.Sprintf("城市节点数量不足,跳过本次更新,城市:%s,节点数:%d,网关数:%d", city.Name, city.EdgesCount, count))
|
slog.Warn(fmt.Sprintf("城市节点数量不足,跳过本次更新,城市:%s,节点数:%d,网关数:%d", city.Name, city.EdgesCount, count))
|
||||||
continue
|
continue
|
||||||
@@ -123,21 +120,21 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// 分配新节点
|
// 分配新节点
|
||||||
for i, oldConfig := range configsUpdate {
|
for i, config := range configs {
|
||||||
|
gateway := findGateway[config.GatewayMac]
|
||||||
gateway := findGateway[oldConfig.GatewayMac]
|
|
||||||
edge := edges[i]
|
edge := edges[i]
|
||||||
|
|
||||||
slog.Debug(fmt.Sprintf("网关配置变更,网关:%s,旧节点:%s,新节点:%s", gateway.Macaddr, oldConfig.EdgeMac, edge.Macaddr))
|
slog.Debug(fmt.Sprintf("网关配置变更,网关:%s,旧节点:%s,新节点:%s", gateway.Macaddr, config.EdgeMac, edge.Macaddr))
|
||||||
|
|
||||||
newConfigs[gateway] = append(newConfigs[gateway], ConfigInfo{
|
newConfigs[gateway] = append(newConfigs[gateway], ConfigInfo{
|
||||||
Change: true,
|
Change: true,
|
||||||
Remote: jd.EdgeInfo{
|
Remote: jd.EdgeInfo{
|
||||||
City: city.Hash,
|
Mac: edge.Macaddr,
|
||||||
Mac: edge.Macaddr,
|
City: city.Hash,
|
||||||
|
Network: config.Network,
|
||||||
},
|
},
|
||||||
Config: model.ConfigUpdate{
|
Config: model.ConfigUpdate{
|
||||||
Id: oldConfig.Id,
|
Id: config.Id,
|
||||||
EdgeMac: u.P(edge.Macaddr),
|
EdgeMac: u.P(edge.Macaddr),
|
||||||
IsChange: u.P(0),
|
IsChange: u.P(0),
|
||||||
IsOnline: u.P(1),
|
IsOnline: u.P(1),
|
||||||
@@ -147,13 +144,13 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
|||||||
Time: now,
|
Time: now,
|
||||||
CityId: city.Id,
|
CityId: city.Id,
|
||||||
Gateway: gateway.Macaddr,
|
Gateway: gateway.Macaddr,
|
||||||
OldEdge: oldConfig.EdgeMac,
|
OldEdge: config.EdgeMac,
|
||||||
NewEdge: edge.Macaddr,
|
NewEdge: edge.Macaddr,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
println(fmt.Sprintf("循环分配:%v", time.Since(step)))
|
println(fmt.Sprintf("更新配置:%v", time.Since(step)))
|
||||||
step = time.Now()
|
step = time.Now()
|
||||||
|
|
||||||
// 更新城市偏移量
|
// 更新城市偏移量
|
||||||
@@ -214,6 +211,8 @@ func update(tx *gorm.DB, arg UpdateArgs) error {
|
|||||||
println(fmt.Sprintf("提交配置:%v", time.Since(step)))
|
println(fmt.Sprintf("提交配置:%v", time.Since(step)))
|
||||||
|
|
||||||
println(fmt.Sprintf("总耗时:%v", time.Since(now)))
|
println(fmt.Sprintf("总耗时:%v", time.Since(now)))
|
||||||
|
println(fmt.Sprint("更新总数:", len(changesCreate)))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,9 @@ package jd
|
|||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
||||||
type EdgeInfo struct {
|
type EdgeInfo struct {
|
||||||
Mac string
|
Mac string
|
||||||
City string
|
City string
|
||||||
|
Network string
|
||||||
}
|
}
|
||||||
|
|
||||||
func GatewayConfigSet(version int, macaddr string, edges []EdgeInfo) error {
|
func GatewayConfigSet(version int, macaddr string, edges []EdgeInfo) error {
|
||||||
@@ -23,7 +24,7 @@ func GatewayConfigSet(version int, macaddr string, edges []EdgeInfo) error {
|
|||||||
rules[i] = GateConfigSetReqRule{
|
rules[i] = GateConfigSetReqRule{
|
||||||
Enable: true,
|
Enable: true,
|
||||||
Edge: []string{edge.Mac},
|
Edge: []string{edge.Mac},
|
||||||
Network: []string{fmt.Sprintf("172.30.168.%d", i+2)},
|
Network: []string{edge.Network},
|
||||||
Cityhash: edge.City, // 每个 edge 的城市应当相同
|
Cityhash: edge.City, // 每个 edge 的城市应当相同
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user