1
0
Files
omc_api/features/state/getstate.go
2023-10-16 20:04:08 +08:00

861 lines
29 KiB
Go

package state
import (
"encoding/json"
"fmt"
"net/http"
"os"
"strconv"
"strings"
"time"
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
"ems.agt/lib/dborm"
"ems.agt/lib/global"
"ems.agt/lib/log"
"ems.agt/lib/services"
"ems.agt/restagent/config"
tokenConst "ems.agt/src/framework/constants/token"
)
type CpuUsage struct {
NfCpuUsage uint16 `json:"nfCpuUsage"`
SysCpuUsage uint16 `json:"sysCpuUsage"`
}
type MemUsage struct {
TotalMem uint32 `json:"totalMem"`
NfUsedMem uint32 `json:"nfUsedMem"`
SysMemUsage uint16 `json:"sysMemUsage"`
}
type PartitionInfo struct {
Total uint32 `json:"total"` // MB
Used uint32 `json:"used"` // MB
}
type DiskSpace struct {
PartitionNum uint8 `json:"partitionNum"`
PartitionInfo []PartitionInfo `json:"partitionInfo"`
}
type HardwareInfo struct {
CPUs int `json:"cpus"`
Memory int `json:"memory"`
}
type SysState struct {
HostName string `json:"hostName"` // linux命令: hostname
OsInfo string `json:"osInfo"` // linux命令: uname -a
DbInfo string `json:"dbInfo"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version
Version string `json:"version"` // 软件版本信息: 16.1.1
IpAddr []string `json:"ipAddr"` // 网管的ipv4和ipv6列表
Port uint16 `json:"port"` // 用于网管的port
Capability uint32 `json:"capability"`
SerialNum string `json:"serialNum"`
ExpiryDate string `json:"expiryDate"`
HardwareInfo HardwareInfo `json:"hardwareInfo"`
CpuUsage CpuUsage `json:"cpuUsage"`
MemUsage MemUsage `json:"memUsage"`
DiskSpace DiskSpace `json:"diskSpace"`
//Timestamp string `json:"timestamp"`
}
type SystemState struct {
HostName string `json:"hostName"` // linux命令: hostname
OsInfo string `json:"osInfo"` // linux命令: uname -a
DbInfo string `json:"dbInfo"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version
Version string `json:"version"` // 软件版本信息: 16.1.1
IpAddr []string `json:"ipAddr"` // 网管的ipv4和ipv6列表
Port uint16 `json:"port"` // 用于网管的port
Capability uint32 `json:"capability"`
SerialNum string `json:"serialNum"`
ExpiryDate string `json:"expiryDate"`
HardwareInfo struct {
CPUs int `json:"cpus"` // 主机(裸机/虚拟机)的cpu个数
Memory int `json:"memory"` // 主机(裸机/虚拟机): 配置的内存
} `json:"hardwareInfo"`
CpuUsage struct {
NfCpuUsage uint16 `json:"nfCpuUsage"`
SysCpuUsage uint16 `json:"sysCpuUsage"`
} `json:"cpuUsage"`
MemUsage struct {
TotalMem uint32 `json:"totalMem"`
NfUsedMem uint32 `json:"nfUsedMem"`
SysMemUsage uint16 `json:"sysMemUsage"`
} `json:"memUsage"`
DiskSpace struct {
PartitionNum uint8 `json:"partitionNum"`
PartitionInfo []struct {
Total uint32 `json:"total"` // MB
Used uint32 `json:"used"` // MB
} `json:"partitionInfo"`
} `json:"diskSpace"`
//Timestamp string `json:"timestamp"`
}
type SystemInfo struct {
NeType string `json:"neType" map:"neType, omitempty"`
NeId string `json:"neId" map:"neId, omitempty"`
HostName string `json:"hostName" map:"hostName, omitempty"` // linux命令: hostname
OsInfo string `json:"osInfo" map:"osInfo, omitempty"` // linux命令: uname -a
DbInfo string `json:"dbInfo" map:"dbInfo, omitempty"` // 网元如果有db, 显示数据库名和版本信息, OMC: mysql --version
Version string `json:"version" map:"version, omitempty"` // 软件版本信息: 16.1.1
IpAddr string `json:"ipAddr" map:"ipAddr, omitempty"` // 网管的ipv4和ipv6列表
Port uint16 `json:"port" map:"port, omitempty"` // 用于网管的port
CPUs int `json:"cpus" map:"cpus, omitempty"`
TotalMem int `json:"totalMem" map:"totalMem, omitempty"`
PvFlag string `json:"pvFlag" map:"pvFlag, omitempty"`
Status string `json:"status" map:"status, omitempty"`
}
type LicenseInfo struct {
NeType string `json:"neType"`
NeId string `json:"neId"`
SerialNum string `json:"serialNum"`
Capability uint32 `json:"capability"`
CapUsed uint32 `json:"capUsed"`
FeatureEnabled []string `json:"featureEnabled"`
ExpiryDate string `json:"expiryDate"`
}
type Response struct {
Data interface{} `json:"data"`
}
var (
UriSysState = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/systemState"
UriSysState2 = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/systemState"
UriSysInfoAll = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/sysInfo"
UriSysInfoOne = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/sysInfo/{neType}/{neId}"
UriLicenseInfoAll = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/licenseInfo"
UriLicenseInfoOne = config.DefaultUriPrefix + "/systemManagement/{apiVersion}/licenseInfo/{neType}/{neId}"
CustomUriSysState = config.UriPrefix + "/systemManagement/{apiVersion}/elementType/{elementTypeValue}/objectType/systemState"
CustomUriSysState2 = config.UriPrefix + "/systemManagement/{apiVersion}/{elementTypeValue}/systemState"
CustomUriSysInfoAll = config.UriPrefix + "/systemManagement/{apiVersion}/sysInfo"
CustomUriSysInfoOne = config.UriPrefix + "/systemManagement/{apiVersion}/sysInfo/{neType}/{neId}"
CustomUriLicenseInfoAll = config.UriPrefix + "/systemManagement/{apiVersion}/licenseInfo"
CustomUriLicenseInfoOne = config.UriPrefix + "/systemManagement/{apiVersion}/licenseInfo/{neType}/{neId}"
)
var client = resty.New()
func init() {
/*
client.
SetTimeout(10 * time.Second).
SetRetryCount(1).
SetRetryWaitTime(1 * time.Second).
SetRetryMaxWaitTime(2 * time.Second).
SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) {
return 0, errors.New("quota exceeded")
})
*/
client.SetTimeout(3 * time.Second)
}
func NeStatusEnumToStr(intStatus int) string {
switch intStatus {
case 0:
return "active"
case 1:
return "offline"
case 2:
return "standby"
case 3:
return "maintain"
default:
return "unkown"
}
}
// Get system state from NF/NFs
func GetOneLicenseInfoFromNF(w http.ResponseWriter, r *http.Request) {
log.Debug("GetOneLicenseInfoFromNF processing... ")
data := make([]map[string]interface{}, 0)
vars := mux.Vars(r)
neType := vars["neType"]
neId := vars["neId"]
if neType == "" || neId == "" {
services.ResponseNotFound404UriNotExist(w, r)
return
}
token, err := services.CheckFrontValidRequest(w, r)
if err != nil {
log.Error("Request error:", err)
return
}
log.Debug("AccessToken:", token)
neInfo, err := dborm.XormGetNeInfo(neType, neId)
if err != nil {
log.Error("Failed to XormGetNeInfo:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
} else if neInfo == nil {
err := global.ErrCMNotFoundTargetNE
log.Error(global.ErrCMNotFoundTargetNE)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
log.Trace("neInfo:", neInfo)
//systemState := make(map[string]interface{})
systemState := &SysState{}
result := make(map[string]interface{})
//sysInfo := &SystemInfo{}
omcNeTypeLower := "omc"
if config.GetYamlConfig().OMC.NeType != "" {
omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType)
}
if neType != omcNeTypeLower {
log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower)
var requestURI2NF string
if config.GetYamlConfig().OMC.TestMode == true && strings.ToLower(neType) != "udm" {
var udmNEs []dborm.NeInfo
err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs)
if err != nil {
log.Error("Get system state from NF is failed:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
if len(udmNEs) > 0 {
udmNe := udmNEs[0]
hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port)
requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, strings.ToLower(udmNe.NeType))
}
} else {
hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, strings.ToLower(neInfo.NeType))
}
log.Debug("requestURI2NF:", requestURI2NF)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
SetHeaders(map[string]string{"accessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(requestURI2NF)
if err != nil {
log.Error("Get system state from NF is failed:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
} else {
log.Trace("resp.Body():", string(resp.Body()))
_ = json.Unmarshal(resp.Body(), &systemState)
log.Trace("systemState:", systemState)
capUsed := config.TDatas[neInfo.NeType].CapUsed
log.Tracef("neInfo.NeType:%s capUsed: %v", capUsed)
licenseInfo := &LicenseInfo{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
SerialNum: systemState.SerialNum,
Capability: systemState.Capability,
CapUsed: capUsed,
FeatureEnabled: config.TDatas[neInfo.NeType].FeatureEnabled,
ExpiryDate: systemState.ExpiryDate,
}
//neItem := strings.ToUpper(neType) + "/" + neId
result, err = global.ToMap(*licenseInfo, "json")
}
} else {
systemState := GetEMSState(neInfo.Ip)
licenseInfo := &LicenseInfo{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
SerialNum: systemState.SerialNum,
Capability: systemState.Capability,
CapUsed: config.TDatas[neInfo.NeType].CapUsed,
FeatureEnabled: config.TDatas[neInfo.NeType].FeatureEnabled,
ExpiryDate: systemState.ExpiryDate,
}
result, err = global.ToMap(*licenseInfo, "json")
// neItem := strings.ToUpper(neType) + "/" + neId
// result[neItem] = sysInfo
}
data = append(data, result)
log.Trace("data:", data)
var response Response
response.Data = data
services.ResponseWithJson(w, http.StatusOK, response)
}
// Get system state from NF/NFs
func GetAllLicenseInfoFromNF(w http.ResponseWriter, r *http.Request) {
log.Debug("GetAllLicenseInfoFromNF processing... ")
data := make([]map[string]interface{}, 0)
token, err := services.CheckFrontValidRequest(w, r)
if err != nil {
log.Error("Request error:", err)
return
}
log.Debug("AccessToken:", token)
var neList []dborm.NeInfo
_, err = dborm.XormGetAllNeInfo(&neList)
omcNeTypeLower := "omc"
if config.GetYamlConfig().OMC.NeType != "" {
omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType)
}
for _, ne := range neList {
result := make(map[string]interface{})
log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower)
log.Debug("ne: ", ne)
//if strings.ToLower(ne.NeType) != omcNeTypeLower || !strings.Contains(r.RemoteAddr, ne.Ip) {
if strings.ToLower(ne.NeType) != omcNeTypeLower {
// hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port)
// requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
// hostUri, strings.ToLower(ne.NeType))
var requestURI2NF string
if config.GetYamlConfig().OMC.TestMode == true && strings.ToLower(ne.NeType) != "udm" {
var udmNEs []dborm.NeInfo
err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs)
if err != nil {
log.Error("Get system state from NF is failed:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
if len(udmNEs) > 0 {
udmNe := udmNEs[0]
hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port)
requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, strings.ToLower(udmNe.NeType))
}
} else {
hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port)
requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, strings.ToLower(ne.NeType))
}
log.Debug("requestURI2NF:", requestURI2NF)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
SetHeaders(map[string]string{"accessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(requestURI2NF)
if err != nil {
log.Error("Get system state from NF is failed:", err)
// errorMessage := services.ErrorMessage{
// ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused",
// }
// //result["error"] = errorMessage
continue
} else {
systemState := &SysState{}
_ = json.Unmarshal(resp.Body(), &systemState)
licenseInfo := &LicenseInfo{
NeType: ne.NeType,
NeId: ne.NeId,
SerialNum: systemState.SerialNum,
Capability: systemState.Capability,
CapUsed: config.TDatas[ne.NeType].CapUsed,
FeatureEnabled: config.TDatas[ne.NeType].FeatureEnabled,
ExpiryDate: systemState.ExpiryDate,
}
result, err = global.ToMap(*licenseInfo, "json")
// neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId
// result[neItem] = sysInfo
}
} else {
systemState := GetEMSState(ne.Ip)
licenseInfo := &LicenseInfo{
NeType: ne.NeType,
NeId: ne.NeId,
SerialNum: systemState.SerialNum,
Capability: systemState.Capability,
CapUsed: config.TDatas[ne.NeType].CapUsed,
FeatureEnabled: config.TDatas[ne.NeType].FeatureEnabled,
ExpiryDate: systemState.ExpiryDate,
}
result, err = global.ToMap(*licenseInfo, "json")
// neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId
// result[neItem] = sysInfo
}
data = append(data, result)
log.Trace("data:", data)
}
var response Response
response.Data = data
services.ResponseWithJson(w, http.StatusOK, response)
}
// Get system state from NF/NFs
func GetOneSysinfoFromNF(w http.ResponseWriter, r *http.Request) {
log.Debug("GetOneSysinfoFromNF processing... ")
data := make([]map[string]interface{}, 0)
vars := mux.Vars(r)
neType := vars["neType"]
neId := vars["neId"]
if neType == "" || neId == "" {
services.ResponseNotFound404UriNotExist(w, r)
return
}
token, err := services.CheckFrontValidRequest(w, r)
if err != nil {
log.Error("Request error:", err)
return
}
log.Debug("AccessToken:", token)
neInfo, err := dborm.XormGetNeInfo(neType, neId)
if err != nil {
log.Error("Failed to XormGetNeInfo:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
} else if neInfo == nil {
err := global.ErrCMNotFoundTargetNE
log.Error(global.ErrCMNotFoundTargetNE)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
log.Trace("neInfo:", neInfo)
//systemState := make(map[string]interface{})
systemState := &SysState{}
result := make(map[string]interface{})
//sysInfo := &SystemInfo{}
omcNeTypeLower := "omc"
if config.GetYamlConfig().OMC.NeType != "" {
omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType)
}
if neType != omcNeTypeLower {
log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower)
var requestURI2NF string
if config.GetYamlConfig().OMC.TestMode == true && strings.ToLower(neType) != "udm" {
var udmNEs []dborm.NeInfo
err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs)
if err != nil {
log.Error("Get system state from NF is failed:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
if len(udmNEs) > 0 {
udmNe := udmNEs[0]
hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port)
requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, strings.ToLower(udmNe.NeType))
}
} else {
hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, strings.ToLower(neInfo.NeType))
}
log.Debug("requestURI2NF:", requestURI2NF)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
SetHeaders(map[string]string{"accessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(requestURI2NF)
if err != nil {
log.Error("Get system state from NF is failed:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
} else {
log.Trace("resp.Body():", string(resp.Body()))
_ = json.Unmarshal(resp.Body(), &systemState)
log.Trace("systemState:", systemState)
hostName := "5gc"
if systemState.HostName != "" {
hostName = systemState.HostName
}
osInfo := "Linux 5gc 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 GNU/Linux"
if systemState.OsInfo != "" {
osInfo = systemState.OsInfo
}
dbInfo := "adb v1.0.1"
if systemState.OsInfo != "" {
dbInfo = systemState.DbInfo
}
port, _ := strconv.Atoi(neInfo.Port)
cpus := 4
if systemState.HardwareInfo.CPUs != 0 {
cpus = systemState.HardwareInfo.CPUs
}
totalMem := 34029125632
if systemState.HardwareInfo.Memory != 0 {
totalMem = systemState.HardwareInfo.Memory
}
sysInfo := &SystemInfo{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
HostName: hostName,
OsInfo: osInfo,
DbInfo: dbInfo,
Version: systemState.Version,
IpAddr: neInfo.Ip,
Port: uint16(port),
CPUs: cpus,
TotalMem: totalMem,
PvFlag: neInfo.PvFlag,
Status: NeStatusEnumToStr(neInfo.Status),
}
//neItem := strings.ToUpper(neType) + "/" + neId
result, err = global.ToMap(*sysInfo, "json")
}
} else {
systemState := GetEMSState(neInfo.Ip)
sysInfo := &SystemInfo{
NeType: neInfo.NeType,
NeId: neInfo.NeId,
HostName: systemState.HostName,
OsInfo: systemState.OsInfo,
DbInfo: systemState.DbInfo,
Version: systemState.Version,
IpAddr: neInfo.Ip,
Port: systemState.Port,
CPUs: systemState.HardwareInfo.CPUs,
TotalMem: systemState.HardwareInfo.Memory,
PvFlag: neInfo.PvFlag,
Status: NeStatusEnumToStr(neInfo.Status),
}
result, err = global.ToMap(*sysInfo, "json")
// neItem := strings.ToUpper(neType) + "/" + neId
// result[neItem] = sysInfo
}
data = append(data, result)
log.Trace("data:", data)
var response Response
response.Data = data
services.ResponseWithJson(w, http.StatusOK, response)
}
// Get system state from NF/NFs
func GetAllSysinfoFromNF(w http.ResponseWriter, r *http.Request) {
log.Debug("GetAllSysinfoFromNF processing... ")
data := make([]map[string]interface{}, 0)
token, err := services.CheckFrontValidRequest(w, r)
if err != nil {
log.Error("Request error:", err)
return
}
log.Debug("AccessToken:", token)
var neList []dborm.NeInfo
_, err = dborm.XormGetAllNeInfo(&neList)
omcNeTypeLower := "omc"
if config.GetYamlConfig().OMC.NeType != "" {
omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType)
}
for _, ne := range neList {
result := make(map[string]interface{})
log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower)
log.Debug("ne: ", ne)
//if strings.ToLower(ne.NeType) != omcNeTypeLower || !strings.Contains(r.RemoteAddr, ne.Ip) {
if strings.ToLower(ne.NeType) != omcNeTypeLower {
// hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port)
// requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
// hostUri, strings.ToLower(ne.NeType))
var requestURI2NF string
if config.GetYamlConfig().OMC.TestMode == true && strings.ToLower(ne.NeType) != "udm" {
var udmNEs []dborm.NeInfo
err := dborm.XormGetNeInfoByNeType("UDM", &udmNEs)
if err != nil {
log.Error("Get system state from NF is failed:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
}
if len(udmNEs) > 0 {
udmNe := udmNEs[0]
hostUri := fmt.Sprintf("http://%s:%v", udmNe.Ip, udmNe.Port)
requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, strings.ToLower(udmNe.NeType))
}
} else {
hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port)
requestURI2NF = fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, strings.ToLower(ne.NeType))
}
log.Debug("requestURI2NF:", requestURI2NF)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
SetHeaders(map[string]string{"accessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(requestURI2NF)
if err != nil {
log.Error("Get system state from NF is failed:", err)
// errorMessage := services.ErrorMessage{
// ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused",
// }
// //result["error"] = errorMessage
continue
} else {
systemState := &SysState{}
_ = json.Unmarshal(resp.Body(), &systemState)
hostName := "5gc"
if systemState.HostName != "" {
hostName = systemState.HostName
}
osInfo := "Linux 5gc 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 GNU/Linux"
if systemState.OsInfo != "" {
osInfo = systemState.OsInfo
}
dbInfo := "adb v1.0.1"
if systemState.OsInfo != "" {
dbInfo = systemState.DbInfo
}
port, _ := strconv.Atoi(ne.Port)
cpus := 4
if systemState.HardwareInfo.CPUs != 0 {
cpus = systemState.HardwareInfo.CPUs
}
totalMem := 34029125632
if systemState.HardwareInfo.Memory != 0 {
totalMem = systemState.HardwareInfo.Memory
}
sysInfo := &SystemInfo{
NeType: ne.NeType,
NeId: ne.NeId,
HostName: hostName,
OsInfo: osInfo,
DbInfo: dbInfo,
Version: systemState.Version,
IpAddr: ne.Ip,
Port: uint16(port),
CPUs: cpus,
TotalMem: totalMem,
PvFlag: ne.PvFlag,
Status: NeStatusEnumToStr(ne.Status),
}
// neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId
// result[neItem] = sysInfo
result, err = global.ToMap(*sysInfo, "json")
}
} else {
port, _ := strconv.Atoi(ne.Port)
systemState := GetEMSState(ne.Ip)
sysInfo := &SystemInfo{
NeType: ne.NeType,
NeId: ne.NeId,
HostName: systemState.HostName,
OsInfo: systemState.OsInfo,
DbInfo: systemState.DbInfo,
Version: systemState.Version,
IpAddr: ne.Ip,
Port: (uint16(port)),
CPUs: systemState.HardwareInfo.CPUs,
TotalMem: systemState.HardwareInfo.Memory,
PvFlag: ne.PvFlag,
Status: NeStatusEnumToStr(ne.Status),
}
// neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId
// result[neItem] = sysInfo
result, err = global.ToMap(*sysInfo, "json")
}
data = append(data, result)
log.Trace("data:", data)
}
var response Response
response.Data = data
services.ResponseWithJson(w, http.StatusOK, response)
}
// Get system state from NF/NFs
func GetStateFromNF(w http.ResponseWriter, r *http.Request) {
log.Debug("GetStateFromNF processing... ")
data := make([]map[string]interface{}, 0)
vars := mux.Vars(r)
neType := vars["elementTypeValue"]
var neList []dborm.NeInfo
if neType == "" {
services.ResponseNotFound404UriNotExist(w, r)
return
}
token, err := services.CheckFrontValidRequest(w, r)
if err != nil {
log.Error("Request error:", err)
return
}
log.Debug("AccessToken:", token)
switch strings.ToLower(neType) {
case "all":
// query all NFs
// create rest client
restHostPort := fmt.Sprintf("http://127.0.0.1:%d", config.GetYamlConfig().Rest[0].Port)
getNeInfoPattern := fmt.Sprintf(config.DefaultUriPrefix+"/databaseManagement/v1/elementType/%s/objectType/ne_info",
config.GetYamlConfig().Database.Name)
getNeInfoURI := restHostPort + getNeInfoPattern + "?WHERE=status='0'"
log.Debug("getNeInfoPattern:", getNeInfoPattern)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
SetHeaders(map[string]string{"AccessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(getNeInfoURI)
if err != nil {
log.Error("Get ne_info from DB is failed:", err)
services.ResponseInternalServerError500NFConnectRefused(w)
return
}
neList, _ = dborm.XormParseResult(resp.Body())
default:
restHostPort := fmt.Sprintf("http://127.0.0.1:%d", config.GetYamlConfig().Rest[0].Port)
getNeInfoPattern := fmt.Sprintf(config.DefaultUriPrefix+"/databaseManagement/v1/elementType/%s/objectType/ne_info",
config.GetYamlConfig().Database.Name)
getNeInfoURI := restHostPort + getNeInfoPattern
neId := services.GetUriParamString(r, "ne_id", ",", true, false)
if neId == "" {
getNeInfoURI = getNeInfoURI + fmt.Sprintf("?WHERE=status='0'+and+ne_type='%s'", neType)
} else {
getNeInfoURI = getNeInfoURI + fmt.Sprintf("?WHERE=status='0'+and+ne_type='%v'+and+ne_id+in+%v", neType, neId)
}
log.Debug("getNeInfoURI:", getNeInfoURI)
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
SetHeaders(map[string]string{"accessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(getNeInfoURI)
if err != nil {
log.Error("Get ne_info from DB is failed:", err)
services.ResponseInternalServerError500NFConnectRefused(w)
return
}
neList, _ = dborm.XormParseResult(resp.Body())
}
omcNeTypeLower := "omc"
if config.GetYamlConfig().OMC.NeType != "" {
omcNeTypeLower = strings.ToLower(config.GetYamlConfig().OMC.NeType)
}
for _, ne := range neList {
result := make(map[string]interface{})
log.Debugf("r.RemoteAddr: %s omcNeTypeLower: %s", r.RemoteAddr, omcNeTypeLower)
log.Debug("ne: ", ne)
//if strings.ToLower(ne.NeType) != omcNeTypeLower || !strings.Contains(r.RemoteAddr, ne.Ip) {
if strings.ToLower(ne.NeType) != omcNeTypeLower {
hostUri := fmt.Sprintf("http://%s:%v", ne.Ip, ne.Port)
requestURI2NF := fmt.Sprintf("%s/api/rest/systemManagement/v1/elementType/%s/objectType/systemState",
hostUri, ne.NeType)
log.Debug("requestURI2NF:", requestURI2NF)
result["ipAddress"] = ne.Ip
resp, err := client.R().
EnableTrace().
SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
SetHeaders(map[string]string{"accessToken": token}).
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
Get(requestURI2NF)
if err != nil {
log.Error("Get system state from NF is failed:", err)
errorMessage := services.ErrorMessage{
ErrorCode: "1", ErrorInfo: "Internal server error, NF connnect refused",
}
result["error"] = errorMessage
} else {
systemState := make(map[string]interface{})
_ = json.Unmarshal(resp.Body(), &systemState)
result["systemState"] = systemState
}
} else {
result["ipAddress"] = ne.Ip
emsState := GetEMSState(ne.Ip)
result["systemState"] = emsState
}
neItem := strings.ToUpper(ne.NeType) + "/" + ne.NeId
mapState := make(map[string]interface{})
mapState[neItem] = result
data = append(data, mapState)
log.Trace("data:", data)
}
var response Response
response.Data = data
services.ResponseWithJson(w, http.StatusOK, response)
}
func GetEMSState(ip string) *SysState {
log.Debug("GetEMSState processing... ")
sysInfo := new(SysInfo)
err := GetSysInfo(sysInfo)
if err != nil {
log.Error("Failed to GetSysInfo:", err)
return nil
}
cpuUsage := &CpuUsage{
NfCpuUsage: sysInfo.MyCpuPercent,
SysCpuUsage: sysInfo.SysCpuPercent,
}
memUsage := &MemUsage{
TotalMem: sysInfo.SysTotalRam,
NfUsedMem: sysInfo.MyUsedRam,
SysMemUsage: sysInfo.SysRamUsedPercent,
}
diskSpace := &DiskSpace{
PartitionNum: sysInfo.PartitionNum,
PartitionInfo: sysInfo.PartitionInfo,
}
version := "16.1.1"
if global.Version != "" {
version = global.Version
}
hostName, _ := os.Hostname()
emsState := &SysState{
HostName: hostName,
OsInfo: getUnameStr(),
DbInfo: "mysql Ver 15.1 Distrib 10.3.35-MariaDB, for Linux (aarch64) using readline 5.1",
IpAddr: []string{ip},
Port: 3030,
Version: version,
Capability: 9999999,
SerialNum: config.GetYamlConfig().OMC.Sn,
ExpiryDate: "-",
HardwareInfo: HardwareInfo{CPUs: getCpuNumber(), Memory: getTotalMemory()},
CpuUsage: *cpuUsage,
MemUsage: *memUsage,
DiskSpace: *diskSpace,
}
//getSystemInfo()
return emsState
}