fix: 优化网元OAM配置读取与写入逻辑,修复键名不一致问题

This commit is contained in:
TsMask
2025-05-23 11:51:39 +08:00
parent 0fbcf6abf4
commit 3e2eb320d8

View File

@@ -474,54 +474,56 @@ func (r *NeInfo) NeRunRedisClient(neType, neId string) (*redis.ConnRedis, error)
} }
// NeConfOAMReadSync 网元OAM配置文件读取 // NeConfOAMReadSync 网元OAM配置文件读取
func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) { func (r NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error) {
oamData, err := r.neConfOAMRead(neType, neId, true) oamData, err := r.neConfOAMRead(neType, neId, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// UPF和SMF 全小写的key // UPF和SMF 全小写的key
if _, ok := oamData["httpmanagecfg"]; ok { // 网元HTTP服务
content := map[string]any{} if v, ok := oamData["httpmanagecfg"]; ok && v != nil {
// 网元HTTP服务 item := v.(map[string]any)
// if v, ok := oamData["httpmanagecfg"]; ok { if v, ok := item["iptype"]; ok && v != nil {
// item := v.(map[string]any) item["ipType"] = v
// } delete(item, "iptype")
// 对网管HTTP配置
if v, ok := oamData["oamconfig"]; ok {
item := v.(map[string]any)
if v, ok := item["iptype"]; ok && v != "" && v != nil {
ipType := v.(string)
if ipType == "ipv6" {
content["omcIP"] = item["ipv6"]
}
if ipType == "ipv4" {
content["omcIP"] = item["ipv4"]
}
}
content["oamEnable"] = item["enable"]
content["oamPort"] = item["port"]
} }
// 对网管SNMP配置 oamData["httpManageCfg"] = item
if v, ok := oamData["snmpconfig"]; ok { delete(oamData, "httpmanagecfg")
item := v.(map[string]any) r.neConfOAMWirte(neType, neId, oamData, false)
content["snmpEnable"] = item["enable"] }
content["snmpPort"] = item["port"] // 对网管HTTP配置
} if v, ok := oamData["oamconfig"]; ok && v != nil {
// 对网管KPI上报配置 item := v.(map[string]any)
if v, ok := oamData["kpiconfig"]; ok { if v, ok := item["iptype"]; ok && v != nil {
item := v.(map[string]any) item["ipType"] = v
content["kpiEnable"] = item["enable"] delete(item, "iptype")
content["kpiTimer"] = item["timer"] }
} if v, ok := item["neconfig"]; ok && v != nil {
item["neConfig"] = v
oamData := r.neConfOAMData() delete(item, "neconfig")
}
oamData["oamConfig"] = item
delete(oamData, "oamconfig")
r.neConfOAMWirte(neType, neId, oamData, false)
}
// 对网管SNMP配置
if v, ok := oamData["snmpconfig"]; ok && v != nil {
item := v.(map[string]any)
if v, ok := item["iptype"]; ok && v != nil {
item["ipType"] = v
delete(item, "iptype")
}
oamData["snmpConfig"] = item
delete(oamData, "snmpconfig")
r.neConfOAMWirte(neType, neId, oamData, false)
}
// 对网管KPI上报配置
if v, ok := oamData["kpiconfig"]; ok && v != nil {
item := v.(map[string]any)
oamData["kpiConfig"] = item
delete(oamData, "kpiconfig")
r.neConfOAMWirte(neType, neId, oamData, false) r.neConfOAMWirte(neType, neId, oamData, false)
r.NeConfOAMWirteSync(model.NeInfo{
NeType: neType,
NeId: neId,
}, content, false)
return r.neConfOAMRead(neType, neId, false)
} }
// NSSF和MME 配置KPIconfig名不一致时 // NSSF和MME 配置KPIconfig名不一致时
@@ -536,7 +538,7 @@ func (r *NeInfo) NeConfOAMReadSync(neType, neId string) (map[string]any, error)
} }
// neConfOAMData 网元OAM配置文件默认格式数据 // neConfOAMData 网元OAM配置文件默认格式数据
func (r *NeInfo) neConfOAMData() map[string]any { func (r NeInfo) neConfOAMData() map[string]any {
return map[string]any{ return map[string]any{
"httpManageCfg": map[string]any{ "httpManageCfg": map[string]any{
"ipType": "ipv4", "ipType": "ipv4",
@@ -579,11 +581,11 @@ func (r *NeInfo) neConfOAMData() map[string]any {
} }
// neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地 // neConfOAMRead 网元OAM配置文件读取 sync从网元端同步到本地
func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) { func (r NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any, error) {
neTypeLower := strings.ToLower(neType) neTypeLower := strings.ToLower(neType)
fileName := "oam_manager.yaml" fileName := "oam_manager.yaml"
// 网管本地路径 // 网管本地路径
localFilePath := fmt.Sprintf("/usr/local/etc/omc/ne_config/%s/%s/%s", neTypeLower, neId, fileName) localFilePath := fmt.Sprintf("/usr/local/omc/backup/ne_config/%s/%s/%s", neTypeLower, neId, fileName)
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
localFilePath = fmt.Sprintf("C:%s", localFilePath) localFilePath = fmt.Sprintf("C:%s", localFilePath)
} }
@@ -614,7 +616,7 @@ func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any,
// 读取文件内容 // 读取文件内容
bytes, err := os.ReadFile(localFilePath) bytes, err := os.ReadFile(localFilePath)
if err != nil { if err != nil || len(bytes) == 0 {
// logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error()) // logger.Warnf("NeConfOAMRead ReadFile => %s", err.Error())
// return nil, fmt.Errorf("read file error") // return nil, fmt.Errorf("read file error")
// 无保留文件时返回默认文件数据 // 无保留文件时返回默认文件数据
@@ -634,11 +636,11 @@ func (r *NeInfo) neConfOAMRead(neType, neId string, sync bool) (map[string]any,
} }
// neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端 // neConfOAMWirte 网元OAM配置文件写入 content内容 sync同步到网元端
func (r *NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) error { func (r NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) error {
neTypeLower := strings.ToLower(neType) neTypeLower := strings.ToLower(neType)
fileName := "oam_manager.yaml" fileName := "oam_manager.yaml"
// 网管本地路径 // 网管本地路径
omcPath := "/usr/local/etc/omc/ne_config" omcPath := "/usr/local/omc/backup/ne_config"
if runtime.GOOS == "windows" { if runtime.GOOS == "windows" {
omcPath = fmt.Sprintf("C:%s", omcPath) omcPath = fmt.Sprintf("C:%s", omcPath)
} }
@@ -679,107 +681,123 @@ func (r *NeInfo) neConfOAMWirte(neType, neId string, content any, sync bool) err
} }
// NeConfOAMWirteSync 网元OAM配置文件生成并同步 // NeConfOAMWirteSync 网元OAM配置文件生成并同步
func (r *NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error { func (r NeInfo) NeConfOAMWirteSync(neInfo model.NeInfo, content map[string]any, sync bool) error {
oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false) oamData, err := r.neConfOAMRead(neInfo.NeType, neInfo.NeId, false)
if oamData == nil || err != nil { if oamData == nil || err != nil {
return fmt.Errorf("error read OAM file info") return fmt.Errorf("error read OAM file info")
} }
// 网元HTTP服务 // 网元HTTP服务
if v, ok := oamData["httpManageCfg"]; ok { httpManageCfg, ok := oamData["httpManageCfg"].(map[string]any)
item := v.(map[string]any) if !ok {
item["port"] = neInfo.Port neConfOAMData := r.neConfOAMData()
if strings.Contains(neInfo.IP, ":") { httpManageCfg = neConfOAMData["httpManageCfg"].(map[string]any)
item["ipType"] = "ipv6"
item["ipv6"] = neInfo.IP
}
if strings.Contains(neInfo.IP, ".") {
item["ipType"] = "ipv4"
item["ipv4"] = neInfo.IP
}
oamData["httpManageCfg"] = item
} }
httpManageCfg["port"] = neInfo.Port
if strings.Contains(neInfo.IP, ":") {
httpManageCfg["ipType"] = "ipv6"
httpManageCfg["ipv6"] = neInfo.IP
}
if strings.Contains(neInfo.IP, ".") {
httpManageCfg["ipType"] = "ipv4"
httpManageCfg["ipv4"] = neInfo.IP
}
delete(httpManageCfg, "iptype")
delete(oamData, "httpmanagecfg")
oamData["httpManageCfg"] = httpManageCfg
// 对网管HTTP配置 // 对网管HTTP配置
if v, ok := oamData["oamConfig"]; ok { oamConfig, ok := oamData["oamConfig"].(map[string]any)
item := v.(map[string]any) if !ok {
item["neConfig"] = map[string]string{ neConfOAMData := r.neConfOAMData()
"neId": neInfo.NeId, oamConfig = neConfOAMData["oamConfig"].(map[string]any)
"rmUid": neInfo.RmUID,
"neName": neInfo.NeName,
"dn": neInfo.Dn,
"vendorName": neInfo.VendorName,
"province": neInfo.Province,
"pvFlag": neInfo.PvFlag,
}
// 公共参数指定的OMC
if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" {
if strings.Contains(omcIP, ":") {
item["ipType"] = "ipv6"
item["ipv6"] = omcIP
}
if strings.Contains(omcIP, ".") {
item["ipType"] = "ipv4"
item["ipv4"] = omcIP
}
}
if v, ok := content["omcIP"]; ok && v != "" && v != nil {
omcIP := v.(string)
if strings.Contains(omcIP, ":") {
item["ipType"] = "ipv6"
item["ipv6"] = omcIP
}
if strings.Contains(omcIP, ".") {
item["ipType"] = "ipv4"
item["ipv4"] = omcIP
}
}
if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil {
item["enable"] = parse.Boolean(oamEnable)
}
if oamPort, ok := content["oamPort"]; ok && oamPort != nil {
item["port"] = parse.Number(oamPort)
}
oamData["oamConfig"] = item
} }
delete(oamConfig, "neconfig")
oamConfig["neConfig"] = map[string]string{
"neId": neInfo.NeId,
"rmUid": neInfo.RmUID,
"neName": neInfo.NeName,
"dn": neInfo.Dn,
"vendorName": neInfo.VendorName,
"province": neInfo.Province,
"pvFlag": neInfo.PvFlag,
}
// 公共参数指定的OMC
if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" {
if strings.Contains(omcIP, ":") {
oamConfig["ipType"] = "ipv6"
oamConfig["ipv6"] = omcIP
}
if strings.Contains(omcIP, ".") {
oamConfig["ipType"] = "ipv4"
oamConfig["ipv4"] = omcIP
}
}
// 传入的变更
if v, ok := content["omcIP"]; ok && v != "" && v != nil {
omcIP := v.(string)
if strings.Contains(omcIP, ":") {
oamConfig["ipType"] = "ipv6"
oamConfig["ipv6"] = omcIP
}
if strings.Contains(omcIP, ".") {
oamConfig["ipType"] = "ipv4"
oamConfig["ipv4"] = omcIP
}
}
delete(oamConfig, "iptype")
if oamEnable, ok := content["oamEnable"]; ok && oamEnable != nil {
oamConfig["enable"] = parse.Boolean(oamEnable)
}
if oamPort, ok := content["oamPort"]; ok && oamPort != nil {
oamConfig["port"] = parse.Number(oamPort)
}
delete(oamData, "oamconfig")
oamData["oamConfig"] = oamConfig
// 对网管SNMP配置 // 对网管SNMP配置
if v, ok := oamData["snmpConfig"]; ok { snmpConfig, ok := oamData["snmpConfig"].(map[string]any)
item := v.(map[string]any) if !ok {
if strings.Contains(neInfo.IP, ":") { neConfOAMData := r.neConfOAMData()
item["ipType"] = "ipv6" snmpConfig = neConfOAMData["snmpConfig"].(map[string]any)
item["ipv6"] = neInfo.IP
}
if strings.Contains(neInfo.IP, ".") {
item["ipType"] = "ipv4"
item["ipv4"] = neInfo.IP
}
if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil {
item["enable"] = parse.Boolean(snmpEnable)
}
if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil {
item["port"] = parse.Number(snmpPort)
}
oamData["snmpConfig"] = item
} }
if strings.Contains(neInfo.IP, ":") {
snmpConfig["ipType"] = "ipv6"
snmpConfig["ipv6"] = neInfo.IP
}
if strings.Contains(neInfo.IP, ".") {
snmpConfig["ipType"] = "ipv4"
snmpConfig["ipv4"] = neInfo.IP
}
delete(snmpConfig, "iptype")
if snmpEnable, ok := content["snmpEnable"]; ok && snmpEnable != nil {
snmpConfig["enable"] = parse.Boolean(snmpEnable)
}
if snmpPort, ok := content["snmpPort"]; ok && snmpPort != nil {
snmpConfig["port"] = parse.Number(snmpPort)
}
delete(oamData, "snmpconfig")
oamData["snmpConfig"] = snmpConfig
// 对网管KPI上报配置 // 对网管KPI上报配置
if v, ok := oamData["kpiConfig"]; ok { kpiConfig, ok := oamData["kpiConfig"].(map[string]any)
item := v.(map[string]any) if !ok {
if neInfo.NeType == "UPF" { neConfOAMData := r.neConfOAMData()
item["timer"] = 5 kpiConfig = neConfOAMData["kpiConfig"].(map[string]any)
} else {
item["timer"] = 60
}
if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil {
item["enable"] = parse.Boolean(kpiEnable)
}
if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil {
item["timer"] = parse.Number(kpiTimer)
}
oamData["kpiConfig"] = item
} }
if neInfo.NeType == "UPF" {
kpiConfig["timer"] = 5
} else {
kpiConfig["timer"] = 60
}
if kpiEnable, ok := content["kpiEnable"]; ok && kpiEnable != nil {
kpiConfig["enable"] = parse.Boolean(kpiEnable)
}
if kpiTimer, ok := content["kpiTimer"]; ok && kpiTimer != nil {
kpiConfig["timer"] = parse.Number(kpiTimer)
}
delete(oamData, "kpiconfig")
oamData["kpiConfig"] = kpiConfig
if err := r.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil { if err := r.neConfOAMWirte(neInfo.NeType, neInfo.NeId, oamData, sync); err != nil {
return fmt.Errorf("error wirte OAM file info") return fmt.Errorf("error wirte OAM file info")
} }