Merge remote-tracking branch 'origin/main' into multi-tenant

This commit is contained in:
TsMask
2024-08-12 11:14:27 +08:00
77 changed files with 2078 additions and 1339 deletions

View File

@@ -54,7 +54,7 @@ func NeConfigOMC(neInfo model.NeInfo) (map[string]any, error) {
func NeConfigInfo(neInfo model.NeInfo, paramName string) (map[string]any, error) {
// 网元配置对端网管信息
neUrl := fmt.Sprintf("http://%s:%d/api/rest/systemManagement/v1/elementType/%s/objectType/config/%s", neInfo.IP, neInfo.Port, strings.ToLower(neInfo.NeType), paramName)
resBytes, err := fetch.Get(neUrl, nil, 1000)
resBytes, err := fetch.Get(neUrl, nil, 60_000)
if err != nil {
logger.Warnf("NeConfigInfo Get \"%s\"", neUrl)
logger.Errorf("NeConfigInfo %s", err.Error())

View File

@@ -0,0 +1,230 @@
package networkelement
import (
"encoding/json"
"fmt"
"log"
"os"
"path/filepath"
"sort"
"strconv"
"strings"
"testing"
"time"
"be.ems/src/modules/network_element/model"
"gopkg.in/yaml.v3"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
const (
// 数据库
DbHost = "192.168.8.58"
DbPort = 33066
DbUser = "root"
DbPassswd = "1000omc@kp!"
DbName = "omc_db"
// 配置文件路径
configParamDir = "../../../config/param"
// configParamFile = "*" // 目录下全部更新
configParamFile = "upf_param_config.yaml" // 单文件更新
)
func TestEncrypt(t *testing.T) {
fileNameList, err := getDirFileNameList(configParamDir)
if err != nil {
log.Fatal(err)
return
}
if configParamFile == "*" {
for _, v := range fileNameList {
params := parseData(filepath.Join(configParamDir, v))
if params == nil {
return
}
saveData(params)
}
} else {
params := parseData(filepath.Join(configParamDir, configParamFile))
if params == nil {
return
}
saveData(params)
}
}
// ========= Main =============
// parseData 文件转map数据
func parseData(filePaht string) []map[string]string {
data, err := parseStrToMap(filePaht)
if err != nil {
log.Printf("parseStrToMap => %s", err.Error())
return nil
}
params, err := parseParamConfig(data)
if err != nil {
log.Printf("parseParamConfig => %s", err.Error())
return nil
}
return params
}
// saveData 保存数据
func saveData(params []map[string]string) {
// 定义排序函数
sort.Slice(params, func(i, j int) bool {
paramSortI := params[i]["paramSort"]
if len(paramSortI) == 0 || paramSortI == "" {
paramSortI = "0"
}
paramSortJ := params[j]["paramSort"]
if len(paramSortJ) == 0 || paramSortJ == "" {
paramSortJ = "0"
}
// 将 age 字段转换为整数进行比较
si, _ := strconv.Atoi(paramSortI)
sj, _ := strconv.Atoi(paramSortJ)
return si < sj
})
// 遍历插入
for _, v := range params {
paramSort := v["paramSort"]
if len(paramSort) == 0 || paramSort == "" {
paramSort = "0"
}
sort, err := strconv.ParseInt(paramSort, 10, 64)
if err != nil {
sort = 0
}
neConfig := model.NeConfig{
NeType: v["neType"],
ParamName: v["paramName"],
ParamDisplay: v["paramDisplay"],
ParamType: v["paramType"],
ParamJson: v["paramJson"],
ParamPerms: v["paramPerms"],
ParamSort: sort,
}
neConfig.ID = saveDB(neConfig)
log.Println(neConfig.ID, neConfig.NeType, neConfig.ParamDisplay)
}
}
// ========= DB =============
var gdb *gorm.DB
// connDB 连接到数据库
func connDB() *gorm.DB {
if gdb != nil {
return gdb
}
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", DbUser, DbPassswd, DbHost, DbPort, DbName)
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Minute, // Slow SQL threshold
LogLevel: logger.Error, // Log level
IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
ParameterizedQueries: true, // Don't include params in the SQL log
Colorful: false, // Disable color
},
)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger})
if err != nil {
log.Fatalln(err)
}
gdb = db
return gdb
}
// saveDB 表插入或更新
func saveDB(s model.NeConfig) string {
db := connDB()
// 检查是否存在
var id string
db.Raw("SELECT id FROM ne_config WHERE ne_type = ? AND param_name = ?", s.NeType, s.ParamName).Scan(&id)
// 更新时间
s.UpdateTime = time.Now().UnixMilli()
if id != "" {
s.ID = id
db.Save(s)
} else {
db.Create(s)
}
return s.ID
}
// ========= Utils =============
// getDirFileNameList 获取文件目录下所有文件名称,不含目录名称
func getDirFileNameList(dirPath string) ([]string, error) {
fileNames := []string{}
dir, err := os.Open(dirPath)
if err != nil {
return fileNames, nil
}
defer dir.Close()
fileInfos, err := dir.Readdir(-1)
if err != nil {
return fileNames, err
}
for _, fileInfo := range fileInfos {
if fileInfo.Mode().IsRegular() {
fileNames = append(fileNames, fileInfo.Name())
}
}
return fileNames, nil
}
// parseStrToMap 解析内容string到map
func parseStrToMap(filePath string) (map[string]any, error) {
// 读取文件内容
bytes, err := os.ReadFile(filePath)
if err != nil {
return nil, err
}
content := string(bytes)
var configMap map[string]any
err = yaml.Unmarshal([]byte(content), &configMap)
return configMap, err
}
// parseParamConfig 解析内容文件数据
func parseParamConfig(data map[string]any) ([]map[string]string, error) {
paramMapArr := make([]map[string]string, 0)
for k, v := range data {
for ik, iv := range v.(map[string]any) {
itemMap := make(map[string]string)
itemMap["neType"] = strings.ToUpper(k)
itemMap["paramName"] = ik
for iik, iiv := range iv.(map[string]any) {
switch iik {
case "display":
itemMap["paramDisplay"] = iiv.(string)
case "sort":
itemMap["paramSort"] = fmt.Sprint(iiv)
case "perms", "method":
itemMap["paramPerms"] = iiv.(string)
case "data", "list", "array":
itemMap["paramType"] = iik
strByte, _ := json.Marshal(iiv)
itemMap["paramJson"] = string(strByte)
}
}
paramMapArr = append(paramMapArr, itemMap)
}
}
return paramMapArr, nil
}

