Improved SessionsV1.ProcessCDR, ChargerS RELEASED in beta

This commit is contained in:
DanB
2018-08-30 19:12:33 +02:00
parent 46b541b65d
commit f6f698a2b0
7 changed files with 194 additions and 31 deletions

View File

@@ -76,3 +76,11 @@ func (self *CdrsV1) RateCDRs(attrs utils.AttrRateCdrs, reply *string) error {
func (self *CdrsV1) StoreSMCost(attr engine.AttrCDRSStoreSMCost, reply *string) error {
return self.CdrSrv.V1StoreSMCost(attr, reply)
}
func (self *CdrsV1) CountCDRs(args utils.RPCCDRsFilter, reply *int64) error {
return self.CdrSrv.V1CountCDRs(args, reply)
}
func (self *CdrsV1) GetCDRs(args utils.RPCCDRsFilter, reply *[]*engine.CDR) error {
return self.CdrSrv.V1GetCDRs(args, reply)
}

View File

@@ -144,7 +144,7 @@ func TestSSv1ItAuth(t *testing.T) {
utils.OriginID: "TestSSv1It1",
utils.RequestType: utils.META_PREPAID,
utils.Account: "1001",
utils.Subject: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC),
utils.Usage: authUsage,
@@ -194,8 +194,8 @@ func TestSSv1ItAuth(t *testing.T) {
utils.Tenant: "cgrates.org",
utils.Category: "call",
utils.ToR: utils.VOICE,
utils.Subject: "1001",
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
"OfficeGroup": "Marketing",
utils.OriginID: "TestSSv1It1",
@@ -228,6 +228,7 @@ func TestSSv1ItAuthWithDigest(t *testing.T) {
utils.OriginID: "TestSSv1It1",
utils.RequestType: utils.META_PREPAID,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC),
utils.Usage: authUsage,
@@ -270,6 +271,7 @@ func TestSSv1ItInitiateSession(t *testing.T) {
utils.OriginID: "TestSSv1It1",
utils.RequestType: utils.META_PREPAID,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC),
utils.AnswerTime: time.Date(2018, time.January, 7, 16, 60, 10, 0, time.UTC),
@@ -301,6 +303,7 @@ func TestSSv1ItInitiateSession(t *testing.T) {
utils.Category: "call",
utils.ToR: utils.VOICE,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
"OfficeGroup": "Marketing",
utils.OriginID: "TestSSv1It1",
@@ -315,6 +318,12 @@ func TestSSv1ItInitiateSession(t *testing.T) {
t.Errorf("expecting: %+v, received: %+v",
utils.ToJSON(eAttrs), utils.ToJSON(rply.Attributes))
}
aSessions := make([]*sessions.ActiveSession, 0)
if err := sSv1BiRpc.Call(utils.SessionSv1GetActiveSessions, nil, &aSessions); err != nil {
t.Error(err)
} else if len(aSessions) != 2 {
t.Errorf("wrong active sessions: %s", utils.ToJSON(aSessions))
}
}
func TestSSv1ItInitiateSessionWithDigest(t *testing.T) {
@@ -333,6 +342,7 @@ func TestSSv1ItInitiateSessionWithDigest(t *testing.T) {
utils.OriginID: "TestSSv1It1",
utils.RequestType: utils.META_PREPAID,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC),
utils.AnswerTime: time.Date(2018, time.January, 7, 16, 60, 10, 0, time.UTC),
@@ -356,6 +366,12 @@ func TestSSv1ItInitiateSessionWithDigest(t *testing.T) {
t.Errorf("expecting: %+v, received: %+v",
utils.ToJSON(eAttrs), utils.ToJSON(rply.AttributesDigest))
}
aSessions := make([]*sessions.ActiveSession, 0)
if err := sSv1BiRpc.Call(utils.SessionSv1GetActiveSessions, nil, &aSessions); err != nil {
t.Error(err)
} else if len(aSessions) != 4 { // the digest has increased the number of sessions
t.Errorf("wrong active sessions: %s", utils.ToJSON(aSessions))
}
}
func TestSSv1ItUpdateSession(t *testing.T) {
@@ -373,6 +389,7 @@ func TestSSv1ItUpdateSession(t *testing.T) {
utils.OriginID: "TestSSv1It1",
utils.RequestType: utils.META_PREPAID,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC),
utils.AnswerTime: time.Date(2018, time.January, 7, 16, 60, 10, 0, time.UTC),
@@ -398,6 +415,7 @@ func TestSSv1ItUpdateSession(t *testing.T) {
utils.Category: "call",
utils.ToR: utils.VOICE,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
"OfficeGroup": "Marketing",
utils.OriginID: "TestSSv1It1",
@@ -415,6 +433,12 @@ func TestSSv1ItUpdateSession(t *testing.T) {
if *rply.MaxUsage != reqUsage {
t.Errorf("Unexpected MaxUsage: %v", rply.MaxUsage)
}
aSessions := make([]*sessions.ActiveSession, 0)
if err := sSv1BiRpc.Call(utils.SessionSv1GetActiveSessions, nil, &aSessions); err != nil {
t.Error(err)
} else if len(aSessions) != 4 { // the digest has increased the number of sessions
t.Errorf("wrong active sessions: %s", utils.ToJSON(aSessions))
}
}
func TestSSv1ItTerminateSession(t *testing.T) {
@@ -431,6 +455,7 @@ func TestSSv1ItTerminateSession(t *testing.T) {
utils.OriginID: "TestSSv1It1",
utils.RequestType: utils.META_PREPAID,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC),
utils.AnswerTime: time.Date(2018, time.January, 7, 16, 60, 10, 0, time.UTC),
@@ -446,6 +471,11 @@ func TestSSv1ItTerminateSession(t *testing.T) {
if rply != utils.OK {
t.Errorf("Unexpected reply: %s", rply)
}
aSessions := make([]*sessions.ActiveSession, 0)
if err := sSv1BiRpc.Call(utils.SessionSv1GetActiveSessions, nil, &aSessions); err == nil ||
err.Error() != utils.ErrNotFound.Error() {
t.Error(err)
}
}
func TestSSv1ItProcessCDR(t *testing.T) {
@@ -459,6 +489,7 @@ func TestSSv1ItProcessCDR(t *testing.T) {
utils.OriginID: "TestSSv1It1",
utils.RequestType: utils.META_PREPAID,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC),
utils.AnswerTime: time.Date(2018, time.January, 7, 16, 60, 10, 0, time.UTC),
@@ -473,8 +504,10 @@ func TestSSv1ItProcessCDR(t *testing.T) {
if rply != utils.OK {
t.Errorf("Unexpected reply: %s", rply)
}
time.Sleep(100 * time.Millisecond)
}
// TestSSv1ItProcessEvent processes individual event and also checks it's CDRs
func TestSSv1ItProcessEvent(t *testing.T) {
initUsage := 5 * time.Minute
args := &sessions.V1ProcessEventArgs{
@@ -491,6 +524,7 @@ func TestSSv1ItProcessEvent(t *testing.T) {
utils.OriginID: "TestSSv1It2",
utils.RequestType: utils.META_PREPAID,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
utils.SetupTime: time.Date(2018, time.January, 7, 16, 60, 0, 0, time.UTC),
utils.AnswerTime: time.Date(2018, time.January, 7, 16, 60, 10, 0, time.UTC),
@@ -522,6 +556,7 @@ func TestSSv1ItProcessEvent(t *testing.T) {
utils.Category: "call",
utils.ToR: utils.VOICE,
utils.Account: "1001",
utils.Subject: "ANY2CNT",
utils.Destination: "1002",
"OfficeGroup": "Marketing",
utils.OriginID: "TestSSv1It2",
@@ -536,6 +571,86 @@ func TestSSv1ItProcessEvent(t *testing.T) {
t.Errorf("expecting: %+v, received: %+v",
utils.ToJSON(eAttrs), utils.ToJSON(rply.Attributes))
}
aSessions := make([]*sessions.ActiveSession, 0)
if err := sSv1BiRpc.Call(utils.SessionSv1GetActiveSessions, nil, &aSessions); err == nil ||
err.Error() != utils.ErrNotFound.Error() {
t.Error(err)
}
var rplyCDR string
if err := sSv1BiRpc.Call(utils.SessionSv1ProcessCDR,
args.CGREvent, &rplyCDR); err != nil {
t.Error(err)
}
if rplyCDR != utils.OK {
t.Errorf("Unexpected reply: %s", rplyCDR)
}
time.Sleep(100 * time.Millisecond)
}
func TestSSv1ItCDRsGetCdrs(t *testing.T) {
var cdrCnt int64
req := utils.AttrGetCdrs{}
if err := sSApierRpc.Call(utils.CdrsV1CountCDRs, req, &cdrCnt); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if cdrCnt != 6 { // 3 for each CDR
t.Error("Unexpected number of CDRs returned: ", cdrCnt)
}
var cdrs []*engine.CDR
args := utils.RPCCDRsFilter{RunIDs: []string{utils.MetaRaw}}
if err := sSApierRpc.Call(utils.CdrsV1GetCDRs, args, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 2 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Cost != -1.0 {
t.Errorf("Unexpected cost for CDR: %f", cdrs[0].Cost)
}
}
args = utils.RPCCDRsFilter{RunIDs: []string{"CustomerCharges"},
OriginIDs: []string{"TestSSv1It1"}}
if err := sSApierRpc.Call(utils.CdrsV1GetCDRs, args, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Cost != 0.198 {
t.Errorf("Unexpected cost for CDR: %f", cdrs[0].Cost)
}
}
args = utils.RPCCDRsFilter{RunIDs: []string{"SupplierCharges"},
OriginIDs: []string{"TestSSv1It1"}}
if err := sSApierRpc.Call(utils.CdrsV1GetCDRs, args, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Cost != 0.102 {
t.Errorf("Unexpected cost for CDR: %f", cdrs[0].Cost)
}
}
args = utils.RPCCDRsFilter{RunIDs: []string{"CustomerCharges"},
OriginIDs: []string{"TestSSv1It2"}}
if err := sSApierRpc.Call(utils.CdrsV1GetCDRs, args, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Cost != 0.099 {
t.Errorf("Unexpected cost for CDR: %f", cdrs[0].Cost)
}
}
args = utils.RPCCDRsFilter{RunIDs: []string{"SupplierCharges"},
OriginIDs: []string{"TestSSv1It2"}}
if err := sSApierRpc.Call(utils.CdrsV1GetCDRs, args, &cdrs); err != nil {
t.Error("Unexpected error: ", err.Error())
} else if len(cdrs) != 1 {
t.Error("Unexpected number of CDRs returned: ", len(cdrs))
} else {
if cdrs[0].Cost != 0.051 {
t.Errorf("Unexpected cost for CDR: %f", cdrs[0].Cost)
}
}
}
func TestSSv1ItStopCgrEngine(t *testing.T) {

View File

@@ -33,6 +33,9 @@
"cdrs": {
"enabled": true,
"chargers_conns":[
{"address": "127.0.0.1:2012", "transport":"*json"},
],
},

View File

@@ -85,77 +85,77 @@ func TestFieldAsString(t *testing.T) {
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.OrderID, true)
eFldVal = strconv.FormatInt(cdr.OrderID, 10)
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.ToR, true)
eFldVal = cdr.ToR
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.OriginID, true)
eFldVal = cdr.OriginID
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.OriginHost, true)
eFldVal = cdr.OriginHost
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Source, true)
eFldVal = cdr.Source
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.RequestType, true)
eFldVal = cdr.RequestType
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Category, true)
eFldVal = cdr.Category
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Account, true)
eFldVal = cdr.Account
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Subject, true)
eFldVal = cdr.Subject
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Destination, true)
eFldVal = cdr.Destination
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.SetupTime, true)
eFldVal = cdr.SetupTime.Format(time.RFC3339)
@@ -176,35 +176,35 @@ func TestFieldAsString(t *testing.T) {
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.RunID, true)
eFldVal = cdr.RunID
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Cost, true)
eFldVal = strconv.FormatFloat(cdr.Cost, 'f', -1, 64)
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+"field_extr1", true)
eFldVal = cdr.ExtraFields["field_extr1"]
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+"fieldextr2", true)
eFldVal = cdr.ExtraFields["fieldextr2"]
if fldVal, err := cdr.FieldAsString(prsr); err != nil {
t.Error(err)
} else if fldVal != eFldVal {
t.Errorf("field: <%s>, expected: <%s>, received: <%s>", prsr, eFldVal, fldVal)
t.Errorf("field: <%v>, expected: <%v>, received: <%v>", prsr, eFldVal, fldVal)
}
prsr = config.NewRSRParserMustCompile(utils.DynamicDataPrefix+"dummy_field", true)
if _, err := cdr.FieldAsString(prsr); err != utils.ErrNotFound {

View File

@@ -792,3 +792,38 @@ func (cdrS *CdrServer) V2RateCDRs(attrs *utils.RPCCDRsFilter, reply *string) err
*reply = utils.OK
return nil
}
// V1GetCDRs returns CDRs from DB
func (self *CdrServer) V1GetCDRs(args utils.RPCCDRsFilter, cdrs *[]*CDR) error {
cdrsFltr, err := args.AsCDRsFilter(self.Timezone())
if err != nil {
if err.Error() != utils.NotFoundCaps {
err = utils.NewErrServerError(err)
}
return err
}
if qryCDRs, _, err := self.cdrDb.GetCDRs(cdrsFltr, false); err != nil {
return utils.NewErrServerError(err)
} else {
*cdrs = qryCDRs
}
return nil
}
// V1CountCDRs counts CDRs from DB
func (self *CdrServer) V1CountCDRs(args utils.RPCCDRsFilter, cnt *int64) error {
cdrsFltr, err := args.AsCDRsFilter(self.Timezone())
if err != nil {
if err.Error() != utils.NotFoundCaps {
err = utils.NewErrServerError(err)
}
return err
}
cdrsFltr.Count = true
if _, qryCnt, err := self.cdrDb.GetCDRs(cdrsFltr, false); err != nil {
return utils.NewErrServerError(err)
} else {
*cnt = qryCnt
}
return nil
}

