diff --git a/internal/context/ue.go b/internal/context/ue.go index cb979ea..590e7dc 100644 --- a/internal/context/ue.go +++ b/internal/context/ue.go @@ -36,6 +36,9 @@ type UeContext struct { AppSessionIdStore *AppSessionIdStore PolicyDataSubscriptionStore *models.PolicyDataSubscription PolicyDataChangeStore *models.PolicyDataChangeNotification + + // ChargingRatingGroup + RatingGroupData map[string][]int32 // use smPolicyId(ue.Supi-pduSessionId) as key } type UeAMPolicyData struct { diff --git a/internal/sbi/producer/smpolicy.go b/internal/sbi/producer/smpolicy.go index 41aa11b..2a38936 100644 --- a/internal/sbi/producer/smpolicy.go +++ b/internal/sbi/producer/smpolicy.go @@ -270,13 +270,16 @@ func createSMPolicyProcedure(request models.SmPolicyContextData) ( } util.SetPccRuleRelatedData(&decision, pcc, nil, nil, chgData, nil) - chargingBsonM := bson.M{ - "ratingGroup": chgData.RatingGroup, - } - logger.SmPolicyLog.Traceln("put ratingGroup to MongoDB") - if _, err = mongoapi.RestfulAPIPutOne(chargingDataColl, filterCharging, chargingBsonM, queryStrength); err != nil { + chargingInterface["ratingGroup"] = chgData.RatingGroup + logger.SmPolicyLog.Tracef("put ratingGroup[%+v] for [%+v] to MongoDB", chgData.RatingGroup, ue.Supi) + if _, err = mongoapi.RestfulAPIPutOne( + chargingDataColl, chargingInterface, chargingInterface, queryStrength); err != nil { logger.SmPolicyLog.Errorf("Fail to put charging data to mongoDB err: %+v", err) } + if ue.RatingGroupData == nil { + ue.RatingGroupData = make(map[string][]int32) + } + ue.RatingGroupData[smPolicyID] = append(ue.RatingGroupData[smPolicyID], chgData.RatingGroup) smPolicyData.ChargingIdGenerator++ } @@ -329,8 +332,10 @@ func createSMPolicyProcedure(request models.SmPolicyContextData) ( }, "") filterCharging := bson.M{ - "ueId": ue.Supi, "snssai": util.SnssaiModelsToHex(*request.SliceInfo), - "dnn": request.Dnn, "filter": val, + "ueId": ue.Supi, + "snssai": util.SnssaiModelsToHex(*request.SliceInfo), + "dnn": request.Dnn, + "filter": val, } var chargingInterface map[string]interface{} chargingInterface, err = mongoapi.RestfulAPIGetOne(chargingDataColl, filterCharging, 2) @@ -363,15 +368,19 @@ func createSMPolicyProcedure(request models.SmPolicyContextData) ( decision.ChgDecs = make(map[string]*models.ChargingData) } - chargingBsonM := bson.M{ - "ratingGroup": chgData.RatingGroup, - } - if _, err = mongoapi.RestfulAPIPutOne(chargingDataColl, filterCharging, chargingBsonM, queryStrength); err != nil { + chargingInterface["ratingGroup"] = chgData.RatingGroup + logger.SmPolicyLog.Tracef("put ratingGroup[%+v] for [%+v] to MongoDB", chgData.RatingGroup, ue.Supi) + if _, err = mongoapi.RestfulAPIPutOne( + chargingDataColl, chargingInterface, chargingInterface, queryStrength); err != nil { logger.SmPolicyLog.Errorf("Fail to put charging data to mongoDB err: %+v", err) } else { util.SetPccRuleRelatedData(&decision, pccRule, nil, nil, chgData, nil) smPolicyData.ChargingIdGenerator++ } + if ue.RatingGroupData == nil { + ue.RatingGroupData = make(map[string][]int32) + } + ue.RatingGroupData[smPolicyID] = append(ue.RatingGroupData[smPolicyID], chgData.RatingGroup) } qosRef := strconv.Itoa(int(flowRule["qosRef"].(float64))) util.SetPccRuleRelatedByQosRef(&decision, pccRule, qosRef) @@ -542,6 +551,19 @@ func deleteSmPolicyContextProcedure(smPolicyID string) *models.ProblemDetails { logger.SmPolicyLog.Tracef("SMPolicy[%s] DELETE Related AppSession[%s]", smPolicyID, appSessionID) } } + + for _, ratingGroup := range ue.RatingGroupData[smPolicyID] { + pcfSelf.RatingGroupIdGenerator.FreeID(int64(ratingGroup)) + + filterCharging := bson.M{ + "ratingGroup": ratingGroup, + } + err := mongoapi.RestfulAPIDeleteMany(chargingDataColl, filterCharging) + if err != nil { + logger.SmPolicyLog.Errorf("Fail to delete charging data, ratingGroup: %+v, err: %+v", ratingGroup, err) + } + } + delete(ue.RatingGroupData, smPolicyID) return nil }