diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index 151f501..af3e9b0 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -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 } diff --git a/common/MlsrConfig_test.go b/common/MlsrConfig_test.go index a72ae17..0a4a849 100644 --- a/common/MlsrConfig_test.go +++ b/common/MlsrConfig_test.go @@ -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() }