View File

@@ -1123,19 +1123,20 @@ func (smg *SMGeneric) ChargeEvent(tnt string, gev *engine.SafEvent) (maxUsage ti
return
}
func (smg *SMGeneric) ProcessCDR(gev *engine.SafEvent) (err error) {
func (smg *SMGeneric) ProcessCDR(tnt string, gev *engine.SafEvent) (err error) {
cgrID := GetSetCGRID(gev)
cacheKey := "ProcessCDR" + cgrID
if item, err := smg.responseCache.Get(cacheKey); err == nil && item != nil {
return item.Err
}
defer smg.responseCache.Cache(cacheKey, &utils.ResponseCacheItem{Err: err})
cdr, err := gev.AsCDR(smg.cgrCfg, smg.Timezone)
if err != nil {
return err
cgrEv := &utils.CGREvent{
Tenant: tnt,
ID: utils.UUIDSha1Prefix(),
Event: gev.AsMapInterface(),
}
var reply string
if err = smg.cdrsrv.Call("CdrsV1.ProcessCDR", cdr, &reply); err != nil {
if err = smg.cdrsrv.Call(utils.CdrsV2ProcessCDR, cgrEv, &reply); err != nil {
return
}
return
@@ -1358,8 +1359,11 @@ func (smg *SMGeneric) BiRPCV2ChargeEvent(clnt rpcclient.RpcClientConnection,
// Called on session end, should send the CDR to CDRS
func (smg *SMGeneric) BiRPCV1ProcessCDR(clnt rpcclient.RpcClientConnection,
ev map[string]interface{}, reply *string) error {
if err := smg.ProcessCDR(engine.NewSafEvent(ev)); err != nil {
ev engine.MapEvent, reply *string) error {
if err := smg.ProcessCDR(
utils.FirstNonEmpty(ev.GetStringIgnoreErrors(utils.Tenant),
smg.cgrCfg.DefaultTenant),
engine.NewSafEvent(ev)); err != nil {
return utils.NewErrServerError(err)
}
*reply = utils.OK
@@ -2107,11 +2111,7 @@ func (smg *SMGeneric) BiRPCv1TerminateSession(clnt rpcclient.RpcClientConnection
// Called on session end, should send the CDR to CDRS
func (smg *SMGeneric) BiRPCv1ProcessCDR(clnt rpcclient.RpcClientConnection,
cgrEv utils.CGREvent, reply *string) error {
if err := smg.ProcessCDR(engine.NewSafEvent(cgrEv.Event)); err != nil {
return utils.NewErrServerError(err)
}
*reply = utils.OK
return nil
return smg.cdrsrv.Call(utils.CdrsV2ProcessCDR, cgrEv, reply)
}
func NewV1ProcessEventArgs(resrc, acnts, attrs bool,

View File

@@ -765,8 +765,10 @@ const (
CacheSv1Clear = "CacheSv1.Clear"
)
// CdrsV2 APIs
// Cdrs APIs
const (
CdrsV1CountCDRs = "CdrsV1.CountCDRs"
CdrsV1GetCDRs = "CdrsV1.GetCDRs"
CdrsV2ProcessCDR = "CdrsV2.ProcessCDR"
CdrsV2RateCDRs = "CdrsV2.RateCDRs"
)