diff --git a/features/ue/ue.go b/features/ue/ue.go index 881b0cb4..1472e2ab 100644 --- a/features/ue/ue.go +++ b/features/ue/ue.go @@ -251,7 +251,7 @@ type UEInfoResponse struct { } // Get UEInfo from NF/NFs, SMF Online users -func GetUEInfoFromNF(w http.ResponseWriter, r *http.Request) { +func GetSMFUEInfoFromNF(w http.ResponseWriter, r *http.Request) { log.Debug("GetUEInfoFromNF processing... ") neId := ctx.GetQuery(r, "neId") @@ -477,6 +477,105 @@ func GetIMSUEInfoFromNF(w http.ResponseWriter, r *http.Request) { services.ResponseWithJson(w, http.StatusOK, response) } +// Get UEInfo from NF/NFs, PCF Online users +func GetPCFUEInfoFromNF(w http.ResponseWriter, r *http.Request) { + log.Debug("GetUEInfoFromNF processing... ") + + neId := ctx.GetQuery(r, "neId") + neType := "pcf" + // 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] + } + + var neInfos []model.NeInfo + if neId != "" { + neInfo := neService.NewNeInfoImpl.SelectNeInfoByNeTypeAndNeID(neType, neId) + neInfos = append(neInfos, neInfo) + } else { + neInfos = neService.NewNeInfoImpl.SelectNeInfoByNeType(neType) + } + + 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) + resp, err := client.R(). + EnableTrace(). + 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 from NF:", err) + // services.ResponseInternalServerError500ProcessError(w, err) + // return + continue + } + // multi-tenancy solution + var tenantID, where string + //var cols []string + if tenantName != "" { + where = fmt.Sprintf("status='1' and tenant_name='%s'", tenantName) + tenantID, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "tenant_id", where) + } else { + userName := ctx.LoginUserToUserName(r) + where = fmt.Sprintf("status='1' and user_name='%s'", userName) + tenantID, _ = dborm.XormGetSingleColStringByWhere("sys_user", "tenant_id", where) + where = fmt.Sprintf("status='1' and tenant_id='%s'", tenantID) + tenantName, _ = dborm.XormGetSingleColStringByWhere("sys_tenant", "tenant_name", where) + } + if tenantID == "" { + 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) + 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 + } else { + //var tenantUEInfos []TenantUEInfo + var ueInfos UEInfoResponse + log.Trace("body:", string(resp.Body())) + _ = json.Unmarshal(resp.Body(), &ueInfos) + log.Trace("ueInfos:", ueInfos) + for _, n := range ueInfos.Data { + log.Trace("tenantID, n.IMSI[5:]:", tenantID, n.IMSI[5:]) + // "imsi": "imsi-460000100029999", + 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 + response.Data = append(response.Data, n) + } + } + // var response UEInfoResponse + // response.Data = tenantUEInfos + // services.ResponseWithJson(w, resp.StatusCode(), &response) + // return + } + } + + services.ResponseWithJson(w, http.StatusOK, response) +} + // POST PCF User Info from NF/NFs func PostPCFUserInfo(w http.ResponseWriter, r *http.Request) { log.Info("PostPCFUserInfo processing... ") diff --git a/lib/routes/routes.go b/lib/routes/routes.go index 885fb977..84b757a3 100644 --- a/lib/routes/routes.go +++ b/lib/routes/routes.go @@ -239,16 +239,16 @@ func init() { Register("GET", aaaa.CustomUriAAAASSO, aaaa.GetSSOFromAAAA, nil) // UEInfo: SMF - Register("GET", ue.UriSMFUEInfo, ue.GetUEInfoFromNF, nil) - Register("GET", ue.CustomUriSMFUEInfo, ue.GetUEInfoFromNF, nil) + Register("GET", ue.UriSMFUEInfo, ue.GetSMFUEInfoFromNF, nil) + Register("GET", ue.CustomUriSMFUEInfo, ue.GetSMFUEInfoFromNF, nil) // UEInfo: IMS Register("GET", ue.UriIMSUEInfo, ue.GetIMSUEInfoFromNF, nil) Register("GET", ue.CustomUriIMSUEInfo, ue.GetIMSUEInfoFromNF, nil) // UEInfo: PCF - Register("GET", ue.UriPCFUser, ue.GetUEInfoFromNF, nil) - Register("GET", ue.CustomUriPCFUser, ue.GetUEInfoFromNF, nil) + Register("GET", ue.UriPCFUser, ue.GetPCFUEInfoFromNF, nil) + Register("GET", ue.CustomUriPCFUser, ue.GetPCFUEInfoFromNF, nil) Register("POST", ue.UriPCFUser, ue.PostPCFUserInfo, nil) Register("POST", ue.CustomUriPCFUser, ue.PostPCFUserInfo, nil) Register("PUT", ue.UriPCFUser, ue.PutPCFUserInfo, nil)