opt: ueInfo and ueNum support neid is empty

This commit is contained in:
2024-07-15 17:03:17 +08:00
parent d3657f8a8a
commit cc4428ed40
4 changed files with 222 additions and 120 deletions

View File

@@ -15,16 +15,12 @@ import (
"be.ems/lib/services"
"be.ems/restagent/config"
tokenConst "be.ems/src/framework/constants/token"
"be.ems/src/modules/network_element/model"
neService "be.ems/src/modules/network_element/service"
"github.com/go-resty/resty/v2"
"github.com/gorilla/mux"
)
// SmfUENum SMF在线用户数
type SmfUENum struct {
UENum int `json:"ueNum"` // 当前在线用户数
}
// N3iwfUEInfo N3IWF在线用户信息
type N3iwfUEInfo struct {
IMSI string `json:"imsi"`
@@ -206,35 +202,6 @@ func GetSubscriptionsFromNSSF(w http.ResponseWriter, r *http.Request) {
}
}
// ImsUEInfo IMS在线用户信息
type ImsUEInfo struct {
IMSI string `json:"imsi"`
MSISDN string `json:"msisdn"`
IMPU string `json:"impu"`
Barring int `json:"barring"`
RegState int `json:"regState"`
Activetime string `json:"activeTime"`
}
// ImsUEInfo IMS在线用户信息
type TenantImsUEInfo struct {
IMSI string `json:"imsi"`
MSISDN string `json:"msisdn"`
IMPU string `json:"impu"`
Barring int `json:"barring"`
RegState int `json:"regState"`
Activetime string `json:"activeTime"`
TenantName string `json:"tenantName"`
}
type ImsUEInfoResponse struct {
Data []ImsUEInfo `json:"data"`
}
type TenantImsUEInfoResponse struct {
Data []TenantImsUEInfo `json:"data"`
}
// SmfUEInfo SMF在线用户信息
type SmfUEInfo struct {
IMSI string `json:"imsi"`
@@ -255,6 +222,8 @@ type SmfUEInfo struct {
}
type TenantUEInfo struct {
NeType string `json:"neType"`
NeID string `json:"neId"`
IMSI string `json:"imsi"`
MSISDN string `json:"msisdn"`
RatType string `json:"ratType"`
@@ -287,21 +256,28 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
neId := ctx.GetQuery(r, "neId")
neType := "smf"
if neType == "" || neId == "" {
log.Error("elementTypeValue/neId is empty")
services.ResponseNotFound404UriNotExist(w, r)
return
}
// if neType == "" || neId == "" {
// log.Error("elementTypeValue/neId is empty")
// services.ResponseNotFound404UriNotExist(w, r)
// return
// }
var tenantName string
tenantNames := services.GetParamsArrByName("tenantName", r)
if len(tenantNames) > 0 {
tenantName = tenantNames[0]
}
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
var neInfos []model.NeInfo
if neId != "" {
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
neInfos = append(neInfos, neInfo)
} else {
neInfos = neService.NewNeInfoImpl.SelectNeInfoByNeType(neType)
}
var response services.MapResponse
if neInfo.NeId == neId && neInfo.NeId != "" {
var response UEInfoResponse
for _, neInfo := range neInfos {
//if neInfo.NeId == neId && neInfo.NeId != "" {
requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI)
//requestURI2NF := "http://127.0.0.1:4523/m1/3157310-1528434-default/api/rest/ueManagement/v1/elementType/smf/objectType/ueInfo?apifoxApiId=128609449"
log.Debug("requestURI2NF:", requestURI2NF)
@@ -312,8 +288,9 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
Get(requestURI2NF)
if err != nil {
log.Error("Failed to Get from NF:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
// services.ResponseInternalServerError500ProcessError(w, err)
// return
continue
}
// multi-tenancy solution
var tenantID, where string
@@ -329,20 +306,23 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
tenantName, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "tenant_name", where)
}
if tenantID == "" {
var response UEInfoResponse
_ = json.Unmarshal(resp.Body(), &response)
for i := 0; i < len(response.Data); i++ {
where = fmt.Sprintf("status='1' and tenancy_type='IMSI' and '%s' like tenancy_key", response.Data[i].IMSI[5:])
var ueInfos UEInfoResponse
_ = json.Unmarshal(resp.Body(), &ueInfos)
for i := 0; i < len(ueInfos.Data); i++ {
where = fmt.Sprintf("status='1' and tenancy_type='IMSI' and '%s' like tenancy_key", ueInfos.Data[i].IMSI[5:])
tenantID, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "parent_id", where)
where = fmt.Sprintf("status='1' and tenant_id='%s'", tenantID)
tenantName, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "tenant_name", where)
log.Tracef("tenantName: %s tenantID: %s", tenantName, tenantID)
response.Data[i].TenantName = tenantName
ueInfos.Data[i].NeType = strings.ToUpper(neType)
ueInfos.Data[i].NeID = neInfo.NeId
ueInfos.Data[i].TenantName = tenantName
response.Data = append(response.Data, ueInfos.Data[i])
}
services.ResponseWithJson(w, resp.StatusCode(), &response)
return
// services.ResponseWithJson(w, resp.StatusCode(), &response)
// return
} else {
var tenantUEInfos []TenantUEInfo
//var tenantUEInfos []TenantUEInfo
var ueInfos UEInfoResponse
log.Trace("body:", string(resp.Body()))
_ = json.Unmarshal(resp.Body(), &ueInfos)
@@ -353,40 +333,80 @@ func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
where = fmt.Sprintf("status='1' and parent_id='%s' and tenancy_type='IMSI' and '%s' like tenancy_key", tenantID, n.IMSI[5:])
has, err := dborm.XormExistTableOne("sys_tenant", where)
if err == nil && has {
n.NeType = strings.ToUpper(neType)
n.NeID = neInfo.NeId
n.TenantName = tenantName
tenantUEInfos = append(tenantUEInfos, n)
response.Data = append(response.Data, n)
}
}
var response UEInfoResponse
response.Data = tenantUEInfos
services.ResponseWithJson(w, resp.StatusCode(), &response)
return
// var response UEInfoResponse
// response.Data = tenantUEInfos
// services.ResponseWithJson(w, resp.StatusCode(), &response)
// return
}
}
services.ResponseWithJson(w, http.StatusOK, response)
}
// ImsUEInfo IMS在线用户信息
type ImsUEInfo struct {
IMSI string `json:"imsi"`
MSISDN string `json:"msisdn"`
IMPU string `json:"impu"`
Barring int `json:"barring"`
RegState int `json:"regState"`
Activetime string `json:"activeTime"`
}
// ImsUEInfo IMS在线用户信息
type TenantImsUEInfo struct {
NeType string `json:"neType"`
NeID string `json:"neId"`
IMSI string `json:"imsi"`
MSISDN string `json:"msisdn"`
IMPU string `json:"impu"`
Barring int `json:"barring"`
RegState int `json:"regState"`
Activetime string `json:"activeTime"`
TenantName string `json:"tenantName"`
}
type ImsUEInfoResponse struct {
Data []ImsUEInfo `json:"data"`
}
type TenantImsUEInfoResponse struct {
Data []TenantImsUEInfo `json:"data"`
}
// Get UEInfo from NF/NFs, IMS Online users
func GetIMSUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
log.Debug("GetUEInfoFromNF processing... ")
log.Debug("GetIMSUEInfoFromNF processing... ")
neId := ctx.GetQuery(r, "neId")
neType := "ims"
if neType == "" || neId == "" {
log.Error("elementTypeValue/neId is empty")
services.ResponseNotFound404UriNotExist(w, r)
return
}
// if neType == "" || neId == "" {
// log.Error("elementTypeValue/neId is empty")
// services.ResponseNotFound404UriNotExist(w, r)
// return
// }
var tenantName string
tenantNames := services.GetParamsArrByName("tenantName", r)
if len(tenantNames) > 0 {
tenantName = tenantNames[0]
}
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
var neInfos []model.NeInfo
if neId != "" {
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
neInfos = append(neInfos, neInfo)
} else {
neInfos = neService.NewNeInfoImpl.SelectNeInfoByNeType(neType)
}
var response services.MapResponse
if neInfo.NeId == neId && neInfo.NeId != "" {
var response TenantImsUEInfoResponse
for _, neInfo := range neInfos {
requestURI2NF := fmt.Sprintf("http://%s:%v%s", neInfo.IP, neInfo.Port, r.RequestURI)
//requestURI2NF := "http://127.0.0.1:4523/m1/3157310-1528434-default/api/rest/ueManagement/v1/elementType/ims/objectType/ueInfo?apifoxApiId=128609458"
log.Debug("requestURI2NF:", requestURI2NF)
@@ -397,8 +417,9 @@ func GetIMSUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
Get(requestURI2NF)
if err != nil {
log.Error("Failed to Get from NF:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
// services.ResponseInternalServerError500ProcessError(w, err)
// return
continue
}
// multi-tenancy solution
var tenantID, where string
@@ -414,20 +435,23 @@ func GetIMSUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
tenantName, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "tenant_name", where)
}
if tenantID == "" {
var response TenantImsUEInfoResponse
_ = json.Unmarshal(resp.Body(), &response)
var ueInfos TenantImsUEInfoResponse
_ = json.Unmarshal(resp.Body(), &ueInfos)
for i := 0; i < len(response.Data); i++ {
where = fmt.Sprintf("status='1' and tenancy_type='IMSI' and '%s' like tenancy_key", response.Data[i].IMSI)
where = fmt.Sprintf("status='1' and tenancy_type='IMSI' and '%s' like tenancy_key", ueInfos.Data[i].IMSI)
tenantID, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "parent_id", where)
where = fmt.Sprintf("status='1' and tenant_id='%s'", tenantID)
tenantName, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "tenant_name", where)
log.Tracef("tenantName: %s tenantID: %s", tenantName, tenantID)
response.Data[i].TenantName = tenantName
ueInfos.Data[i].NeType = strings.ToUpper(neType)
ueInfos.Data[i].NeID = neInfo.NeId
ueInfos.Data[i].TenantName = tenantName
response.Data = append(response.Data, ueInfos.Data[i])
}
services.ResponseWithJson(w, resp.StatusCode(), &response)
return
// services.ResponseWithJson(w, resp.StatusCode(), &response)
// return
} else {
var tenantUEInfos []TenantImsUEInfo
//var tenantUEInfos []TenantImsUEInfo
var ueInfos TenantImsUEInfoResponse
log.Trace("body:", string(resp.Body()))
_ = json.Unmarshal(resp.Body(), &ueInfos)
@@ -438,14 +462,16 @@ func GetIMSUEInfoFromNF(w http.ResponseWriter, r *http.Request) {
where = fmt.Sprintf("status='1' and parent_id='%s' and tenancy_type='IMSI' and '%s' like tenancy_key", tenantID, n.IMSI)
has, err := dborm.XormExistTableOne("sys_tenant", where)
if err == nil && has {
n.NeType = strings.ToUpper(neType)
n.NeID = neInfo.NeId
n.TenantName = tenantName
tenantUEInfos = append(tenantUEInfos, n)
response.Data = append(response.Data, n)
}
}
var response TenantImsUEInfoResponse
response.Data = tenantUEInfos
services.ResponseWithJson(w, resp.StatusCode(), &response)
return
// var response TenantImsUEInfoResponse
// response.Data = tenantUEInfos
// services.ResponseWithJson(w, resp.StatusCode(), &response)
// return
}
}
services.ResponseWithJson(w, http.StatusOK, response)
@@ -664,6 +690,22 @@ func DeletePCFUserInfo(w http.ResponseWriter, r *http.Request) {
}
}
// SmfUENum SMF在线用户数
// type SmfUENum struct {
// UENum int `json:"ueNum"` // 当前在线用户数
// }
// SmfUENum SMF在线用户数
type UENumInfo struct {
NeType string `json:"neType"`
NeId string `json:"neId"`
UENum int `json:"ueNum"` // 当前在线用户数
}
type UENumResponse struct {
UENums []UENumInfo
}
// Get UEInfo from SMF
func GetUENumFromNF(w http.ResponseWriter, r *http.Request) {
log.Info("GetUENumFromNF processing... ")
@@ -675,14 +717,15 @@ func GetUENumFromNF(w http.ResponseWriter, r *http.Request) {
return
}
//neTypeLower := strings.ToLower(neType)
var neId string
neIds := services.GetParamsArrByName("neId", r)
if len(neIds) == 1 {
neId = neIds[0]
} else {
services.ResponseNotFound404UriNotExist(w, r)
return
}
//var neId string
//neIds := services.GetParamsArrByName("neId", r)
neId := ctx.GetQuery(r, "neId")
// if len(neIds) == 1 {
// neId = neIds[0]
// } else {
// services.ResponseNotFound404UriNotExist(w, r)
// return
// }
// token, err := services.CheckFrontValidRequest(w, r)
// if err != nil {
@@ -691,40 +734,60 @@ func GetUENumFromNF(w http.ResponseWriter, r *http.Request) {
// }
// log.Debug("token:", 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)
// 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)
hostUri := fmt.Sprintf("http://%s:%v", neInfo.Ip, neInfo.Port)
requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI)
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
var neInfos []model.NeInfo
if neId != "" {
neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId)
neInfos = append(neInfos, neInfo)
} else {
var response services.MapResponse
_ = json.Unmarshal(resp.Body(), &response)
services.ResponseWithJson(w, resp.StatusCode(), response)
return
neInfos = neService.NewNeInfoImpl.SelectNeInfoByNeType(neType)
}
var response []UENumInfo
for _, neInfo := range neInfos {
hostUri := fmt.Sprintf("http://%s:%v", neInfo.IP, neInfo.Port)
requestURI2NF := fmt.Sprintf("%s%s", hostUri, r.RequestURI)
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("failed to get UENum from NF:", err)
services.ResponseInternalServerError500ProcessError(w, err)
return
} else {
var ueNum UENumInfo
_ = json.Unmarshal(resp.Body(), &ueNum)
ueNum.NeType = strings.ToUpper(neType)
ueNum.NeId = neInfo.NeId
response = append(response, ueNum)
// services.ResponseWithJson(w, resp.StatusCode(), response)
// return
}
}
if neId != "" {
services.ResponseWithJson(w, http.StatusOK, response[0])
} else {
services.ResponseWithJson(w, http.StatusOK, response)
}
}

