From f6f698a2b001901654ee604f775aaa8afdc59cae Mon Sep 17 00:00:00 2001 From: DanB Date: Thu, 30 Aug 2018 19:12:33 +0200 Subject: [PATCH] Improved SessionsV1.ProcessCDR, ChargerS RELEASED in beta --- apier/v1/cdrsv1.go | 8 ++ apier/v1/sessionsv1_it_test.go | 119 +++++++++++++++++++++++- data/conf/samples/sessions/cgrates.json | 3 + engine/cdr_test.go | 32 +++---- engine/cdrs.go | 35 +++++++ sessions/sessions.go | 24 ++--- utils/consts.go | 4 +- 7 files changed, 194 insertions(+), 31 deletions(-) diff --git a/apier/v1/cdrsv1.go b/apier/v1/cdrsv1.go index 1c7465fe5..56078a1bf 100644 --- a/apier/v1/cdrsv1.go +++ b/apier/v1/cdrsv1.go @@ -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) +} diff --git a/apier/v1/sessionsv1_it_test.go b/apier/v1/sessionsv1_it_test.go index 13481806e..13998ff9e 100644 --- a/apier/v1/sessionsv1_it_test.go +++ b/apier/v1/sessionsv1_it_test.go @@ -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) { diff --git a/data/conf/samples/sessions/cgrates.json b/data/conf/samples/sessions/cgrates.json index 0cb0c356f..241063036 100644 --- a/data/conf/samples/sessions/cgrates.json +++ b/data/conf/samples/sessions/cgrates.json @@ -33,6 +33,9 @@ "cdrs": { "enabled": true, + "chargers_conns":[ + {"address": "127.0.0.1:2012", "transport":"*json"}, + ], }, diff --git a/engine/cdr_test.go b/engine/cdr_test.go index cc3a8a358..0d056f918 100644 --- a/engine/cdr_test.go +++ b/engine/cdr_test.go @@ -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 { diff --git a/engine/cdrs.go b/engine/cdrs.go index f3a3dcc42..2ac377223 100644 --- a/engine/cdrs.go +++ b/engine/cdrs.go @@ -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 +} diff --git a/sessions/sessions.go b/sessions/sessions.go index 0e48d0ad5..2f0d8a19d 100644 --- a/sessions/sessions.go +++ b/sessions/sessions.go @@ -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, diff --git a/utils/consts.go b/utils/consts.go index baa36e22f..52fe315a1 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -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" )