diff --git a/README.md b/README.md index b572bc1..f3a6684 100644 --- a/README.md +++ b/README.md @@ -22,4 +22,23 @@ model/ 数据库模型 util/ 工具类 scripts/ shell 脚本 +``` + +--- + +``` + +每城市更新数量 + +遍历配置[网关][配置] + 如果无需更新直接放入新配置 + 如果需要更新,放入城市更新统计 + +统计[城市][配置] +遍历城市 + 取到新节点 + 遍历需要更新的配置: + 根据配置放入指定槽位[网关][配置] + +新配置[网关][配置] ``` \ No newline at end of file diff --git a/actions/update.go b/actions/update.go index 276ccaa..1f83166 100644 --- a/actions/update.go +++ b/actions/update.go @@ -63,43 +63,40 @@ func update(tx *gorm.DB, arg UpdateArgs) error { if err != nil { 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))) 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 changesCreate []model.Change - - 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 - } + for city, configs := range oldConfigs { // 如果有需要变更的节点,获取足量新节点 + count := len(configs) if count > city.EdgesCount { slog.Warn(fmt.Sprintf("城市节点数量不足,跳过本次更新,城市:%s,节点数:%d,网关数:%d", city.Name, city.EdgesCount, count)) continue @@ -123,21 +120,21 @@ func update(tx *gorm.DB, arg UpdateArgs) error { }) // 分配新节点 - for i, oldConfig := range configsUpdate { - - gateway := findGateway[oldConfig.GatewayMac] + for i, config := range configs { + gateway := findGateway[config.GatewayMac] 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{ Change: true, Remote: jd.EdgeInfo{ - City: city.Hash, - Mac: edge.Macaddr, + Mac: edge.Macaddr, + City: city.Hash, + Network: config.Network, }, Config: model.ConfigUpdate{ - Id: oldConfig.Id, + Id: config.Id, EdgeMac: u.P(edge.Macaddr), IsChange: u.P(0), IsOnline: u.P(1), @@ -147,13 +144,13 @@ func update(tx *gorm.DB, arg UpdateArgs) error { Time: now, CityId: city.Id, Gateway: gateway.Macaddr, - OldEdge: oldConfig.EdgeMac, + OldEdge: config.EdgeMac, NewEdge: edge.Macaddr, }) } } - println(fmt.Sprintf("循环分配:%v", time.Since(step))) + println(fmt.Sprintf("更新配置:%v", time.Since(step))) 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(now))) + println(fmt.Sprint("更新总数:", len(changesCreate))) + return nil } diff --git a/clients/jd/getway-config-set.go b/clients/jd/getway-config-set.go index 47f44c1..cdac5a4 100644 --- a/clients/jd/getway-config-set.go +++ b/clients/jd/getway-config-set.go @@ -3,8 +3,9 @@ package jd import "fmt" type EdgeInfo struct { - Mac string - City string + Mac string + City string + Network string } 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{ Enable: true, Edge: []string{edge.Mac}, - Network: []string{fmt.Sprintf("172.30.168.%d", i+2)}, + Network: []string{edge.Network}, Cityhash: edge.City, // 每个 edge 的城市应当相同 } }