From 01975afe9c95f7b725f59cbdce172bb46324247f Mon Sep 17 00:00:00 2001 From: simon Date: Fri, 23 May 2025 18:24:18 +0800 Subject: [PATCH] feat: nbi --- .gitignore | 1 + database/install/alarm_relation.sql | 82 ++- database/upgrade/upg_alarm_relation.sql | 20 + features/fm/alarm.go | 19 + features/fm/relation.go | 78 +++ features/nbi/redisqueue/queue.go | 103 ++++ features/pm/performance.go | 7 + go.mod | 1 + go.sum | 1 + lib/config/alarm_relation_rules.go | 31 + lib/config/config.go | 11 +- restagent/etc/alarm_relation_rules.yaml | 10 + restagent/etc/restconf.yaml | 19 +- restagent/restagent.go | 4 + .../crontask/processor/syncNbiNRM/amf/sync.go | 326 +++++++++++ .../processor/syncNbiNRM/common/common.go | 5 + .../processor/syncNbiNRM/common/compare.go | 95 ++++ .../crontask/processor/syncNbiNRM/pcf/sync.go | 234 ++++++++ .../processor/syncNbiNRM/smf/schema.go | 44 +- .../crontask/processor/syncNbiNRM/smf/sync.go | 323 +++++++++++ .../crontask/processor/syncNbiNRM/syncAmf.go | 276 --------- .../processor/syncNbiNRM/syncNbiNRM.go | 15 +- .../crontask/processor/syncNbiNRM/syncPcf.go | 200 ------- .../crontask/processor/syncNbiNRM/syncSmf.go | 267 --------- .../crontask/processor/syncNbiNRM/syncUdm.go | 239 -------- .../crontask/processor/syncNbiNRM/syncUpf.go | 410 -------------- .../processor/syncNbiNRM/udm/schema.go | 66 +-- .../crontask/processor/syncNbiNRM/udm/sync.go | 284 ++++++++++ .../processor/syncNbiNRM/upf/schema.go | 70 +-- .../crontask/processor/syncNbiNRM/upf/sync.go | 534 ++++++++++++++++++ tools/compare/cmpjson.go | 101 ++++ 31 files changed, 2338 insertions(+), 1538 deletions(-) create mode 100644 database/upgrade/upg_alarm_relation.sql create mode 100644 features/fm/relation.go create mode 100644 features/nbi/redisqueue/queue.go create mode 100644 lib/config/alarm_relation_rules.go create mode 100644 restagent/etc/alarm_relation_rules.yaml create mode 100644 src/modules/crontask/processor/syncNbiNRM/amf/sync.go create mode 100644 src/modules/crontask/processor/syncNbiNRM/common/compare.go create mode 100644 src/modules/crontask/processor/syncNbiNRM/pcf/sync.go create mode 100644 src/modules/crontask/processor/syncNbiNRM/smf/sync.go delete mode 100644 src/modules/crontask/processor/syncNbiNRM/syncAmf.go delete mode 100644 src/modules/crontask/processor/syncNbiNRM/syncPcf.go delete mode 100644 src/modules/crontask/processor/syncNbiNRM/syncSmf.go delete mode 100644 src/modules/crontask/processor/syncNbiNRM/syncUdm.go delete mode 100644 src/modules/crontask/processor/syncNbiNRM/syncUpf.go create mode 100644 src/modules/crontask/processor/syncNbiNRM/udm/sync.go create mode 100644 src/modules/crontask/processor/syncNbiNRM/upf/sync.go create mode 100644 tools/compare/cmpjson.go diff --git a/.gitignore b/.gitignore index cb617397..00c37d3c 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,4 @@ vendor *.bak *.bak* *.exe +__debug_bin* diff --git a/database/install/alarm_relation.sql b/database/install/alarm_relation.sql index 59045f2e..be215c48 100644 --- a/database/install/alarm_relation.sql +++ b/database/install/alarm_relation.sql @@ -1,48 +1,34 @@ --- MariaDB dump 10.19 Distrib 10.6.16-MariaDB, for debian-linux-gnu (x86_64) --- --- Host: 192.168.2.219 Database: omc_db --- ------------------------------------------------------ --- Server version 10.3.38-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `alarm_relation` --- - -DROP TABLE IF EXISTS `alarm_relation`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `alarm_relation` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `created_at` datetime(3) DEFAULT NULL, - `updated_at` datetime(3) DEFAULT NULL, - `deleted_at` datetime(3) DEFAULT NULL, - `root_alarm_id` varchar(64) DEFAULT NULL, - `alarm_id` varchar(64) DEFAULT NULL, - `relation_type` varchar(64) DEFAULT NULL, - `add_info` varchar(64) DEFAULT NULL, - PRIMARY KEY (`id`) USING BTREE, - 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 +/* + Navicat Premium Data Transfer + + Source Server : root@192.168.2.165 + Source Server Type : MariaDB + Source Server Version : 100335 (10.3.35-MariaDB) + Source Host : 192.168.2.165:33066 + Source Schema : omc_db + + Target Server Type : MariaDB + Target Server Version : 100335 (10.3.35-MariaDB) + File Encoding : 65001 + + Date: 16/05/2025 10:48:43 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for alarm_relation +-- ---------------------------- +DROP TABLE IF EXISTS `alarm_relation`; +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; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/database/upgrade/upg_alarm_relation.sql b/database/upgrade/upg_alarm_relation.sql new file mode 100644 index 00000000..1057b65f --- /dev/null +++ b/database/upgrade/upg_alarm_relation.sql @@ -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; \ No newline at end of file diff --git a/features/fm/alarm.go b/features/fm/alarm.go index 7883ee1d..e1f2ce28 100644 --- a/features/fm/alarm.go +++ b/features/fm/alarm.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "be.ems/features/nbi/redisqueue" "be.ems/lib/config" "be.ems/lib/dborm" "be.ems/lib/global" @@ -476,6 +477,24 @@ func PostAlarmFromNF(w http.ResponseWriter, r *http.Request) { 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) diff --git a/features/fm/relation.go b/features/fm/relation.go new file mode 100644 index 00000000..9f6f86a4 --- /dev/null +++ b/features/fm/relation.go @@ -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 +} diff --git a/features/nbi/redisqueue/queue.go b/features/nbi/redisqueue/queue.go new file mode 100644 index 00000000..7351b234 --- /dev/null +++ b/features/nbi/redisqueue/queue.go @@ -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) + } +} diff --git a/features/pm/performance.go b/features/pm/performance.go index b4d2992c..ba8fc87f 100644 --- a/features/pm/performance.go +++ b/features/pm/performance.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "be.ems/features/nbi/redisqueue" "be.ems/features/pm/kpi_c_report" "be.ems/features/pm/kpi_c_title" "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) } diff --git a/go.mod b/go.mod index b3873542..8eeae21e 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,7 @@ require ( golang.org/x/term v0.28.0 golang.org/x/text v0.21.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df + gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/mysql v1.5.7 gorm.io/gorm v1.25.11 diff --git a/go.sum b/go.sum index 59b0d79c..3371dc59 100644 --- a/go.sum +++ b/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.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.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/lib/config/alarm_relation_rules.go b/lib/config/alarm_relation_rules.go new file mode 100644 index 00000000..b1fa5b0f --- /dev/null +++ b/lib/config/alarm_relation_rules.go @@ -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) +} diff --git a/lib/config/config.go b/lib/config/config.go index 9b81433d..0670ec09 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -180,7 +180,11 @@ type AlarmConfig struct { SignName string `yaml:"signName"` TemplateCode string `yaml:"templateCode"` } `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 { @@ -271,6 +275,11 @@ func ReadConfig(configFile string) { yamlConfig = YamlConfigInfo.ConfigLines ReadOriginalConfig(configFile) + + // load alarm relation rules + if yamlConfig.Alarm.RelatedRules.Enabled { + LoadAlarmRelationRules(yamlConfig.Alarm.RelatedRules.File) + } } func ReadOriginalConfig(configFile string) { diff --git a/restagent/etc/alarm_relation_rules.yaml b/restagent/etc/alarm_relation_rules.yaml new file mode 100644 index 00000000..c8e39907 --- /dev/null +++ b/restagent/etc/alarm_relation_rules.yaml @@ -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 # 秒 \ No newline at end of file diff --git a/restagent/etc/restconf.yaml b/restagent/etc/restconf.yaml index 3e89fc21..73a70479 100644 --- a/restagent/etc/restconf.yaml +++ b/restagent/etc/restconf.yaml @@ -31,8 +31,8 @@ rest: keyFile: ./etc/certs/omc-server.key webServer: - enabled: false - rootDir: d:/omc.git/fe.ems.vue3/dist # front-end build dist directory + enabled: true + rootDir: /home/simon/omc.git/fe.ems.vue3/dist # front-end build dist directory listen: - addr: :8080 schema: http @@ -47,8 +47,8 @@ database: type: mysql user: root password: "1000omc@kp!" - host: "192.168.9.58" - port: 13306 + host: "192.168.2.165" + port: 33066 name: omc_db connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True backup: ./database @@ -58,8 +58,8 @@ redis: dataSource: # OMC system db default: - port: 16379 # Redis port - host: "192.168.9.58" # Redis host + port: 6379 # Redis port + host: "127.0.0.1" # Redis host password: "helloearth" db: 10 # Redis db_num # used to specify the default data source for multiple data resourece @@ -139,7 +139,7 @@ alarm: enable: true emailList: smtp: mail.smtp.com - port: 25 + port: 110 user: smtpext@smtp.com password: "1000smtp@omc!" tlsSkipVerify: true @@ -159,6 +159,11 @@ alarm: signName: xxx SMSC templateCode: 1000 smProxy: smsc + # alarm_relation_rules.yaml + relationRules: + enabled: true + file: ./etc/alarm_relation_rules.yaml + # User authorized information # crypt: mysql/md5/bcrypt diff --git a/restagent/restagent.go b/restagent/restagent.go index 4a3eaa63..01ca636f 100644 --- a/restagent/restagent.go +++ b/restagent/restagent.go @@ -20,6 +20,7 @@ import ( "be.ems/features/fm" "be.ems/features/lm" "be.ems/features/mml" + "be.ems/features/nbi/redisqueue" "be.ems/features/pm" featuresCfg "be.ems/lib/config" "be.ems/lib/dborm" @@ -209,6 +210,9 @@ func loadFeatures(app *gin.Engine) { mml.InitMML() + // 初始化Redis Queue连接池 + redisqueue.InitRedisQueue() + // 将 mux.Router 注册到 gin.Engine // 默认路由组 diff --git a/src/modules/crontask/processor/syncNbiNRM/amf/sync.go b/src/modules/crontask/processor/syncNbiNRM/amf/sync.go new file mode 100644 index 00000000..a9b8b40d --- /dev/null +++ b/src/modules/crontask/processor/syncNbiNRM/amf/sync.go @@ -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 +} diff --git a/src/modules/crontask/processor/syncNbiNRM/common/common.go b/src/modules/crontask/processor/syncNbiNRM/common/common.go index 9c2cf789..bb6ec710 100644 --- a/src/modules/crontask/processor/syncNbiNRM/common/common.go +++ b/src/modules/crontask/processor/syncNbiNRM/common/common.go @@ -30,6 +30,7 @@ type EventType int const ( ObjectNullEvent EventType = iota // ObjectNullEvent 空事件 + ObjectOriginalEvent // ObjectOriginalEvent 原始事件 ObjectCreationEvent // ObjectCreationEvent 创建事件 ObjectDeletionEvent // ObjectDeletionEvent 删除事件 ObjectAttributeValueChangeEvent // ObjectAttributeValueChangeEvent 修改事件 @@ -38,6 +39,8 @@ const ( func (et EventType) EventTypeEnumString() string { switch et { + case ObjectOriginalEvent: + return "ObjectOriginalEvent" case ObjectCreationEvent: return "ObjectCreationEvent" case ObjectDeletionEvent: @@ -62,6 +65,8 @@ func EventTypeInt(s string) EventType { } switch s { + case "ObjectOriginalEvent": + return ObjectOriginalEvent case "ObjectCreationEvent": return ObjectCreationEvent case "ObjectDeletionEvent": diff --git a/src/modules/crontask/processor/syncNbiNRM/common/compare.go b/src/modules/crontask/processor/syncNbiNRM/common/compare.go new file mode 100644 index 00000000..27931a05 --- /dev/null +++ b/src/modules/crontask/processor/syncNbiNRM/common/compare.go @@ -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) +} diff --git a/src/modules/crontask/processor/syncNbiNRM/pcf/sync.go b/src/modules/crontask/processor/syncNbiNRM/pcf/sync.go new file mode 100644 index 00000000..2acb968e --- /dev/null +++ b/src/modules/crontask/processor/syncNbiNRM/pcf/sync.go @@ -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 +} diff --git a/src/modules/crontask/processor/syncNbiNRM/smf/schema.go b/src/modules/crontask/processor/syncNbiNRM/smf/schema.go index 789225b1..3123939b 100644 --- a/src/modules/crontask/processor/syncNbiNRM/smf/schema.go +++ b/src/modules/crontask/processor/syncNbiNRM/smf/schema.go @@ -1,28 +1,34 @@ package smf +import "be.ems/src/modules/crontask/processor/syncNbiNRM/common" + +const ( + SMF string = "SMF" // 网元类型 +) + type ManagedElement struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - VendorName string `json:"vendorName"` - ManagedBy string `json:"managedBy"` - ManagementIpAddress string `json:"managementIpAddress"` - SwVersion string `json:"swVersion"` - PatchInfo string `json:"patchInfo"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + VendorName string `json:"vendorName"` + ManagedBy string `json:"managedBy"` + ManagementIpAddress string `json:"managementIpAddress"` + SwVersion string `json:"swVersion"` + PatchInfo string `json:"patchInfo"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` } type SmfFunction struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` - VnfInstanceId string `json:"vnfInstanceId"` - Fqdn string `json:"fqdn"` - SbiServiceList string `json:"sbiServiceList"` - MaxPduSessions int `json:"maxPduSessions"` - MaxQfi int `json:"maxQfi"` - UpfList string `json:"upfList"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` + VnfInstanceId string `json:"vnfInstanceId"` + Fqdn string `json:"fqdn"` + SbiServiceList string `json:"sbiServiceList"` + MaxPduSessions int `json:"maxPduSessions"` + MaxQfi int `json:"maxQfi"` + UpfList string `json:"upfList"` } type AddrPool struct { diff --git a/src/modules/crontask/processor/syncNbiNRM/smf/sync.go b/src/modules/crontask/processor/syncNbiNRM/smf/sync.go new file mode 100644 index 00000000..3a478492 --- /dev/null +++ b/src/modules/crontask/processor/syncNbiNRM/smf/sync.go @@ -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 +} diff --git a/src/modules/crontask/processor/syncNbiNRM/syncAmf.go b/src/modules/crontask/processor/syncNbiNRM/syncAmf.go deleted file mode 100644 index 08542457..00000000 --- a/src/modules/crontask/processor/syncNbiNRM/syncAmf.go +++ /dev/null @@ -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 -} diff --git a/src/modules/crontask/processor/syncNbiNRM/syncNbiNRM.go b/src/modules/crontask/processor/syncNbiNRM/syncNbiNRM.go index 66531d9e..6cce8641 100644 --- a/src/modules/crontask/processor/syncNbiNRM/syncNbiNRM.go +++ b/src/modules/crontask/processor/syncNbiNRM/syncNbiNRM.go @@ -2,6 +2,11 @@ package syncNbiNRM import ( "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{ @@ -34,27 +39,27 @@ func (s *BarProcessor) Execute(data any) (any, error) { // sysJob := options.SysJob // var params BarParams - err := s.SyncAmfNbiCM() + err := amf.SyncNbiCM() if err != nil { log.Errorf("SyncAmfNbiCM error: %v", err) return nil, err } - err = s.SyncPcfNbiCM() + err = pcf.SyncNbiCM() if err != nil { log.Errorf("SyncPcfNbiCM error: %v", err) return nil, err } - err = s.SyncUdmNbiCM() + err = udm.SyncNbiCM() if err != nil { log.Errorf("SyncUdmNbiCM error: %v", err) return nil, err } - err = s.SyncSmfNbiCM() + err = smf.SyncNbiCM() if err != nil { log.Errorf("SyncSmfNbiCM error: %v", err) return nil, err } - err = s.SyncUpfNbiCM() + err = upf.SyncNbiCM() if err != nil { log.Errorf("SyncUpfNbiCM error: %v", err) return nil, err diff --git a/src/modules/crontask/processor/syncNbiNRM/syncPcf.go b/src/modules/crontask/processor/syncNbiNRM/syncPcf.go deleted file mode 100644 index f2919555..00000000 --- a/src/modules/crontask/processor/syncNbiNRM/syncPcf.go +++ /dev/null @@ -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 -} diff --git a/src/modules/crontask/processor/syncNbiNRM/syncSmf.go b/src/modules/crontask/processor/syncNbiNRM/syncSmf.go deleted file mode 100644 index efea91cf..00000000 --- a/src/modules/crontask/processor/syncNbiNRM/syncSmf.go +++ /dev/null @@ -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 -} diff --git a/src/modules/crontask/processor/syncNbiNRM/syncUdm.go b/src/modules/crontask/processor/syncNbiNRM/syncUdm.go deleted file mode 100644 index fc16b714..00000000 --- a/src/modules/crontask/processor/syncNbiNRM/syncUdm.go +++ /dev/null @@ -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 -} diff --git a/src/modules/crontask/processor/syncNbiNRM/syncUpf.go b/src/modules/crontask/processor/syncNbiNRM/syncUpf.go deleted file mode 100644 index 178ddb78..00000000 --- a/src/modules/crontask/processor/syncNbiNRM/syncUpf.go +++ /dev/null @@ -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 -} diff --git a/src/modules/crontask/processor/syncNbiNRM/udm/schema.go b/src/modules/crontask/processor/syncNbiNRM/udm/schema.go index 36a71fcf..d1dee26f 100644 --- a/src/modules/crontask/processor/syncNbiNRM/udm/schema.go +++ b/src/modules/crontask/processor/syncNbiNRM/udm/schema.go @@ -1,47 +1,49 @@ package udm +import "be.ems/src/modules/crontask/processor/syncNbiNRM/common" + type ManagedElement struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - VendorName string `json:"vendorName"` - ManagedBy string `json:"managedBy"` - ManagementIpAddress string `json:"managementIpAddress"` - SwVersion string `json:"swVersion"` - PatchInfo string `json:"patchInfo"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + VendorName string `json:"vendorName"` + ManagedBy string `json:"managedBy"` + ManagementIpAddress string `json:"managementIpAddress"` + SwVersion string `json:"swVersion"` + PatchInfo string `json:"patchInfo"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` } type UdmFunction struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` - VnfInstanceId string `json:"vnfInstanceId"` - Fqdn string `json:"fqdn"` - SbiServiceList string `json:"sbiServiceList"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` + VnfInstanceId string `json:"vnfInstanceId"` + Fqdn string `json:"fqdn"` + SbiServiceList string `json:"sbiServiceList"` } type UdrFunction struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` - VnfInstanceId string `json:"vnfInstanceId"` - Fqdn string `json:"fqdn"` - SbiServiceList string `json:"sbiServiceList"` - MaxNumSupi int `json:"maxNumSupi"` - MaxNumMsisdn int `json:"maxNumMsisdn"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` + VnfInstanceId string `json:"vnfInstanceId"` + Fqdn string `json:"fqdn"` + SbiServiceList string `json:"sbiServiceList"` + MaxNumSupi int `json:"maxNumSupi"` + MaxNumMsisdn int `json:"maxNumMsisdn"` } type AusfFunction struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` - VnfInstanceId string `json:"vnfInstanceId"` - Fqdn string `json:"fqdn"` - SbiServiceList string `json:"sbiServiceList"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` + VnfInstanceId string `json:"vnfInstanceId"` + Fqdn string `json:"fqdn"` + SbiServiceList string `json:"sbiServiceList"` } type IPResource struct { diff --git a/src/modules/crontask/processor/syncNbiNRM/udm/sync.go b/src/modules/crontask/processor/syncNbiNRM/udm/sync.go new file mode 100644 index 00000000..1387b966 --- /dev/null +++ b/src/modules/crontask/processor/syncNbiNRM/udm/sync.go @@ -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 +} diff --git a/src/modules/crontask/processor/syncNbiNRM/upf/schema.go b/src/modules/crontask/processor/syncNbiNRM/upf/schema.go index 4901246a..a5d5c2f6 100644 --- a/src/modules/crontask/processor/syncNbiNRM/upf/schema.go +++ b/src/modules/crontask/processor/syncNbiNRM/upf/schema.go @@ -1,15 +1,17 @@ package upf +import "be.ems/src/modules/crontask/processor/syncNbiNRM/common" + type ManagedElement struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - VendorName string `json:"vendorName"` - ManagedBy string `json:"managedBy"` - ManagementIpAddress string `json:"managementIpAddress"` - SwVersion string `json:"swVersion"` - PatchInfo string `json:"patchInfo"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + VendorName string `json:"vendorName"` + ManagedBy string `json:"managedBy"` + ManagementIpAddress string `json:"managementIpAddress"` + SwVersion string `json:"swVersion"` + PatchInfo string `json:"patchInfo"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` } type InventoryUnitRack struct { @@ -88,13 +90,13 @@ type InventoryUnitAccessory struct { } type UpfFunction struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` - VnfInstanceId string `json:"vnfInstanceId"` - MaxQosFlows string `json:"maxQosFlows"` - MaxThroughput string `json:"maxThroughput"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` + VnfInstanceId string `json:"vnfInstanceId"` + MaxQosFlows string `json:"maxQosFlows"` + MaxThroughput string `json:"maxThroughput"` } type EpRpDynN9Upf struct { @@ -121,30 +123,30 @@ type AmfFunction struct { } type SmfFunction struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` - VnfInstanceId string `json:"vnfInstanceId"` - Fqdn string `json:"fqdn"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` + VnfInstanceId string `json:"vnfInstanceId"` + Fqdn string `json:"fqdn"` } type UdrFunction struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` - VnfInstanceId string `json:"vnfInstanceId"` - Fqdn string `json:"fqdn"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` + VnfInstanceId string `json:"vnfInstanceId"` + Fqdn string `json:"fqdn"` } type AusfFunction struct { - Id string `json:"id"` - UserLabel string `json:"userLabel"` - AdministrativeState string `json:"administrativeState"` - OperationalState string `json:"operationalState"` - VnfInstanceId string `json:"vnfInstanceId"` - Fqdn string `json:"fqdn"` + Id string `json:"id"` + UserLabel string `json:"userLabel"` + AdministrativeState common.AdministrativeState `json:"administrativeState"` + OperationalState common.OperationalState `json:"operationalState"` + VnfInstanceId string `json:"vnfInstanceId"` + Fqdn string `json:"fqdn"` } type IPResource struct { diff --git a/src/modules/crontask/processor/syncNbiNRM/upf/sync.go b/src/modules/crontask/processor/syncNbiNRM/upf/sync.go new file mode 100644 index 00000000..0cd840db --- /dev/null +++ b/src/modules/crontask/processor/syncNbiNRM/upf/sync.go @@ -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 +} diff --git a/tools/compare/cmpjson.go b/tools/compare/cmpjson.go new file mode 100644 index 00000000..3169f5bf --- /dev/null +++ b/tools/compare/cmpjson.go @@ -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) +}