1
0
mirror of https://gitee.com/willfree/mlsr.git synced 2026-06-06 17:09:29 +08:00

通过转json的方式,解决MlsrConfig中结构体数组的存取问题

This commit is contained in:
free will
2022-04-08 14:13:12 +08:00
parent 520d3dd0e6
commit 0b302ba9ac
2 changed files with 79 additions and 13 deletions
+62 -13
View File
@@ -9,6 +9,7 @@
package common
import (
"encoding/json"
"gopkg.in/ini.v1"
)
@@ -26,7 +27,8 @@ type MlsrConfig struct {
AdvertisingConfig `ini:"Advertising"`
SecurityConfig `ini:"Security"`
mlsrConfigPath string // 配置文件所在路径
mlsrConfigPath string // 配置文件所在路径
neighbors []NeighborConfig // NeighborsConfig中的信息
}
//
@@ -61,17 +63,47 @@ type NeighborsConfig struct {
LogicFaceDatasetFetchRetries uint32 `ini:"LogicFaceDatasetFetchRetries"` // 获取FaceStatus数据集的重试次数
LogicFaceDatasetFetchInterval uint32 `ini:"LogicFaceDatasetFetchInterval"` // FaceStatus数据集获取尝试之间的间隔
NeighborsInfo []*NeighborConfig `ini:"NeighborsInfo"` // 邻居路由器链路信息
NeighborsInfo NeighborsJsonString `ini:"NeighborsInfo"` // 邻居路由器链路信息
}
type NeighborConfig struct {
//NeighborName string `ini:"NeighborName"` // 邻居路由器的名称前缀
//LogicFaceUri string `ini:"LogicFaceUri"` // 连接该邻居路由器的LogicFace的URI
//LinkCost uint64 `ini:"LinkCost"` // 链路开销(用uint64还是double待决)
type NeighborsJsonString string
NeighborName string // 邻居路由器的名称前缀
LogicFaceUri string // 连接该邻居路由器的LogicFace的URI
LinkCost uint64 // 链路开销(用uint64还是double待决)
type NeighborConfig struct {
NeighborName string `ini:"NeighborName"` // 邻居路由器的名称前缀
LogicFaceUri string `ini:"LogicFaceUri"` // 连接该邻居路由器的LogicFace的URI
LinkCost uint64 `ini:"LinkCost"` // 链路开销(用uint64还是double待决)
}
//
// parseNeighborConfigToJsonString
// @Description: 将neighbors结构体数组转为json字符串
// @param neighbors
// @return NeighborsJsonString
// @return error
//
func parseNeighborConfigToJsonString(neighbors []NeighborConfig) (NeighborsJsonString,error) {
bytes,err := json.Marshal(neighbors)
if err!= nil{
return "",err
}
return NeighborsJsonString(bytes), nil
}
//
// parseJsonStringToNeighbors
// @Description: 将json字符串neighbors结构体数组
// @receiver c
// @param jsonString
// @return []NeighborConfig
// @return error
//
func parseJsonStringToNeighbors(jsonString NeighborsJsonString) ([]NeighborConfig,error) {
var neighbors []NeighborConfig
err := json.Unmarshal([]byte(jsonString), &neighbors)
if err!= nil{
return nil,err
}
return neighbors, nil
}
//
@@ -120,10 +152,21 @@ func (c *MlsrConfig) Init() {
c.NeighborsConfig.AdjLsaBuildInterval = 10 // 5-30
c.NeighborsConfig.LogicFaceDatasetFetchRetries = 3 // 1-10
c.NeighborsConfig.LogicFaceDatasetFetchInterval = 3600 // 1800-5400
// todo: 下面这种记录方式,无法将邻居链路信息存储到配置文件中
c.NeighborsConfig.NeighborsInfo=[]*NeighborConfig{
{"/routerB","tcp://1.1.1.1",10},
{"/routerC","udp://1.1.1.2",10}}
// 将邻居链路信息存储到配置文件中 todo:用于测试
neighborConfig1 := NeighborConfig{
NeighborName: "/routerB",
LogicFaceUri: "tcp://1.1.1.1",
LinkCost: 10,
}
neighborConfig2 := NeighborConfig{
NeighborName: "/routerC",
LogicFaceUri: "tcp://1.1.1.0",
LinkCost: 10,
}
//neighborsJsonString, _ := parseNeighborConfigToJsonString(
// []NeighborConfig{neighborConfig1,neighborConfig2})
//c.NeighborsConfig.NeighborsInfo=neighborsJsonString
c.neighbors=[]NeighborConfig{neighborConfig1,neighborConfig2}
// 路由计算配置参数
c.FibConfig.MaxLogicFacesPerPrefix = 0 // 0-60 todo:为啥默认是0呢
@@ -141,6 +184,9 @@ func (c *MlsrConfig) Init() {
//
func (c *MlsrConfig) Save() error {
cfg := ini.Empty()
if len(c.neighbors)>0 {
c.NeighborsInfo, _ = parseNeighborConfigToJsonString(c.neighbors)
}
if err:= ini.ReflectFrom(cfg,c); err!= nil{
return err
}
@@ -168,5 +214,8 @@ func ParseConfig(configPath string) (*MlsrConfig, error) {
if err = cfg.MapTo(&mlsrConfig); err != nil {
return nil, err
}
if mlsrConfig.NeighborsInfo!="" {
mlsrConfig.neighbors, _ = parseJsonStringToNeighbors(mlsrConfig.NeighborsInfo)
}
return mlsrConfig, nil
}
+17
View File
@@ -36,8 +36,25 @@ func TestMlsrConfig_ParseConfigAndSave(t *testing.T) {
testPath += DefaultConfFileName
fmt.Println("test mlsr conf path: "+testPath)
mlsrConfig,_ := ParseConfig(testPath)
// 存储
fmt.Println(mlsrConfig)
_ = mlsrConfig.Save()
// 取出
mlsrConfig2,_ := ParseConfig(testPath)
fmt.Println(mlsrConfig2)
// 解析neighbors
neighbors := mlsrConfig2.neighbors
fmt.Println(neighbors)
// 修改再存
ss:=NeighborConfig{
NeighborName: "nei",
LogicFaceUri: "uri",
LinkCost: 0,
}
mlsrConfig2.neighbors = append(mlsrConfig2.neighbors,ss)
_ = mlsrConfig2.Save()
}