From cc4428ed409eb35f0787399600e864eeac73acd5 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Mon, 15 Jul 2024 17:03:17 +0800 Subject: [PATCH] opt: ueInfo and ueNum support neid is empty --- features/ue/ue.go | 303 +++++++++++------- .../network_element/repository/ne_info.go | 3 + .../repository/ne_info.impl.go | 13 + .../network_element/service/ne_info.impl.go | 23 ++ 4 files changed, 222 insertions(+), 120 deletions(-) diff --git a/features/ue/ue.go b/features/ue/ue.go index 8b11ee7b..881b0cb4 100644 --- a/features/ue/ue.go +++ b/features/ue/ue.go @@ -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) } } diff --git a/src/modules/network_element/repository/ne_info.go b/src/modules/network_element/repository/ne_info.go index c09d034a..c5e18bba 100644 --- a/src/modules/network_element/repository/ne_info.go +++ b/src/modules/network_element/repository/ne_info.go @@ -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 diff --git a/src/modules/network_element/repository/ne_info.impl.go b/src/modules/network_element/repository/ne_info.impl.go index 631a7e6a..2559bd84 100644 --- a/src/modules/network_element/repository/ne_info.impl.go +++ b/src/modules/network_element/repository/ne_info.impl.go @@ -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 { // 查询条件拼接 diff --git a/src/modules/network_element/service/ne_info.impl.go b/src/modules/network_element/service/ne_info.impl.go index 51497725..17c31e12 100644 --- a/src/modules/network_element/service/ne_info.impl.go +++ b/src/modules/network_element/service/ne_info.impl.go @@ -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