mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Improved SessionsV1.ProcessCDR, ChargerS RELEASED in beta
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true,
|
||||
"chargers_conns":[
|
||||
{"address": "127.0.0.1:2012", "transport":"*json"},
|
||||
],
|
||||
},
|
||||
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user