View File

@@ -119,6 +119,8 @@ func (r *NeConfigBackupImpl) NeConfigLocalToNe(neInfo model.NeInfo, localFile st
sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/rtproxy && sudo cp -rf %s/rtproxy/* /usr/local/etc/rtproxy && sudo chmod 755 /usr/local/etc/rtproxy/rtproxy.conf", neDirTemp))
// iwf目录
sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/etc/iwf && sudo cp -rf %s/iwf/* /usr/local/etc/iwf && sudo chmod 755 /usr/local/etc/iwf/*.yaml", neDirTemp))
} else if neTypeLower == "omc" {
sshClient.RunCMD(fmt.Sprintf("sudo mkdir -p /usr/local/omc/etc && sudo cp -rf %s/* /usr/local/omc/etc && sudo chmod 755 /usr/local/omc/etc/*.{yaml,conf}", neDirTemp))
} else {
neEtcPath := fmt.Sprintf("/usr/local/etc/%s", neTypeLower)
chmodFile := fmt.Sprintf("sudo chmod 755 %s/*.yaml", neEtcPath)
@@ -172,6 +174,8 @@ func (r *NeConfigBackupImpl) NeConfigNeToLocal(neInfo model.NeInfo) (string, err
sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/rtproxy && sudo cp -rf /usr/local/etc/rtproxy/rtproxy.conf %s/rtproxy", neDirTemp, neDirTemp))
// iwf目录
sshClient.RunCMD(fmt.Sprintf("mkdir -p %s/iwf && sudo cp -rf /usr/local/etc/iwf/*.yaml %s/iwf", neDirTemp, neDirTemp))
} else if neTypeLower == "omc" {
sshClient.RunCMD(fmt.Sprintf("mkdir -p %s && sudo cp -rf /usr/local/omc/etc/*.{yaml,conf} %s", neDirTemp, neDirTemp))
} else {
nePath := fmt.Sprintf("/usr/local/etc/%s/*.yaml", neTypeLower)
if neTypeLower == "mme" {

View File

@@ -563,6 +563,7 @@ func (r *NeInfoImpl) NeConfOAMSync(neInfo model.NeInfo, content map[string]any,
"pvFlag": neInfo.PvFlag,
}
// 公共参数指定的OMC
if omcIP, ok := r.Para5GData["OMC_IP"]; ok && omcIP != "" {
if strings.Contains(omcIP, ":") {
item["ipType"] = "ipv6"
@@ -574,6 +575,17 @@ func (r *NeInfoImpl) NeConfOAMSync(neInfo model.NeInfo, content map[string]any,
}
}
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)
}