Refactor network element state management - Removed the NE state endpoint and related service logic from the network_data module. - Introduced a new NEStateController to handle network element state records. - Implemented NEState service and repository for managing state records in the database. - Updated NEInfo and NeLicense controllers to utilize the new NEState service for fetching and saving state information. - Enhanced state handling in the websocket processor to reflect the latest state of network elements. - Added caching logic for network element states using Redis. - Improved error handling and response formatting for state queries.
138 lines
3.9 KiB
Go
138 lines
3.9 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strconv"
|
|
|
|
"be.ems/src/modules/network_element/model"
|
|
"be.ems/src/modules/network_element/repository"
|
|
"github.com/tsmask/go-oam/framework/utils/parse"
|
|
)
|
|
|
|
// 实例化数据层 NEState 结构体
|
|
var NewNEState = &NEState{
|
|
neStateRepository: repository.NewNEState,
|
|
}
|
|
|
|
// NEState 网元状态记录表 服务层处理
|
|
type NEState struct {
|
|
neStateRepository *repository.NEState // 网元状态记录信息
|
|
}
|
|
|
|
// FindByPage 根据条件分页查询
|
|
func (r NEState) FindByPage(query model.NEStateQuery) ([]model.NEState, int64) {
|
|
return r.neStateRepository.SelectByPage(query)
|
|
}
|
|
|
|
// Insert 插入数据
|
|
func (r NEState) Insert(item model.NEState) int64 {
|
|
return r.neStateRepository.Insert(item)
|
|
}
|
|
|
|
// DeleteByTime 删除数据
|
|
func (r NEState) DeleteByTime(neType, neId string, ltTime int64) int64 {
|
|
return r.neStateRepository.DeleteByTime(neType, neId, ltTime)
|
|
}
|
|
|
|
// Last 查询最新状态
|
|
func (r NEState) Last(neType, neId string) model.NEState {
|
|
return r.neStateRepository.SelectByLast(neType, neId)
|
|
}
|
|
|
|
// ParseState 解析状态数据
|
|
func (r NEState) ParseState(neInfo model.NeInfo, state model.NEState) map[string]any {
|
|
if state.ID == 0 {
|
|
return map[string]any{}
|
|
}
|
|
return map[string]any{
|
|
"neId": neInfo.NeId,
|
|
"neName": neInfo.NeName,
|
|
"neType": neInfo.NeType,
|
|
"neIP": neInfo.IP,
|
|
"standby": state.Standby,
|
|
"version": state.NeVersion,
|
|
"sn": state.SerialNum,
|
|
"expire": state.ExpiryDate,
|
|
"refreshTime": state.RefreshTime,
|
|
"ueNumber": state.UENumber,
|
|
"nbNumber": state.NbNumber,
|
|
"hostname": state.HostName,
|
|
"os": state.OS,
|
|
"sysCpuUsage": state.SysCpuUsage,
|
|
"sysMemUsage": state.SysMemUsage,
|
|
"sysDiskUsage": state.SysDiskUsage,
|
|
"nfCpuUsage": state.NfCpuUsage,
|
|
"nfMemUsed": state.NfMemUsed,
|
|
}
|
|
}
|
|
|
|
// SaveState 网元直连返回的状态数据保存
|
|
func (r NEState) SaveState(state map[string]any) model.NEState {
|
|
// 网元CPU使用率
|
|
var nfCpuUsage float64 = 0
|
|
// CPU使用率
|
|
var sysCpuUsage float64 = 0
|
|
if state["cpu"] != nil {
|
|
cpu := state["cpu"].(map[string]any)
|
|
v := parse.Number(cpu["sysCpuUsage"])
|
|
sysCpuUsage = float64(v) / 100
|
|
nfv := parse.Number(cpu["nfCpuUsage"])
|
|
nfCpuUsage = float64(nfv) / 100
|
|
}
|
|
|
|
// 网元内存使用KB
|
|
var nfMemUsed int64 = 0
|
|
// 内存使用率
|
|
var sysMemUsage float64 = 0
|
|
if state["mem"] != nil {
|
|
mem := state["mem"].(map[string]any)
|
|
v := parse.Number(mem["sysMemUsage"])
|
|
sysMemUsage = float64(v) / 100
|
|
nfMemUsed = parse.Number(mem["nfUsedMem"])
|
|
}
|
|
|
|
// 磁盘使用率
|
|
var sysDiskUsage float64 = 0
|
|
if state["disk"] != nil {
|
|
mem := state["disk"].(map[string]any)
|
|
disks := mem["partitionInfo"].([]any)
|
|
sort.Slice(disks, func(i, j int) bool {
|
|
iUsed := parse.Number(disks[i].(map[string]any)["used"])
|
|
jUsed := parse.Number(disks[j].(map[string]any)["used"])
|
|
return iUsed > jUsed
|
|
})
|
|
disk := disks[0].(map[string]any)
|
|
total := parse.Number(disk["total"])
|
|
used := parse.Number(disk["used"])
|
|
sysDiskUsage = (float64(used) / float64(total)) * 100
|
|
sysDiskUsage, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", sysDiskUsage), 64)
|
|
}
|
|
|
|
// 插入网元状态记录
|
|
neState := model.NEState{
|
|
NeType: fmt.Sprint(state["neType"]),
|
|
NeId: fmt.Sprint(state["neId"]),
|
|
NeVersion: fmt.Sprint(state["version"]),
|
|
Standby: parse.Number(state["standby"]),
|
|
UENumber: parse.Number(state["ueNumber"]),
|
|
NbNumber: parse.Number(state["nbNumber"]),
|
|
SerialNum: fmt.Sprint(state["sn"]),
|
|
ExpiryDate: fmt.Sprint(state["expire"]),
|
|
HostName: fmt.Sprint(state["hostname"]),
|
|
OS: fmt.Sprint(state["os"]),
|
|
SysCpuUsage: sysCpuUsage,
|
|
SysMemUsage: sysMemUsage,
|
|
SysDiskUsage: sysDiskUsage,
|
|
NfCpuUsage: nfCpuUsage,
|
|
NfMemUsed: nfMemUsed,
|
|
RefreshTime: parse.Number(state["refreshTime"]),
|
|
}
|
|
|
|
insertId := r.neStateRepository.Insert(neState)
|
|
if insertId > 0 {
|
|
neState.ID = insertId
|
|
}
|
|
return neState
|
|
}
|