feat: nbi
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -38,3 +38,4 @@ vendor
|
|||||||
*.bak
|
*.bak
|
||||||
*.bak*
|
*.bak*
|
||||||
*.exe
|
*.exe
|
||||||
|
__debug_bin*
|
||||||
|
|||||||
@@ -1,48 +1,34 @@
|
|||||||
-- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64)
|
/*
|
||||||
--
|
Navicat Premium Data Transfer
|
||||||
-- Host: 192.168.2.219 Database: omc_db
|
|
||||||
-- ------------------------------------------------------
|
Source Server : root@192.168.2.165
|
||||||
-- Server version 10.3.38-MariaDB
|
Source Server Type : MariaDB
|
||||||
|
Source Server Version : 100335 (10.3.35-MariaDB)
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
Source Host : 192.168.2.165:33066
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
Source Schema : omc_db
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8mb4 */;
|
Target Server Type : MariaDB
|
||||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
Target Server Version : 100335 (10.3.35-MariaDB)
|
||||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
File Encoding : 65001
|
||||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
|
||||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
Date: 16/05/2025 10:48:43
|
||||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
*/
|
||||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
--
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
-- Table structure for table `alarm_relation`
|
|
||||||
--
|
-- ----------------------------
|
||||||
|
-- Table structure for alarm_relation
|
||||||
DROP TABLE IF EXISTS `alarm_relation`;
|
-- ----------------------------
|
||||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
DROP TABLE IF EXISTS `alarm_relation`;
|
||||||
/*!40101 SET character_set_client = utf8 */;
|
CREATE TABLE `alarm_relation` (
|
||||||
CREATE TABLE `alarm_relation` (
|
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
`root_alarm_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
||||||
`created_at` datetime(3) DEFAULT NULL,
|
`alarm_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
||||||
`updated_at` datetime(3) DEFAULT NULL,
|
`relation_type` enum('derived','related') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '衍生关系:derived/related: 父子/兄弟',
|
||||||
`deleted_at` datetime(3) DEFAULT NULL,
|
`add_info` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
||||||
`root_alarm_id` varchar(64) DEFAULT NULL,
|
`created_at` datetime NULL DEFAULT NULL,
|
||||||
`alarm_id` varchar(64) DEFAULT NULL,
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
`relation_type` varchar(64) DEFAULT NULL,
|
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
`add_info` varchar(64) DEFAULT NULL,
|
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
KEY `idx_alarm_relation_deleted_at` (`deleted_at`) USING BTREE
|
|
||||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
|
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
|
||||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
|
||||||
|
|
||||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
|
||||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
|
||||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
|
||||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
||||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
|
||||||
|
|
||||||
-- Dump completed on 2024-03-06 17:26:55
|
|
||||||
|
|||||||
20
database/upgrade/upg_alarm_relation.sql
Normal file
20
database/upgrade/upg_alarm_relation.sql
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
CREATE TABLE `alarm_relation` (
|
||||||
|
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`root_alarm_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
||||||
|
`alarm_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
||||||
|
`relation_type` enum('derived','related') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '衍生关系:derived/related: 父子/兄弟',
|
||||||
|
`add_info` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
|
||||||
|
`created_at` datetime NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
ALTER TABLE `alarm_relation`
|
||||||
|
DROP COLUMN IF EXISTS `updated_at`,
|
||||||
|
DROP COLUMN IF EXISTS `deleted_at`,
|
||||||
|
MODIFY COLUMN IF EXISTS `relation_type` enum('derived','related') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '衍生关系:derived/related: 父子/兄弟' AFTER `alarm_id`,
|
||||||
|
MODIFY COLUMN IF EXISTS `created_at` datetime NULL DEFAULT NULL AFTER `add_info`;
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"be.ems/features/nbi/redisqueue"
|
||||||
"be.ems/lib/config"
|
"be.ems/lib/config"
|
||||||
"be.ems/lib/dborm"
|
"be.ems/lib/dborm"
|
||||||
"be.ems/lib/global"
|
"be.ems/lib/global"
|
||||||
@@ -476,6 +477,24 @@ func PostAlarmFromNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
log.Error("Failed to AlarmSMSForward:", err)
|
log.Error("Failed to AlarmSMSForward:", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if config.GetYamlConfig().Alarm.RelatedRules.Enabled {
|
||||||
|
relatedId, found := JudgeRelated(&alarmData, session, config.RelationRules.Related)
|
||||||
|
if found {
|
||||||
|
id, err := InsertAlarmRelation(session, alarmData.AlarmId, relatedId, "related")
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Failed to insert alarm relation:", err)
|
||||||
|
}
|
||||||
|
redisqueue.AddAlarmRelationQueue([]string{strconv.FormatInt(id, 10)})
|
||||||
|
}
|
||||||
|
derivedId, found := JudgeDerived(&alarmData, session)
|
||||||
|
if found {
|
||||||
|
id, err := InsertAlarmRelation(session, alarmData.AlarmId, derivedId, "derived")
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Failed to insert alarm relation:", err)
|
||||||
|
}
|
||||||
|
redisqueue.AddAlarmRelationQueue([]string{strconv.FormatInt(id, 10)})
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
services.ResponseStatusOK200Null(w)
|
services.ResponseStatusOK200Null(w)
|
||||||
|
|||||||
78
features/fm/relation.go
Normal file
78
features/fm/relation.go
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
package fm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"be.ems/lib/config"
|
||||||
|
"xorm.io/xorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func JudgeDerived(alarm *Alarm, session *xorm.Session) (parentId string, found bool) {
|
||||||
|
for _, rule := range config.RelationRules.Derived {
|
||||||
|
if alarm.AlarmCode == rule.ChildCode {
|
||||||
|
// 查询是否有 parent_code 的告警
|
||||||
|
var parent Alarm
|
||||||
|
has, _ := session.Table("alarm").
|
||||||
|
Where("alarm_code=? AND ne_id=? AND alarm_status=1", rule.ParentCode, alarm.NeId).
|
||||||
|
Get(&parent)
|
||||||
|
if has {
|
||||||
|
return parent.AlarmId, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
func JudgeRelated(alarm *Alarm, session *xorm.Session, rules []config.RelatedRule) (relatedId string, found bool) {
|
||||||
|
for _, rule := range rules {
|
||||||
|
// 1. 检查 ne_type 是否匹配
|
||||||
|
if rule.NeType != "" && alarm.NeType != rule.NeType {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 2. 检查 code 是否在 codes 列表
|
||||||
|
codeMatch := false
|
||||||
|
for _, c := range rule.Codes {
|
||||||
|
if alarm.AlarmCode == c {
|
||||||
|
codeMatch = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !codeMatch {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 3. 查询同一ne_id、codes列表内、时间窗口内的其他告警
|
||||||
|
var brother Alarm
|
||||||
|
parsedTime, err := time.Parse(time.RFC3339, alarm.EventTime)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
timeStart := parsedTime.Add(-time.Duration(rule.TimeWindow) * time.Second)
|
||||||
|
has, _ := session.Table("alarm").
|
||||||
|
Where("ne_id=? AND alarm_code IN (?) AND event_time BETWEEN ? AND ? AND alarm_id!=?",
|
||||||
|
alarm.NeId, rule.Codes, timeStart, alarm.EventTime, alarm.AlarmId).
|
||||||
|
Get(&brother)
|
||||||
|
if has {
|
||||||
|
return brother.AlarmId, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
type AlarmRelation struct {
|
||||||
|
Id int64 `xorm:"pk autoincr 'id'"`
|
||||||
|
AlarmId string `xorm:"alarm_id"`
|
||||||
|
RelatedAlarmId string `xorm:"related_alarm_id"`
|
||||||
|
RelationType string `xorm:"relation_type"`
|
||||||
|
CreateAt time.Time `xorm:"create_at"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertAlarmRelation(session *xorm.Session, alarmId, relatedId, relationType string) (int64, error) {
|
||||||
|
relation := &AlarmRelation{
|
||||||
|
AlarmId: alarmId,
|
||||||
|
RelatedAlarmId: relatedId,
|
||||||
|
RelationType: relationType,
|
||||||
|
CreateAt: time.Now(),
|
||||||
|
}
|
||||||
|
_, err := session.Insert(relation)
|
||||||
|
return relation.Id, err // 返回插入的ID
|
||||||
|
}
|
||||||
103
features/nbi/redisqueue/queue.go
Normal file
103
features/nbi/redisqueue/queue.go
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
package redisqueue
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"be.ems/lib/log"
|
||||||
|
|
||||||
|
redisdb "be.ems/src/framework/database/redis"
|
||||||
|
"github.com/redis/go-redis/v9"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 写入 alarm_relation 消息
|
||||||
|
func AddAlarmRelationQueue(ids []string) error {
|
||||||
|
payload := map[string][]string{"ids": ids}
|
||||||
|
payloadBytes, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
values := map[string]interface{}{
|
||||||
|
"payload": string(payloadBytes),
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = client.XAdd(ctx, &redis.XAddArgs{
|
||||||
|
Stream: "alarm_relation",
|
||||||
|
Values: values,
|
||||||
|
}).Result()
|
||||||
|
|
||||||
|
// 只保留最新2000条消息
|
||||||
|
client.XTrimMaxLen(context.Background(), "alarm_relation", 2000).Result()
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 写入 nbi_cm 消息
|
||||||
|
func AddNbiCMQueue(ids []string) error {
|
||||||
|
payload := map[string][]string{"ids": ids}
|
||||||
|
payloadBytes, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
values := map[string]interface{}{
|
||||||
|
"payload": string(payloadBytes),
|
||||||
|
}
|
||||||
|
_, err = client.XAdd(ctx, &redis.XAddArgs{
|
||||||
|
Stream: "nbi_cm",
|
||||||
|
Values: values,
|
||||||
|
}).Result()
|
||||||
|
|
||||||
|
// 只保留最新2000条消息
|
||||||
|
client.XTrimMaxLen(context.Background(), "nbi_cm", 2000).Result()
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 写入 nbi_pm 消息
|
||||||
|
func AddNbiPMQueue(neType, id string) error {
|
||||||
|
payload := map[string]string{"neType": neType, "id": id}
|
||||||
|
payloadBytes, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
values := map[string]interface{}{
|
||||||
|
"payload": string(payloadBytes),
|
||||||
|
}
|
||||||
|
_, err = client.XAdd(ctx, &redis.XAddArgs{
|
||||||
|
Stream: "nbi_pm",
|
||||||
|
Values: values,
|
||||||
|
}).Result()
|
||||||
|
|
||||||
|
// 只保留最新2000条消息
|
||||||
|
client.XTrimMaxLen(context.Background(), "nbi_pm", 2000).Result()
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 读取并打印指定 stream 的最新消息
|
||||||
|
func ReadLatest(stream string) error {
|
||||||
|
res, err := client.XRevRangeN(ctx, stream, "+", "-", 1).Result()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, msg := range res {
|
||||||
|
log.Tracef("Stream: %s, ID: %s, Values: %v\n", stream, msg.ID, msg.Values)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var ctx = context.Background()
|
||||||
|
var client *redis.Client
|
||||||
|
|
||||||
|
func InitRedisQueue() {
|
||||||
|
// var cancel context.CancelFunc
|
||||||
|
// ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
|
// defer cancel()
|
||||||
|
client = redisdb.RDB("")
|
||||||
|
}
|
||||||
|
|
||||||
|
func CloseRedisQueue() {
|
||||||
|
if err := client.Close(); err != nil {
|
||||||
|
log.Errorf("redis db close: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"be.ems/features/nbi/redisqueue"
|
||||||
"be.ems/features/pm/kpi_c_report"
|
"be.ems/features/pm/kpi_c_report"
|
||||||
"be.ems/features/pm/kpi_c_title"
|
"be.ems/features/pm/kpi_c_title"
|
||||||
"be.ems/lib/config"
|
"be.ems/lib/config"
|
||||||
@@ -338,6 +339,12 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 推送到redis队列
|
||||||
|
err = redisqueue.AddNbiPMQueue(kpiData.NEType, strconv.Itoa(kpiData.ID))
|
||||||
|
if err != nil {
|
||||||
|
log.Warn("Failed to AddNbiPMQueue:", err)
|
||||||
|
}
|
||||||
|
|
||||||
services.ResponseStatusOK204NoContent(w)
|
services.ResponseStatusOK204NoContent(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
go.mod
1
go.mod
@@ -37,6 +37,7 @@ require (
|
|||||||
golang.org/x/term v0.28.0
|
golang.org/x/term v0.28.0
|
||||||
golang.org/x/text v0.21.0
|
golang.org/x/text v0.21.0
|
||||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
||||||
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
gorm.io/driver/mysql v1.5.7
|
gorm.io/driver/mysql v1.5.7
|
||||||
gorm.io/gorm v1.25.11
|
gorm.io/gorm v1.25.11
|
||||||
|
|||||||
1
go.sum
1
go.sum
@@ -575,6 +575,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
31
lib/config/alarm_relation_rules.go
Normal file
31
lib/config/alarm_relation_rules.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DerivedRule struct {
|
||||||
|
ParentCode int `yaml:"parentCode"`
|
||||||
|
ChildCode int `yaml:"childCode"`
|
||||||
|
}
|
||||||
|
type RelatedRule struct {
|
||||||
|
Codes []int `yaml:"codes"`
|
||||||
|
NeType string `yaml:"neType"`
|
||||||
|
TimeWindow int `yaml:"timeWindow"`
|
||||||
|
}
|
||||||
|
type AlarmRelationRules struct {
|
||||||
|
Derived []DerivedRule `yaml:"derived"`
|
||||||
|
Related []RelatedRule `yaml:"related"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var RelationRules AlarmRelationRules
|
||||||
|
|
||||||
|
func LoadAlarmRelationRules(path string) error {
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return yaml.Unmarshal(data, &RelationRules)
|
||||||
|
}
|
||||||
@@ -180,7 +180,11 @@ type AlarmConfig struct {
|
|||||||
SignName string `yaml:"signName"`
|
SignName string `yaml:"signName"`
|
||||||
TemplateCode string `yaml:"templateCode"`
|
TemplateCode string `yaml:"templateCode"`
|
||||||
} `yaml:"smsForward"`
|
} `yaml:"smsForward"`
|
||||||
SMProxy string `yaml:"smProxy"`
|
SMProxy string `yaml:"smProxy"`
|
||||||
|
RelatedRules struct {
|
||||||
|
Enabled bool `yaml:"enabled"`
|
||||||
|
File string `yaml:"file"`
|
||||||
|
} `yaml:"relatedRules"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type MMLParam struct {
|
type MMLParam struct {
|
||||||
@@ -271,6 +275,11 @@ func ReadConfig(configFile string) {
|
|||||||
yamlConfig = YamlConfigInfo.ConfigLines
|
yamlConfig = YamlConfigInfo.ConfigLines
|
||||||
|
|
||||||
ReadOriginalConfig(configFile)
|
ReadOriginalConfig(configFile)
|
||||||
|
|
||||||
|
// load alarm relation rules
|
||||||
|
if yamlConfig.Alarm.RelatedRules.Enabled {
|
||||||
|
LoadAlarmRelationRules(yamlConfig.Alarm.RelatedRules.File)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReadOriginalConfig(configFile string) {
|
func ReadOriginalConfig(configFile string) {
|
||||||
|
|||||||
10
restagent/etc/alarm_relation_rules.yaml
Normal file
10
restagent/etc/alarm_relation_rules.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# alarm relation rules
|
||||||
|
derived:
|
||||||
|
- parentCode: 1001
|
||||||
|
childCode: 1002
|
||||||
|
- parentCode: 2001
|
||||||
|
childCode: 2002
|
||||||
|
related:
|
||||||
|
- codes: [3001, 3002, 3003]
|
||||||
|
neType: "AMF"
|
||||||
|
timeWindow: 60 # 秒
|
||||||
@@ -31,8 +31,8 @@ rest:
|
|||||||
keyFile: ./etc/certs/omc-server.key
|
keyFile: ./etc/certs/omc-server.key
|
||||||
|
|
||||||
webServer:
|
webServer:
|
||||||
enabled: false
|
enabled: true
|
||||||
rootDir: d:/omc.git/fe.ems.vue3/dist # front-end build dist directory
|
rootDir: /home/simon/omc.git/fe.ems.vue3/dist # front-end build dist directory
|
||||||
listen:
|
listen:
|
||||||
- addr: :8080
|
- addr: :8080
|
||||||
schema: http
|
schema: http
|
||||||
@@ -47,8 +47,8 @@ database:
|
|||||||
type: mysql
|
type: mysql
|
||||||
user: root
|
user: root
|
||||||
password: "1000omc@kp!"
|
password: "1000omc@kp!"
|
||||||
host: "192.168.9.58"
|
host: "192.168.2.165"
|
||||||
port: 13306
|
port: 33066
|
||||||
name: omc_db
|
name: omc_db
|
||||||
connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True
|
connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True
|
||||||
backup: ./database
|
backup: ./database
|
||||||
@@ -58,8 +58,8 @@ redis:
|
|||||||
dataSource:
|
dataSource:
|
||||||
# OMC system db
|
# OMC system db
|
||||||
default:
|
default:
|
||||||
port: 16379 # Redis port
|
port: 6379 # Redis port
|
||||||
host: "192.168.9.58" # Redis host
|
host: "127.0.0.1" # Redis host
|
||||||
password: "helloearth"
|
password: "helloearth"
|
||||||
db: 10 # Redis db_num
|
db: 10 # Redis db_num
|
||||||
# used to specify the default data source for multiple data resourece
|
# used to specify the default data source for multiple data resourece
|
||||||
@@ -139,7 +139,7 @@ alarm:
|
|||||||
enable: true
|
enable: true
|
||||||
emailList:
|
emailList:
|
||||||
smtp: mail.smtp.com
|
smtp: mail.smtp.com
|
||||||
port: 25
|
port: 110
|
||||||
user: smtpext@smtp.com
|
user: smtpext@smtp.com
|
||||||
password: "1000smtp@omc!"
|
password: "1000smtp@omc!"
|
||||||
tlsSkipVerify: true
|
tlsSkipVerify: true
|
||||||
@@ -159,6 +159,11 @@ alarm:
|
|||||||
signName: xxx SMSC
|
signName: xxx SMSC
|
||||||
templateCode: 1000
|
templateCode: 1000
|
||||||
smProxy: smsc
|
smProxy: smsc
|
||||||
|
# alarm_relation_rules.yaml
|
||||||
|
relationRules:
|
||||||
|
enabled: true
|
||||||
|
file: ./etc/alarm_relation_rules.yaml
|
||||||
|
|
||||||
|
|
||||||
# User authorized information
|
# User authorized information
|
||||||
# crypt: mysql/md5/bcrypt
|
# crypt: mysql/md5/bcrypt
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import (
|
|||||||
"be.ems/features/fm"
|
"be.ems/features/fm"
|
||||||
"be.ems/features/lm"
|
"be.ems/features/lm"
|
||||||
"be.ems/features/mml"
|
"be.ems/features/mml"
|
||||||
|
"be.ems/features/nbi/redisqueue"
|
||||||
"be.ems/features/pm"
|
"be.ems/features/pm"
|
||||||
featuresCfg "be.ems/lib/config"
|
featuresCfg "be.ems/lib/config"
|
||||||
"be.ems/lib/dborm"
|
"be.ems/lib/dborm"
|
||||||
@@ -209,6 +210,9 @@ func loadFeatures(app *gin.Engine) {
|
|||||||
|
|
||||||
mml.InitMML()
|
mml.InitMML()
|
||||||
|
|
||||||
|
// 初始化Redis Queue连接池
|
||||||
|
redisqueue.InitRedisQueue()
|
||||||
|
|
||||||
// 将 mux.Router 注册到 gin.Engine
|
// 将 mux.Router 注册到 gin.Engine
|
||||||
|
|
||||||
// 默认路由组
|
// 默认路由组
|
||||||
|
|||||||
326
src/modules/crontask/processor/syncNbiNRM/amf/sync.go
Normal file
326
src/modules/crontask/processor/syncNbiNRM/amf/sync.go
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
package amf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"be.ems/features/nbi/redisqueue"
|
||||||
|
"be.ems/lib/dborm"
|
||||||
|
"be.ems/lib/log"
|
||||||
|
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SyncAmfNbiCM 从ne_info获取AMF网元并同步数据到nbi_cm表
|
||||||
|
func SyncNbiCM() error {
|
||||||
|
log.Info("Starting AMF NBI CM synchronization")
|
||||||
|
|
||||||
|
// 从ne_info表获取AMF类型的网元
|
||||||
|
var amfNEs []common.NeInfo
|
||||||
|
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "AMF").
|
||||||
|
Find(&amfNEs).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query AMF network elements: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("Found %d AMF network elements", len(amfNEs))
|
||||||
|
|
||||||
|
// 遍历每个AMF网元,生成对应的NBI CM记录
|
||||||
|
for _, ne := range amfNEs {
|
||||||
|
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
||||||
|
|
||||||
|
var version string = "-"
|
||||||
|
err := dborm.DefaultDB().Table("ne_version").
|
||||||
|
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("version", &version).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== ManagedElement ==========
|
||||||
|
managedElement := ManagedElement{
|
||||||
|
Id: fmt.Sprintf("%s-%s-ManagedElement", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
ManagedBy: ne.Dn,
|
||||||
|
ManagementIpAddress: ne.Ip,
|
||||||
|
SwVersion: version,
|
||||||
|
PatchInfo: "-",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
}
|
||||||
|
meJSON, err := json.Marshal(managedElement)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal ManagedElement for ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "ManagedElement", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastJson).Error
|
||||||
|
newValueJson := string(meJSON)
|
||||||
|
if err != nil || lastJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastJson, newValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== AmfFunction ==========
|
||||||
|
var capability int
|
||||||
|
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("capability", &capability).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
||||||
|
capability = 0
|
||||||
|
}
|
||||||
|
amfFunction := AmfFunction{
|
||||||
|
Id: fmt.Sprintf("%s-%s-AmfFunction", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-AmfFunction",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
||||||
|
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
||||||
|
SbiServiceList: "Namf_Communication,Namf_EventExposure,Namf_MT,Namf_Location",
|
||||||
|
AmfGuamiList: "[{\"mcc\":\"460\",\"mnc\":\"000\",\"amfId\":\"" + ne.NeId + "\"}]",
|
||||||
|
SnssaiList: "[{\"sst\":1,\"sd\":\"000001\"}]",
|
||||||
|
MaxUser: capability,
|
||||||
|
RelativeCapacity: 30,
|
||||||
|
MaxGnbNum: 100,
|
||||||
|
}
|
||||||
|
amfJSON, err := json.Marshal(amfFunction)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal AmfFunction for ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastAmfJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "AmfFunction", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastAmfJson).Error
|
||||||
|
newAmfValueJson := string(amfJSON)
|
||||||
|
if err != nil || lastAmfJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "AmfFunction", newAmfValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AmfFunction", newAmfValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastAmfJson, newAmfValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AmfFunction", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AmfFunction", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AmfFunction", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "AmfFunction", newAmfValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== EpRpDynN8Amf ==========
|
||||||
|
epRpDynN8Amf := EpRpDynN8Amf{
|
||||||
|
Id: fmt.Sprintf("%s-%s-EpRpDynN8Amf", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-EpRpDynN8Amf",
|
||||||
|
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
||||||
|
FarIpSubnetworkList: "[\"10.10.0.0/16\"]",
|
||||||
|
}
|
||||||
|
n8JSON, err := json.Marshal(epRpDynN8Amf)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal EpRpDynN8Amf for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastN8Json string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "EpRpDynN8Amf", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastN8Json).Error
|
||||||
|
newN8ValueJson := string(n8JSON)
|
||||||
|
if err != nil || lastN8Json == "" {
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN8Amf", newN8ValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN8Amf", newN8ValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastN8Json, newN8ValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN8Amf", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN8Amf", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN8Amf", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN8Amf", newN8ValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== EpRpDynN11Amf ==========
|
||||||
|
epRpDynN11Amf := EpRpDynN11Amf{
|
||||||
|
Id: fmt.Sprintf("%s-%s-EpRpDynN11Amf", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-EpRpDynN11Amf",
|
||||||
|
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
||||||
|
FarIpSubnetworkList: "[\"10.11.0.0/16\"]",
|
||||||
|
}
|
||||||
|
n11JSON, err := json.Marshal(epRpDynN11Amf)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal EpRpDynN11Amf for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastN11Json string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "EpRpDynN11Amf", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastN11Json).Error
|
||||||
|
newN11ValueJson := string(n11JSON)
|
||||||
|
if err != nil || lastN11Json == "" {
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN11Amf", newN11ValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN11Amf", newN11ValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastN11Json, newN11ValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN11Amf", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN11Amf", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN11Amf", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN11Amf", newN11ValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== EpRpDynN12Amf ==========
|
||||||
|
epRpDynN12Amf := EpRpDynN12Amf{
|
||||||
|
Id: fmt.Sprintf("%s-%s-EpRpDynN12Amf", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-EpRpDynN12Amf",
|
||||||
|
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
||||||
|
FarIpSubnetworkList: "[\"10.12.0.0/16\"]",
|
||||||
|
}
|
||||||
|
n12JSON, err := json.Marshal(epRpDynN12Amf)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal EpRpDynN12Amf for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastN12Json string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "EpRpDynN12Amf", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastN12Json).Error
|
||||||
|
newN12ValueJson := string(n12JSON)
|
||||||
|
if err != nil || lastN12Json == "" {
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN12Amf", newN12ValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN12Amf", newN12ValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastN12Json, newN12ValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN12Amf", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN12Amf", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN12Amf", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN12Amf", newN12ValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== IPResource ==========
|
||||||
|
ipResource := IPResource{
|
||||||
|
Id: fmt.Sprintf("%s-%s-IPResource", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-IPResource",
|
||||||
|
InterfaceType: "{Mgt,N8,N11,N12}",
|
||||||
|
LocIpV4AddrList: fmt.Sprintf("{%s,Default,Default,Default}", ne.Ip),
|
||||||
|
LocIpV6AddrList: "{Default,Default,Default,Default}",
|
||||||
|
}
|
||||||
|
ipJSON, err := json.Marshal(ipResource)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal IPResource for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastIpJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "IPResource", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastIpJson).Error
|
||||||
|
newIpValueJson := string(ipJSON)
|
||||||
|
if err != nil || lastIpJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastIpJson, newIpValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("AMF NBI CM synchronization completed")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -30,6 +30,7 @@ type EventType int
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
ObjectNullEvent EventType = iota // ObjectNullEvent 空事件
|
ObjectNullEvent EventType = iota // ObjectNullEvent 空事件
|
||||||
|
ObjectOriginalEvent // ObjectOriginalEvent 原始事件
|
||||||
ObjectCreationEvent // ObjectCreationEvent 创建事件
|
ObjectCreationEvent // ObjectCreationEvent 创建事件
|
||||||
ObjectDeletionEvent // ObjectDeletionEvent 删除事件
|
ObjectDeletionEvent // ObjectDeletionEvent 删除事件
|
||||||
ObjectAttributeValueChangeEvent // ObjectAttributeValueChangeEvent 修改事件
|
ObjectAttributeValueChangeEvent // ObjectAttributeValueChangeEvent 修改事件
|
||||||
@@ -38,6 +39,8 @@ const (
|
|||||||
|
|
||||||
func (et EventType) EventTypeEnumString() string {
|
func (et EventType) EventTypeEnumString() string {
|
||||||
switch et {
|
switch et {
|
||||||
|
case ObjectOriginalEvent:
|
||||||
|
return "ObjectOriginalEvent"
|
||||||
case ObjectCreationEvent:
|
case ObjectCreationEvent:
|
||||||
return "ObjectCreationEvent"
|
return "ObjectCreationEvent"
|
||||||
case ObjectDeletionEvent:
|
case ObjectDeletionEvent:
|
||||||
@@ -62,6 +65,8 @@ func EventTypeInt(s string) EventType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch s {
|
switch s {
|
||||||
|
case "ObjectOriginalEvent":
|
||||||
|
return ObjectOriginalEvent
|
||||||
case "ObjectCreationEvent":
|
case "ObjectCreationEvent":
|
||||||
return ObjectCreationEvent
|
return ObjectCreationEvent
|
||||||
case "ObjectDeletionEvent":
|
case "ObjectDeletionEvent":
|
||||||
|
|||||||
95
src/modules/crontask/processor/syncNbiNRM/common/compare.go
Normal file
95
src/modules/crontask/processor/syncNbiNRM/common/compare.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"be.ems/lib/dborm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CompareJSON 比较两个 JSON,返回新增、修改和删除的内容
|
||||||
|
func CompareJSON(json1, json2 string) (map[string]interface{}, map[string]interface{}, map[string]interface{}, error) {
|
||||||
|
var map1, map2 map[string]interface{}
|
||||||
|
|
||||||
|
// 解析 JSON
|
||||||
|
if err := json.Unmarshal([]byte(json1), &map1); err != nil {
|
||||||
|
return nil, nil, nil, fmt.Errorf("failed to parse json1: %v", err)
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal([]byte(json2), &map2); err != nil {
|
||||||
|
return nil, nil, nil, fmt.Errorf("failed to parse json2: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 存储新增、修改和删除的内容
|
||||||
|
added := make(map[string]interface{})
|
||||||
|
modified := make(map[string]interface{})
|
||||||
|
deleted := make(map[string]interface{})
|
||||||
|
|
||||||
|
// 递归比较
|
||||||
|
compareMaps(map1, map2, added, modified, deleted, "")
|
||||||
|
|
||||||
|
return added, modified, deleted, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// compareMaps 递归比较两个 map
|
||||||
|
func compareMaps(map1, map2, added, modified, deleted map[string]interface{}, prefix string) {
|
||||||
|
// 遍历 map1,检查删除或修改
|
||||||
|
for key, val1 := range map1 {
|
||||||
|
fullKey := key
|
||||||
|
if prefix != "" {
|
||||||
|
fullKey = prefix + "." + key
|
||||||
|
}
|
||||||
|
|
||||||
|
val2, exists := map2[key]
|
||||||
|
if !exists {
|
||||||
|
// 如果 key 不存在于 map2,记录为删除
|
||||||
|
deleted[fullKey] = val1
|
||||||
|
} else if !reflect.DeepEqual(val1, val2) {
|
||||||
|
// 如果 key 存在但值不同,记录为修改
|
||||||
|
if reflect.TypeOf(val1) == reflect.TypeOf(val2) && reflect.TypeOf(val1).Kind() == reflect.Map {
|
||||||
|
// 如果值是嵌套对象,递归比较
|
||||||
|
compareMaps(val1.(map[string]interface{}), val2.(map[string]interface{}), added, modified, deleted, fullKey)
|
||||||
|
} else {
|
||||||
|
modified[fullKey] = map[string]interface{}{
|
||||||
|
"old": val1,
|
||||||
|
"new": val2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 遍历 map2,检查新增
|
||||||
|
for key, val2 := range map2 {
|
||||||
|
fullKey := key
|
||||||
|
if prefix != "" {
|
||||||
|
fullKey = prefix + "." + key
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, exists := map1[key]; !exists {
|
||||||
|
// 如果 key 不存在于 map1,记录为新增
|
||||||
|
added[fullKey] = val2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func InsertNbiCm(ne NeInfo, objType, valueJson string, eventType EventType) NbiCm {
|
||||||
|
nbiCM := NbiCm{
|
||||||
|
NeType: ne.NeType,
|
||||||
|
NeId: ne.NeId,
|
||||||
|
CmVersion: CmVersion,
|
||||||
|
RmUid: ne.RmUid,
|
||||||
|
EventType: eventType,
|
||||||
|
ObjectType: objType,
|
||||||
|
ValueJson: valueJson,
|
||||||
|
Timestamp: time.Now().Format("2006-01-02 15:04:05"),
|
||||||
|
}
|
||||||
|
dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM)
|
||||||
|
|
||||||
|
return nbiCM
|
||||||
|
}
|
||||||
|
|
||||||
|
func ToJson(m map[string]interface{}) string {
|
||||||
|
b, _ := json.Marshal(m)
|
||||||
|
return string(b)
|
||||||
|
}
|
||||||
234
src/modules/crontask/processor/syncNbiNRM/pcf/sync.go
Normal file
234
src/modules/crontask/processor/syncNbiNRM/pcf/sync.go
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
package pcf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"be.ems/features/nbi/redisqueue"
|
||||||
|
"be.ems/lib/dborm"
|
||||||
|
"be.ems/lib/log"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SyncPcfNbiCM 从ne_info获取PCF网元并同步数据到nbi_cm表
|
||||||
|
func SyncNbiCM() error {
|
||||||
|
log.Info("Starting PCF NBI CM synchronization")
|
||||||
|
|
||||||
|
// 从ne_info表获取PCF类型的网元
|
||||||
|
var pcfNEs []common.NeInfo
|
||||||
|
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "PCF").
|
||||||
|
Find(&pcfNEs).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query PCF network elements: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("Found %d PCF network elements", len(pcfNEs))
|
||||||
|
|
||||||
|
for _, ne := range pcfNEs {
|
||||||
|
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
||||||
|
|
||||||
|
var version string = "-"
|
||||||
|
err := dborm.DefaultDB().Table("ne_version").
|
||||||
|
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("version", &version).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== ManagedElement ==========
|
||||||
|
managedElement := ManagedElement{
|
||||||
|
Id: fmt.Sprintf("%s-%s-ManagedElement", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
ManagedBy: ne.Dn,
|
||||||
|
ManagementIpAddress: ne.Ip,
|
||||||
|
SwVersion: version,
|
||||||
|
PatchInfo: "-",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
}
|
||||||
|
meJSON, err := json.Marshal(managedElement)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal ManagedElement for PCF ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "ManagedElement", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastJson).Error
|
||||||
|
newValueJson := string(meJSON)
|
||||||
|
if err != nil || lastJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastJson, newValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== PcfFunction ==========
|
||||||
|
pcfFunction := PcfFunction{
|
||||||
|
Id: fmt.Sprintf("%s-%s-PcfFunction", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-PcfFunction",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
||||||
|
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
||||||
|
SbiServiceList: "Npcf_AMPolicyControl,Npcf_PolicyAuthorization,Npcf_SMPolicyControl,Npcf_BDTPolicyControl",
|
||||||
|
}
|
||||||
|
pcfJSON, err := json.Marshal(pcfFunction)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal PcfFunction for ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastPcfJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "PcfFunction", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastPcfJson).Error
|
||||||
|
newPcfValueJson := string(pcfJSON)
|
||||||
|
if err != nil || lastPcfJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "PcfFunction", newPcfValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "PcfFunction", newPcfValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastPcfJson, newPcfValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "PcfFunction", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "PcfFunction", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "PcfFunction", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "PcfFunction", newPcfValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== UdrFunction ==========
|
||||||
|
var capability int
|
||||||
|
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("capability", &capability).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
||||||
|
capability = 0
|
||||||
|
}
|
||||||
|
udrFunction := UdrFunction{
|
||||||
|
Id: fmt.Sprintf("%s-%s-UdrFunction", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-UdrFunction",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
MaxSubNbr: capability,
|
||||||
|
}
|
||||||
|
udrJSON, err := json.Marshal(udrFunction)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal UdrFunction for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastUdrJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "UdrFunction", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastUdrJson).Error
|
||||||
|
newUdrValueJson := string(udrJSON)
|
||||||
|
if err != nil || lastUdrJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "UdrFunction", newUdrValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdrFunction", newUdrValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastUdrJson, newUdrValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdrFunction", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdrFunction", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdrFunction", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "UdrFunction", newUdrValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== IPResource ==========
|
||||||
|
ipResource := IPResource{
|
||||||
|
Id: fmt.Sprintf("%s-%s-IPResource", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-IPResource",
|
||||||
|
InterfaceType: "{Mgt,N5,N7,N15}",
|
||||||
|
LocIpV4AddrList: fmt.Sprintf("{%s,Default,Default,Default}", ne.Ip),
|
||||||
|
LocIpV6AddrList: "{Default,Default,Default,Default}",
|
||||||
|
}
|
||||||
|
ipJSON, err := json.Marshal(ipResource)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal IPResource for PCF ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastIpJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "IPResource", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastIpJson).Error
|
||||||
|
newIpValueJson := string(ipJSON)
|
||||||
|
if err != nil || lastIpJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastIpJson, newIpValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("PCF NBI CM synchronization completed")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -1,28 +1,34 @@
|
|||||||
package smf
|
package smf
|
||||||
|
|
||||||
|
import "be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
||||||
|
|
||||||
|
const (
|
||||||
|
SMF string = "SMF" // 网元类型
|
||||||
|
)
|
||||||
|
|
||||||
type ManagedElement struct {
|
type ManagedElement struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
VendorName string `json:"vendorName"`
|
VendorName string `json:"vendorName"`
|
||||||
ManagedBy string `json:"managedBy"`
|
ManagedBy string `json:"managedBy"`
|
||||||
ManagementIpAddress string `json:"managementIpAddress"`
|
ManagementIpAddress string `json:"managementIpAddress"`
|
||||||
SwVersion string `json:"swVersion"`
|
SwVersion string `json:"swVersion"`
|
||||||
PatchInfo string `json:"patchInfo"`
|
PatchInfo string `json:"patchInfo"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SmfFunction struct {
|
type SmfFunction struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
VnfInstanceId string `json:"vnfInstanceId"`
|
VnfInstanceId string `json:"vnfInstanceId"`
|
||||||
Fqdn string `json:"fqdn"`
|
Fqdn string `json:"fqdn"`
|
||||||
SbiServiceList string `json:"sbiServiceList"`
|
SbiServiceList string `json:"sbiServiceList"`
|
||||||
MaxPduSessions int `json:"maxPduSessions"`
|
MaxPduSessions int `json:"maxPduSessions"`
|
||||||
MaxQfi int `json:"maxQfi"`
|
MaxQfi int `json:"maxQfi"`
|
||||||
UpfList string `json:"upfList"`
|
UpfList string `json:"upfList"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AddrPool struct {
|
type AddrPool struct {
|
||||||
|
|||||||
323
src/modules/crontask/processor/syncNbiNRM/smf/sync.go
Normal file
323
src/modules/crontask/processor/syncNbiNRM/smf/sync.go
Normal file
@@ -0,0 +1,323 @@
|
|||||||
|
package smf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"be.ems/features/nbi/redisqueue"
|
||||||
|
"be.ems/lib/dborm"
|
||||||
|
"be.ems/lib/log"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SyncSmfNbiCM 从ne_info获取SMF网元并同步数据到nbi_cm表
|
||||||
|
func SyncNbiCM() error {
|
||||||
|
log.Info("Starting SMF NBI CM synchronization")
|
||||||
|
|
||||||
|
// 从ne_info表获取SMF类型的网元
|
||||||
|
var smfNEs []common.NeInfo
|
||||||
|
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "SMF").
|
||||||
|
Find(&smfNEs).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query SMF network elements: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("Found %d SMF network elements", len(smfNEs))
|
||||||
|
|
||||||
|
for _, ne := range smfNEs {
|
||||||
|
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
||||||
|
|
||||||
|
var version string = "-"
|
||||||
|
err := dborm.DefaultDB().Table("ne_version").
|
||||||
|
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("version", &version).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== ManagedElement ==========
|
||||||
|
managedElement := ManagedElement{
|
||||||
|
Id: fmt.Sprintf("%s-%s-ManagedElement", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
ManagedBy: ne.Dn,
|
||||||
|
ManagementIpAddress: ne.Ip,
|
||||||
|
SwVersion: version,
|
||||||
|
PatchInfo: "-",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
}
|
||||||
|
meJSON, err := json.Marshal(managedElement)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal ManagedElement for SMF ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "ManagedElement", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastJson).Error
|
||||||
|
newValueJson := string(meJSON)
|
||||||
|
if err != nil || lastJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastJson, newValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== SmfFunction ==========
|
||||||
|
var capability int
|
||||||
|
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("capability", &capability).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
||||||
|
capability = 0
|
||||||
|
}
|
||||||
|
smfFunction := SmfFunction{
|
||||||
|
Id: fmt.Sprintf("%s-%s-SmfFunction", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-SmfFunction",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
||||||
|
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
||||||
|
SbiServiceList: "Nsmf_PDUSession,Nsmf_EventExposure",
|
||||||
|
MaxPduSessions: capability,
|
||||||
|
MaxQfi: 64,
|
||||||
|
UpfList: "[\"UPF-001\",\"UPF-2\"]",
|
||||||
|
}
|
||||||
|
smfJSON, err := json.Marshal(smfFunction)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal SmfFunction for ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastSmfJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "SmfFunction", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastSmfJson).Error
|
||||||
|
newSmfValueJson := string(smfJSON)
|
||||||
|
if err != nil || lastSmfJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "SmfFunction", newSmfValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "SmfFunction", newSmfValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastSmfJson, newSmfValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "SmfFunction", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "SmfFunction", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "SmfFunction", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "SmfFunction", newSmfValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== AddrPool ==========
|
||||||
|
addrPool := AddrPool{
|
||||||
|
Id: fmt.Sprintf("%s-%s-AddrPool", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-AddrPool",
|
||||||
|
AddrType: "UE",
|
||||||
|
IpVersion: "IPv4",
|
||||||
|
AddrSegList: "[\"10.60.0.0/16\",\"10.61.0.0/16\"]",
|
||||||
|
}
|
||||||
|
addrPoolJSON, err := json.Marshal(addrPool)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal AddrPool for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastAddrPoolJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "AddrPool", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastAddrPoolJson).Error
|
||||||
|
newAddrPoolValueJson := string(addrPoolJSON)
|
||||||
|
if err != nil || lastAddrPoolJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "AddrPool", newAddrPoolValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AddrPool", newAddrPoolValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastAddrPoolJson, newAddrPoolValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AddrPool", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AddrPool", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AddrPool", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "AddrPool", newAddrPoolValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== EpRpDynN7Smf ==========
|
||||||
|
epRpDynN7Smf := EpRpDynN7Smf{
|
||||||
|
Id: fmt.Sprintf("%s-%s-EpRpDynN7Smf", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-N7",
|
||||||
|
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
||||||
|
FarIpSubnetworkList: "[\"10.17.0.0/16\"]",
|
||||||
|
}
|
||||||
|
n7JSON, err := json.Marshal(epRpDynN7Smf)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal EpRpDynN7Smf for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastN7Json string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "EpRpDynN7Smf", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastN7Json).Error
|
||||||
|
newN7ValueJson := string(n7JSON)
|
||||||
|
if err != nil || lastN7Json == "" {
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN7Smf", newN7ValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN7Smf", newN7ValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastN7Json, newN7ValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN7Smf", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN7Smf", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN7Smf", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN7Smf", newN7ValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== EpRpDynN10Smf ==========
|
||||||
|
epRpDynN10Smf := EpRpDynN10Smf{
|
||||||
|
Id: fmt.Sprintf("%s-%s-EpRpDynN10Smf", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-N10",
|
||||||
|
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
||||||
|
FarIpSubnetworkList: "[\"10.20.0.0/16\"]",
|
||||||
|
}
|
||||||
|
n10JSON, err := json.Marshal(epRpDynN10Smf)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal EpRpDynN10Smf for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastN10Json string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "EpRpDynN10Smf", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastN10Json).Error
|
||||||
|
newN10ValueJson := string(n10JSON)
|
||||||
|
if err != nil || lastN10Json == "" {
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN10Smf", newN10ValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN10Smf", newN10ValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastN10Json, newN10ValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN10Smf", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN10Smf", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN10Smf", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN10Smf", newN10ValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== IPResource ==========
|
||||||
|
ipResource := IPResource{
|
||||||
|
Id: fmt.Sprintf("%s-%s-IPResource", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-IPResource",
|
||||||
|
InterfaceType: "{Mgt,N4,N7,N10,N11}",
|
||||||
|
LocIpV4AddrList: fmt.Sprintf("{%s,%s,%s,%s,%s}", ne.Ip, ne.Ip, ne.Ip, ne.Ip, ne.Ip),
|
||||||
|
LocIpV6AddrList: "{Default,Default,Default,Default,Default}",
|
||||||
|
}
|
||||||
|
ipJSON, err := json.Marshal(ipResource)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal IPResource for SMF ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastIpJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "IPResource", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastIpJson).Error
|
||||||
|
newIpValueJson := string(ipJSON)
|
||||||
|
if err != nil || lastIpJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastIpJson, newIpValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("SMF NBI CM synchronization completed")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -1,276 +0,0 @@
|
|||||||
package syncNbiNRM
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"be.ems/lib/dborm"
|
|
||||||
"be.ems/lib/log"
|
|
||||||
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/amf"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SyncAmfNbiCM 从ne_info获取AMF网元并同步数据到nbi_cm表
|
|
||||||
func (s *BarProcessor) SyncAmfNbiCM() error {
|
|
||||||
log.Info("Starting AMF NBI CM synchronization")
|
|
||||||
|
|
||||||
// 从ne_info表获取AMF类型的网元
|
|
||||||
var amfNEs []common.NeInfo
|
|
||||||
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "AMF").
|
|
||||||
Find(&amfNEs).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query AMF network elements: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Infof("Found %d AMF network elements", len(amfNEs))
|
|
||||||
|
|
||||||
// 当前时间戳
|
|
||||||
now := time.Now()
|
|
||||||
timestamp := now.Unix()
|
|
||||||
|
|
||||||
// 遍历每个AMF网元,生成对应的NBI CM记录
|
|
||||||
for _, ne := range amfNEs {
|
|
||||||
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
|
||||||
|
|
||||||
var version string = "-"
|
|
||||||
err := dborm.DefaultDB().Table("ne_version").
|
|
||||||
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("version", &version).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成ManagedElement记录
|
|
||||||
managedElement := amf.ManagedElement{
|
|
||||||
Id: fmt.Sprintf("%s-%s-ManagedElement-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
ManagedBy: ne.Dn,
|
|
||||||
ManagementIpAddress: ne.Ip, // 可以从其他表获取IP地址
|
|
||||||
SwVersion: version, // 可以从其他表获取软件版本
|
|
||||||
PatchInfo: "-",
|
|
||||||
AdministrativeState: adminState,
|
|
||||||
OperationalState: operState,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
meJSON, err := json.Marshal(managedElement)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal ManagedElement for ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成唯一ID
|
|
||||||
// meID := fmt.Sprintf("nbi-cm-%s-me-%d", ne.NeID, timestamp)
|
|
||||||
|
|
||||||
// 插入ManagedElement记录
|
|
||||||
nbiCM := common.NbiCm{
|
|
||||||
// Id: meID,
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "ManagedElement",
|
|
||||||
ValueJson: string(meJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert ManagedElement record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var capability int
|
|
||||||
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("capability", &capability).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
|
||||||
capability = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成AmfFunction记录
|
|
||||||
amfFunction := amf.AmfFunction{
|
|
||||||
Id: fmt.Sprintf("%s-%s-AmfFunction-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-AmfFunction",
|
|
||||||
AdministrativeState: adminState,
|
|
||||||
OperationalState: operState,
|
|
||||||
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
|
||||||
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
|
||||||
SbiServiceList: "Namf_Communication,Namf_EventExposure,Namf_MT,Namf_Location",
|
|
||||||
AmfGuamiList: "[{\"mcc\":\"460\",\"mnc\":\"000\",\"amfId\":\"" + ne.NeId + "\"}]",
|
|
||||||
SnssaiList: "[{\"sst\":1,\"sd\":\"000001\"}]",
|
|
||||||
MaxUser: capability,
|
|
||||||
RelativeCapacity: 30,
|
|
||||||
MaxGnbNum: 100,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
amfJSON, err := json.Marshal(amfFunction)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal AmfFunction for ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入AmfFunction记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
// Id: amfID,
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "AmfFunction",
|
|
||||||
ValueJson: string(amfJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert AmfFunction record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 在 AmfFunction 记录创建完成后添加以下代码
|
|
||||||
|
|
||||||
// 创建 EpRpDynN8Amf 记录
|
|
||||||
epRpDynN8Amf := amf.EpRpDynN8Amf{
|
|
||||||
Id: fmt.Sprintf("%s-%s-EpRpDynN8Amf-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-EpRpDynN8Amf",
|
|
||||||
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
|
||||||
FarIpSubnetworkList: "[\"10.10.0.0/16\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
n8JSON, err := json.Marshal(epRpDynN8Amf)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal EpRpDynN8Amf for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入EpRpDynN8Amf记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "EpRpDynN8Amf",
|
|
||||||
ValueJson: string(n8JSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert EpRpDynN8Amf record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 EpRpDynN11Amf 记录
|
|
||||||
epRpDynN11Amf := amf.EpRpDynN11Amf{
|
|
||||||
Id: fmt.Sprintf("%s-%s-EpRpDynN11Amf-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-EpRpDynN11Amf",
|
|
||||||
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
|
||||||
FarIpSubnetworkList: "[\"10.11.0.0/16\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
n11JSON, err := json.Marshal(epRpDynN11Amf)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal EpRpDynN11Amf for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入EpRpDynN11Amf记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "EpRpDynN11Amf",
|
|
||||||
ValueJson: string(n11JSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert EpRpDynN11Amf record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 EpRpDynN12Amf 记录
|
|
||||||
epRpDynN12Amf := amf.EpRpDynN12Amf{
|
|
||||||
Id: fmt.Sprintf("%s-%s-EpRpDynN12Amf-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-EpRpDynN12Amf",
|
|
||||||
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
|
||||||
FarIpSubnetworkList: "[\"10.12.0.0/16\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
n12JSON, err := json.Marshal(epRpDynN12Amf)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal EpRpDynN12Amf for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入EpRpDynN12Amf记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "EpRpDynN12Amf",
|
|
||||||
ValueJson: string(n12JSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert EpRpDynN12Amf record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 IPResource 记录
|
|
||||||
ipResource := amf.IPResource{
|
|
||||||
Id: fmt.Sprintf("%s-%s-IPResource-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-IPResource",
|
|
||||||
InterfaceType: "{Mgt,N8,N11,N12}",
|
|
||||||
LocIpV4AddrList: fmt.Sprintf("{%s,Default,Default,Default}", ne.Ip),
|
|
||||||
LocIpV6AddrList: "{Default,Default,Default,Default}",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
ipJSON, err := json.Marshal(ipResource)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal IPResource for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入IPResource记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "IPResource",
|
|
||||||
ValueJson: string(ipJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert IPResource record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("AMF NBI CM synchronization completed")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -2,6 +2,11 @@ package syncNbiNRM
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"be.ems/lib/log"
|
"be.ems/lib/log"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/amf"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/pcf"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/smf"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/udm"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/upf"
|
||||||
)
|
)
|
||||||
|
|
||||||
var NewProcessor = &BarProcessor{
|
var NewProcessor = &BarProcessor{
|
||||||
@@ -34,27 +39,27 @@ func (s *BarProcessor) Execute(data any) (any, error) {
|
|||||||
// sysJob := options.SysJob
|
// sysJob := options.SysJob
|
||||||
// var params BarParams
|
// var params BarParams
|
||||||
|
|
||||||
err := s.SyncAmfNbiCM()
|
err := amf.SyncNbiCM()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("SyncAmfNbiCM error: %v", err)
|
log.Errorf("SyncAmfNbiCM error: %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = s.SyncPcfNbiCM()
|
err = pcf.SyncNbiCM()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("SyncPcfNbiCM error: %v", err)
|
log.Errorf("SyncPcfNbiCM error: %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = s.SyncUdmNbiCM()
|
err = udm.SyncNbiCM()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("SyncUdmNbiCM error: %v", err)
|
log.Errorf("SyncUdmNbiCM error: %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = s.SyncSmfNbiCM()
|
err = smf.SyncNbiCM()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("SyncSmfNbiCM error: %v", err)
|
log.Errorf("SyncSmfNbiCM error: %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
err = s.SyncUpfNbiCM()
|
err = upf.SyncNbiCM()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("SyncUpfNbiCM error: %v", err)
|
log.Errorf("SyncUpfNbiCM error: %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -1,200 +0,0 @@
|
|||||||
package syncNbiNRM
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"be.ems/lib/dborm"
|
|
||||||
"be.ems/lib/log"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/pcf"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SyncPcfNbiCM 从ne_info获取PCF网元并同步数据到nbi_cm表
|
|
||||||
func (s *BarProcessor) SyncPcfNbiCM() error {
|
|
||||||
log.Info("Starting PCF NBI CM synchronization")
|
|
||||||
|
|
||||||
// 从ne_info表获取PCF类型的网元
|
|
||||||
var pcfNEs []common.NeInfo
|
|
||||||
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "PCF").
|
|
||||||
Find(&pcfNEs).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query PCF network elements: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Infof("Found %d PCF network elements", len(pcfNEs))
|
|
||||||
|
|
||||||
// 当前时间戳
|
|
||||||
now := time.Now()
|
|
||||||
timestamp := now.Unix()
|
|
||||||
|
|
||||||
// 遍历每个PCF网元,生成对应的NBI CM记录
|
|
||||||
for _, ne := range pcfNEs {
|
|
||||||
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
|
||||||
|
|
||||||
var version string = "-"
|
|
||||||
err := dborm.DefaultDB().Table("ne_version").
|
|
||||||
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("version", &version).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成ManagedElement记录
|
|
||||||
managedElement := pcf.ManagedElement{
|
|
||||||
Id: fmt.Sprintf("%s-%s-ManagedElement-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
ManagedBy: ne.Dn,
|
|
||||||
ManagementIpAddress: ne.Ip,
|
|
||||||
SwVersion: version,
|
|
||||||
PatchInfo: "-",
|
|
||||||
AdministrativeState: adminState,
|
|
||||||
OperationalState: operState,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
meJSON, err := json.Marshal(managedElement)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal ManagedElement for PCF ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入ManagedElement记录
|
|
||||||
nbiCM := common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "ManagedElement",
|
|
||||||
ValueJson: string(meJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert PCF ManagedElement record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成PcfFunction记录
|
|
||||||
pcfFunction := pcf.PcfFunction{
|
|
||||||
Id: fmt.Sprintf("%s-%s-PcfFunction-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-PcfFunction",
|
|
||||||
AdministrativeState: adminState,
|
|
||||||
OperationalState: operState,
|
|
||||||
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
|
||||||
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
|
||||||
SbiServiceList: "Npcf_AMPolicyControl,Npcf_PolicyAuthorization,Npcf_SMPolicyControl,Npcf_BDTPolicyControl",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
pcfJSON, err := json.Marshal(pcfFunction)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal PcfFunction for ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入PcfFunction记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "PcfFunction",
|
|
||||||
ValueJson: string(pcfJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert PcfFunction record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var capability int
|
|
||||||
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("capability", &capability).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
|
||||||
capability = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成UdrFunction记录
|
|
||||||
udrFunction := pcf.UdrFunction{
|
|
||||||
Id: fmt.Sprintf("%s-%s-UdrFunction-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-UdrFunction",
|
|
||||||
AdministrativeState: adminState,
|
|
||||||
OperationalState: operState,
|
|
||||||
MaxSubNbr: capability,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
udrJSON, err := json.Marshal(udrFunction)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal UdrFunction for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入UdrFunction记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "UdrFunction",
|
|
||||||
ValueJson: string(udrJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert UdrFunction record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 IPResource 记录
|
|
||||||
ipResource := pcf.IPResource{
|
|
||||||
Id: fmt.Sprintf("%s-%s-IPResource-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-IPResource",
|
|
||||||
InterfaceType: "{Mgt,N5,N7,N15}",
|
|
||||||
LocIpV4AddrList: fmt.Sprintf("{%s,Default,Default,Default}", ne.Ip),
|
|
||||||
LocIpV6AddrList: "{Default,Default,Default,Default}",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
ipJSON, err := json.Marshal(ipResource)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal IPResource for PCF ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入IPResource记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "IPResource",
|
|
||||||
ValueJson: string(ipJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert PCF IPResource record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("PCF NBI CM synchronization completed")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -1,267 +0,0 @@
|
|||||||
package syncNbiNRM
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"be.ems/lib/dborm"
|
|
||||||
"be.ems/lib/log"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/smf"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SyncSmfNbiCM 从ne_info获取SMF网元并同步数据到nbi_cm表
|
|
||||||
func (s *BarProcessor) SyncSmfNbiCM() error {
|
|
||||||
log.Info("Starting SMF NBI CM synchronization")
|
|
||||||
|
|
||||||
// 从ne_info表获取SMF类型的网元
|
|
||||||
var smfNEs []common.NeInfo
|
|
||||||
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "SMF").
|
|
||||||
Find(&smfNEs).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query SMF network elements: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Infof("Found %d SMF network elements", len(smfNEs))
|
|
||||||
|
|
||||||
// 当前时间戳
|
|
||||||
now := time.Now()
|
|
||||||
timestamp := now.Unix()
|
|
||||||
|
|
||||||
// 遍历每个SMF网元,生成对应的NBI CM记录
|
|
||||||
for _, ne := range smfNEs {
|
|
||||||
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
|
||||||
|
|
||||||
var version string = "-"
|
|
||||||
err := dborm.DefaultDB().Table("ne_version").
|
|
||||||
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("version", &version).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成ManagedElement记录
|
|
||||||
managedElement := smf.ManagedElement{
|
|
||||||
Id: fmt.Sprintf("%s-%s-ManagedElement-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
ManagedBy: ne.Dn,
|
|
||||||
ManagementIpAddress: ne.Ip,
|
|
||||||
SwVersion: version,
|
|
||||||
PatchInfo: "-",
|
|
||||||
AdministrativeState: string(adminState),
|
|
||||||
OperationalState: string(operState),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
meJSON, err := json.Marshal(managedElement)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal ManagedElement for SMF ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入ManagedElement记录
|
|
||||||
nbiCM := common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "ManagedElement",
|
|
||||||
ValueJson: string(meJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert SMF ManagedElement record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var capability int
|
|
||||||
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("capability", &capability).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
|
||||||
capability = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成SmfFunction记录
|
|
||||||
smfFunction := smf.SmfFunction{
|
|
||||||
Id: fmt.Sprintf("%s-%s-SmfFunction-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-SmfFunction",
|
|
||||||
AdministrativeState: string(adminState),
|
|
||||||
OperationalState: string(operState),
|
|
||||||
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
|
||||||
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
|
||||||
SbiServiceList: "Nsmf_PDUSession,Nsmf_EventExposure",
|
|
||||||
MaxPduSessions: capability,
|
|
||||||
MaxQfi: 64,
|
|
||||||
UpfList: "[\"UPF-001\",\"UPF-2\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
smfJSON, err := json.Marshal(smfFunction)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal SmfFunction for ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入SmfFunction记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "SmfFunction",
|
|
||||||
ValueJson: string(smfJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert SmfFunction record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 AddrPool 记录
|
|
||||||
addrPool := smf.AddrPool{
|
|
||||||
Id: fmt.Sprintf("%s-%s-AddrPool-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-AddrPool",
|
|
||||||
AddrType: "UE",
|
|
||||||
IpVersion: "IPv4",
|
|
||||||
AddrSegList: "[\"10.60.0.0/16\",\"10.61.0.0/16\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
addrPoolJSON, err := json.Marshal(addrPool)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal AddrPool for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入AddrPool记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "AddrPool",
|
|
||||||
ValueJson: string(addrPoolJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert AddrPool record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 EpRpDynN7Smf 记录
|
|
||||||
epRpDynN7Smf := smf.EpRpDynN7Smf{
|
|
||||||
Id: fmt.Sprintf("%s-%s-EpRpDynN7Smf-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-N7",
|
|
||||||
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
|
||||||
FarIpSubnetworkList: "[\"10.17.0.0/16\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
n7JSON, err := json.Marshal(epRpDynN7Smf)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal EpRpDynN7Smf for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入EpRpDynN7Smf记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "EpRpDynN7Smf",
|
|
||||||
ValueJson: string(n7JSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert EpRpDynN7Smf record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 EpRpDynN10Smf 记录
|
|
||||||
epRpDynN10Smf := smf.EpRpDynN10Smf{
|
|
||||||
Id: fmt.Sprintf("%s-%s-EpRpDynN10Smf-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-N10",
|
|
||||||
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
|
||||||
FarIpSubnetworkList: "[\"10.20.0.0/16\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
n10JSON, err := json.Marshal(epRpDynN10Smf)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal EpRpDynN10Smf for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入EpRpDynN10Smf记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "EpRpDynN10Smf",
|
|
||||||
ValueJson: string(n10JSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert EpRpDynN10Smf record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 IPResource 记录
|
|
||||||
ipResource := smf.IPResource{
|
|
||||||
Id: fmt.Sprintf("%s-%s-IPResource-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-IPResource",
|
|
||||||
InterfaceType: "{Mgt,N4,N7,N10,N11}",
|
|
||||||
LocIpV4AddrList: fmt.Sprintf("{%s,%s,%s,%s,%s}", ne.Ip, ne.Ip, ne.Ip, ne.Ip, ne.Ip),
|
|
||||||
LocIpV6AddrList: "{Default,Default,Default,Default,Default}",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
ipJSON, err := json.Marshal(ipResource)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal IPResource for SMF ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入IPResource记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "IPResource",
|
|
||||||
ValueJson: string(ipJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert SMF IPResource record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("SMF NBI CM synchronization completed")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -1,239 +0,0 @@
|
|||||||
package syncNbiNRM
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"be.ems/lib/dborm"
|
|
||||||
"be.ems/lib/log"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/udm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SyncUdmNbiCM 从ne_info获取UDM网元并同步数据到nbi_cm表
|
|
||||||
func (s *BarProcessor) SyncUdmNbiCM() error {
|
|
||||||
log.Info("Starting UDM NBI CM synchronization")
|
|
||||||
|
|
||||||
// 从ne_info表获取UDM类型的网元
|
|
||||||
var udmNEs []common.NeInfo
|
|
||||||
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "UDM").
|
|
||||||
Find(&udmNEs).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query UDM network elements: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Infof("Found %d UDM network elements", len(udmNEs))
|
|
||||||
|
|
||||||
// 当前时间戳
|
|
||||||
now := time.Now()
|
|
||||||
timestamp := now.Unix()
|
|
||||||
|
|
||||||
// 遍历每个UDM网元,生成对应的NBI CM记录
|
|
||||||
for _, ne := range udmNEs {
|
|
||||||
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
|
||||||
|
|
||||||
var version string = "-"
|
|
||||||
err := dborm.DefaultDB().Table("ne_version").
|
|
||||||
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("version", &version).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成ManagedElement记录
|
|
||||||
managedElement := udm.ManagedElement{
|
|
||||||
Id: fmt.Sprintf("%s-%s-ManagedElement-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
ManagedBy: ne.Dn,
|
|
||||||
ManagementIpAddress: ne.Ip,
|
|
||||||
SwVersion: version,
|
|
||||||
PatchInfo: "-",
|
|
||||||
AdministrativeState: string(adminState),
|
|
||||||
OperationalState: string(operState),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
meJSON, err := json.Marshal(managedElement)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal ManagedElement for UDM ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入ManagedElement记录
|
|
||||||
nbiCM := common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "ManagedElement",
|
|
||||||
ValueJson: string(meJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert UDM ManagedElement record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成UdmFunction记录
|
|
||||||
udmFunction := udm.UdmFunction{
|
|
||||||
Id: fmt.Sprintf("%s-%s-UdmFunction-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-UdmFunction",
|
|
||||||
AdministrativeState: string(adminState),
|
|
||||||
OperationalState: string(operState),
|
|
||||||
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
|
||||||
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", ne.NeType, ne.NeId),
|
|
||||||
SbiServiceList: "Nudm_UEAuthentication,Nudm_SubscriberDataManagement,Nudm_UEContextManagement",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
udmJSON, err := json.Marshal(udmFunction)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal UdmFunction for ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入UdmFunction记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "UdmFunction",
|
|
||||||
ValueJson: string(udmJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert UdmFunction record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var capability int
|
|
||||||
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("capability", &capability).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
|
||||||
capability = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成UdrFunction记录
|
|
||||||
udrFunction := udm.UdrFunction{
|
|
||||||
Id: fmt.Sprintf("%s-%s-UdrFunction-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-UdrFunction",
|
|
||||||
AdministrativeState: string(adminState),
|
|
||||||
OperationalState: string(operState),
|
|
||||||
VnfInstanceId: "vnf-UDR-" + ne.NeId,
|
|
||||||
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
|
||||||
SbiServiceList: "Nudr_DataRepository",
|
|
||||||
MaxNumSupi: capability,
|
|
||||||
MaxNumMsisdn: capability,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
udrJSON, err := json.Marshal(udrFunction)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal UdrFunction for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入UdrFunction记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "UdrFunction",
|
|
||||||
ValueJson: string(udrJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert UdrFunction record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成AusfFunction记录
|
|
||||||
ausfFunction := udm.AusfFunction{
|
|
||||||
Id: fmt.Sprintf("%s-%s-AusfFunction-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-AusfFunction",
|
|
||||||
AdministrativeState: string(adminState),
|
|
||||||
OperationalState: string(operState),
|
|
||||||
VnfInstanceId: "vnf-AUSF-" + ne.NeId,
|
|
||||||
Fqdn: fmt.Sprintf("ausf%s.mnc000.mcc460.3gppnetwork.org", ne.NeId),
|
|
||||||
SbiServiceList: "Nausf_UEAuthentication,Nausf_SoRProtection",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
ausfJSON, err := json.Marshal(ausfFunction)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal AusfFunction for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入AusfFunction记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "AusfFunction",
|
|
||||||
ValueJson: string(ausfJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert AusfFunction record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 IPResource 记录
|
|
||||||
ipResource := udm.IPResource{
|
|
||||||
Id: fmt.Sprintf("%s-%s-IPResource-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-IPResource",
|
|
||||||
InterfaceType: "{Mgt,N8,N10,N12,N21}",
|
|
||||||
LocIpV4AddrList: fmt.Sprintf("{%s,%s,%s,%s,%s}", ne.Ip, ne.Ip, ne.Ip, ne.Ip, ne.Ip),
|
|
||||||
LocIpV6AddrList: "{Default,Default,Default,Default,Default}",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
ipJSON, err := json.Marshal(ipResource)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal IPResource for UDM ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
// 插入IPResource记录
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "IPResource",
|
|
||||||
ValueJson: string(ipJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert UDM IPResource record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("UDM NBI CM synchronization completed")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -1,410 +0,0 @@
|
|||||||
package syncNbiNRM
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"be.ems/lib/dborm"
|
|
||||||
"be.ems/lib/log"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
|
||||||
"be.ems/src/modules/crontask/processor/syncNbiNRM/upf"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SyncUpfNbiCM 从ne_info获取UPF网元并同步数据到nbi_cm表
|
|
||||||
func (s *BarProcessor) SyncUpfNbiCM() error {
|
|
||||||
log.Info("Starting UPF NBI CM synchronization")
|
|
||||||
|
|
||||||
// 从ne_info表获取UPF类型的网元
|
|
||||||
var upfNEs []common.NeInfo
|
|
||||||
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "UPF").
|
|
||||||
Find(&upfNEs).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query UPF network elements: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Infof("Found %d UPF network elements", len(upfNEs))
|
|
||||||
|
|
||||||
// 当前时间戳
|
|
||||||
now := time.Now()
|
|
||||||
timestamp := now.Unix()
|
|
||||||
|
|
||||||
// 遍历每个UPF网元,生成对应的NBI CM记录
|
|
||||||
for _, ne := range upfNEs {
|
|
||||||
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
|
||||||
|
|
||||||
var version string = "-"
|
|
||||||
err := dborm.DefaultDB().Table("ne_version").
|
|
||||||
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("version", &version).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 为每个网元生成ManagedElement记录
|
|
||||||
managedElement := upf.ManagedElement{
|
|
||||||
Id: fmt.Sprintf("%s-%s-ManagedElement-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
ManagedBy: ne.Dn,
|
|
||||||
ManagementIpAddress: ne.Ip,
|
|
||||||
SwVersion: version,
|
|
||||||
PatchInfo: "-",
|
|
||||||
AdministrativeState: string(adminState),
|
|
||||||
OperationalState: string(operState),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
meJSON, err := json.Marshal(managedElement)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal ManagedElement for UPF ne_id %s: %v", ne.NeId, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入ManagedElement记录
|
|
||||||
nbiCM := common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "ManagedElement",
|
|
||||||
ValueJson: string(meJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
// 插入到数据库
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert UPF ManagedElement record: %v", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成 InventoryUnitRack 记录
|
|
||||||
inventoryUnitRack := upf.InventoryUnitRack{
|
|
||||||
Id: fmt.Sprintf("%s-%s-InventoryUnitRack-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-InventoryUnitRack",
|
|
||||||
VendorUnitFamilyType: "5G-UPF",
|
|
||||||
VendorUnitTypeNumber: "UPF-" + ne.NeId,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
SerialNumber: "SN-UPF-" + ne.NeId,
|
|
||||||
VersionNumber: "1.0.0",
|
|
||||||
DateOfManufacture: "2023-01-01",
|
|
||||||
DateOfLastService: now.Format("2006-01-02"),
|
|
||||||
ManufacturerData: "{}",
|
|
||||||
RackPosition: "1",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
rackJSON, err := json.Marshal(inventoryUnitRack)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal InventoryUnitRack for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "InventoryUnitRack",
|
|
||||||
ValueJson: string(rackJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert InventoryUnitRack record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成 InventoryUnitShelf 记录
|
|
||||||
inventoryUnitShelf := upf.InventoryUnitShelf{
|
|
||||||
Id: fmt.Sprintf("%s-%s-InventoryUnitShelf-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-InventoryUnitShelf",
|
|
||||||
VendorUnitFamilyType: "5G-UPF-SHELF",
|
|
||||||
VendorUnitTypeNumber: "UPF-SHELF-" + ne.NeId,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
SerialNumber: "SN-UPF-SHELF-" + ne.NeId,
|
|
||||||
VersionNumber: "1.0.0",
|
|
||||||
DateOfManufacture: "2023-01-01",
|
|
||||||
DateOfLastService: now.Format("2006-01-02"),
|
|
||||||
ManufacturerData: "{}",
|
|
||||||
ShelfPosition: "1",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
shelfJSON, err := json.Marshal(inventoryUnitShelf)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal InventoryUnitShelf for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "InventoryUnitShelf",
|
|
||||||
ValueJson: string(shelfJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert InventoryUnitShelf record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成 InventoryUnitPack 记录
|
|
||||||
inventoryUnitPack := upf.InventoryUnitPack{
|
|
||||||
Id: fmt.Sprintf("%s-%s-InventoryUnitPack-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-InventoryUnitPack",
|
|
||||||
VendorUnitFamilyType: "5G-UPF-PACK",
|
|
||||||
VendorUnitTypeNumber: "UPF-PACK-" + ne.NeId,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
SerialNumber: "SN-UPF-PACK-" + ne.NeId,
|
|
||||||
VersionNumber: "1.0.0",
|
|
||||||
DateOfManufacture: "2023-01-01",
|
|
||||||
DateOfLastService: now.Format("2006-01-02"),
|
|
||||||
ManufacturerData: "{}",
|
|
||||||
SlotsOccupied: "1,2",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
packJSON, err := json.Marshal(inventoryUnitPack)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal InventoryUnitPack for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "InventoryUnitPack",
|
|
||||||
ValueJson: string(packJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert InventoryUnitPack record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成 InventoryUnitHost 记录
|
|
||||||
inventoryUnitHost := upf.InventoryUnitHost{
|
|
||||||
Id: fmt.Sprintf("%s-%s-InventoryUnitHost-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-InventoryUnitHost",
|
|
||||||
VendorUnitFamilyType: "5G-UPF-HOST",
|
|
||||||
VendorUnitTypeNumber: "UPF-HOST-" + ne.NeId,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
SerialNumber: "SN-UPF-HOST-" + ne.NeId,
|
|
||||||
VersionNumber: "1.0.0",
|
|
||||||
DateOfManufacture: "2023-01-01",
|
|
||||||
DateOfLastService: now.Format("2006-01-02"),
|
|
||||||
ManufacturerData: "{}",
|
|
||||||
HostPosition: "1",
|
|
||||||
NumberOfCpu: "16",
|
|
||||||
MemSize: "64GB",
|
|
||||||
HardDiskSize: "1TB",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
hostJSON, err := json.Marshal(inventoryUnitHost)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal InventoryUnitHost for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "InventoryUnitHost",
|
|
||||||
ValueJson: string(hostJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert InventoryUnitHost record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成 InventoryUnitAccessory 记录
|
|
||||||
inventoryUnitAccessory := upf.InventoryUnitAccessory{
|
|
||||||
Id: fmt.Sprintf("%s-%s-InventoryUnitAccessory-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-InventoryUnitAccessory",
|
|
||||||
VendorUnitFamilyType: "5G-UPF-ACC",
|
|
||||||
VendorUnitTypeNumber: "UPF-ACC-" + ne.NeId,
|
|
||||||
VendorName: ne.VendorName,
|
|
||||||
SerialNumber: "SN-UPF-ACC-" + ne.NeId,
|
|
||||||
VersionNumber: "1.0.0",
|
|
||||||
DateOfManufacture: "2023-01-01",
|
|
||||||
DateOfLastService: now.Format("2006-01-02"),
|
|
||||||
ManufacturerData: "{}",
|
|
||||||
AccessoryPosition: "1",
|
|
||||||
AccessoryType: "FAN",
|
|
||||||
AddtionalInformation: "Cooling system",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
accJSON, err := json.Marshal(inventoryUnitAccessory)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal InventoryUnitAccessory for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "InventoryUnitAccessory",
|
|
||||||
ValueJson: string(accJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert InventoryUnitAccessory record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var capability int
|
|
||||||
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
|
||||||
Pluck("capability", &capability).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
|
||||||
capability = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成 UpfFunction 记录
|
|
||||||
upfFunction := upf.UpfFunction{
|
|
||||||
Id: fmt.Sprintf("%s-%s-UpfFunction-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-UpfFunction",
|
|
||||||
AdministrativeState: string(adminState),
|
|
||||||
OperationalState: string(operState),
|
|
||||||
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
|
||||||
MaxQosFlows: fmt.Sprintf("%d", capability),
|
|
||||||
MaxThroughput: "10Gbps",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
upfJSON, err := json.Marshal(upfFunction)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal UpfFunction for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "UpfFunction",
|
|
||||||
ValueJson: string(upfJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert UpfFunction record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 EpRpDynN3Upf 记录
|
|
||||||
epRpDynN3Upf := upf.EpRpDynN3Upf{
|
|
||||||
Id: fmt.Sprintf("%s-%s-EpRpDynN3Upf-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-EpRpDynN3Upf",
|
|
||||||
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
|
||||||
FarIpSubnetworkList: "[\"10.13.0.0/16\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
n3JSON, err := json.Marshal(epRpDynN3Upf)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal EpRpDynN3Upf for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "EpRpDynN3Upf",
|
|
||||||
ValueJson: string(n3JSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert EpRpDynN3Upf record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 EpRpDynN9Upf 记录
|
|
||||||
epRpDynN9Upf := upf.EpRpDynN9Upf{
|
|
||||||
Id: fmt.Sprintf("%s-%s-EpRpDynN9Upf-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-EpRpDynN9Upf",
|
|
||||||
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
|
||||||
FarIpSubnetworkList: "[\"10.19.0.0/16\"]",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
n9JSON, err := json.Marshal(epRpDynN9Upf)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal EpRpDynN9Upf for ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "EpRpDynN9Upf",
|
|
||||||
ValueJson: string(n9JSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert EpRpDynN9Upf record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建 IPResource 记录
|
|
||||||
ipResource := upf.IPResource{
|
|
||||||
Id: fmt.Sprintf("%s-%s-IPResource-%d", ne.NeType, ne.NeId, timestamp), // 生成唯一ID
|
|
||||||
UserLabel: ne.NeName + "-IPResource",
|
|
||||||
InterfaceType: "{Mgt,N3,N4,N9}",
|
|
||||||
LocIpV4AddrList: fmt.Sprintf("{%s,%s,%s,%s}", ne.Ip, ne.Ip, ne.Ip, ne.Ip),
|
|
||||||
LocIpV6AddrList: "{Default,Default,Default,Default}",
|
|
||||||
}
|
|
||||||
|
|
||||||
// 序列化为JSON
|
|
||||||
ipJSON, err := json.Marshal(ipResource)
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to marshal IPResource for UPF ne_id %s: %v", ne.NeId, err)
|
|
||||||
} else {
|
|
||||||
nbiCM = common.NbiCm{
|
|
||||||
NeType: ne.NeType,
|
|
||||||
NeId: ne.NeId,
|
|
||||||
CmVersion: common.CmVersion,
|
|
||||||
RmUid: ne.RmUid,
|
|
||||||
EventType: common.EventTypeInt("ObjectCreationEvent"),
|
|
||||||
ObjectType: "IPResource",
|
|
||||||
ValueJson: string(ipJSON),
|
|
||||||
Timestamp: now.Format("2006-01-02 15:04:05"),
|
|
||||||
}
|
|
||||||
|
|
||||||
err = dborm.DefaultDB().Table("nbi_cm").Create(&nbiCM).Error
|
|
||||||
if err != nil {
|
|
||||||
log.Errorf("Failed to insert UPF IPResource record: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("UPF NBI CM synchronization completed")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
@@ -1,47 +1,49 @@
|
|||||||
package udm
|
package udm
|
||||||
|
|
||||||
|
import "be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
||||||
|
|
||||||
type ManagedElement struct {
|
type ManagedElement struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
VendorName string `json:"vendorName"`
|
VendorName string `json:"vendorName"`
|
||||||
ManagedBy string `json:"managedBy"`
|
ManagedBy string `json:"managedBy"`
|
||||||
ManagementIpAddress string `json:"managementIpAddress"`
|
ManagementIpAddress string `json:"managementIpAddress"`
|
||||||
SwVersion string `json:"swVersion"`
|
SwVersion string `json:"swVersion"`
|
||||||
PatchInfo string `json:"patchInfo"`
|
PatchInfo string `json:"patchInfo"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type UdmFunction struct {
|
type UdmFunction struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
VnfInstanceId string `json:"vnfInstanceId"`
|
VnfInstanceId string `json:"vnfInstanceId"`
|
||||||
Fqdn string `json:"fqdn"`
|
Fqdn string `json:"fqdn"`
|
||||||
SbiServiceList string `json:"sbiServiceList"`
|
SbiServiceList string `json:"sbiServiceList"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type UdrFunction struct {
|
type UdrFunction struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
VnfInstanceId string `json:"vnfInstanceId"`
|
VnfInstanceId string `json:"vnfInstanceId"`
|
||||||
Fqdn string `json:"fqdn"`
|
Fqdn string `json:"fqdn"`
|
||||||
SbiServiceList string `json:"sbiServiceList"`
|
SbiServiceList string `json:"sbiServiceList"`
|
||||||
MaxNumSupi int `json:"maxNumSupi"`
|
MaxNumSupi int `json:"maxNumSupi"`
|
||||||
MaxNumMsisdn int `json:"maxNumMsisdn"`
|
MaxNumMsisdn int `json:"maxNumMsisdn"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AusfFunction struct {
|
type AusfFunction struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
VnfInstanceId string `json:"vnfInstanceId"`
|
VnfInstanceId string `json:"vnfInstanceId"`
|
||||||
Fqdn string `json:"fqdn"`
|
Fqdn string `json:"fqdn"`
|
||||||
SbiServiceList string `json:"sbiServiceList"`
|
SbiServiceList string `json:"sbiServiceList"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type IPResource struct {
|
type IPResource struct {
|
||||||
|
|||||||
284
src/modules/crontask/processor/syncNbiNRM/udm/sync.go
Normal file
284
src/modules/crontask/processor/syncNbiNRM/udm/sync.go
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
package udm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"be.ems/features/nbi/redisqueue"
|
||||||
|
"be.ems/lib/dborm"
|
||||||
|
"be.ems/lib/log"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SyncUdmNbiCM 从ne_info获取UDM网元并同步数据到nbi_cm表
|
||||||
|
func SyncNbiCM() error {
|
||||||
|
log.Info("Starting UDM NBI CM synchronization")
|
||||||
|
|
||||||
|
// 从ne_info表获取UDM类型的网元
|
||||||
|
var udmNEs []common.NeInfo
|
||||||
|
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "UDM").
|
||||||
|
Find(&udmNEs).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query UDM network elements: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("Found %d UDM network elements", len(udmNEs))
|
||||||
|
|
||||||
|
for _, ne := range udmNEs {
|
||||||
|
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
||||||
|
|
||||||
|
var version string = "-"
|
||||||
|
err := dborm.DefaultDB().Table("ne_version").
|
||||||
|
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("version", &version).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== ManagedElement ==========
|
||||||
|
managedElement := ManagedElement{
|
||||||
|
Id: fmt.Sprintf("%s-%s-ManagedElement", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
ManagedBy: ne.Dn,
|
||||||
|
ManagementIpAddress: ne.Ip,
|
||||||
|
SwVersion: version,
|
||||||
|
PatchInfo: "-",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
}
|
||||||
|
meJSON, err := json.Marshal(managedElement)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal ManagedElement for UDM ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "ManagedElement", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastJson).Error
|
||||||
|
newValueJson := string(meJSON)
|
||||||
|
if err != nil || lastJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastJson, newValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== UdmFunction ==========
|
||||||
|
udmFunction := UdmFunction{
|
||||||
|
Id: fmt.Sprintf("%s-%s-UdmFunction", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-UdmFunction",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
||||||
|
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
||||||
|
SbiServiceList: "Nudm_UEAuthentication,Nudm_SubscriberDataManagement,Nudm_UEContextManagement",
|
||||||
|
}
|
||||||
|
udmJSON, err := json.Marshal(udmFunction)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal UdmFunction for ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastUdmJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "UdmFunction", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastUdmJson).Error
|
||||||
|
newUdmValueJson := string(udmJSON)
|
||||||
|
if err != nil || lastUdmJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "UdmFunction", newUdmValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdmFunction", newUdmValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastUdmJson, newUdmValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdmFunction", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdmFunction", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdmFunction", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "UdmFunction", newUdmValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== UdrFunction ==========
|
||||||
|
var capability int
|
||||||
|
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("capability", &capability).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
||||||
|
capability = 0
|
||||||
|
}
|
||||||
|
udrFunction := UdrFunction{
|
||||||
|
Id: fmt.Sprintf("%s-%s-UdrFunction", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-UdrFunction",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
VnfInstanceId: "vnf-UDR-" + ne.NeId,
|
||||||
|
Fqdn: fmt.Sprintf("%s%s.mnc000.mcc460.3gppnetwork.org", strings.ToLower(ne.NeType), ne.NeId),
|
||||||
|
SbiServiceList: "Nudr_DataRepository",
|
||||||
|
MaxNumSupi: capability,
|
||||||
|
MaxNumMsisdn: capability,
|
||||||
|
}
|
||||||
|
udrJSON, err := json.Marshal(udrFunction)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal UdrFunction for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastUdrJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "UdrFunction", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastUdrJson).Error
|
||||||
|
newUdrValueJson := string(udrJSON)
|
||||||
|
if err != nil || lastUdrJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "UdrFunction", newUdrValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdrFunction", newUdrValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastUdrJson, newUdrValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdrFunction", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdrFunction", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UdrFunction", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "UdrFunction", newUdrValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== AusfFunction ==========
|
||||||
|
ausfFunction := AusfFunction{
|
||||||
|
Id: fmt.Sprintf("%s-%s-AusfFunction", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-AusfFunction",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
VnfInstanceId: "vnf-AUSF-" + ne.NeId,
|
||||||
|
Fqdn: fmt.Sprintf("ausf%s.mnc000.mcc460.3gppnetwork.org", ne.NeId),
|
||||||
|
SbiServiceList: "Nausf_UEAuthentication,Nausf_SoRProtection",
|
||||||
|
}
|
||||||
|
ausfJSON, err := json.Marshal(ausfFunction)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal AusfFunction for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastAusfJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "AusfFunction", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastAusfJson).Error
|
||||||
|
newAusfValueJson := string(ausfJSON)
|
||||||
|
if err != nil || lastAusfJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "AusfFunction", newAusfValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AusfFunction", newAusfValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastAusfJson, newAusfValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AusfFunction", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AusfFunction", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "AusfFunction", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "AusfFunction", newAusfValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== IPResource ==========
|
||||||
|
ipResource := IPResource{
|
||||||
|
Id: fmt.Sprintf("%s-%s-IPResource", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-IPResource",
|
||||||
|
InterfaceType: "{Mgt,N8,N10,N12,N21}",
|
||||||
|
LocIpV4AddrList: fmt.Sprintf("{%s,%s,%s,%s,%s}", ne.Ip, ne.Ip, ne.Ip, ne.Ip, ne.Ip),
|
||||||
|
LocIpV6AddrList: "{Default,Default,Default,Default,Default}",
|
||||||
|
}
|
||||||
|
ipJSON, err := json.Marshal(ipResource)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal IPResource for UDM ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastIpJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "IPResource", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastIpJson).Error
|
||||||
|
newIpValueJson := string(ipJSON)
|
||||||
|
if err != nil || lastIpJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastIpJson, newIpValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("UDM NBI CM synchronization completed")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -1,15 +1,17 @@
|
|||||||
package upf
|
package upf
|
||||||
|
|
||||||
|
import "be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
||||||
|
|
||||||
type ManagedElement struct {
|
type ManagedElement struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
VendorName string `json:"vendorName"`
|
VendorName string `json:"vendorName"`
|
||||||
ManagedBy string `json:"managedBy"`
|
ManagedBy string `json:"managedBy"`
|
||||||
ManagementIpAddress string `json:"managementIpAddress"`
|
ManagementIpAddress string `json:"managementIpAddress"`
|
||||||
SwVersion string `json:"swVersion"`
|
SwVersion string `json:"swVersion"`
|
||||||
PatchInfo string `json:"patchInfo"`
|
PatchInfo string `json:"patchInfo"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type InventoryUnitRack struct {
|
type InventoryUnitRack struct {
|
||||||
@@ -88,13 +90,13 @@ type InventoryUnitAccessory struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type UpfFunction struct {
|
type UpfFunction struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
VnfInstanceId string `json:"vnfInstanceId"`
|
VnfInstanceId string `json:"vnfInstanceId"`
|
||||||
MaxQosFlows string `json:"maxQosFlows"`
|
MaxQosFlows string `json:"maxQosFlows"`
|
||||||
MaxThroughput string `json:"maxThroughput"`
|
MaxThroughput string `json:"maxThroughput"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type EpRpDynN9Upf struct {
|
type EpRpDynN9Upf struct {
|
||||||
@@ -121,30 +123,30 @@ type AmfFunction struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SmfFunction struct {
|
type SmfFunction struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
VnfInstanceId string `json:"vnfInstanceId"`
|
VnfInstanceId string `json:"vnfInstanceId"`
|
||||||
Fqdn string `json:"fqdn"`
|
Fqdn string `json:"fqdn"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type UdrFunction struct {
|
type UdrFunction struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
VnfInstanceId string `json:"vnfInstanceId"`
|
VnfInstanceId string `json:"vnfInstanceId"`
|
||||||
Fqdn string `json:"fqdn"`
|
Fqdn string `json:"fqdn"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AusfFunction struct {
|
type AusfFunction struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
UserLabel string `json:"userLabel"`
|
UserLabel string `json:"userLabel"`
|
||||||
AdministrativeState string `json:"administrativeState"`
|
AdministrativeState common.AdministrativeState `json:"administrativeState"`
|
||||||
OperationalState string `json:"operationalState"`
|
OperationalState common.OperationalState `json:"operationalState"`
|
||||||
VnfInstanceId string `json:"vnfInstanceId"`
|
VnfInstanceId string `json:"vnfInstanceId"`
|
||||||
Fqdn string `json:"fqdn"`
|
Fqdn string `json:"fqdn"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type IPResource struct {
|
type IPResource struct {
|
||||||
|
|||||||
534
src/modules/crontask/processor/syncNbiNRM/upf/sync.go
Normal file
534
src/modules/crontask/processor/syncNbiNRM/upf/sync.go
Normal file
@@ -0,0 +1,534 @@
|
|||||||
|
package upf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"be.ems/features/nbi/redisqueue"
|
||||||
|
"be.ems/lib/dborm"
|
||||||
|
"be.ems/lib/log"
|
||||||
|
"be.ems/src/modules/crontask/processor/syncNbiNRM/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SyncUpfNbiCM 从ne_info获取UPF网元并同步数据到nbi_cm表
|
||||||
|
func SyncNbiCM() error {
|
||||||
|
log.Info("Starting UPF NBI CM synchronization")
|
||||||
|
|
||||||
|
// 从ne_info表获取UPF类型的网元
|
||||||
|
var upfNEs []common.NeInfo
|
||||||
|
err := dborm.DefaultDB().Table("ne_info").Where("ne_type = ?", "UPF").
|
||||||
|
Find(&upfNEs).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query UPF network elements: %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("Found %d UPF network elements", len(upfNEs))
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
|
for _, ne := range upfNEs {
|
||||||
|
adminState, operState := common.ParseStateFromStatus(ne.Status)
|
||||||
|
|
||||||
|
var version string = "-"
|
||||||
|
err := dborm.DefaultDB().Table("ne_version").
|
||||||
|
Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("version", &version).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query %s version: %v", ne.NeName, err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== ManagedElement ==========
|
||||||
|
managedElement := ManagedElement{
|
||||||
|
Id: fmt.Sprintf("%s-%s-ManagedElement", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
ManagedBy: ne.Dn,
|
||||||
|
ManagementIpAddress: ne.Ip,
|
||||||
|
SwVersion: version,
|
||||||
|
PatchInfo: "-",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
}
|
||||||
|
meJSON, err := json.Marshal(managedElement)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal ManagedElement for UPF ne_id %s: %v", ne.NeId, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var lastJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "ManagedElement", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastJson).Error
|
||||||
|
newValueJson := string(meJSON)
|
||||||
|
if err != nil || lastJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastJson, newValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "ManagedElement", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "ManagedElement", newValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== InventoryUnitRack ==========
|
||||||
|
inventoryUnitRack := InventoryUnitRack{
|
||||||
|
Id: fmt.Sprintf("%s-%s-InventoryUnitRack", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-InventoryUnitRack",
|
||||||
|
VendorUnitFamilyType: "5G-UPF",
|
||||||
|
VendorUnitTypeNumber: "UPF-" + ne.NeId,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
SerialNumber: "SN-UPF-" + ne.NeId,
|
||||||
|
VersionNumber: "1.0.0",
|
||||||
|
DateOfManufacture: "2023-01-01",
|
||||||
|
DateOfLastService: now.Format("2006-01-02"),
|
||||||
|
ManufacturerData: "{}",
|
||||||
|
RackPosition: "1",
|
||||||
|
}
|
||||||
|
rackJSON, err := json.Marshal(inventoryUnitRack)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal InventoryUnitRack for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastRackJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "InventoryUnitRack", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastRackJson).Error
|
||||||
|
newRackValueJson := string(rackJSON)
|
||||||
|
if err != nil || lastRackJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitRack", newRackValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitRack", newRackValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastRackJson, newRackValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitRack", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitRack", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitRack", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitRack", newRackValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== InventoryUnitShelf ==========
|
||||||
|
inventoryUnitShelf := InventoryUnitShelf{
|
||||||
|
Id: fmt.Sprintf("%s-%s-InventoryUnitShelf", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-InventoryUnitShelf",
|
||||||
|
VendorUnitFamilyType: "5G-UPF-SHELF",
|
||||||
|
VendorUnitTypeNumber: "UPF-SHELF-" + ne.NeId,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
SerialNumber: "SN-UPF-SHELF-" + ne.NeId,
|
||||||
|
VersionNumber: "1.0.0",
|
||||||
|
DateOfManufacture: "2023-01-01",
|
||||||
|
DateOfLastService: now.Format("2006-01-02"),
|
||||||
|
ManufacturerData: "{}",
|
||||||
|
ShelfPosition: "1",
|
||||||
|
}
|
||||||
|
shelfJSON, err := json.Marshal(inventoryUnitShelf)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal InventoryUnitShelf for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastShelfJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "InventoryUnitShelf", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastShelfJson).Error
|
||||||
|
newShelfValueJson := string(shelfJSON)
|
||||||
|
if err != nil || lastShelfJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitShelf", newShelfValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitShelf", newShelfValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastShelfJson, newShelfValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitShelf", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitShelf", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitShelf", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitShelf", newShelfValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== InventoryUnitPack ==========
|
||||||
|
inventoryUnitPack := InventoryUnitPack{
|
||||||
|
Id: fmt.Sprintf("%s-%s-InventoryUnitPack", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-InventoryUnitPack",
|
||||||
|
VendorUnitFamilyType: "5G-UPF-PACK",
|
||||||
|
VendorUnitTypeNumber: "UPF-PACK-" + ne.NeId,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
SerialNumber: "SN-UPF-PACK-" + ne.NeId,
|
||||||
|
VersionNumber: "1.0.0",
|
||||||
|
DateOfManufacture: "2023-01-01",
|
||||||
|
DateOfLastService: now.Format("2006-01-02"),
|
||||||
|
ManufacturerData: "{}",
|
||||||
|
SlotsOccupied: "1,2",
|
||||||
|
}
|
||||||
|
packJSON, err := json.Marshal(inventoryUnitPack)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal InventoryUnitPack for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastPackJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "InventoryUnitPack", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastPackJson).Error
|
||||||
|
newPackValueJson := string(packJSON)
|
||||||
|
if err != nil || lastPackJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitPack", newPackValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitPack", newPackValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastPackJson, newPackValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitPack", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitPack", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitPack", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitPack", newPackValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== InventoryUnitHost ==========
|
||||||
|
inventoryUnitHost := InventoryUnitHost{
|
||||||
|
Id: fmt.Sprintf("%s-%s-InventoryUnitHost", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-InventoryUnitHost",
|
||||||
|
VendorUnitFamilyType: "5G-UPF-HOST",
|
||||||
|
VendorUnitTypeNumber: "UPF-HOST-" + ne.NeId,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
SerialNumber: "SN-UPF-HOST-" + ne.NeId,
|
||||||
|
VersionNumber: "1.0.0",
|
||||||
|
DateOfManufacture: "2023-01-01",
|
||||||
|
DateOfLastService: now.Format("2006-01-02"),
|
||||||
|
ManufacturerData: "{}",
|
||||||
|
HostPosition: "1",
|
||||||
|
NumberOfCpu: "16",
|
||||||
|
MemSize: "64GB",
|
||||||
|
HardDiskSize: "1TB",
|
||||||
|
}
|
||||||
|
hostJSON, err := json.Marshal(inventoryUnitHost)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal InventoryUnitHost for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastHostJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "InventoryUnitHost", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastHostJson).Error
|
||||||
|
newHostValueJson := string(hostJSON)
|
||||||
|
if err != nil || lastHostJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitHost", newHostValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitHost", newHostValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastHostJson, newHostValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitHost", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitHost", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitHost", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitHost", newHostValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== InventoryUnitAccessory ==========
|
||||||
|
inventoryUnitAccessory := InventoryUnitAccessory{
|
||||||
|
Id: fmt.Sprintf("%s-%s-InventoryUnitAccessory", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-InventoryUnitAccessory",
|
||||||
|
VendorUnitFamilyType: "5G-UPF-ACC",
|
||||||
|
VendorUnitTypeNumber: "UPF-ACC-" + ne.NeId,
|
||||||
|
VendorName: ne.VendorName,
|
||||||
|
SerialNumber: "SN-UPF-ACC-" + ne.NeId,
|
||||||
|
VersionNumber: "1.0.0",
|
||||||
|
DateOfManufacture: "2023-01-01",
|
||||||
|
DateOfLastService: now.Format("2006-01-02"),
|
||||||
|
ManufacturerData: "{}",
|
||||||
|
AccessoryPosition: "1",
|
||||||
|
AccessoryType: "FAN",
|
||||||
|
AddtionalInformation: "Cooling system",
|
||||||
|
}
|
||||||
|
accJSON, err := json.Marshal(inventoryUnitAccessory)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal InventoryUnitAccessory for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastAccJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "InventoryUnitAccessory", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastAccJson).Error
|
||||||
|
newAccValueJson := string(accJSON)
|
||||||
|
if err != nil || lastAccJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitAccessory", newAccValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitAccessory", newAccValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastAccJson, newAccValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitAccessory", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitAccessory", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "InventoryUnitAccessory", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "InventoryUnitAccessory", newAccValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var capability int
|
||||||
|
err = dborm.DefaultDB().Table("ne_license").Where("ne_type = ? and ne_id = ?", ne.NeType, ne.NeId).
|
||||||
|
Pluck("capability", &capability).Error
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to query capability for ne_id %s: %v", ne.NeId, err)
|
||||||
|
capability = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== UpfFunction ==========
|
||||||
|
upfFunction := UpfFunction{
|
||||||
|
Id: fmt.Sprintf("%s-%s-UpfFunction", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-UpfFunction",
|
||||||
|
AdministrativeState: adminState,
|
||||||
|
OperationalState: operState,
|
||||||
|
VnfInstanceId: "vnf-" + ne.NeType + "-" + ne.NeId,
|
||||||
|
MaxQosFlows: fmt.Sprintf("%d", capability),
|
||||||
|
MaxThroughput: "10Gbps",
|
||||||
|
}
|
||||||
|
upfJSON, err := json.Marshal(upfFunction)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal UpfFunction for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastUpfJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "UpfFunction", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastUpfJson).Error
|
||||||
|
newUpfValueJson := string(upfJSON)
|
||||||
|
if err != nil || lastUpfJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "UpfFunction", newUpfValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UpfFunction", newUpfValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastUpfJson, newUpfValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UpfFunction", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UpfFunction", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "UpfFunction", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "UpfFunction", newUpfValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== EpRpDynN3Upf ==========
|
||||||
|
epRpDynN3Upf := EpRpDynN3Upf{
|
||||||
|
Id: fmt.Sprintf("%s-%s-EpRpDynN3Upf", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-EpRpDynN3Upf",
|
||||||
|
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
||||||
|
FarIpSubnetworkList: "[\"10.13.0.0/16\"]",
|
||||||
|
}
|
||||||
|
n3JSON, err := json.Marshal(epRpDynN3Upf)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal EpRpDynN3Upf for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastN3Json string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "EpRpDynN3Upf", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastN3Json).Error
|
||||||
|
newN3ValueJson := string(n3JSON)
|
||||||
|
if err != nil || lastN3Json == "" {
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN3Upf", newN3ValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN3Upf", newN3ValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastN3Json, newN3ValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN3Upf", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN3Upf", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN3Upf", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN3Upf", newN3ValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== EpRpDynN9Upf ==========
|
||||||
|
epRpDynN9Upf := EpRpDynN9Upf{
|
||||||
|
Id: fmt.Sprintf("%s-%s-EpRpDynN9Upf", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-EpRpDynN9Upf",
|
||||||
|
LocIpAddrList: "[\"" + ne.Ip + "\"]",
|
||||||
|
FarIpSubnetworkList: "[\"10.19.0.0/16\"]",
|
||||||
|
}
|
||||||
|
n9JSON, err := json.Marshal(epRpDynN9Upf)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal EpRpDynN9Upf for ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastN9Json string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "EpRpDynN9Upf", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastN9Json).Error
|
||||||
|
newN9ValueJson := string(n9JSON)
|
||||||
|
if err != nil || lastN9Json == "" {
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN9Upf", newN9ValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN9Upf", newN9ValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastN9Json, newN9ValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN9Upf", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN9Upf", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "EpRpDynN9Upf", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "EpRpDynN9Upf", newN9ValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== IPResource ==========
|
||||||
|
ipResource := IPResource{
|
||||||
|
Id: fmt.Sprintf("%s-%s-IPResource", ne.NeType, ne.NeId),
|
||||||
|
UserLabel: ne.NeName + "-IPResource",
|
||||||
|
InterfaceType: "{Mgt,N3,N4,N9}",
|
||||||
|
LocIpV4AddrList: fmt.Sprintf("{%s,%s,%s,%s}", ne.Ip, ne.Ip, ne.Ip, ne.Ip),
|
||||||
|
LocIpV6AddrList: "{Default,Default,Default,Default}",
|
||||||
|
}
|
||||||
|
ipJSON, err := json.Marshal(ipResource)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Failed to marshal IPResource for UPF ne_id %s: %v", ne.NeId, err)
|
||||||
|
} else {
|
||||||
|
var lastIpJson string
|
||||||
|
err = dborm.DefaultDB().Table("nbi_cm").
|
||||||
|
Where("ne_type = ? AND ne_id = ? AND object_type = ? AND event_type = ?", ne.NeType, ne.NeId, "IPResource", common.ObjectOriginalEvent).
|
||||||
|
Order("timestamp ASC").Pluck("value_json", &lastIpJson).Error
|
||||||
|
newIpValueJson := string(ipJSON)
|
||||||
|
if err != nil || lastIpJson == "" {
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectCreationEvent)
|
||||||
|
redisqueue.AddNbiCMQueue([]string{strconv.Itoa(nbiCm.Id)})
|
||||||
|
} else {
|
||||||
|
var ids []string
|
||||||
|
added, modified, deleted, _ := common.CompareJSON(lastIpJson, newIpValueJson)
|
||||||
|
if len(added) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(added), common.ObjectCreationEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(modified) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(modified), common.ObjectAttributeValueChangeEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
if len(deleted) > 0 {
|
||||||
|
nbiCm := common.InsertNbiCm(ne, "IPResource", common.ToJson(deleted), common.ObjectDeletionEvent)
|
||||||
|
ids = append(ids, strconv.Itoa(nbiCm.Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
redisqueue.AddNbiCMQueue(ids)
|
||||||
|
common.InsertNbiCm(ne, "IPResource", newIpValueJson, common.ObjectOriginalEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("UPF NBI CM synchronization completed")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
101
tools/compare/cmpjson.go
Normal file
101
tools/compare/cmpjson.go
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CompareJSON 比较两个 JSON,返回新增、修改和删除的内容
|
||||||
|
func CompareJSON(json1, json2 string) (map[string]interface{}, map[string]interface{}, map[string]interface{}, error) {
|
||||||
|
var map1, map2 map[string]interface{}
|
||||||
|
|
||||||
|
// 解析 JSON
|
||||||
|
if err := json.Unmarshal([]byte(json1), &map1); err != nil {
|
||||||
|
return nil, nil, nil, fmt.Errorf("failed to parse json1: %v", err)
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal([]byte(json2), &map2); err != nil {
|
||||||
|
return nil, nil, nil, fmt.Errorf("failed to parse json2: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 存储新增、修改和删除的内容
|
||||||
|
added := make(map[string]interface{})
|
||||||
|
modified := make(map[string]interface{})
|
||||||
|
deleted := make(map[string]interface{})
|
||||||
|
|
||||||
|
// 递归比较
|
||||||
|
compareMaps(map1, map2, added, modified, deleted, "")
|
||||||
|
|
||||||
|
return added, modified, deleted, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// compareMaps 递归比较两个 map
|
||||||
|
func compareMaps(map1, map2, added, modified, deleted map[string]interface{}, prefix string) {
|
||||||
|
// 遍历 map1,检查删除或修改
|
||||||
|
for key, val1 := range map1 {
|
||||||
|
fullKey := key
|
||||||
|
if prefix != "" {
|
||||||
|
fullKey = prefix + "." + key
|
||||||
|
}
|
||||||
|
|
||||||
|
val2, exists := map2[key]
|
||||||
|
if !exists {
|
||||||
|
// 如果 key 不存在于 map2,记录为删除
|
||||||
|
deleted[fullKey] = val1
|
||||||
|
} else if !reflect.DeepEqual(val1, val2) {
|
||||||
|
// 如果 key 存在但值不同,记录为修改
|
||||||
|
if reflect.TypeOf(val1) == reflect.TypeOf(val2) && reflect.TypeOf(val1).Kind() == reflect.Map {
|
||||||
|
// 如果值是嵌套对象,递归比较
|
||||||
|
compareMaps(val1.(map[string]interface{}), val2.(map[string]interface{}), added, modified, deleted, fullKey)
|
||||||
|
} else {
|
||||||
|
modified[fullKey] = map[string]interface{}{
|
||||||
|
"old": val1,
|
||||||
|
"new": val2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 遍历 map2,检查新增
|
||||||
|
for key, val2 := range map2 {
|
||||||
|
fullKey := key
|
||||||
|
if prefix != "" {
|
||||||
|
fullKey = prefix + "." + key
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, exists := map1[key]; !exists {
|
||||||
|
// 如果 key 不存在于 map1,记录为新增
|
||||||
|
added[fullKey] = val2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
json1 := `{
|
||||||
|
"name": "example",
|
||||||
|
"age": 25,
|
||||||
|
"address": {
|
||||||
|
"city": "New York",
|
||||||
|
"zip": "10001"
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
json2 := `{
|
||||||
|
"name": "example",
|
||||||
|
"age": 26,
|
||||||
|
"address": {
|
||||||
|
"city": "Los Angeles"
|
||||||
|
},
|
||||||
|
"phone": "123-456-7890"
|
||||||
|
}`
|
||||||
|
|
||||||
|
added, modified, deleted, err := CompareJSON(json1, json2)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Added: %v\n", added)
|
||||||
|
fmt.Printf("Modified: %v\n", modified)
|
||||||
|
fmt.Printf("Deleted: %v\n", deleted)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user