314 lines
10 KiB
Go
314 lines
10 KiB
Go
package genNeStateAlarm
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"net/http"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
"be.ems/features/fm"
|
||
"be.ems/lib/config"
|
||
"be.ems/lib/log"
|
||
"be.ems/src/framework/cron"
|
||
"be.ems/src/framework/datasource"
|
||
"be.ems/src/framework/utils/date"
|
||
"be.ems/src/framework/utils/parse"
|
||
"github.com/go-resty/resty/v2"
|
||
|
||
neModel "be.ems/src/modules/network_element/model"
|
||
neService "be.ems/src/modules/network_element/service"
|
||
)
|
||
|
||
var NewProcessor = &BarProcessor{
|
||
neConfigBackupService: neService.NewNeConfigBackup,
|
||
neInfoService: neService.NewNeInfo,
|
||
progress: 0,
|
||
count: 0,
|
||
}
|
||
|
||
// bar 队列任务处理
|
||
type BarProcessor struct {
|
||
neConfigBackupService *neService.NeConfigBackup // 网元配置文件备份记录服务
|
||
neInfoService *neService.NeInfo // 网元信息服务
|
||
// 任务进度
|
||
progress int
|
||
// 执行次数
|
||
count int
|
||
}
|
||
type BarParams struct {
|
||
AlarmID string `json:"alarmID"`
|
||
AlarmCode int `json:"alarmCode"`
|
||
AlarmTitle string `json:"alarmTitle"`
|
||
AlarmType string `json:"alarmType"`
|
||
OrigSeverity string `json:"origSeverity"`
|
||
ObjectUID string `json:"objectUID"`
|
||
ObjectName string `json:"objectName"`
|
||
ObjectType string `json:"objectType"`
|
||
SpecificProblem string `json:"specificProblem"`
|
||
SpecificProblemID string `json:"specificProblemID"`
|
||
AddInfo string `json:"AddInfo"`
|
||
Threshold int64 `json:"threshold"`
|
||
}
|
||
|
||
// type BarParams struct {
|
||
// Duration int `json:"duration"`
|
||
// }
|
||
|
||
type Alarm struct {
|
||
Id int `json:"-" xorm:"pk 'id' autoincr"`
|
||
AlarmSeq int `json:"alarmSeq"`
|
||
AlarmId string `json:"alarmId" xorm:"alarm_id"`
|
||
NeId string `json:"neId"`
|
||
AlarmCode int `json:"alarmCode"`
|
||
AlarmTitle string `json:"alarmTitle"`
|
||
EventTime string `json:"eventTime"`
|
||
AlarmType string `json:"alarmType"`
|
||
OrigSeverity string `json:"origSeverity"`
|
||
PerceivedSeverity string `json:"perceivedSeverity"`
|
||
PVFlag string `json:"pvFlag" xorm:"pv_flag"`
|
||
NeName string `json:"neName"`
|
||
NeType string `json:"neType"`
|
||
ObjectUid string `json:"objectUid" xorm:"object_uid"`
|
||
ObjectName string `json:"objectName" xorm:"object_name"`
|
||
ObjectType string `json:"objectType" xorm:"object_type"`
|
||
LocationInfo string `json:"locationInfo"`
|
||
Province string `json:"province"`
|
||
AlarmStatus int `json:"alarmStatus" xorm:"alarm_status"`
|
||
SpecificProblem string `json:"specificProblem"`
|
||
SpecificProblemID string `json:"specificProblemID" xorm:"specific_problem_id"`
|
||
AddInfo string `json:"addInfo"`
|
||
|
||
// ClearType int `json:"-" xorm:"clear_type"` // 0: Unclear, 1: Auto clear, 2: Manual clear
|
||
// ClearTime sql.NullTime `json:"-" xorm:"clear_time"`
|
||
}
|
||
|
||
var client = resty.New()
|
||
|
||
func init() {
|
||
client.
|
||
SetTimeout(time.Duration(400 * time.Millisecond))
|
||
}
|
||
|
||
func (s *BarProcessor) Execute(data any) (any, error) {
|
||
var err error
|
||
|
||
s.count++
|
||
options := data.(cron.JobData)
|
||
sysJob := options.SysJob
|
||
var alarmDefine BarParams
|
||
|
||
err = json.Unmarshal([]byte(sysJob.TargetParams), &alarmDefine)
|
||
if err != nil {
|
||
log.Error("Failed to Unmarshal:", err)
|
||
return nil, err
|
||
}
|
||
|
||
succActiveAlarmNum := 0
|
||
failActiveAlarmNum := 0
|
||
succClearAlarmNum := 0
|
||
failClearAlarmNum := 0
|
||
|
||
neList := s.neInfoService.SelectList(neModel.NeInfo{}, true, false)
|
||
for _, ne := range neList {
|
||
//log.Debug("ne:", ne)
|
||
|
||
// sql := fmt.Sprintf("select * from ne_state where ne_type='%s' and ne_id='%s' order by `timestamp` desc limit 1", ne.NeType, ne.NeId)
|
||
// log.Debug("SQL:", sql)
|
||
// neState, err := dborm.XormGetDataBySQL(sql)
|
||
// if err != nil {
|
||
// log.Error("Failed to get ne_state:", err)
|
||
// continue
|
||
// }
|
||
// if len(*neState) == 0 {
|
||
// log.Warn("Not found record in ne_state:")
|
||
// //continue
|
||
// }
|
||
//log.Debug("neState:", *neState)
|
||
|
||
// params := "10000"
|
||
|
||
// alarmDefine, err := dborm.XormGetAlarmDefine(params)
|
||
// if err != nil {
|
||
// log.Error("Failed to get alarm_define:", err)
|
||
// continue
|
||
// } else if alarmDefine == nil {
|
||
// log.Error("Not found data from alarm_define")
|
||
// continue
|
||
// }
|
||
|
||
// log.Debug("alarmDefine:", alarmDefine)
|
||
|
||
// 是否存在告警
|
||
sql := fmt.Sprintf("select * from alarm where alarm_id = '%s' and ne_type='%s' and ne_id = '%s' order by event_time desc limit 1",
|
||
alarmDefine.AlarmID, ne.NeType, ne.RmUID)
|
||
alarm, err := datasource.RawDB("", sql, nil)
|
||
if err != nil {
|
||
continue
|
||
}
|
||
alarmStatus := "0"
|
||
if len(alarm) > 0 {
|
||
alarmStatus = fmt.Sprint(alarm[0]["alarm_status"])
|
||
}
|
||
|
||
changeTime := time.UnixMilli(ne.UpdateTime)
|
||
// 检查状态
|
||
isOnline := false
|
||
if ne.ServerState != nil {
|
||
isOnline = parse.Boolean(ne.ServerState["online"])
|
||
}
|
||
|
||
// 在线且状态为活动告警
|
||
if isOnline && alarmStatus == "1" {
|
||
if len(alarm) == 0 {
|
||
continue
|
||
}
|
||
if alarmStatus == "0" {
|
||
continue
|
||
}
|
||
|
||
// clear alarm, todo
|
||
var alarmSeq int = 1
|
||
threshold := strconv.FormatInt(alarmDefine.Threshold, 10)
|
||
SpecificProblem := strings.ReplaceAll(alarmDefine.SpecificProblem, "{threshold}", threshold)
|
||
timeStr := date.ParseDateToStr(changeTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||
locationInfo := fmt.Sprintf("SystemManagement.State: NE heartbeat timestamp=%s,threshold=%v", timeStr, alarmDefine.Threshold)
|
||
alarmData := &Alarm{
|
||
AlarmSeq: alarmSeq,
|
||
AlarmId: alarmDefine.AlarmID,
|
||
NeId: ne.RmUID,
|
||
NeType: ne.NeType,
|
||
NeName: ne.NeName,
|
||
Province: ne.Province,
|
||
PVFlag: ne.PvFlag,
|
||
AlarmCode: alarmDefine.AlarmCode,
|
||
AlarmTitle: alarmDefine.AlarmTitle,
|
||
AlarmType: alarmDefine.AlarmType,
|
||
AlarmStatus: fm.AlarmStatusClear,
|
||
OrigSeverity: alarmDefine.OrigSeverity,
|
||
ObjectUid: alarmDefine.ObjectUID,
|
||
ObjectName: alarmDefine.ObjectName,
|
||
ObjectType: alarmDefine.ObjectType,
|
||
LocationInfo: locationInfo,
|
||
SpecificProblem: SpecificProblem,
|
||
SpecificProblemID: alarmDefine.SpecificProblemID,
|
||
AddInfo: alarmDefine.AddInfo,
|
||
EventTime: time.Now().Local().Format(time.RFC3339),
|
||
}
|
||
|
||
alarmArray := &[]Alarm{*alarmData}
|
||
body, _ := json.Marshal(alarmArray)
|
||
//log.Debug("body: ", string(body))
|
||
|
||
var response *resty.Response
|
||
requestURI := fmt.Sprintf("/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", ne.NeType)
|
||
//restHost := fmt.Sprintf("http://127.0.0.1:%d", config.GetYamlConfig().Rest[0].Port)
|
||
restHost := config.GetOMCHostUrl()
|
||
requestURL := fmt.Sprintf("%s%s", restHost, requestURI)
|
||
log.Debug("requestURL: POST ", requestURL)
|
||
response, err = client.R().
|
||
EnableTrace().
|
||
//SetHeaders(map[string]string{tokenConst.HEADER_KEY: r.Header.Get(tokenConst.HEADER_KEY)}).
|
||
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
|
||
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
|
||
SetBody(body).
|
||
Post(requestURL)
|
||
if err != nil {
|
||
log.Error("Failed to post:", err)
|
||
failClearAlarmNum++
|
||
continue
|
||
}
|
||
|
||
log.Debug("StatusCode: ", response.StatusCode())
|
||
switch response.StatusCode() {
|
||
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
||
log.Debug("response body:", string(response.Body()))
|
||
body := new(map[string]interface{})
|
||
_ = json.Unmarshal(response.Body(), &body)
|
||
succClearAlarmNum++
|
||
default:
|
||
log.Debug("response body:", string(response.Body()))
|
||
body := new(map[string]interface{})
|
||
_ = json.Unmarshal(response.Body(), &body)
|
||
failClearAlarmNum++
|
||
}
|
||
}
|
||
|
||
// 不在线且状态为清除告警
|
||
if !isOnline && alarmStatus == "0" {
|
||
var alarmSeq int = 1
|
||
threshold := strconv.FormatInt(alarmDefine.Threshold, 10)
|
||
SpecificProblem := strings.ReplaceAll(alarmDefine.SpecificProblem, "{threshold}", threshold)
|
||
timeStr := date.ParseDateToStr(changeTime, date.YYYY_MM_DDTHH_MM_SSZ)
|
||
locationInfo := fmt.Sprintf("SystemManagement.State: NE heartbeat timestamp=%s threshold=%v", timeStr, alarmDefine.Threshold)
|
||
alarmData := &Alarm{
|
||
AlarmSeq: alarmSeq,
|
||
AlarmId: alarmDefine.AlarmID,
|
||
NeId: ne.RmUID,
|
||
NeType: ne.NeType,
|
||
NeName: ne.NeName,
|
||
Province: ne.Province,
|
||
PVFlag: ne.PvFlag,
|
||
AlarmCode: alarmDefine.AlarmCode,
|
||
AlarmTitle: alarmDefine.AlarmTitle,
|
||
AlarmType: alarmDefine.AlarmType,
|
||
AlarmStatus: fm.AlarmStatusActive,
|
||
OrigSeverity: alarmDefine.OrigSeverity,
|
||
ObjectUid: alarmDefine.ObjectUID,
|
||
ObjectName: alarmDefine.ObjectName,
|
||
ObjectType: alarmDefine.ObjectType,
|
||
LocationInfo: locationInfo,
|
||
SpecificProblem: SpecificProblem,
|
||
SpecificProblemID: alarmDefine.SpecificProblemID,
|
||
AddInfo: alarmDefine.AddInfo,
|
||
EventTime: time.Now().Local().Format(time.RFC3339),
|
||
}
|
||
|
||
alarmArray := &[]Alarm{*alarmData}
|
||
body, _ := json.Marshal(alarmArray)
|
||
//log.Debug("body: ", string(body))
|
||
|
||
var response *resty.Response
|
||
requestURI := fmt.Sprintf("/api/rest/faultManagement/v1/elementType/%s/objectType/alarms", ne.NeType)
|
||
//restHost := fmt.Sprintf("http://127.0.0.1:%d", config.GetYamlConfig().Rest[0].Port)
|
||
restHost := config.GetOMCHostUrl()
|
||
requestURL := fmt.Sprintf("%s%s", restHost, requestURI)
|
||
log.Debug("requestURL: POST ", requestURL)
|
||
response, err = client.R().
|
||
EnableTrace().
|
||
SetHeaders(map[string]string{"User-Agent": config.GetDefaultUserAgent()}).
|
||
SetHeaders(map[string]string{"Content-Type": "application/json;charset=UTF-8"}).
|
||
SetBody(body).
|
||
Post(requestURL)
|
||
if err != nil {
|
||
log.Error("Failed to post:", err)
|
||
failActiveAlarmNum++
|
||
continue
|
||
}
|
||
|
||
log.Debug("StatusCode: ", response.StatusCode())
|
||
switch response.StatusCode() {
|
||
case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
|
||
log.Debug("response body:", string(response.Body()))
|
||
body := new(map[string]interface{})
|
||
_ = json.Unmarshal(response.Body(), &body)
|
||
succActiveAlarmNum++
|
||
default:
|
||
log.Debug("response body:", string(response.Body()))
|
||
body := new(map[string]interface{})
|
||
_ = json.Unmarshal(response.Body(), &body)
|
||
failActiveAlarmNum++
|
||
}
|
||
}
|
||
}
|
||
|
||
// 返回结果,用于记录执行结果
|
||
return map[string]any{
|
||
"succActiveAlarmNum": succActiveAlarmNum,
|
||
"failActiveAlarmNum": failActiveAlarmNum,
|
||
"succClearAlarmNum": succClearAlarmNum,
|
||
"failClearAlarmNum": failClearAlarmNum,
|
||
}, nil
|
||
}
|