View File

@@ -9,6 +9,9 @@ type INeInfo interface {
// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息
SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeInfo
// SelectNeInfoByNeType 通过ne_type和ne_id查询网元信息
SelectNeInfoByNeType(neType string) []model.NeInfo
// SelectPage 根据条件分页查询
SelectPage(query map[string]any) map[string]any

View File

@@ -124,6 +124,19 @@ func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeIn
return model.NeInfo{}
}
// SelectNeInfoByNeTypeAndNeID 通过ne_type和ne_id查询网元信息
func (r *NeInfoImpl) SelectNeInfoByNeType(neType string) []model.NeInfo {
querySql := r.selectSql + " where ne_type = ?"
results, err := datasource.RawDB("", querySql, []any{neType})
if err != nil {
logger.Errorf("query err => %v", err)
return []model.NeInfo{}
}
// 转换实体
rows := r.convertResultRows(results)
return rows
}
// SelectPage 根据条件分页查询
func (r *NeInfoImpl) SelectPage(query map[string]any) map[string]any {
// 查询条件拼接

View File

@@ -53,6 +53,29 @@ func (r *NeInfoImpl) SelectNeInfoByNeTypeAndNeID(neType, neID string) model.NeIn
return neInfo
}
// SelectNeInfoByNeTyp 通过ne_type查询网元信息
func (r *NeInfoImpl) SelectNeInfoByNeType(neType string) []model.NeInfo {
var neInfos []model.NeInfo
key := fmt.Sprintf("%s%s:", cachekey.NE_KEY, strings.ToUpper(neType))
jsonStr, _ := redis.Get("", key)
if len(jsonStr) > 7 {
err := json.Unmarshal([]byte(jsonStr), &neInfos)
if err != nil {
neInfos = []model.NeInfo{}
}
} else {
neInfos = r.neInfoRepository.SelectNeInfoByNeType(neType)
for _, neInfo := range neInfos {
if neInfo.ID != "" {
redis.Del("", key)
values, _ := json.Marshal(neInfos)
redis.Set("", key, string(values))
}
}
}
return neInfos
}
// RefreshByNeTypeAndNeID 通过ne_type和ne_id刷新redis中的缓存
func (r *NeInfoImpl) RefreshByNeTypeAndNeID(neType, neID string) model.NeInfo {
var neInfo model.NeInfo