Compare commits
23 Commits
9bf9ac6479
...
nbi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b5e958113 | ||
|
|
0c3a264b24 | ||
|
|
c4e620d2a7 | ||
|
|
d38cf41630 | ||
|
|
e8059871d5 | ||
|
|
a666f177cc | ||
|
|
847d9ab781 | ||
|
|
16ef83f04b | ||
|
|
e4c0806468 | ||
|
|
e5b8df0753 | ||
|
|
1386f2aa41 | ||
|
|
d0d4efed93 | ||
|
|
1cda2618f3 | ||
|
|
9046f4daa7 | ||
|
|
c3eb9874a8 | ||
|
|
22d3f6f9fa | ||
|
|
efa3b6e627 | ||
|
|
c565a3ee8f | ||
|
|
1e1b8394a5 | ||
|
|
91ac4aa3ff | ||
|
|
3451f36ece | ||
|
|
c12c9d2f31 | ||
|
|
f1685db6ed |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -27,5 +27,6 @@ release
|
||||
rpmbuild/RPMS
|
||||
rpmbuild/SOURCES
|
||||
rpmbuild/BUILD
|
||||
rpmbuild/BUILDROOT
|
||||
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ fi
|
||||
ProjectL=omc
|
||||
ProjectU=OMC
|
||||
PROJECT=${ProjectL}
|
||||
VERSION=2.2503.5
|
||||
VERSION=2.2508.2
|
||||
RelDate=`date +%Y%m%d`
|
||||
RelVer=${VERSION}-${RelDate}
|
||||
Ky10Arch=ky10.aarch64
|
||||
@@ -69,7 +69,7 @@ RpmArch=`arch`
|
||||
RpmsDir=${EmsBuildRoot}/rpmbuild/RPMS
|
||||
ReleaseDir=${EmsBuildRoot}/release
|
||||
DumpToolDir=${EmsBEDir}/tools/misc
|
||||
ProjectTag=""
|
||||
ProjectTag="nbi"
|
||||
|
||||
BuildDir=${EmsBuildRoot}/build
|
||||
CustomizedDir=${EmsBuildRoot}/customized
|
||||
@@ -159,7 +159,8 @@ case $(get_os_info) in
|
||||
;;
|
||||
openEuler)
|
||||
ptype=rpm
|
||||
RelOS=oe20
|
||||
majorVersion=${OSVersion:0:2}
|
||||
RelOS=oe${majorVersion}
|
||||
RpmPkgName=${ProjectL}-${RelVer}.${RpmArch}.${ptype}
|
||||
RpmPkgRename=${ProjectL}-r${RelVer}-${RelOS}-${RelArch}.${ptype}
|
||||
;;
|
||||
@@ -220,7 +221,11 @@ case "${pkgtype}" in
|
||||
cp -rf ${CustomizedDir}/omc.d ${RpmBuildOMCDir}/static
|
||||
cd ${RpmBuildDir}
|
||||
rpmbuild -bb -D "_topdir ${RpmBuildDir}" ${RpmBuildDir}/SPECS/omc.spec
|
||||
|
||||
|
||||
if [ ! ProjectTag = "" ]; then
|
||||
RpmPkgRename=${ProjectL}-r${RelVer}-${RelOS}-${RelArch}-${ProjectTag}.${ptype}
|
||||
fi
|
||||
|
||||
mv -f $RpmsDir/$RpmArch/$RpmPkgName ${ReleasePkgDir}/$RpmPkgRename
|
||||
cd ${ReleasePkgDir}
|
||||
rm -f omc-md5sum.txt
|
||||
@@ -107,7 +107,7 @@ makefe() {
|
||||
}
|
||||
|
||||
makebe() {
|
||||
cd ${builddir}
|
||||
cd ${builddir}/bin
|
||||
#chmod +x mkpkg.sh
|
||||
chmod +x build.sh
|
||||
./build.sh ${be_args[@]}
|
||||
@@ -1,193 +0,0 @@
|
||||
# file: log file name
|
||||
# level: /trace/debug/info/warn/error/fatal, default: debug
|
||||
# duration: rotation time with xx hours, example: 1/12/24 hours
|
||||
# count: rotation count of log, default is 30 rotation
|
||||
logger:
|
||||
file: /usr/local/omc/log/restagent.log
|
||||
level: warn
|
||||
duration: 24
|
||||
count: 90
|
||||
|
||||
# rest agent listen ipv4/v6 and port, support multiple routines
|
||||
# ip: 0.0.0.0 or ::0, support IPv4/v6
|
||||
# clientAuthType: 0:NoClientCert (default), 1:RequestClientCert, 2:RequireAnyClientCert,
|
||||
# 3:VerifyClientCertIfGiven, 4:RequireAndVerifyClientCerts
|
||||
rest:
|
||||
- ipv4: 0.0.0.0
|
||||
ipv6:
|
||||
port: 33030
|
||||
- ipv4: 0.0.0.0
|
||||
ipv6:
|
||||
port: 33443
|
||||
schema: https
|
||||
clientAuthType: 0
|
||||
caFile: /usr/local/omc/etc/certs/omc-ca.crt
|
||||
certFile: /usr/local/omc/etc/certs/omc-server.crt
|
||||
keyFile: /usr/local/omc/etc/certs/omc-server.key
|
||||
|
||||
webServer:
|
||||
enabled: true
|
||||
rootDir: /usr/local/omc/htdocs/front
|
||||
listen:
|
||||
- addr: :80
|
||||
schema: http
|
||||
- addr: :443
|
||||
schema: https
|
||||
clientAuthType: 0
|
||||
caFile: /usr/local/omc/etc/certs/omc-ca.crt
|
||||
certFile: /usr/local/omc/etc/certs/omc-server.crt
|
||||
keyFile: /usr/local/omc/etc/certs/omc-server.key
|
||||
|
||||
database:
|
||||
type: mysql
|
||||
user: root
|
||||
password: 1000omc@kp!
|
||||
host: 127.0.0.1
|
||||
port: 33066
|
||||
name: omc_db
|
||||
connParam: charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=True&interpolateParams=True
|
||||
backup: /usr/local/omc/database
|
||||
|
||||
# Redis data cache
|
||||
redis:
|
||||
dataSource:
|
||||
# OMC system db
|
||||
default:
|
||||
port: 6379 # Redis port
|
||||
host: "127.0.0.1" # Redis host
|
||||
password: "helloearth"
|
||||
db: 10 # Redis db_num
|
||||
# UDM sub/auth db
|
||||
udmuser:
|
||||
port: 6379 # Redis port
|
||||
host: "127.0.0.1"
|
||||
password: "helloearth"
|
||||
db: 0 # Redis db_num
|
||||
# used to specify the default data source for multiple data resourece
|
||||
defaultDataSourceName: "default"
|
||||
|
||||
# sleep: time delay for after write buffer (millisecond)
|
||||
# deadLine: timeout for io read and write (second)
|
||||
mml:
|
||||
sleep: 200
|
||||
deadLine: 10
|
||||
sizeRow: 600
|
||||
sizeCol: 128
|
||||
bufferSize: 65535
|
||||
mmlHome: ./mmlhome
|
||||
|
||||
# Tracking configuration
|
||||
trace:
|
||||
enabled: true
|
||||
host: "172.16.5.100" # Fill in the specific IP address
|
||||
port: 33033
|
||||
|
||||
# NE config
|
||||
ne:
|
||||
user: omcuser
|
||||
etcdir: /usr/local/etc
|
||||
bindir: /usr/local/bin
|
||||
omcdir: /usr/local/omc
|
||||
scpdir: /tmp
|
||||
licensedir: /usr/local/etc/{neType}/license
|
||||
# backup etc list of IMS, does not contain spaces
|
||||
etcListIMS: '{*.yaml,mmtel,vars.cfg}'
|
||||
etcListDefault: '{*.yaml,*.conf,*.cfg}'
|
||||
# true/false to overwrite config file when dpkg ne software
|
||||
dpkgOverwrite: false
|
||||
# dpkg timeout (second)
|
||||
dpkgTimeout: 180
|
||||
|
||||
# chk2ne: true/false, if put OmcNeConfig parameters to NE
|
||||
omc:
|
||||
uriPrefix: "/omc/rest"
|
||||
neType: OMC
|
||||
neId: 001
|
||||
rmUID: 4400HX101
|
||||
neName: OMC
|
||||
province: ""
|
||||
vendor: ""
|
||||
dn: ""
|
||||
chk2ne: false
|
||||
sn: "-"
|
||||
checksign: false
|
||||
rootDir: /usr/local/omc
|
||||
binDir: /usr/local/omc/bin
|
||||
backup: /usr/local/omc/backup
|
||||
upload: /usr/local/omc/upload
|
||||
frontUpload: /usr/local/omc/htdocs/front/upload
|
||||
frontTraceDir: /usr/local/omc/htdocs/front/trace
|
||||
software: /usr/local/omc/software
|
||||
license: /usr/local/omc/license
|
||||
gtpUri: gtp:192.168.2.119:32152
|
||||
checkContentType: false
|
||||
testMode: false
|
||||
rbacMode: true
|
||||
runDir: /usr/local/omc/run
|
||||
cmdTimeout: 120
|
||||
|
||||
# Alarm module setting
|
||||
# Forward interface:
|
||||
# TLS Skip verify: true/false
|
||||
# email/sms
|
||||
# smProxy: sms(Short Message Service)/smsc(SMS Centre)
|
||||
# dataCoding: 0:GSM7BIT, 1:ASCII, 2:BINARY8BIT1, 3:LATIN1,
|
||||
# 4:BINARY8BIT2, 6:CYRILLIC, 7:HEBREW, 8:UCS2
|
||||
alarm:
|
||||
alarmEmailForward:
|
||||
enable: true
|
||||
emailList:
|
||||
smtp: mail.smtp.com
|
||||
port: 25
|
||||
user: smtpext@smtp.com
|
||||
password: "1000smtp@omc!"
|
||||
tlsSkipVerify: true
|
||||
alarmSMSForward:
|
||||
enable: true
|
||||
mobileList:
|
||||
smscAddr: "192.168.13.114:2775"
|
||||
systemID: "omc"
|
||||
password: "omc123"
|
||||
systemType: "UTRAN"
|
||||
dataCoding: 0
|
||||
serviceNumber: "OMC"
|
||||
sms:
|
||||
apiURL: http://smsc.xxx.com/
|
||||
accessKeyID: xxxx
|
||||
accessKeySecret: xxxx
|
||||
signName: xxx SMSC
|
||||
templateCode: 1000
|
||||
smProxy: smsc
|
||||
|
||||
# User authorized information
|
||||
# crypt: mysql/md5/bcrypt
|
||||
# token: true/false to check accessToken
|
||||
# expires for session, unit: second
|
||||
# Support single/multiple session of user
|
||||
#
|
||||
auth:
|
||||
crypt: bcrypt
|
||||
token: true
|
||||
expires: 1800
|
||||
session: multiple
|
||||
publicKey: /usr/local/omc/etc/certs/omc
|
||||
privateKey: /usr/local/omc/etc/certs/omc
|
||||
|
||||
# Parameter for limit number
|
||||
# rmuid_maxnum: the max number of rmUID, default: 50
|
||||
# alarmid_maxnum: the max number of AlarmID, default: 50
|
||||
# pmid_maxnum: the max number of pmID, default: 50
|
||||
# subid_maxnum: the max number of subscription ID, default: 20
|
||||
# uri_maxlen: the max length of uri, default: 8192
|
||||
# rmuid_regexp: regexp pattern of rmUID
|
||||
params:
|
||||
rmuidmaxnum: 50
|
||||
alarmidmaxnum: 50
|
||||
pmidmaxnum: 50
|
||||
subidmaxnum: 20
|
||||
urimaxlen: 2100000
|
||||
rmuidregexp: "[0-9]{4}[A-Z]{2}[A-Z]{2}[0-9A-Z]{1}[0-9A-Z]{3}[0-9A-Z]{1,16}"
|
||||
|
||||
testConfig:
|
||||
enabled: false
|
||||
file: /usr/local/omc/etc/testconfig.yaml
|
||||
@@ -1,5 +1,5 @@
|
||||
Package: OMC
|
||||
Version: 2.2503.5-YYYYMMDD
|
||||
Version: 2.2508.2-YYYYMMDD
|
||||
Section: AGrandTech
|
||||
Prioritt: optional
|
||||
Architecture: amd64
|
||||
|
||||
@@ -10,7 +10,7 @@ UsrLocalBinDir=/usr/local/bin
|
||||
OmcDaemon=omcd
|
||||
NginxEtcDir=/etc/nginx
|
||||
NginxConfDir=${NginxEtcDir}/conf.d
|
||||
CFileList="restconf.yaml sshsvc.yaml omc.conf"
|
||||
CFileList=$(ls ${OMCEtcDir}/default)
|
||||
LogoFileList="zh_brand.png zh_icon.png en_brand.png en_icon.png"
|
||||
|
||||
echo ""
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Package: OMC
|
||||
Version: 2.2503.5-YYYYMMDD
|
||||
Version: 2.2508.2-YYYYMMDD
|
||||
Section: AGrandTech
|
||||
Prioritt: optional
|
||||
Architecture: amd64
|
||||
|
||||
@@ -10,7 +10,7 @@ UsrLocalBinDir=/usr/local/bin
|
||||
OmcDaemon=omcd
|
||||
NginxEtcDir=/etc/nginx
|
||||
NginxConfDir=${NginxEtcDir}/conf.d
|
||||
CFileList="restconf.yaml sshsvc.yaml omc.conf"
|
||||
CFileList=$(ls ${OMCEtcDir}/default)
|
||||
LogoFileList="zh_brand.png zh_icon.png en_brand.png en_icon.png"
|
||||
|
||||
echo ""
|
||||
|
||||
BIN
docs/nbi/cm/AMF-NRM(V1.1.5)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/cm/AMF-NRM(V1.1.5)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/cm/PCF-NRM(V1.1.4)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/cm/PCF-NRM(V1.1.4)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/cm/SMF-NRM(V1.2.1)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/cm/SMF-NRM(V1.2.1)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/cm/UDM-NRM(V1.2.2)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/cm/UDM-NRM(V1.2.2)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/cm/UPF-NRM(V1.2.1)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/cm/UPF-NRM(V1.2.1)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/pm/AMF-PM(V1.1.5)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/pm/AMF-PM(V1.1.5)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/pm/PCF-PM(V1.1.4)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/pm/PCF-PM(V1.1.4)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/pm/SMF-PM(V1.2.1)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/pm/SMF-PM(V1.2.1)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/pm/UDM-PM(V1.2.2)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/pm/UDM-PM(V1.2.2)-Company-Version00.xlsx
Executable file
Binary file not shown.
BIN
docs/nbi/pm/UPF-PM(V1.2.1)-Company-Version00.xlsx
Executable file
BIN
docs/nbi/pm/UPF-PM(V1.2.1)-Company-Version00.xlsx
Executable file
Binary file not shown.
175
docs/nbi/pm/generate_ne_pm.py
Normal file
175
docs/nbi/pm/generate_ne_pm.py
Normal file
@@ -0,0 +1,175 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import pandas as pd
|
||||
import json
|
||||
import random
|
||||
import os
|
||||
import glob
|
||||
|
||||
def generate_pm_json(excel_file_path, output_file_path):
|
||||
"""
|
||||
从 Excel 文件中提取英文名称和空间粒度,生成 PM JSON 文件
|
||||
"""
|
||||
try:
|
||||
# 检查文件是否存在
|
||||
if not os.path.exists(excel_file_path):
|
||||
print(f"错误:文件 {excel_file_path} 不存在")
|
||||
return False
|
||||
|
||||
print(f"正在读取 Excel 文件: {excel_file_path}")
|
||||
|
||||
# 读取 Excel 文件的所有工作表
|
||||
excel_data = pd.read_excel(excel_file_path, sheet_name=None)
|
||||
|
||||
# 使用字典按 granularity 分组
|
||||
granularity_groups = {}
|
||||
processed_sheets = 0
|
||||
|
||||
# 遍历所有工作表,查找包含"英文名称"列的表格
|
||||
for sheet_name, df in excel_data.items():
|
||||
print(f" 处理工作表: {sheet_name}")
|
||||
|
||||
# 检查是否包含"英文名称"列
|
||||
if '英文名称' in df.columns:
|
||||
processed_sheets += 1
|
||||
print(f" - 找到英文名称列,共 {len(df)} 行数据")
|
||||
|
||||
# 检查是否有空间粒度列
|
||||
granularity_col = None
|
||||
for col in df.columns:
|
||||
if '空间粒度' in str(col) or '粒度' in str(col):
|
||||
granularity_col = col
|
||||
break
|
||||
|
||||
# 用于记录当前sheet中最后一个不为空的空间粒度
|
||||
last_valid_granularity = "DefaultFunction"
|
||||
|
||||
for index, row in df.iterrows():
|
||||
english_name = row['英文名称']
|
||||
|
||||
# 跳过空值和非字符串值
|
||||
if pd.notna(english_name) and str(english_name).strip() and str(english_name) != 'nan':
|
||||
english_name = str(english_name).strip()
|
||||
|
||||
# 获取空间粒度信息
|
||||
current_granularity = None
|
||||
if granularity_col and pd.notna(row[granularity_col]):
|
||||
current_granularity = str(row[granularity_col]).strip()
|
||||
if current_granularity: # 确保不是空字符串
|
||||
last_valid_granularity = current_granularity
|
||||
|
||||
# 如果当前行的空间粒度为空,使用最后一个有效的空间粒度
|
||||
granularity = last_valid_granularity
|
||||
|
||||
# 生成随机值
|
||||
random_value = random.randint(0, 16)
|
||||
|
||||
kpi = {
|
||||
"KPIID": english_name,
|
||||
"KPIValues": [
|
||||
{
|
||||
"Name": "Total",
|
||||
"Value": random_value
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
# 按 granularity 分组
|
||||
if granularity not in granularity_groups:
|
||||
granularity_groups[granularity] = []
|
||||
|
||||
granularity_groups[granularity].append(kpi)
|
||||
|
||||
# 显示使用的粒度信息
|
||||
granularity_info = ""
|
||||
if current_granularity:
|
||||
granularity_info = f" (当前: {granularity})"
|
||||
else:
|
||||
granularity_info = f" (继承: {granularity})"
|
||||
|
||||
print(f" 添加 KPI: {english_name} = {random_value}{granularity_info}")
|
||||
else:
|
||||
print(f" - 跳过(无英文名称列)")
|
||||
|
||||
# 生成最终的 JSON 结构
|
||||
result = []
|
||||
for granularity, kpis in granularity_groups.items():
|
||||
result.append({
|
||||
"ObjectType": granularity,
|
||||
"KPIs": kpis
|
||||
})
|
||||
|
||||
# 写入文件
|
||||
with open(output_file_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(result, f, indent=4, ensure_ascii=False)
|
||||
|
||||
print(f" 成功生成文件: {output_file_path}")
|
||||
print(f" 处理了 {processed_sheets} 个工作表")
|
||||
print(f" 生成了 {len(granularity_groups)} 个对象类型")
|
||||
for granularity, kpis in granularity_groups.items():
|
||||
print(f" - {granularity}: {len(kpis)} 个 KPI")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"错误: {str(e)}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
def main():
|
||||
print("PM JSON 批量生成器")
|
||||
print("=" * 60)
|
||||
|
||||
# 定义要处理的文件列表
|
||||
pm_files = [
|
||||
"AMF-PM(V1.1.5)-Company-Version00.xlsx",
|
||||
"PCF-PM(V1.1.4)-Company-Version00.xlsx",
|
||||
"SMF-PM(V1.2.1)-Company-Version00.xlsx",
|
||||
"UDM-PM(V1.2.2)-Company-Version00.xlsx",
|
||||
"UPF-PM(V1.2.1)-Company-Version00.xlsx"
|
||||
]
|
||||
|
||||
# 也可以自动发现当前目录下的所有 PM Excel 文件
|
||||
# pm_files = glob.glob("*-PM(*)-Company-Version*.xlsx")
|
||||
|
||||
successful_files = 0
|
||||
failed_files = 0
|
||||
|
||||
for excel_file in pm_files:
|
||||
print(f"\n处理文件: {excel_file}")
|
||||
print("-" * 50)
|
||||
|
||||
# 检查文件是否存在
|
||||
if not os.path.exists(excel_file):
|
||||
print(f" 警告:文件 {excel_file} 不存在,跳过")
|
||||
failed_files += 1
|
||||
continue
|
||||
|
||||
# 生成输出文件名
|
||||
base_name = os.path.splitext(excel_file)[0]
|
||||
output_file = f"{base_name}-generated.json"
|
||||
|
||||
# 处理文件
|
||||
if generate_pm_json(excel_file, output_file):
|
||||
successful_files += 1
|
||||
else:
|
||||
failed_files += 1
|
||||
|
||||
# 汇总结果
|
||||
print("\n" + "=" * 60)
|
||||
print("批量处理完成!")
|
||||
print(f"成功处理: {successful_files} 个文件")
|
||||
print(f"失败/跳过: {failed_files} 个文件")
|
||||
print(f"总计: {successful_files + failed_files} 个文件")
|
||||
|
||||
if successful_files > 0:
|
||||
print("\n生成的文件列表:")
|
||||
for excel_file in pm_files:
|
||||
if os.path.exists(excel_file):
|
||||
base_name = os.path.splitext(excel_file)[0]
|
||||
output_file = f"{base_name}-generated.json"
|
||||
if os.path.exists(output_file):
|
||||
print(f" - {output_file}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
225
docs/nbi/pm/pm_generator.go
Normal file
225
docs/nbi/pm/pm_generator.go
Normal file
@@ -0,0 +1,225 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// KPIValue 表示单个 KPI 值
|
||||
type KPIValue struct {
|
||||
Name string `json:"Name"`
|
||||
Value int `json:"Value"`
|
||||
}
|
||||
|
||||
// KPI 表示单个 KPI 项
|
||||
type KPI struct {
|
||||
KPIID string `json:"KPIID"`
|
||||
KPIValues []KPIValue `json:"KPIValues"`
|
||||
}
|
||||
|
||||
// PMObject 表示性能管理对象
|
||||
type PMObject struct {
|
||||
ObjectType string `json:"ObjectType"`
|
||||
KPIs []KPI `json:"KPIs"`
|
||||
}
|
||||
|
||||
// PMData 表示完整的性能管理数据
|
||||
type PMData []PMObject
|
||||
|
||||
// generateRandomValue 生成 0-16 之间的随机数
|
||||
func generateRandomValue() int {
|
||||
return rand.Intn(17) // 0-16
|
||||
}
|
||||
|
||||
// generatePMDataFromSchema 从 schema 文件生成随机数据
|
||||
func generatePMDataFromSchema(schemaFile string, outputFile string) error {
|
||||
// 读取 schema 文件
|
||||
schemaData, err := os.ReadFile(schemaFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("读取 schema 文件失败: %v", err)
|
||||
}
|
||||
|
||||
// 解析 JSON
|
||||
var pmSchema PMData
|
||||
if err := json.Unmarshal(schemaData, &pmSchema); err != nil {
|
||||
return fmt.Errorf("解析 JSON 失败: %v", err)
|
||||
}
|
||||
|
||||
// 生成新的随机数据
|
||||
var newPMData PMData
|
||||
for _, pmObj := range pmSchema {
|
||||
newObj := PMObject{
|
||||
ObjectType: pmObj.ObjectType,
|
||||
KPIs: make([]KPI, len(pmObj.KPIs)),
|
||||
}
|
||||
|
||||
for i, kpi := range pmObj.KPIs {
|
||||
newKPI := KPI{
|
||||
KPIID: kpi.KPIID,
|
||||
KPIValues: make([]KPIValue, len(kpi.KPIValues)),
|
||||
}
|
||||
|
||||
for j, kpiVal := range kpi.KPIValues {
|
||||
newKPI.KPIValues[j] = KPIValue{
|
||||
Name: kpiVal.Name,
|
||||
Value: generateRandomValue(),
|
||||
}
|
||||
}
|
||||
|
||||
newObj.KPIs[i] = newKPI
|
||||
}
|
||||
|
||||
newPMData = append(newPMData, newObj)
|
||||
}
|
||||
|
||||
// 写入新文件
|
||||
outputData, err := json.MarshalIndent(newPMData, "", " ")
|
||||
if err != nil {
|
||||
return fmt.Errorf("序列化 JSON 失败: %v", err)
|
||||
}
|
||||
|
||||
if err := os.WriteFile(outputFile, outputData, 0644); err != nil {
|
||||
return fmt.Errorf("写入文件失败: %v", err)
|
||||
}
|
||||
|
||||
fmt.Printf("成功生成随机数据文件: %s\n", outputFile)
|
||||
return nil
|
||||
}
|
||||
|
||||
// generatePMDataFromMultipleSchemas 批量处理多个 schema 文件
|
||||
func generatePMDataFromMultipleSchemas(schemaDir string) error {
|
||||
// 查找所有 *-generated.json 文件
|
||||
pattern := filepath.Join(schemaDir, "*-generated.json")
|
||||
schemaFiles, err := filepath.Glob(pattern)
|
||||
if err != nil {
|
||||
return fmt.Errorf("查找 schema 文件失败: %v", err)
|
||||
}
|
||||
|
||||
if len(schemaFiles) == 0 {
|
||||
return fmt.Errorf("未找到任何 schema 文件 (pattern: %s)", pattern)
|
||||
}
|
||||
|
||||
fmt.Printf("找到 %d 个 schema 文件\n", len(schemaFiles))
|
||||
|
||||
successCount := 0
|
||||
failCount := 0
|
||||
|
||||
for _, schemaFile := range schemaFiles {
|
||||
// 生成输出文件名:将 "-generated.json" 替换为 "-random.json"
|
||||
outputFile := strings.Replace(schemaFile, "-generated.json", "-random.json", 1)
|
||||
|
||||
fmt.Printf("\n处理文件: %s\n", filepath.Base(schemaFile))
|
||||
fmt.Printf("输出文件: %s\n", filepath.Base(outputFile))
|
||||
|
||||
if err := generatePMDataFromSchema(schemaFile, outputFile); err != nil {
|
||||
fmt.Printf("错误: %v\n", err)
|
||||
failCount++
|
||||
} else {
|
||||
successCount++
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Printf("\n处理完成! 成功: %d, 失败: %d\n", successCount, failCount)
|
||||
return nil
|
||||
}
|
||||
|
||||
// printPMDataSummary 打印 PM 数据摘要信息
|
||||
func printPMDataSummary(file string) error {
|
||||
data, err := os.ReadFile(file)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var pmData PMData
|
||||
if err := json.Unmarshal(data, &pmData); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Printf("\n文件: %s\n", filepath.Base(file))
|
||||
fmt.Printf("对象类型数量: %d\n", len(pmData))
|
||||
|
||||
totalKPIs := 0
|
||||
for _, obj := range pmData {
|
||||
fmt.Printf(" - %s: %d 个 KPI\n", obj.ObjectType, len(obj.KPIs))
|
||||
totalKPIs += len(obj.KPIs)
|
||||
}
|
||||
fmt.Printf("总 KPI 数量: %d\n", totalKPIs)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 示例用法函数
|
||||
func main() {
|
||||
// 设置随机种子
|
||||
// rand.Seed(time.Now().UnixNano())
|
||||
|
||||
if len(os.Args) < 2 {
|
||||
fmt.Println("用法:")
|
||||
fmt.Println(" go run pm_generator.go <command> [args]")
|
||||
fmt.Println("")
|
||||
fmt.Println("命令:")
|
||||
fmt.Println(" batch <directory> - 批量处理目录下的所有 *-generated.json 文件")
|
||||
fmt.Println(" single <input> <output> - 处理单个文件")
|
||||
fmt.Println(" summary <file> - 显示文件摘要信息")
|
||||
fmt.Println("")
|
||||
fmt.Println("示例:")
|
||||
fmt.Println(" go run pm_generator.go batch .")
|
||||
fmt.Println(" go run pm_generator.go single AMF-PM-generated.json AMF-PM-random.json")
|
||||
fmt.Println(" go run pm_generator.go summary AMF-PM-random.json")
|
||||
return
|
||||
}
|
||||
|
||||
command := os.Args[1]
|
||||
|
||||
switch command {
|
||||
case "batch":
|
||||
dir := "."
|
||||
if len(os.Args) > 2 {
|
||||
dir = os.Args[2]
|
||||
}
|
||||
|
||||
fmt.Println("PM 数据随机生成器 - 批量模式")
|
||||
fmt.Println(strings.Repeat("=", 50))
|
||||
|
||||
if err := generatePMDataFromMultipleSchemas(dir); err != nil {
|
||||
fmt.Printf("错误: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
case "single":
|
||||
if len(os.Args) < 4 {
|
||||
fmt.Println("用法: go run pm_generator.go single <input_file> <output_file>")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
inputFile := os.Args[2]
|
||||
outputFile := os.Args[3]
|
||||
|
||||
fmt.Printf("处理单个文件: %s -> %s\n", inputFile, outputFile)
|
||||
|
||||
if err := generatePMDataFromSchema(inputFile, outputFile); err != nil {
|
||||
fmt.Printf("错误: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
case "summary":
|
||||
if len(os.Args) < 3 {
|
||||
fmt.Println("用法: go run pm_generator.go summary <file>")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
file := os.Args[2]
|
||||
if err := printPMDataSummary(file); err != nil {
|
||||
fmt.Printf("错误: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
default:
|
||||
fmt.Printf("未知命令: %s\n", command)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
47
docs/nbi/pm/protocol.md
Normal file
47
docs/nbi/pm/protocol.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# OMC->北向通信协议 基于redis stream消息队列实现
|
||||
|
||||
## 告警关联关系数据上报变更
|
||||
|
||||
alarm_relation告警新增时
|
||||
|
||||
* streamkey和数据格式
|
||||
|
||||
```json
|
||||
alarm_relation
|
||||
{
|
||||
"payload": "{\"ids\":[\"871847\",\"557903\"]}"
|
||||
}
|
||||
```
|
||||
|
||||
1、871847,557903为alarm_relation表主键,至少一个数据
|
||||
|
||||
## 资源数据上报变更
|
||||
|
||||
nbi_cm表新增时
|
||||
|
||||
* streamkey和数据格式
|
||||
|
||||
```json
|
||||
nbi_cm
|
||||
{
|
||||
"payload": "{\"ids\":[\"642470\",\"105633\"]}"
|
||||
}
|
||||
```
|
||||
|
||||
1、642470,105633为nbi_cm表主键ID,ID支持多个
|
||||
|
||||
## 1分钟性能订阅上报数据
|
||||
|
||||
kpi_report_*表新增时
|
||||
|
||||
* 数据格式
|
||||
|
||||
```json
|
||||
nbi_pm
|
||||
{
|
||||
"payload": "{\"neType\":\"AMF\",\"id\":\"606538\"}"
|
||||
}
|
||||
```
|
||||
|
||||
1、AMF、PCF等为具体对应的网元
|
||||
2、606538为kpi_report_amf、kpi_report_pcf等表主键ID,ID支持一个
|
||||
66
docs/reference/gen-rand-cdr.sql
Normal file
66
docs/reference/gen-rand-cdr.sql
Normal file
@@ -0,0 +1,66 @@
|
||||
-- 1. 建辅助数字表
|
||||
DROP TABLE IF EXISTS tmp_num_100;
|
||||
CREATE TABLE tmp_num_100 (n TINYINT UNSIGNED PRIMARY KEY);
|
||||
INSERT INTO tmp_num_100(n)
|
||||
SELECT a.n + b.n AS n FROM (
|
||||
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
|
||||
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
|
||||
) a
|
||||
CROSS JOIN (
|
||||
SELECT 0 n UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40
|
||||
UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90
|
||||
) b
|
||||
ORDER BY a.n + b.n;
|
||||
|
||||
DROP TABLE IF EXISTS tmp_num_500;
|
||||
CREATE TABLE tmp_num_500 (n SMALLINT UNSIGNED PRIMARY KEY);
|
||||
INSERT INTO tmp_num_500(n)
|
||||
SELECT t.n FROM (
|
||||
SELECT @r:=@r+1 n
|
||||
FROM (SELECT 0 FROM tmp_num_100) a,
|
||||
(SELECT 0 FROM tmp_num_100) b,
|
||||
(SELECT @r:=-1) init
|
||||
LIMIT 500
|
||||
) t;
|
||||
|
||||
-- 2. 目标表(若未建)
|
||||
-- CREATE TABLE cdr_event_smsc (
|
||||
-- id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
-- ne_type VARCHAR(16),
|
||||
-- ne_name VARCHAR(64),
|
||||
-- rm_uid VARCHAR(64),
|
||||
-- `timestamp` BIGINT,
|
||||
-- cdr_json JSON,
|
||||
-- created_at DATETIME,
|
||||
-- tenant_id VARCHAR(64)
|
||||
-- ) ENGINE=InnoDB;
|
||||
|
||||
-- 3. 关闭一些约束提高插入速度(可选)
|
||||
SET autocommit = 0;
|
||||
SET unique_checks = 0;
|
||||
SET foreign_key_checks = 0;
|
||||
|
||||
-- 4. 插入 500 万(100 * 100 * 500)
|
||||
-- 随机时间:过去一年内的任意秒(不均匀)
|
||||
SET @start_ts = UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 365 DAY));
|
||||
SET @range_sec = 365 * 24 * 3600;
|
||||
|
||||
INSERT INTO cdr_event_smsc
|
||||
(ne_type, ne_name, rm_uid, `timestamp`, cdr_json, created_at)
|
||||
SELECT
|
||||
'SMSC' AS ne_type,
|
||||
'SMSC_001' AS ne_name,
|
||||
'4400HXSMSC001' AS rm_uid,
|
||||
@start_ts + FLOOR(RAND()*@range_sec) AS `timestamp`,
|
||||
'{\"calledParty\":\"15731123455\",\"callerParty\":\"18165338055\",\"cause\":28,\"recordType\":\"MTSM\",\"result\":0,\"serviceType\":\"Normal\",\"updateTime\":\"2025-08-18T11:09:52.703Z\"}' AS cdr_json,
|
||||
NOW() AS created_at
|
||||
FROM tmp_num_100 a
|
||||
CROSS JOIN tmp_num_100 b
|
||||
CROSS JOIN tmp_num_500 c;
|
||||
|
||||
COMMIT;
|
||||
|
||||
-- 5. 恢复
|
||||
SET unique_checks = 1;
|
||||
SET foreign_key_checks = 1;
|
||||
SET autocommit = 1;
|
||||
@@ -6,9 +6,10 @@
|
||||
%define project_lname omc
|
||||
%define project_Uname OMC
|
||||
|
||||
|
||||
Name: %{project_lname}
|
||||
Summary: 5GC OMC
|
||||
Version: 2.2503.5
|
||||
Version: 2.2508.2
|
||||
Release: %{release_date}
|
||||
Vendor: omc
|
||||
URL: https://www.omc.com/
|
||||
@@ -28,6 +29,13 @@ chmod +rx ${RPM_BUILD_ROOT}/usr/local/bin/*
|
||||
chmod +x ${RPM_BUILD_ROOT}/usr/local/omc/htdocs/front
|
||||
chmod +rx ${RPM_BUILD_ROOT}/usr/lib64/*
|
||||
|
||||
# 安装前执行
|
||||
%pre
|
||||
echo -n "Stopping OMC service ... "
|
||||
systemctl stop restagent.service
|
||||
systemctl stop sshsvc.service
|
||||
echo "done"
|
||||
|
||||
# 安装完成后执行
|
||||
%post
|
||||
OMCRootDir=/usr/local/omc
|
||||
@@ -38,13 +46,13 @@ OMCStaticDir=${OMCRootDir}/static
|
||||
UsrLocalBinDir=/usr/local/bin
|
||||
OMCDaemon=omcd
|
||||
NginxEtcDir=/etc/nginx
|
||||
CFileList="restconf.yaml sshsvc.yaml omc.conf"
|
||||
CFileList=$(ls ${OMCEtcDir}/default)
|
||||
LogoFileList="zh_brand.png zh_icon.png en_brand.png en_icon.png"
|
||||
|
||||
echo -n "Stopping OMC service ... "
|
||||
systemctl stop restagent.service
|
||||
systemctl stop sshsvc.service
|
||||
echo "done"
|
||||
# echo -n "Stopping OMC service ... "
|
||||
# systemctl stop restagent.service
|
||||
# systemctl stop sshsvc.service
|
||||
# echo "done"
|
||||
|
||||
for CFile in ${CFileList}; do
|
||||
if [ ! -e "${OMCEtcDir}/${CFile}" ]; then
|
||||
@@ -67,12 +75,17 @@ done
|
||||
if ! id -u omc >/dev/null 2>&1 ; then useradd -d /opt/omc -m -s /bin/bash -p1000ftp@kp omc; else echo "user omc exist"; fi
|
||||
mkdir -p /opt/omc/ftp
|
||||
mkdir -p /opt/omc/ftp/log
|
||||
cd ${UsrLocalBinDir}
|
||||
if [ ! -e ${OMCDaemon} ]; then ln -s ${OMCBinDir}/omcsvc.sh ${OMCDaemon}; fi
|
||||
|
||||
if [ ! -e ${UsrLocalBinDir}/${OMCDaemon} ]; then
|
||||
echo -n "Creating symbolic link ${UsrLocalBinDir}/${OMCDaemon} ... "
|
||||
ln -s ${OMCBinDir}/omcsvc.sh ${UsrLocalBinDir}/${OMCDaemon};
|
||||
echo "done"
|
||||
fi
|
||||
|
||||
# setting firewall
|
||||
PortList="80 443 44080 44443 33030 22222"
|
||||
for Port in ${PortList}; do
|
||||
port_list="80 443 44080 44443 33030 33443 33066 6379 22222"
|
||||
for Port in ${port_list}; do
|
||||
echo -n "firewall-cmd add port ${Port} ... "
|
||||
firewall-cmd --zone=public --add-port=${Port}/tcp --permanent
|
||||
done
|
||||
firewall-cmd --reload
|
||||
@@ -97,22 +110,15 @@ if [ "$M_PARAM" = "install" -o "$M_PARAM" = "upgrade" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
echo -n "Starting OMC service ... "
|
||||
systemctl start sshsvc.service
|
||||
systemctl start restagent.service
|
||||
echo "done"
|
||||
# echo -n "Starting OMC service ... "
|
||||
# systemctl start sshsvc.service
|
||||
# systemctl start restagent.service
|
||||
# echo "done"
|
||||
|
||||
# 卸载时执行
|
||||
%postun
|
||||
UsrLocalBinDir=/usr/local/bin
|
||||
rm -f ${UsrLocalBinDir}/omcd
|
||||
|
||||
# setting firewall
|
||||
PortList="80 443 44080 44443 33030 22222"
|
||||
for Port in ${PortList}; do
|
||||
firewall-cmd --zone=public --remove-port=${Port}/tcp --permanent
|
||||
done
|
||||
firewall-cmd --reload
|
||||
OMCDaemon=omcd
|
||||
|
||||
if [ "$1" = "0" ] ; then
|
||||
sudo systemctl stop restagent.service
|
||||
@@ -122,12 +128,22 @@ if [ "$1" = "0" ] ; then
|
||||
sudo systemctl disable restagent.service
|
||||
sudo systemctl disable sshsvc.service
|
||||
sudo systemctl daemon-reload
|
||||
# setting firewall
|
||||
port_list="80 443 44080 44443 33030 33443 33066 6379 22222"
|
||||
for Port in ${port_list}; do
|
||||
echo -n "firewall-cmd remove port ${Port} ... "
|
||||
firewall-cmd --zone=public --remove-port=${Port}/tcp --permanent
|
||||
done
|
||||
firewall-cmd --reload
|
||||
rm -f ${UsrLocalBinDir}/${OMCDaemon}
|
||||
else
|
||||
echo -n "Starting OMC service ... "
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl stop restagent.service
|
||||
sudo systemctl stop sshsvc.service
|
||||
sudo systemctl start sshsvc.service
|
||||
sudo systemctl start restagent.service
|
||||
echo "done"
|
||||
fi
|
||||
|
||||
# 规定那些文件必须放入安装程序中,如果没有就报错
|
||||
|
||||
Reference in New Issue
Block a user